示例#1
0
 public GaSymMultivectorBinaryTree3D(int domainVSpaceDimension1, int domainVSpaceDimension2, int domainVSpaceDimension3, int targetVSpaceDimension)
 {
     RootNode = new GMacBinaryTree <GaSymMultivectorBinaryTree2D>(domainVSpaceDimension1);
     DomainVSpaceDimension2 = domainVSpaceDimension2;
     DomainVSpaceDimension3 = domainVSpaceDimension3;
     TargetVSpaceDimension  = targetVSpaceDimension;
 }
示例#2
0
        internal static GaNumMultivector CreateCopy(GMacBinaryTree <double> termsTree)
        {
            var resultMv = new GaNumMultivector(termsTree.TreeDepth.ToGaSpaceDimension());

            resultMv.TermsTree.FillFromTree(termsTree);

            return(resultMv);
        }
示例#3
0
        public static GaSymMultivector CreateCopy(GMacBinaryTree <Expr> termsTree)
        {
            var gaSpaceDimension = termsTree.TreeDepth.ToGaSpaceDimension();
            var resultMv         = new GaSymMultivector(gaSpaceDimension);

            resultMv.TermsTree.FillFromTree(termsTree);

            return(resultMv);
        }
示例#4
0
        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);
        }
示例#5
0
        //public static BinaryTreeNode<MathematicaScalar> ComputeBasisBladesSignatures(this IReadOnlyList<MathematicaScalar> basisVectorsSignaturesList)
        //{
        //    var vSpaceDim = basisVectorsSignaturesList.Count;
        //    var bbsList = new BinaryTreeNode<MathematicaScalar>(vSpaceDim);

        //    bbsList.SetValue(0ul, Constants.One);

        //    for (var m = 0; m < vSpaceDim; m++)
        //    {
        //        var bvs = basisVectorsSignaturesList[m];

        //        if (bvs.IsNullOrZero()) continue;

        //        bbsList.SetValue(1ul << m, bvs);
        //    }

        //    var idsSeq = FrameUtils.BasisBladeIDsSortedByGrade(vSpaceDim, 2);
        //    foreach (var id in idsSeq)
        //    {
        //        int id1, id2;
        //        id.SplitBySmallestBasisVectorId(out id1, out id2);

        //        var bvs1 = bbsList.GetValue((ulong)id1);
        //        if (bvs1.IsNullOrZero()) continue;

        //        var bvs2 = bbsList.GetValue((ulong)id2);
        //        if (bvs2.IsNullOrZero()) continue;

        //        bbsList.SetValue((ulong)id, bvs1 * bvs2);
        //    }

        //    return bbsList;
        //}

        public static GMacBinaryTree <int> ComputeBasisBladesSignatures(this IReadOnlyList <int> basisVectorsSignaturesList)
        {
            var vSpaceDim = basisVectorsSignaturesList.Count;
            var bbsList   = new GMacBinaryTree <int>(vSpaceDim);

            bbsList.SetLeafValue(0ul, 1);

            for (var m = 0; m < vSpaceDim; m++)
            {
                var bvs = basisVectorsSignaturesList[m];

                if (bvs == 0)
                {
                    continue;
                }

                bbsList.SetLeafValue(1ul << m, bvs);
            }

            var idsSeq = GMacMathUtils.BasisBladeIDsSortedByGrade(vSpaceDim, 2);

            foreach (var id in idsSeq)
            {
                int id1, id2;
                id.SplitBySmallestBasisVectorId(out id1, out id2);

                var bvs1 = bbsList.GetLeafValue((ulong)id1);
                if (bvs1 == 0)
                {
                    continue;
                }

                var bvs2 = bbsList.GetLeafValue((ulong)id2);
                if (bvs2 == 0)
                {
                    continue;
                }

                bbsList.SetLeafValue((ulong)id, bvs1 * bvs2);
            }

            return(bbsList);
        }
示例#6
0
 private GaSymMapUnilinearTree(int domainVSpaceDim, int targetVSpaceDim)
 {
     DomainVSpaceDimension = domainVSpaceDim;
     _basisBladeMaps       = new GMacBinaryTree <IGaSymMultivector>(targetVSpaceDim);
 }
示例#7
0
 private GaSymMultivector(int gaSpaceDim)
 {
     CasInterface    = SymbolicUtils.Cas;
     VSpaceDimension = gaSpaceDim.ToVSpaceDimension();
     TermsTree       = new GMacBinaryTree <Expr>(VSpaceDimension);
 }
 public GaSymMultivectorBinaryTree1D(int domainVSpaceDimension, int targetVSpaceDimension)
 {
     RootNode = new GMacBinaryTree <IGaSymMultivector>(domainVSpaceDimension);
     TargetVSpaceDimension = targetVSpaceDimension;
 }
示例#9
0
 private GaSymMultivectorTempTree(int gaSpaceDim)
 {
     _termsTree = new GMacBinaryTree <List <Expr> >(gaSpaceDim.ToVSpaceDimension());
 }
示例#10
0
 private GaNumMetricOrthogonal(int vSpaceDim)
 {
     RootNode = new GMacBinaryTree <double>(vSpaceDim);
 }
示例#11
0
 private GaSymMetricOrthogonal(int vSpaceDim)
 {
     RootNode = new GMacBinaryTree <Expr>(vSpaceDim);
 }
示例#12
0
 private GaNumMultivector(int gaSpaceDim)
 {
     VSpaceDimension = gaSpaceDim.ToVSpaceDimension();
     TermsTree       = new GMacBinaryTree <double>(VSpaceDimension);
 }
 public GaSymScalarBinaryTree2D(int vSpaceDimension)
 {
     RootNode = new GMacBinaryTree <GaSymScalarBinaryTree1D>(vSpaceDimension);
 }
示例#14
0
 public static GMacBinaryTree <MathematicaScalar> ToSymbolicTree(this GMacBinaryTree <double> rootTreeNode)
 {
     return(rootTreeNode?.MapLeafValues(
                i => MathematicaScalar.Create(Cas, i)
                ));
 }
示例#15
0
 private GaNumMapUnilinearTree(int targetVSpaceDim)
 {
     DomainVSpaceDimension = targetVSpaceDim;
     BasisBladesMapTree    = new GMacBinaryTree <IGaNumMultivector>(targetVSpaceDim);
 }