public static IGaNumMultivectorTemp ToTempMultivector(this IGaNumMultivector mv) { if (ReferenceEquals(mv, null)) { return(null); } var tempMv = GaNumMultivector.CreateZeroTemp(mv.GaSpaceDimension); foreach (var term in mv.NonZeroTerms) { tempMv.SetTermCoef(term.Key, term.Value); } return(tempMv); }
public IGaNumMultivector this[int id1] { get { IGaNumMultivector mv; RootNode.TryGetLeafValue((ulong)id1, out mv); return(mv); } set { RootNode.SetLeafValue( (ulong)id1, value ?? GaNumMultivector.CreateZero(TargetGaSpaceDimension) ); } }
public static IEnumerable <GaNumMultivectorBiTerm> GetBiTermsForESp(this GaNumMultivector mv1, GaNumMultivector mv2) { var mvStack1 = mv1.TermsTree.CreateNodesStack(); var mvStack2 = mv2.TermsTree.CreateNodesStack(); var idStack1 = mv1.TermsTree.CreateNodeIDsStack(); var idStack2 = mv2.TermsTree.CreateNodeIDsStack(); while (mvStack1.Count > 0) { var node1 = mvStack1.Pop(); var node2 = mvStack2.Pop(); var id1 = idStack1.Pop(); var id2 = idStack2.Pop(); if (node1.IsLeafNode) { yield return(new GaNumMultivectorBiTerm( (int)id1, (int)id2, node1.Value, node2.Value )); continue; } if (node1.HasChildNode0 && node2.HasChildNode0) { mvStack1.Push(node1.ChildNode0); mvStack2.Push(node2.ChildNode0); idStack1.Push(id1); idStack2.Push(id2); } if (node1.HasChildNode1 && node2.HasChildNode1) { mvStack1.Push(node1.ChildNode1); mvStack2.Push(node2.ChildNode1); idStack1.Push(id1 | node1.ChildNode1.BitMask); idStack2.Push(id2 | node2.ChildNode1.BitMask); } } }
public Dictionary <int, GaNumMultivector> GetKVectorParts() { var kVectorsList = new Dictionary <int, GaNumMultivector>(); foreach (var term in NonZeroTerms) { GaNumMultivector mv; var grade = term.Key.BasisBladeGrade(); if (kVectorsList.TryGetValue(grade, out mv) == false) { mv = new GaNumMultivector(GaSpaceDimension); kVectorsList.Add(grade, mv); } mv.AddFactor(term.Key, term.Value); } return(kVectorsList); }
public GaNumMultivector ToMultivector() { return(TermCoef.IsNearZero() ? GaNumMultivector.CreateZero(GaSpaceDimension) : GaNumMultivector.CreateTerm(GaSpaceDimension, TermId, TermCoef)); }
public static IGaNumMultivectorTemp AddFactors(this IGaNumMultivectorTemp tempMv, double scalar, GaNumMultivector termsMv) { foreach (var term in termsMv.NonZeroTerms) { tempMv.AddFactor(term.Key, term.Value * scalar); } return(tempMv); }
public static IGaNumMultivectorTemp SetTerms(this IGaNumMultivectorTemp tempMv, GaNumMultivector termsMv) { foreach (var term in termsMv.NonZeroTerms) { tempMv.SetTermCoef(term.Key, term.Value); } return(tempMv); }
public static IEnumerable <GaNumMultivectorBiTerm> GetBiTermsForCp(this GaNumMultivector mv1, GaNumMultivector mv2, GaNumMetricOrthogonal orthogonalMetric) { return(GetBiTermsForGp(mv1, mv2, orthogonalMetric).Where(t => t.IsNonZeroCp)); }
public static IEnumerable <GaNumMultivectorBiTerm> GetBiTermsForRcp(this GaNumMultivector mv1, GaNumMultivector mv2, GaNumMetricOrthogonal orthogonalMetric) { var mvStack1 = mv1.TermsTree.CreateNodesStack(); var mvStack2 = mv2.TermsTree.CreateNodesStack(); var idStack1 = mv1.TermsTree.CreateNodeIDsStack(); var idStack2 = mv2.TermsTree.CreateNodeIDsStack(); var metricStack = orthogonalMetric.RootNode.CreateNodesStack(); while (mvStack1.Count > 0) { var node1 = mvStack1.Pop(); var node2 = mvStack2.Pop(); var id1 = idStack1.Pop(); var id2 = idStack2.Pop(); var metricNode = metricStack.Pop(); if (node1.IsLeafNode) { yield return(new GaNumMultivectorBiTerm( (int)id1, (int)id2, node1.Value, node2.Value, metricNode.Value )); continue; } if (node1.HasChildNode0 && node2.HasChildNode0 && metricNode.HasChildNode0) { mvStack1.Push(node1.ChildNode0); mvStack2.Push(node2.ChildNode0); //0 and 0 = 0 metricStack.Push(metricNode.ChildNode0); idStack1.Push(id1); idStack2.Push(id2); } if (node1.HasChildNode1) { if (node2.HasChildNode0 && metricNode.HasChildNode0) { mvStack1.Push(node1.ChildNode1); mvStack2.Push(node2.ChildNode0); //0 and 1 = 0 metricStack.Push(metricNode.ChildNode0); idStack1.Push(id1 | node1.ChildNode1.BitMask); idStack2.Push(id2); } if (node2.HasChildNode1 && metricNode.HasChildNode1) { mvStack1.Push(node1.ChildNode1); mvStack2.Push(node2.ChildNode1); //1 and 1 = 1 metricStack.Push(metricNode.ChildNode1); idStack1.Push(id1 | node1.ChildNode1.BitMask); idStack2.Push(id2 | node2.ChildNode1.BitMask); } } } }
public static IEnumerable <GaNumMultivectorBiTerm> GetBiTermsForECp(this GaNumMultivector mv1, GaNumMultivector mv2) { return(GetBiTermsForEGp(mv1, mv2).Where(t => t.IsNonZeroCp)); }
public static GaNumMultivector CreatePseudoscalar(int gaSpaceDim, double coef) { var resultMv = new GaNumMultivector(gaSpaceDim); return(resultMv.AddFactor(gaSpaceDim - 1, coef)); }
public static GaNumMultivector CreateUnitScalar(int gaSpaceDim) { var resultMv = new GaNumMultivector(gaSpaceDim); return(resultMv.AddFactor(0, 1.0d)); }
public static GaNumMultivector CreateBasisBlade(int gaSpaceDim, int id) { var resultMv = new GaNumMultivector(gaSpaceDim); return(resultMv.AddFactor(id, 1.0d)); }
public static GaNumMultivector CreateTerm(int gaSpaceDim, int id, double coef) { var resultMv = new GaNumMultivector(gaSpaceDim); return(resultMv.AddFactor(id, coef)); }
public static IGaNumMultivectorTemp CreateCopyTemp(GaNumMultivector mv) { return(CreateZeroTemp(mv.GaSpaceDimension).SetTerms(mv)); }