예제 #1
0
        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);
        }
예제 #2
0
        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)
                    );
            }
        }
예제 #3
0
        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);
                }
            }
        }
예제 #4
0
        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);
        }
예제 #5
0
 public GaNumMultivector ToMultivector()
 {
     return(TermCoef.IsNearZero()
         ? GaNumMultivector.CreateZero(GaSpaceDimension)
         : GaNumMultivector.CreateTerm(GaSpaceDimension, TermId, TermCoef));
 }
예제 #6
0
        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);
        }
예제 #7
0
        public static IGaNumMultivectorTemp SetTerms(this IGaNumMultivectorTemp tempMv, GaNumMultivector termsMv)
        {
            foreach (var term in termsMv.NonZeroTerms)
            {
                tempMv.SetTermCoef(term.Key, term.Value);
            }

            return(tempMv);
        }
예제 #8
0
 public static IEnumerable <GaNumMultivectorBiTerm> GetBiTermsForCp(this GaNumMultivector mv1, GaNumMultivector mv2, GaNumMetricOrthogonal orthogonalMetric)
 {
     return(GetBiTermsForGp(mv1, mv2, orthogonalMetric).Where(t => t.IsNonZeroCp));
 }
예제 #9
0
        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);
                    }
                }
            }
        }
예제 #10
0
 public static IEnumerable <GaNumMultivectorBiTerm> GetBiTermsForECp(this GaNumMultivector mv1, GaNumMultivector mv2)
 {
     return(GetBiTermsForEGp(mv1, mv2).Where(t => t.IsNonZeroCp));
 }
예제 #11
0
        public static GaNumMultivector CreatePseudoscalar(int gaSpaceDim, double coef)
        {
            var resultMv = new GaNumMultivector(gaSpaceDim);

            return(resultMv.AddFactor(gaSpaceDim - 1, coef));
        }
예제 #12
0
        public static GaNumMultivector CreateUnitScalar(int gaSpaceDim)
        {
            var resultMv = new GaNumMultivector(gaSpaceDim);

            return(resultMv.AddFactor(0, 1.0d));
        }
예제 #13
0
        public static GaNumMultivector CreateBasisBlade(int gaSpaceDim, int id)
        {
            var resultMv = new GaNumMultivector(gaSpaceDim);

            return(resultMv.AddFactor(id, 1.0d));
        }
예제 #14
0
        public static GaNumMultivector CreateTerm(int gaSpaceDim, int id, double coef)
        {
            var resultMv = new GaNumMultivector(gaSpaceDim);

            return(resultMv.AddFactor(id, coef));
        }
예제 #15
0
 public static IGaNumMultivectorTemp CreateCopyTemp(GaNumMultivector mv)
 {
     return(CreateZeroTemp(mv.GaSpaceDimension).SetTerms(mv));
 }