示例#1
0
        public GaNumMultivector GetNumBlade(int gaSpaceDim, int grade)
        {
            var vSpaceDim = gaSpaceDim.ToVSpaceDimension();

            if (grade < 0 || grade > vSpaceDim)
            {
                return(GaNumMultivector.CreateZero(gaSpaceDim));
            }

            if (grade <= 1 || grade >= vSpaceDim - 1)
            {
                return(GetNumKVector(gaSpaceDim, grade));
            }

            var mv = GetNumVector(gaSpaceDim);

            grade--;

            while (grade > 0)
            {
                var v   = GetNumVector(gaSpaceDim);
                var mv1 = mv.Op(v);

                if (mv1.IsZero())
                {
                    continue;
                }

                mv = mv1;
                grade--;
            }

            return(mv);
        }
示例#2
0
        public GaNumMultivector GetNumTerm(int gaSpaceDim, int basisBladeId, double minValue, double maxValue)
        {
            var mv = GaNumMultivector.CreateZero(gaSpaceDim);

            mv.SetTermCoef(basisBladeId, GetScalar(minValue, maxValue));

            return(mv);
        }
示例#3
0
        public GaNumMultivector GetNumTerm(int gaSpaceDim, int grade, int index, double minValue, double maxValue)
        {
            var mv = GaNumMultivector.CreateZero(gaSpaceDim);

            var basisBladeId = GMacMathUtils.BasisBladeId(grade, index);

            mv.SetTermCoef(basisBladeId, GetScalar(minValue, maxValue));

            return(mv);
        }
        public GaNumMultivector ToMultivector()
        {
            var mv = GaNumMultivector.CreateZero(GaSpaceDimension);

            foreach (var term in _termsDictionary.Where(p => !p.Value.IsNearZero()))
            {
                mv.SetTermCoef(term.Key, term.Value);
            }

            return(mv);
        }
        public override IGaNumMultivector this[int id1]
        {
            get
            {
                IGaNumMultivector basisBladeMv;
                _basisBladeMaps.TryGetValue(id1, out basisBladeMv);

                return(basisBladeMv
                       ?? GaNumMultivector.CreateZero(TargetGaSpaceDimension));
            }
        }
示例#6
0
 public override IGaNumMultivector this[int id1, int id2, int id3]
 {
     get
     {
         IGaNumMultivector basisBladeMv;
         return
             (!_basisBladesMaps.TryGetValue(id1, id2, id3, out basisBladeMv) || ReferenceEquals(basisBladeMv, null)
                 ? GaNumMultivector.CreateZero(TargetGaSpaceDimension)
                 : basisBladeMv);
     }
 }
示例#7
0
        public GaNumMultivector GetNumVector(int gaSpaceDim)
        {
            var mv = GaNumMultivector.CreateZero(gaSpaceDim);

            foreach (var basisBladeId in GMacMathUtils.BasisBladeIDsOfGrade(mv.VSpaceDimension, 1))
            {
                mv.SetTermCoef(basisBladeId, GetScalar());
            }

            return(mv);
        }
示例#8
0
        public GaNumMultivector GetNumKVector(int gaSpaceDim, int grade, double minValue, double maxValue)
        {
            var mv = GaNumMultivector.CreateZero(gaSpaceDim);

            foreach (var basisBladeId in GMacMathUtils.BasisBladeIDsOfGrade(mv.VSpaceDimension, grade))
            {
                mv.SetTermCoef(basisBladeId, GetScalar(minValue, maxValue));
            }

            return(mv);
        }
示例#9
0
        public GaNumMultivector GetNumMultivectorByTerms(int gaSpaceDim, IEnumerable <int> basisBladeIDs)
        {
            var mv = GaNumMultivector.CreateZero(gaSpaceDim);

            foreach (var basisBladeId in basisBladeIDs)
            {
                mv.SetTermCoef(basisBladeId, GetScalar());
            }

            return(mv);
        }
示例#10
0
        public GaNumMultivector GetNumMultivectorFull(int gaSpaceDim, double minValue, double maxValue)
        {
            var mv = GaNumMultivector.CreateZero(gaSpaceDim);

            for (var basisBladeId = 0; basisBladeId < gaSpaceDim; basisBladeId++)
            {
                mv.SetTermCoef(basisBladeId, GetScalar(minValue, maxValue));
            }

            return(mv);
        }
示例#11
0
        public override IGaNumMultivector this[int id1, int id2]
        {
            get
            {
                IGaNumMultivector resultMv;
                _basisBladesMaps.TryGetValue(id1, id2, out resultMv);

                return(resultMv
                       ?? GaNumMultivector.CreateZero(TargetGaSpaceDimension));
            }
        }
示例#12
0
        public void Setup()
        {
            _randGen = new GMacRandomGenerator(10);

            _frame = GaNumFrame.CreateConformal(5);
            //_frame.SelectBilinearProductsImplementation(ProductsImplementation);

            _mv1 = _randGen.GetNumMultivectorFull(_frame.GaSpaceDimension);
            _mv2 = _mv1.Terms.ToDictionary(t => t.Key, t => t.Value);

            _mv3 = GaNumMultivector.CreateZero(_frame.GaSpaceDimension);
            //_mv4 = new Dictionary<int, double>();
            //_mv5 = new double[_frame.GaSpaceDimension];
        }
        public GaNumMultivector GetVectorPart()
        {
            var mv = GaNumMultivector.CreateZero(GaSpaceDimension);

            foreach (var id in GMacMathUtils.BasisVectorIDs(VSpaceDimension))
            {
                var coef = this[id];
                if (!coef.IsNearZero())
                {
                    mv.SetTermCoef(id, coef);
                }
            }

            return(mv);
        }
示例#14
0
        public GaNumMultivector GetNumMultivectorByGrades(int gaSpaceDim, params int[] grades)
        {
            var mv = GaNumMultivector.CreateZero(gaSpaceDim);

            var basisBladeIDs =
                GMacMathUtils.BasisBladeIDsOfGrades(
                    mv.VSpaceDimension,
                    grades
                    );

            foreach (var basisBladeId in basisBladeIDs)
            {
                mv.SetTermCoef(basisBladeId, GetScalar());
            }

            return(mv);
        }
示例#15
0
        public static Dictionary <int, GaNumMultivector> ToOutermorphismDictionary(this Dictionary <int, IGaNumMultivector> linearVectorMaps, int domainVSpaceDim, int targetVSpaceDim)
        {
            var domainGaSpaceDim =
                domainVSpaceDim.ToGaSpaceDimension();

            var targetGaSpaceDim =
                targetVSpaceDim.ToGaSpaceDimension();

            var omMapDict = new Dictionary <int, GaNumMultivector>();

            //Add unit scalar as the image of the 0-basis blade
            omMapDict.Add(0, GaNumMultivector.CreateUnitScalar(targetGaSpaceDim));

            for (var id = 1; id <= domainGaSpaceDim - 1; id++)
            {
                GaNumMultivector basisBladeImage;

                if (id.IsValidBasisVectorId())
                {
                    //Add images of vector basis blades
                    IGaNumMultivector mv;
                    linearVectorMaps.TryGetValue(id.BasisBladeIndex(), out mv);

                    basisBladeImage = mv?.GetVectorPart()
                                      ?? GaNumMultivector.CreateZero(targetGaSpaceDim);
                }
                else
                {
                    //Add images of a higher dimensional basis blade using the outer product
                    //of the images of two lower dimensional basis blades
                    int id1, id2;
                    id.SplitBySmallestBasicPattern(out id1, out id2);

                    basisBladeImage =
                        omMapDict[id1].Op(omMapDict[id2]);
                }

                if (!basisBladeImage.IsZero())
                {
                    omMapDict.Add(id, basisBladeImage);
                }
            }

            return(omMapDict);
        }
示例#16
0
        public GaNumMultivector ToMultivector()
        {
            var mv = GaNumMultivector.CreateZero(GaSpaceDimension);

            var id = 0;

            foreach (var coef in _termsArray)
            {
                if (!coef.IsNearZero())
                {
                    mv.SetTermCoef(id, coef);
                }

                id++;
            }

            return(mv);
        }