Ejemplo n.º 1
0
        public static GaSymOutermorphism Create(ISymbolicMatrix vectorsMappingMatrix, GaUnilinearMapImplementation multivectorsMappingKind)
        {
            if (multivectorsMappingKind == GaUnilinearMapImplementation.Identity)
            {
                var vSpaceDim = vectorsMappingMatrix.ColumnCount;

                return(new GaSymOutermorphism(
                           MathematicaMatrix.CreateIdentity(SymbolicUtils.Cas, vSpaceDim),
                           GaSymMapUnilinearIdentity.Create(vSpaceDim),
                           GaUnilinearMapImplementation.Identity
                           ));
            }

            var mvMappingDictionaryDict = vectorsMappingMatrix.ToOutermorphismDictionary();
            GaSymMapUnilinear multivectorsMap;

            switch (multivectorsMappingKind)
            {
            case GaUnilinearMapImplementation.Array:
                multivectorsMap = mvMappingDictionaryDict.ToArrayMap(
                    vectorsMappingMatrix.ColumnCount,
                    vectorsMappingMatrix.RowCount
                    );
                break;

            case GaUnilinearMapImplementation.Hash:
                multivectorsMap = mvMappingDictionaryDict.ToHashMap(
                    vectorsMappingMatrix.ColumnCount,
                    vectorsMappingMatrix.RowCount
                    );
                break;

            case GaUnilinearMapImplementation.Matrix:
                multivectorsMap = mvMappingDictionaryDict.ToMatrixMap(
                    vectorsMappingMatrix.ColumnCount,
                    vectorsMappingMatrix.RowCount
                    );
                break;

            case GaUnilinearMapImplementation.CoefSums:
                multivectorsMap = mvMappingDictionaryDict.ToCoefSumsMap(
                    vectorsMappingMatrix.ColumnCount,
                    vectorsMappingMatrix.RowCount
                    );
                break;

            default:
                multivectorsMap = mvMappingDictionaryDict.ToTreeMap(
                    vectorsMappingMatrix.ColumnCount,
                    vectorsMappingMatrix.RowCount
                    );
                break;
            }

            return(new GaSymOutermorphism(
                       vectorsMappingMatrix,
                       multivectorsMap,
                       multivectorsMappingKind
                       ));
        }
Ejemplo n.º 2
0
        protected virtual void ComputeMappingMatrix()
        {
            var matrixItems = new Expr[TargetGaSpaceDimension, DomainGaSpaceDimension];

            for (var col = 0; col < DomainGaSpaceDimension; col++)
            {
                var mv = this[col];

                if (mv.IsNullOrZero())
                {
                    for (var row = 0; row < TargetGaSpaceDimension; row++)
                    {
                        matrixItems[row, col] = Expr.INT_ZERO;
                    }

                    continue;
                }

                for (var row = 0; row < TargetGaSpaceDimension; row++)
                {
                    var scalar = mv[row];

                    matrixItems[row, col] =
                        scalar.IsNullOrZero()
                            ? Expr.INT_ZERO
                            : scalar;
                }
            }

            InternalMappingMatrix =
                MathematicaMatrix.CreateFullMatrix(SymbolicUtils.Cas, matrixItems);
        }
Ejemplo n.º 3
0
 public static MathematicaMatrix ToMatrix(this IGaSymMapUnilinear linearMap)
 {
     return(MathematicaMatrix.CreateFullMatrix(
                SymbolicUtils.Cas,
                ToExprScalarsArray(linearMap)
                ));
 }
Ejemplo n.º 4
0
 public static GaSymOutermorphism CreateIdentity(int vSpaceDim)
 {
     return(new GaSymOutermorphism(
                MathematicaMatrix.CreateIdentity(SymbolicUtils.Cas, vSpaceDim),
                GaSymMapUnilinearIdentity.Create(vSpaceDim),
                GaUnilinearMapImplementation.Identity
                ));
 }
Ejemplo n.º 5
0
        protected override void ComputeIpm()
        {
            var bvSig = _basisVectorsSignatures.Select(i => MathematicaScalar.Create(CasInterface, i));

            var v = MathematicaVector.CreateFullVector(CasInterface, bvSig);

            InnerProductMatrix = MathematicaMatrix.CreateDiagonal(v);
        }
Ejemplo n.º 6
0
        ///Set the signature of the current frame to be defined by IPM
        private GaFrame translate_Frame_Signature_IPM(ParseTreeNode node)
        {
            //Read the IPM symbolic matrix
            var ipmMatrix = MathematicaMatrix.Create(Cas, GenUtils.Translate_StringLiteral(node.ChildNodes[0]));

            if (ipmMatrix.IsSymmetric() == false || ipmMatrix.Rows != _vSpaceDim)
            {
                CompilationLog.RaiseGeneratorError <int>("Expecting a square symmetric matrix with " + _vSpaceDim + " rows", node.ChildNodes[0]);
            }

            return(GaFrame.CreateFromIpm(ipmMatrix));
        }
Ejemplo n.º 7
0
        public static void ConstructionTest()
        {
            TestUtils.AddTestStartingMessage("MathematicaMatrix Creation Test Started.");

            var scalarsArray = new MathematicaScalar[2, 2];

            scalarsArray[0, 0] = MathematicaScalar.Create(Cas, 2);
            scalarsArray[0, 1] = MathematicaScalar.Create(Cas, -2);
            scalarsArray[1, 0] = MathematicaScalar.Create(Cas, 3);
            scalarsArray[1, 1] = MathematicaScalar.Create(Cas, 1);

            var s = MathematicaMatrix.CreateFullMatrix(Cas, scalarsArray);

            TestUtils.AddTest("Try create full matrix from array of scalars ... ", s);

            s = MathematicaMatrix.CreateIdentity(Cas, 3);
            TestUtils.AddTest("Try create full 3x3 identity matrix ... ", s);

            s = MathematicaMatrix.CreateIdentity(Cas, 3, false);
            TestUtils.AddTest("Try create sparse 3x3 identity matrix ... ", s);

            var v = MathematicaVector.CreateFullVector(Cas, Cas.Constants.Zero, Cas.Constants.TwoPi, Cas.Constants.One);

            s = MathematicaMatrix.CreateDiagonal(v);
            TestUtils.AddTest("Try create full 3x3 diagonal matrix from vector {0, 2 Pi, 1} ... ", s);

            s = MathematicaMatrix.CreateDiagonal(v, false);
            TestUtils.AddTest("Try create sparse 3x3 diagonal matrix from vector {0, 2 Pi, 1} ... ", s);

            s = MathematicaMatrix.CreateRowVector(v);
            TestUtils.AddTest("Try create full row vector matrix from vector {0, 2 Pi, 1} ... ", s);

            s = MathematicaMatrix.CreateRowVector(v, false);
            TestUtils.AddTest("Try create sparse row vector matrix from vector {0, 2 Pi, 1} ... ", s);

            s = MathematicaMatrix.CreateColumnVector(v);
            TestUtils.AddTest("Try create full row vector matrix from vector {0, 2 Pi, 1} ... ", s);

            s = MathematicaMatrix.CreateColumnVector(v, false);
            TestUtils.AddTest("Try create sparse row vector matrix from vector {0, 2 Pi, 1} ... ", s);

            s = MathematicaMatrix.CreateConstant(Cas.Constants.Pi, 2, 3);
            TestUtils.AddTest("Try create 2x3 matrix with constant elements of Pi ... ", s);

            s = MathematicaMatrix.Create(Cas, @"{{1, x}, {2, y}, {3, z}}");
            TestUtils.AddTest("Try create matrix from expression text \"{{1, x}, {2, y}, {3, z}}\" ... ", s);

            TestUtils.AddTestCompletionMessage("MathematicaMatrix Creation Test Completed.");
        }
Ejemplo n.º 8
0
        private void ComputeMultivectorTransformMatrix()
        {
            var matrixArray = new MathematicaScalar[CodomainGaSpaceDim, DomainGaSpaceDim];

            for (var col = 0; col < DomainGaSpaceDim; col++)
            {
                var mv = _transformedBasisBlades[col];

                foreach (var term in mv)
                {
                    matrixArray[term.Key, col] = term.Value;
                }
            }

            _multivectorTransformMatrix = MathematicaMatrix.CreateFullMatrix(CasInterface, matrixArray);
        }
Ejemplo n.º 9
0
        /// <summary>
        /// Create a non orthogonal frame based on an asymmetric inner product matrix
        /// </summary>
        /// <param name="ipm"></param>
        /// <returns></returns>
        private static GaFrameNonOrthogonal CreateNonOrthogonalFromIpm(MathematicaMatrix ipm)
        {
            MathematicaVector eigenValues;
            MathematicaMatrix eigenVectors;

            if (ipm.EigenSystem(MathematicaMatrix.EigenVectorsSpecs.OrthogonalInMatrixColumns, out eigenValues, out eigenVectors) == false)
            {
                throw new GMacSymbolicException("Cannot obtain orthogonal eigen system of the given matrix");
            }

            var baseFrame = CreateOrthogonal(eigenValues);

            var baseToDerivedOm = GaOuterMorphismFull.Create(eigenVectors);
            var derivedToBaseOm = GaOuterMorphismFull.Create(eigenVectors.Transpose());

            return(new GaFrameNonOrthogonal(baseFrame, ipm, derivedToBaseOm, baseToDerivedOm));
        }
Ejemplo n.º 10
0
        //public GAOuterMorphismFull(ISymbolicMatrix vector_transform_matrix)
        //    : base(vector_transform_matrix.CAS)
        //{
        //    int domain_ga_space_dim = GAUtils.GASpaceDim(vector_transform_matrix.Columns);
        //    int codomain_ga_space_dim = GAUtils.GASpaceDim(vector_transform_matrix.Rows);

        //    _TransformedBasisBlades  = new Multivector[domain_ga_space_dim];

        //    _TransformedBasisBlades[0] = Multivector.CreateScalar(codomain_ga_space_dim, MathematicaScalar.Create(CAS, 1));

        //    for (int id = 1 ; id <= domain_ga_space_dim - 1)
        //    {
        //        if (GAUtils.is_ID_Vector(id))
        //        {
        //            _TransformedBasisBlades[id] = CreateFromMatrixColumn(vector_transform_matrix, GAUtils.ID_To_Index(id));
        //        }
        //        else
        //        {
        //            int id1, id2;
        //            GAUtils.SeparateIDs(id, out id1, out id2);

        //            _TransformedBasisBlades[id] = Multivector.OuterProduct(_TransformedBasisBlades[id1], _TransformedBasisBlades[id2]);
        //        }
        //    }
        //}

        private void ComputeVectorTransformMatrix()
        {
            var matrixArray = new MathematicaScalar[CodomainVSpaceDim, DomainVSpaceDim];

            for (var col = 0; col < DomainVSpaceDim; col++)
            {
                var id = FrameUtils.BasisBladeId(1, col);
                var mv = _transformedBasisBlades[id];

                foreach (var term in mv)
                {
                    var row = term.Key.BasisBladeIndex();
                    matrixArray[row, col] = term.Value;
                }
            }

            _vectorTransformMatrix = MathematicaMatrix.CreateFullMatrix(CasInterface, matrixArray);
        }
Ejemplo n.º 11
0
        /// <summary>
        /// Create a derived frame system where the derived frame is the reciprocal of the base frame
        /// </summary>
        /// <param name="baseFrame"></param>
        /// <returns></returns>
        public static GaSymMetricNonOrthogonal CreateReciprocalCbmFrameSystem(GaSymFrame baseFrame)
        {
            if (baseFrame.IsOrthogonal)
            {
                var cbmat = baseFrame.Ipm.Inverse();

                var b2DOm = baseFrame.Ipm.ToOutermorphismTree();
                var d2BOm = cbmat.ToOutermorphismTree();

                var derivedFrame = CreateOrthogonal(cbmat.GetDiagonal());
                return(new GaSymMetricNonOrthogonal(baseFrame, derivedFrame, d2BOm, b2DOm));
            }

            var cbmArray = new MathematicaScalar[baseFrame.VSpaceDimension, baseFrame.VSpaceDimension];

            var mv2 = baseFrame.CreateInverseUnitPseudoScalar();

            for (var i = 0; i < baseFrame.VSpaceDimension; i++)
            {
                var id  = (1 << i) ^ baseFrame.MaxBasisBladeId;
                var mv1 = GaSymMultivector.CreateTerm(baseFrame.GaSpaceDimension, id, SymbolicUtils.Constants.One);

                var mv = baseFrame.Lcp[mv1, mv2];

                foreach (var term in mv.NonZeroTerms)
                {
                    var j = term.Key.BasisBladeIndex();

                    if ((i & 1) == 1)
                    {
                        cbmArray[i, j] = term.Value;
                    }
                    else
                    {
                        cbmArray[i, j] = -term.Value;
                    }
                }
            }

            var cbm = MathematicaMatrix.CreateFullMatrix(SymbolicUtils.Cas, cbmArray);

            return(CreateDerivedCbmFrameSystem(baseFrame, cbm));
        }
Ejemplo n.º 12
0
        public static GaSymMapUnilinearMatrix ToMatrixMap(this Dictionary <int, GaSymMultivector> basisBladeMaps, int domainVSpaceDim, int targetVSpaceDim)
        {
            var targetGaSpaceDim = targetVSpaceDim.ToGaSpaceDimension();
            var zeroMvArray      = new Expr[targetGaSpaceDim];

            return(GaSymMapUnilinearMatrix.Create(
                       MathematicaMatrix.CreateFullMatrixFromColumns(
                           SymbolicUtils.Cas,
                           Enumerable
                           .Range(0, domainVSpaceDim.ToGaSpaceDimension())
                           .Select(
                               id =>
            {
                GaSymMultivector mv;
                basisBladeMaps.TryGetValue(id, out mv);

                return mv?.TermsToExprArray()
                ?? zeroMvArray;
            }
                               )
                           )
                       ));
        }
Ejemplo n.º 13
0
        ///Set the signature of the current frame to a base frame with a change of basis matrix
        private GaFrame translate_Frame_Signature_CBM(ParseTreeNode node)
        {
            var baseFrame =
                (GMacFrame)GMacValueAccessGenerator.Translate_Direct(Context, node.ChildNodes[0], RoleNames.Frame);

            if (baseFrame.VSpaceDimension != _vSpaceDim)
            {
                CompilationLog.RaiseGeneratorError <int>("Base frame must be of dimension " + _vSpaceDim, node.ChildNodes[0]);
            }

            var cbmMatrix = MathematicaMatrix.Create(Cas, GenUtils.Translate_StringLiteral(node.ChildNodes[1]));

            if (cbmMatrix.IsInvertable() == false || cbmMatrix.Rows != _vSpaceDim)
            {
                CompilationLog.RaiseGeneratorError <int>("Expecting a square invertable matrix with " + _vSpaceDim + " rows", node.ChildNodes[1]);
            }

            _baseFrame = baseFrame;

            var derivedFrameSystem = GaFrame.CreateDerivedCbmFrameSystem(baseFrame.AssociatedSymbolicFrame, cbmMatrix);

            return(derivedFrameSystem.DerivedFrame);
        }
Ejemplo n.º 14
0
        public static GaSymFrameNonOrthogonal CreateConformal(int vSpaceDim)
        {
            VerifyVSpaceDim(vSpaceDim, 3);

            var eSpaceDim    = vSpaceDim - 2;
            var listComposer = new ListComposer(",")
            {
                FinalPrefix = "{",
                FinalSuffix = "}"
            };

            for (var i = 0; i < eSpaceDim; i++)
            {
                listComposer.Add(
                    (1 << i)
                    .PatternToSequence(vSpaceDim, "0", "1")
                    .Concatenate(",", "{", "}")
                    );
            }

            listComposer.Add(
                "{" +
                0.PatternToSequence(eSpaceDim, "0", "1").Concatenate(",") +
                ",0,-1}"
                );

            listComposer.Add(
                "{" +
                0.PatternToSequence(eSpaceDim, "0", "1").Concatenate(",") +
                ",-1,0}"
                );

            var ipm = MathematicaMatrix.Create(SymbolicUtils.Cas, listComposer.ToString());

            return(CreateNonOrthogonalFromIpm(ipm));
        }
Ejemplo n.º 15
0
 public static string DescribeMatrix(MathematicaMatrix matrix)
 {
     return(matrix.ToString());
 }
Ejemplo n.º 16
0
 public MathematicaMatrix ToMathematicaSparseMatrix()
 {
     return(MathematicaMatrix.CreateIdentity(CasInterface, _size, false));
 }
Ejemplo n.º 17
0
 public MathematicaMatrix ToMathematicaFullMatrix()
 {
     return(MathematicaMatrix.CreateIdentity(CasInterface, _size));
 }
Ejemplo n.º 18
0
        public static void BasicOpsTest()
        {
            var s   = MathematicaScalar.Create(Cas, -2);
            var v   = MathematicaVector.CreateFullVector(Cas, Cas.Constants.One, Cas.Constants.Pi, Cas.Constants.MinusOne);
            var m1  = MathematicaMatrix.Create(Cas, "RandomInteger[{-5, 5}, {3, 4}]");
            var m2  = MathematicaMatrix.CreateFullDiagonalMatrix(Cas, Cas.Constants.One, Cas.Constants.Pi, Cas.Constants.MinusOne);
            var sm3 = MathematicaMatrix.Create(Cas, "SparseArray[{{1, 0, 0, 0}, {0, 2, 0, 4}, {0, 0, 0, 3}}]");
            var sm4 = m2.ToMathematicaSparseMatrix();

            TestUtils.AddTestStartingMessage("MathematicaMatrix Basic Operations Test Started.");

            TestUtils.AddTest("Try get rows of full 3x4 matrix ... ", m1.RowCount);
            TestUtils.AddTest("Try get columns of full 3x4 matrix ... ", m1.ColumnCount);

            TestUtils.AddTest("Try get rows of sparse 3x4 matrix ... ", sm3.RowCount);
            TestUtils.AddTest("Try get columns of sparse 3x4 matrix ... ", sm3.ColumnCount);

            for (var i = 0; i < m1.RowCount; i++)
            {
                for (var j = 0; j < m1.ColumnCount; j++)
                {
                    TestUtils.AddTest("Try get component (" + i + ", " + j + ") of full 3x4 matrix " + m1.ExpressionText + " ... ", m1[i, j]);
                }
            }

            for (var i = 0; i < sm3.RowCount; i++)
            {
                for (var j = 0; j < sm3.ColumnCount; j++)
                {
                    TestUtils.AddTest("Try get component (" + i + ", " + j + ") of sparse 3x4 matrix " + sm3.ToMathematicaFullMatrix().ExpressionText + " ... ", sm3[i, j]);
                }
            }

            for (var i = 0; i < m1.RowCount; i++)
            {
                TestUtils.AddTest("Try get row " + i + " of full 3x4 matrix " + m1.ExpressionText + " ... ", m1.GetRow(i));
            }

            for (var i = 0; i < m1.ColumnCount; i++)
            {
                TestUtils.AddTest("Try get column " + i + " of full 3x4 matrix " + m1.ExpressionText + " ... ", m1.GetColumn(i));
            }

            for (var i = 0; i < sm3.RowCount; i++)
            {
                TestUtils.AddTest("Try get row " + i + " of sparse 3x4 matrix " + sm3.ToMathematicaFullMatrix().ExpressionText + " ... ", sm3.GetRow(i));
            }

            for (var i = 0; i < sm3.ColumnCount; i++)
            {
                TestUtils.AddTest("Try get column " + i + " of sparse 3x4 matrix " + sm3.ToMathematicaFullMatrix().ExpressionText + " ... ", sm3.GetColumn(i));
            }

            TestUtils.AddTest("Try get diagonal of full matrix " + m2.ExpressionText + " ... ", m2.GetDiagonal());
            TestUtils.AddTest("Try get diagonal of sparse matrix " + sm4.ToMathematicaFullMatrix().ExpressionText + " ... ", sm4.GetDiagonal());
            TestUtils.AddTest("Try negate matrix " + m2.ExpressionText + " ... ", -m2);
            TestUtils.AddTest("Try add matrix " + m1.ExpressionText + " and " + sm3.ToMathematicaFullMatrix().ExpressionText + " ... ", m1 + sm3);
            TestUtils.AddTest("Try subtract matrix " + m1.ExpressionText + " and " + sm3.ToMathematicaFullMatrix().ExpressionText + " ... ", m1 - sm3);
            TestUtils.AddTest("Try multiply matrix " + m2.ExpressionText + " and " + m1.ToMathematicaFullMatrix().ExpressionText + " ... ", m2 * m1);
            TestUtils.AddTest("Try multiply matrix " + m2.ExpressionText + " and scalar -2 ... ", m2 * s);
            TestUtils.AddTest("Try multiply scalar -2 and matrix " + m2.ExpressionText + " ... ", s * m2);
            TestUtils.AddTest("Try divide matrix " + m2.ExpressionText + " by scalar -2 ... ", m2 / s);
            TestUtils.AddTest("Try multiply matrix " + m2.ExpressionText + " and vector " + v.ExpressionText + " ... ", m2.Times(v));
            TestUtils.AddTest("Try multiply vector " + v.ExpressionText + " and matrix " + m2.ExpressionText + " ... ", v.Times(m2));
            TestUtils.AddTest("Try transpose matrix " + m2.ExpressionText + " ... ", m2.Transpose());
            TestUtils.AddTest("Try inverse matrix " + m2.ExpressionText + " ... ", m2.Inverse());
            TestUtils.AddTest("Try inverse transpose matrix " + m2.ExpressionText + " ... ", m2.InverseTranspose());

            m2 = MathematicaMatrix.Create(Cas, "{{1, -1, 0}, {-1, 2, -1}, {0, -1, 1}}");
            TestUtils.AddTest("Try get eigen values (in a vector) of matrix " + m2.ExpressionText + " ... ", m2.EigenValues_InVector());
            TestUtils.AddTest("Try get eigen values (in a matrix) of matrix " + m2.ExpressionText + " ... ", m2.EigenValues_InDiagonalMatrix());
            TestUtils.AddTest("Try get eigen vectors (as rows of a matrix) of matrix " + m2.ExpressionText + " ... ", m2.EigenVectors(MathematicaMatrix.EigenVectorsSpecs.InMatrixRows));
            TestUtils.AddTest("Try get eigen vectors (as columns of a matrix) of matrix " + m2.ExpressionText + " ... ", m2.EigenVectors(MathematicaMatrix.EigenVectorsSpecs.InMatrixColumns));
            TestUtils.AddTest("Try get eigen vectors (as orthonormal rows of a matrix) of matrix " + m2.ExpressionText + " ... ", m2.EigenVectors(MathematicaMatrix.EigenVectorsSpecs.OrthogonalInMatrixRows));
            TestUtils.AddTest("Try get eigen vectors (as orthonormal columns of a matrix) of matrix " + m2.ExpressionText + " ... ", m2.EigenVectors(MathematicaMatrix.EigenVectorsSpecs.OrthogonalInMatrixColumns));

            MathematicaVector eval1;
            MathematicaMatrix eval2;
            MathematicaMatrix evec;

            m2.EigenSystem(MathematicaMatrix.EigenVectorsSpecs.InMatrixRows, out eval1, out evec);
            TestUtils.AddTest("Try get eigen system values (in a vector) of matrix " + m2.ExpressionText + " ... ", eval1);

            m2.EigenSystem(MathematicaMatrix.EigenVectorsSpecs.InMatrixRows, out eval2, out evec);
            TestUtils.AddTest("Try get eigen system values (in a matrix) of matrix " + m2.ExpressionText + " ... ", eval2);

            m2.EigenSystem(MathematicaMatrix.EigenVectorsSpecs.InMatrixRows, out eval1, out evec);
            TestUtils.AddTest("Try get eigen system vectors (as rows of a matrix) of matrix " + m2.ExpressionText + " ... ", evec);

            m2.EigenSystem(MathematicaMatrix.EigenVectorsSpecs.InMatrixColumns, out eval1, out evec);
            TestUtils.AddTest("Try get eigen system vectors (as columns of a matrix) of matrix " + m2.ExpressionText + " ... ", evec);

            m2.EigenSystem(MathematicaMatrix.EigenVectorsSpecs.OrthogonalInMatrixRows, out eval1, out evec);
            TestUtils.AddTest("Try get eigen system vectors (as orthonormal rows of a matrix) of matrix " + m2.ExpressionText + " ... ", evec);

            m2.EigenSystem(MathematicaMatrix.EigenVectorsSpecs.OrthogonalInMatrixColumns, out eval1, out evec);
            TestUtils.AddTest("Try get eigen system vectors (as orthonormal columns of a matrix) of matrix " + m2.ExpressionText + " ... ", evec);

            TestUtils.AddTestCompletionMessage("MathematicaMatrix Basic Operations Test Completed.");
        }
Ejemplo n.º 19
0
        public static void IsOpsTest()
        {
            TestUtils.AddTestStartingMessage("MathematicaMatrix 'Is' Operations Test Started.");

            var m1 = MathematicaMatrix.CreateFullDiagonalMatrix(Cas, Cas.Constants.Zero, Cas.Constants.One, Cas.Constants.TwoPi);

            TestUtils.AddTest("Try apply IsZero() to full diagonal matrix {0, 1, 2 Pi} ... ", m1.IsZero());

            var sm1 = m1.ToMathematicaSparseMatrix();

            TestUtils.AddTest("Try apply IsZero() to sparse diagonal matrix {0, 1, 2 Pi} ... ", sm1.IsZero());

            m1 = MathematicaMatrix.CreateFullDiagonalMatrix(Cas, Cas.Constants.Zero, Cas.Constants.Zero, Cas.Constants.Zero);
            TestUtils.AddTest("Try apply IsZero() to full diagonal matrix {0, 0, 0} ... ", m1.IsZero());

            sm1 = m1.ToMathematicaSparseMatrix();
            TestUtils.AddTest("Try apply IsZero() to sparse diagonal matrix {0, 0, 0} ... ", sm1.IsZero());


            m1 = MathematicaMatrix.CreateFullDiagonalMatrix(Cas, Cas.Constants.Zero, Cas.Constants.One, Cas.Constants.TwoPi);
            TestUtils.AddTest("Try apply IsIdentity() to full diagonal matrix {0, 1, 2 Pi} ... ", m1.IsIdentity());

            sm1 = m1.ToMathematicaSparseMatrix();
            TestUtils.AddTest("Try apply IsIdentity() to sparse diagonal matrix {0, 1, 2 Pi} ... ", sm1.IsIdentity());

            m1 = MathematicaMatrix.CreateIdentity(Cas, 4);
            TestUtils.AddTest("Try apply IsIdentity() to full 4x4 Identity matrix ... ", m1.IsIdentity());

            sm1 = m1.ToMathematicaSparseMatrix();
            TestUtils.AddTest("Try apply IsIdentity() to sparse 4x4 Identity matrix ... ", sm1.IsIdentity());


            m1 = MathematicaMatrix.CreateFullDiagonalMatrix(Cas, Cas.Constants.Zero, Cas.Constants.One, Cas.Constants.TwoPi);
            TestUtils.AddTest("Try apply IsDiagonal() to full diagonal matrix {0, 1, 2 Pi} ... ", m1.IsDiagonal());

            sm1 = m1.ToMathematicaSparseMatrix();
            TestUtils.AddTest("Try apply IsDiagonal() to sparse diagonal matrix {0, 1, 2 Pi} ... ", sm1.IsDiagonal());

            m1 = MathematicaMatrix.CreateConstant(Cas.Constants.Pi, 5, 5);
            TestUtils.AddTest("Try apply IsDiagonal() to full 5x5 matrix with non-zero elements ... ", m1.IsDiagonal());

            sm1 = MathematicaMatrix.Create(Cas, "SparseArray[RandomInteger[1, {5, 5}]]");
            TestUtils.AddTest("Try apply IsDiagonal() to sparse 5x5 matrix " + sm1.ToMathematicaFullMatrix().ExpressionText + " ... ", sm1.IsDiagonal());


            m1 = MathematicaMatrix.Create(Cas, "RandomInteger[3, {5, 5}]");
            m1 = m1 * m1.Transpose().ToMathematicaMatrix();
            TestUtils.AddTest("Try apply IsSymmetric() to full 5x5 symmetric matrix " + m1.ExpressionText + " ... ", m1.IsSymmetric());

            TestUtils.AddTest("Try apply IsSymmetric() to sparse 5x5 matrix " + sm1.ToMathematicaFullMatrix().ExpressionText + " ... ", sm1.IsSymmetric());


            m1 = MathematicaMatrix.Create(Cas, "RandomInteger[{-10, 10}, {5, 5}]");
            TestUtils.AddTest("Try apply IsInvertable() to full 5x5 matrix " + m1.ExpressionText + " ... ", m1.IsInvertable());

            sm1 = MathematicaMatrix.Create(Cas, "SparseArray[RandomInteger[1, {5, 5}]]");
            TestUtils.AddTest("Try apply IsInvertable() to sparse 5x5 matrix " + sm1.ToMathematicaFullMatrix().ExpressionText + " ... ", sm1.IsInvertable());


            m1 = MathematicaMatrix.Create(Cas, "RandomInteger[3, {5, 5}]");
            m1 = m1 * m1.Transpose().ToMathematicaMatrix();
            TestUtils.AddTest("Try apply IsOrthogonal() to full 5x5 symmetric matrix " + m1.ExpressionText + " ... ", m1.IsOrthogonal());

            TestUtils.AddTest("Try apply IsOrthogonal() to sparse 5x5 matrix " + sm1.ToMathematicaFullMatrix().ExpressionText + " ... ", sm1.IsOrthogonal());

            m1 = MathematicaMatrix.Create(Cas, Cas[Mfs.Orthogonalize[m1.Expression]]);
            TestUtils.AddTest("Try apply IsOrthogonal() to full 5x5 symmetric matrix " + m1.ExpressionText + " ... ", m1.IsOrthogonal());

            sm1 = MathematicaMatrix.Create(Cas, Cas[Mfs.SparseArray[Mfs.Orthogonalize[sm1.Expression]]]);
            TestUtils.AddTest("Try apply IsOrthogonal() to sparse 5x5 matrix " + sm1.ToMathematicaFullMatrix().ExpressionText + " ... ", sm1.IsOrthogonal());


            TestUtils.AddTestCompletionMessage("MathematicaMatrix 'Is' Operations Test Completed.");
        }
Ejemplo n.º 20
0
        /// <summary>
        /// Create a derived frame system using a change of basis matrix for the basis vectors
        /// </summary>
        /// <param name="baseFrame">The base frame. It may be any kind of frame</param>
        /// <param name="cbm">The 'Change Of Basis Vectors' matrix. It must be invertable</param>
        /// <returns></returns>
        public static GaSymMetricNonOrthogonal CreateDerivedCbmFrameSystem(GaSymFrame baseFrame, MathematicaMatrix cbm)
        {
            var baseIpm         = baseFrame.Ipm.ToMathematicaMatrix();
            var cbmTrans        = (MathematicaMatrix)cbm.Transpose();
            var cbmInverseTrans = (MathematicaMatrix)cbmTrans.Inverse();

            var ipm = cbm * baseIpm * cbmTrans;

            var baseToDerivedCba = cbmInverseTrans.ToOutermorphismTree();
            var derivedToBaseCba = cbmTrans.ToOutermorphismTree();

            if (ipm.IsDiagonal())
            {
                var derivedFrame = CreateOrthogonal(ipm.GetDiagonal());
                return(new GaSymMetricNonOrthogonal(baseFrame, derivedFrame, derivedToBaseCba, baseToDerivedCba));
            }

            if (baseFrame.IsOrthogonal)
            {
                var derivedFrame = new GaSymFrameNonOrthogonal(baseFrame, ipm, derivedToBaseCba, baseToDerivedCba);
                return(derivedFrame.NonOrthogonalMetric);
            }

            var gaFrame =
                //new GaFrameNonOrthogonal(baseFrame, ipm, derivedToBaseOm, baseToDerivedOm);
                CreateNonOrthogonalFromIpm(ipm.ToMathematicaMatrix());

            return(gaFrame.NonOrthogonalMetric);
            //return new DerivedFrameSystem(baseFrame, gaFrame, derivedToBaseOm, baseToDerivedOm);
        }
Ejemplo n.º 21
0
 public static void AddTest(string message, MathematicaMatrix result)
 {
     Log.AppendAtNewLine(message);
     Log.AppendLine(DescribeMatrix(result));
     Log.AppendLine();
 }
Ejemplo n.º 22
0
        protected override void ComputeIpm()
        {
            var v = MathematicaVector.CreateFullVector(CasInterface, BasisVectorsSignatures);

            InnerProductMatrix = MathematicaMatrix.CreateDiagonal(v);
        }
Ejemplo n.º 23
0
        /// <summary>
        /// Create a derived frame system using a change of basis matrix for the basis vectors
        /// </summary>
        /// <param name="baseFrame">The base frame. It may be any kind of frame</param>
        /// <param name="cbm">The 'Change Of Basis Vectors' matrix. It must be invertable</param>
        /// <returns></returns>
        public static DerivedFrameSystem CreateDerivedCbmFrameSystem(GaFrame baseFrame, MathematicaMatrix cbm)
        {
            var baseIpm         = baseFrame.Ipm.ToMathematicaMatrix();
            var cbmTrans        = (MathematicaMatrix)cbm.Transpose();
            var cbmInverseTrans = (MathematicaMatrix)cbmTrans.Inverse();

            var ipm = cbm * baseIpm * cbmTrans;

            var baseToDerivedOm = GaOuterMorphismFull.Create(cbmInverseTrans);
            var derivedToBaseOm = GaOuterMorphismFull.Create(cbmTrans);

            if (ipm.IsDiagonal())
            {
                var derivedFrame = CreateOrthogonal(ipm.GetDiagonal());
                return(new DerivedFrameSystem(baseFrame, derivedFrame, derivedToBaseOm, baseToDerivedOm));
            }

            if (baseFrame.IsOrthogonal)
            {
                var derivedFrame = new GaFrameNonOrthogonal(baseFrame, ipm, derivedToBaseOm, baseToDerivedOm);
                return(derivedFrame.Dfs);
            }

            var gaFrame =
                //new GaFrameNonOrthogonal(baseFrame, ipm, derivedToBaseOm, baseToDerivedOm);
                CreateNonOrthogonalFromIpm(ipm.ToMathematicaMatrix());

            return(gaFrame.Dfs);
            //return new DerivedFrameSystem(baseFrame, gaFrame, derivedToBaseOm, baseToDerivedOm);
        }
Ejemplo n.º 24
0
        public static void BasicOpsTest()
        {
            var v1  = MathematicaVector.CreateFullVector(Cas, Cas.Constants.Zero, Cas.Constants.One, Cas.Constants.TwoPi);
            var v2  = MathematicaVector.Create(Cas, @"{-1, x, Sin[t]}");
            var sv3 = MathematicaVector.Create(Cas, "SparseArray[{Rule[1, Pi], Rule[5, -1]}]");
            var s   = MathematicaScalar.Create(Cas, "x");

            TestUtils.AddTestStartingMessage("MathematicaVector Basic Operations Test Started.");

            TestUtils.AddTest("Try get size of full vector {-1, x, Sin[t]} ... ", v2.Size);
            TestUtils.AddTest("Try get 1st component of full vector {-1, x, Sin[t]} ... ", v2[0]);
            TestUtils.AddTest("Try get 2nd component of full vector {-1, x, Sin[t]} ... ", v2[1]);
            TestUtils.AddTest("Try get 3rd component of full vector {-1, x, Sin[t]} ... ", v2[2]);

            TestUtils.AddTest("Try get size of sparse vector {Pi, 0, 0, 0, -1} ... ", sv3.Size);
            TestUtils.AddTest("Try get 1st component of sparse vector {Pi, 0, 0, 0, -1} ... ", sv3[0]);
            TestUtils.AddTest("Try get 3rd component of sparse vector {Pi, 0, 0, 0, -1} ... ", sv3[2]);
            TestUtils.AddTest("Try get 5th component of sparse vector {Pi, 0, 0, 0, -1} ... ", sv3[4]);

            TestUtils.AddTest("Try list components of full vector {-1, x, Sin[t]}", "");
            var i = 0;

            foreach (var scalar in v2)
            {
                TestUtils.AddTest("   Component " + i + " ... ", scalar);
                i++;
            }

            TestUtils.AddTest("Try list components of sparse vector {Pi, 0, 0, 0, -1}", "");
            i = 0;
            foreach (var scalar in sv3)
            {
                TestUtils.AddTest("   Component " + i + " ... ", scalar);
                i++;
            }

            TestUtils.AddTest("Try negate vector {-1, x, Sin[t]} ... ", -v2);
            TestUtils.AddTest("Try add vectors {0, 1, 2 Pi} and {-1, x, Sin[t]} ... ", v1 + v2);
            TestUtils.AddTest("Try subtract vectors {0, 1, 2 Pi} and {-1, x, Sin[t]} ... ", v1 - v2);
            TestUtils.AddTest("Try find dot product of {0, 1, 2 Pi} and {-1, x, Sin[t]} ... ", v1 * v2);
            TestUtils.AddTest("Try find product of vector {-1, x, Sin[t]} with scalar x ... ", v2 * s);
            TestUtils.AddTest("Try find product of scalar x with vector {-1, x, Sin[t]} ... ", s * v2);
            TestUtils.AddTest("Try divide vector {-1, x, Sin[t]} by scalar x ... ", v2 / s);

            TestUtils.AddTest("Try apply Norm to vector {0, 1, 2 Pi} ... ", v1.Norm());
            TestUtils.AddTest("Try apply Norm2 to vector {0, 1, 2 Pi} ... ", v1.Norm2());

            var m = MathematicaMatrix.CreateFullDiagonalMatrix(Cas, Cas.Constants.One, Cas.Constants.Pi, Cas.Constants.MinusOne);

            TestUtils.AddTest("Try find product of vector {-1, x, Sin[t]} with matrix DiagonalMatrix[{1, Pi, -1}] ... ", v2.Times(m));

            TestUtils.AddTest("Try apply ToMathematicaVector() to full vector {0, 1, 2 Pi} ... ", v1.ToMathematicaVector());
            TestUtils.AddTest("Try apply ToMathematicaFullVector() to full vector {0, 1, 2 Pi} ... ", v1.ToMathematicaFullVector());
            TestUtils.AddTest("Try apply ToMathematicaSparseVector() to full vector {0, 1, 2 Pi} ... ", v1.ToMathematicaSparseVector());

            TestUtils.AddTest("Try apply ToMathematicaVector() to sparse vector {Pi, 0, 0, 0, -1} ... ", sv3.ToMathematicaVector());
            TestUtils.AddTest("Try apply ToMathematicaFullVector() to sparse vector {Pi, 0, 0, 0, -1} ... ", sv3.ToMathematicaFullVector());
            TestUtils.AddTest("Try apply ToMathematicaSparseVector() to sparse vector {Pi, 0, 0, 0, -1} ... ", sv3.ToMathematicaSparseVector());

            TestUtils.AddTestCompletionMessage("MathematicaVector Basic Operations Test Completed.");
        }