public static IGaNumMultivectorTemp MapToTemp(this GMacBinaryTree <IGaNumMapUnilinear> mappingTree, GaNumMultivector mv1, GaNumMultivector mv2, int targetGaSpaceDimension) { if (mv1.GaSpaceDimension != mappingTree.TreeDepth.ToGaSpaceDimension()) { throw new GMacNumericException("Multivector size mismatch"); } var resultMv = GaNumMultivector.CreateZeroTemp(targetGaSpaceDimension); var nodeStack1 = mappingTree.CreateNodesStack(); var nodeStack2 = mv1.TermsTree.CreateNodesStack(); while (nodeStack1.Count > 0) { var node1 = nodeStack1.Pop(); var node2 = nodeStack2.Pop(); if (node1.IsLeafNode && !ReferenceEquals(node1.Value, null)) { var leafScalar = node2.Value; var leafMv = node1.Value.MapToTemp(mv2); resultMv.AddFactors( leafScalar, leafMv ); continue; } if (node1.HasChildNode0 && node2.HasChildNode0) { nodeStack1.Push(node1.ChildNode0); nodeStack2.Push(node2.ChildNode0); } if (node1.HasChildNode1 && node2.HasChildNode1) { nodeStack1.Push(node1.ChildNode1); nodeStack2.Push(node2.ChildNode1); } } return(resultMv); }
public override IGaSymMultivectorTemp MapToTemp(GaSymMultivector mv) { if (mv.GaSpaceDimension != DomainGaSpaceDimension) { throw new GMacSymbolicException("Multivector size mismatch"); } var resultMv = GaSymMultivector.CreateZeroTemp(TargetGaSpaceDimension); var nodeStack1 = _basisBladeMaps.CreateNodesStack(); var nodeStack2 = mv.TermsTree.CreateNodesStack(); while (nodeStack1.Count > 0) { var node1 = nodeStack1.Pop(); var node2 = nodeStack2.Pop(); if (node1.IsLeafNode) { resultMv.AddFactors(node2.Value, node1.Value); continue; } if (node1.HasChildNode0 && node2.HasChildNode0) { nodeStack1.Push(node1.ChildNode0); nodeStack2.Push(node2.ChildNode0); } if (node1.HasChildNode1 && node2.HasChildNode1) { nodeStack1.Push(node1.ChildNode1); nodeStack2.Push(node2.ChildNode1); } } return(resultMv); }