コード例 #1
0
        public GaSymMapBilinearHash SetBasisBladesMap(int id1, int id2, IGaSymMultivector value)
        {
            Debug.Assert(ReferenceEquals(value, null) || value.VSpaceDimension == TargetVSpaceDimension);

            _basisBladesMaps[id1, id2] = value.Compactify(true);

            return(this);
        }
コード例 #2
0
 public Expr this[IGaSymMultivector mv1]
 => _factorsList.Count == 0
         ? Expr.INT_ZERO
         : Mfs.SumExpr(
     _factorsList
     .Select(term => Mfs.Times[term.Item2, mv1[term.Item1]])
     .ToArray()
     );
コード例 #3
0
        public GaSymMapUnilinearArray SetBasisBladeMap(int basisBladeId, IGaSymMultivector targetMv)
        {
            Debug.Assert(ReferenceEquals(targetMv, null) || targetMv.VSpaceDimension == TargetVSpaceDimension);

            _basisBladeMaps[basisBladeId] = targetMv.Compactify(true);

            return(this);
        }
コード例 #4
0
        public static GaSymMultivectorHash ToHashMultivector(this IGaSymMultivector mv)
        {
            var sparseMv = GaSymMultivectorHash.CreateZero(mv.GaSpaceDimension);

            foreach (var term in mv.NonZeroTerms)
            {
                sparseMv.Add(term.Key, term.Value);
            }

            return(sparseMv);
        }
コード例 #5
0
        public static GaSymMultivector Op(this IGaSymMultivector mv1, IGaSymMultivector mv2)
        {
            if (mv1.GaSpaceDimension != mv2.GaSpaceDimension)
            {
                throw new GMacSymbolicException("Multivector size mismatch");
            }

            return(GaSymMultivector
                   .CreateZeroTemp(mv1.GaSpaceDimension)
                   .AddFactors(mv1.ToMultivector().GetBiTermsForOp(mv2.ToMultivector()))
                   .ToMultivector());
        }
コード例 #6
0
        public GaSymMapUnilinearCoefSums SetBasisBladeMap(int basisBladeId, IGaSymMultivector targetMv)
        {
            if (ReferenceEquals(targetMv, null))
            {
                return(this);
            }

            foreach (var term in targetMv.NonZeroExprTerms)
            {
                SetFactor(term.Key, basisBladeId, term.Value);
            }

            return(this);
        }
コード例 #7
0
        public static IGaSymMultivector Compactify(this IGaSymMultivector mv, bool returnZeroMvAsNull = false)
        {
            if (DisableCompactifyMultivectors)
            {
                return(mv);
            }

            if (ReferenceEquals(mv, null))
            {
                return(null);
            }

            //Make sure this is not a temp multivector
            if (mv.IsTemp)
            {
                mv = mv.ToMultivector();
            }

            //If it's zero return null or a zero term depending on returnZeroMvAsNull
            if (mv.IsZero())
            {
                return(returnZeroMvAsNull
                    ? null
                    : GaSymMultivectorTerm.CreateZero(mv.GaSpaceDimension));
            }

            //If it's a non-zero term return it as is
            var termMv = mv as GaSymMultivectorTerm;

            if (!ReferenceEquals(termMv, null))
            {
                return(termMv);
            }

            //It's a full multivector
            var fullMv = (GaSymMultivector)mv;

            //If it's not a term return it after simplification
            if (!mv.IsTerm())
            {
                fullMv.Simplify();
                return(fullMv);
            }

            //It's a full multivector containing a single term
            var term = mv.NonZeroExprTerms.FirstOrDefault();

            return(GaSymMultivectorTerm.CreateTerm(mv.GaSpaceDimension, term.Key, term.Value));
        }
コード例 #8
0
        public GaSymMapUnilinearTree SetBasisBladeMap(int basisBladeId, IGaSymMultivector targetMv)
        {
            Debug.Assert(ReferenceEquals(targetMv, null) || targetMv.VSpaceDimension == TargetVSpaceDimension);

            targetMv = targetMv.Compactify(true);

            if (ReferenceEquals(targetMv, null))
            {
                return(this);
            }

            _basisBladeMaps.SetLeafValue((ulong)basisBladeId, targetMv);

            return(this);
        }
コード例 #9
0
        public static IGaSymMultivectorTemp ToTempMultivector(this IGaSymMultivector mv)
        {
            if (ReferenceEquals(mv, null))
            {
                return(null);
            }

            var tempMv = GaSymMultivector.CreateZeroTemp(mv.GaSpaceDimension);

            foreach (var term in mv.NonZeroExprTerms)
            {
                tempMv.SetTermCoef(term.Key, term.Value);
            }

            return(tempMv);
        }
コード例 #10
0
            public Expr this[IGaSymMultivector mv1, IGaSymMultivector mv2]
            {
                get
                {
                    if (_factorsList.Count == 0)
                    {
                        return(Expr.INT_ZERO);
                    }

                    var termsExprArray =
                        _factorsList
                        .Select(factor => Mfs.ProductExpr(
                                    mv1[factor.Item1],
                                    mv2[factor.Item2],
                                    factor.Item3
                                    )).ToArray();

                    return(termsExprArray.Length == 1
                        ? termsExprArray[0]
                        : Mfs.SumExpr(termsExprArray));
                }
            }
コード例 #11
0
 public static bool IsNullOrEqualZero(this IGaSymMultivector mv)
 {
     return(ReferenceEquals(mv, null) || mv.IsEqualZero());
 }
コード例 #12
0
        public GaSymMapBilinearCoefSums SetBasisBladesMap(int domainBasisBladeId1, int domainBasisBladeId2, IGaSymMultivector targetMv)
        {
            Debug.Assert(targetMv.VSpaceDimension == TargetVSpaceDimension);

            foreach (var term in targetMv.NonZeroExprTerms)
            {
                SetFactor(term.Key, domainBasisBladeId1, domainBasisBladeId2, term.Value);
            }

            return(this);
        }