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 )); }
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); }
public static MathematicaMatrix ToMatrix(this IGaSymMapUnilinear linearMap) { return(MathematicaMatrix.CreateFullMatrix( SymbolicUtils.Cas, ToExprScalarsArray(linearMap) )); }
public static GaSymOutermorphism CreateIdentity(int vSpaceDim) { return(new GaSymOutermorphism( MathematicaMatrix.CreateIdentity(SymbolicUtils.Cas, vSpaceDim), GaSymMapUnilinearIdentity.Create(vSpaceDim), GaUnilinearMapImplementation.Identity )); }
protected override void ComputeIpm() { var bvSig = _basisVectorsSignatures.Select(i => MathematicaScalar.Create(CasInterface, i)); var v = MathematicaVector.CreateFullVector(CasInterface, bvSig); InnerProductMatrix = MathematicaMatrix.CreateDiagonal(v); }
///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)); }
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."); }
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); }
/// <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)); }
//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); }
/// <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)); }
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; } ) ) )); }
///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); }
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)); }
public static string DescribeMatrix(MathematicaMatrix matrix) { return(matrix.ToString()); }
public MathematicaMatrix ToMathematicaSparseMatrix() { return(MathematicaMatrix.CreateIdentity(CasInterface, _size, false)); }
public MathematicaMatrix ToMathematicaFullMatrix() { return(MathematicaMatrix.CreateIdentity(CasInterface, _size)); }
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."); }
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."); }
/// <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); }
public static void AddTest(string message, MathematicaMatrix result) { Log.AppendAtNewLine(message); Log.AppendLine(DescribeMatrix(result)); Log.AppendLine(); }
protected override void ComputeIpm() { var v = MathematicaVector.CreateFullVector(CasInterface, BasisVectorsSignatures); InnerProductMatrix = MathematicaMatrix.CreateDiagonal(v); }
/// <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); }
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."); }