private void GenerateOutermorphismToLinearTransformMacro(AstFrame frameInfo) { var commandsList = GMacDslSyntaxFactory.SyntaxElementsList( GMacDslSyntaxFactory.DeclareLocalVariable(DefaultStructure.LinearTransform, "newTr"), GMacDslSyntaxFactory.EmptyLine(), GMacDslSyntaxFactory.FixedCode("let newTr.ImageE0 = Multivector(#E0# = '1')"), GMacDslSyntaxFactory.EmptyLine() ); for (var index = 1; index <= frameInfo.VSpaceDimension; index++) { var id = FrameUtils.BasisVectorId(index - 1); commandsList.Add( GMacDslSyntaxFactory.AssignToLocalVariable( "newTr.ImageE" + id, "om.ImageV" + index + ".@G1@" ) ); } commandsList.AddEmptyLine(); for (var grade = 2; grade <= frameInfo.VSpaceDimension; grade++) { var kvSpaceDim = frameInfo.KvSpaceDimension(grade); for (var index = 0; index < kvSpaceDim; index++) { int id = FrameUtils.BasisBladeId(grade, index); int id1, id2; id.SplitBySmallestBasisVectorId(out id1, out id2); commandsList.Add( GMacDslSyntaxFactory.AssignToLocalVariable( "newTr.ImageE" + id, " newTr.ImageE" + id1 + " op newTr.ImageE" + id2 ) ); } commandsList.AddEmptyLine(); } var commandsText = GMacLanguage.CodeGenerator.GenerateCode(commandsList); GenerateMacro( frameInfo, DefaultMacro.Outermorphism.ToLinearTransform, ComposeMacroInputs("om", DefaultStructure.Outermorphism), DefaultStructure.LinearTransform, commandsText, "newTr" ); }
public MathematicaScalar this[int grade, int index] { get { return(this[FrameUtils.BasisBladeId(grade, index)]); } set { this[FrameUtils.BasisBladeId(grade, index)] = value; } }
/// <summary> /// Create a default subspaces of k-vectors with a given grade and name /// </summary> private void DefineDefaultSubspaces_KVectors(GMacFrame frame, int grade, string subspaceName) { var basisCount = FrameUtils.KvSpaceDimension(frame.VSpaceDimension, grade); var idsList = new List <int>(basisCount); for (var index = 0; index < basisCount; index++) { idsList.Add(FrameUtils.BasisBladeId(grade, index)); } var subspaceSignature = BooleanPattern.CreateFromTrueIndexes(frame.GaSpaceDimension, idsList); var subspace = frame.DefineSubspace(subspaceName, subspaceSignature); subspace.AddCodeLocation(Context.GetCodeLocation(frame.ParseNode)); }
private void GenerateTransposeOutermorphismMacro(AstFrame frameInfo) { var inputsText = ComposeMacroInputs( "om", DefaultStructure.Outermorphism ); var commandsList = GMacDslSyntaxFactory.SyntaxElementsList( GMacDslSyntaxFactory.DeclareLocalVariable(DefaultStructure.Outermorphism, "newOm"), GMacDslSyntaxFactory.EmptyLine() ); var componentsText = new ListComposer("," + Environment.NewLine); for (var index1 = 1; index1 <= frameInfo.VSpaceDimension; index1++) { componentsText.Clear(); var id1 = FrameUtils.BasisBladeId(1, index1 - 1); commandsList.AddFixedCode("let newOm.ImageV" + index1 + " = Multivector("); for (var index2 = 1; index2 <= frameInfo.VSpaceDimension; index2++) { var id2 = FrameUtils.BasisBladeId(1, index2 - 1); componentsText.Add(" #E" + id2 + "# = om.ImageV" + index2 + ".#E" + id1 + "#"); } commandsList.AddFixedCode(componentsText.ToString()); commandsList.AddFixedCode(")"); commandsList.AddEmptyLine(); } var commandsText = GMacLanguage.CodeGenerator.GenerateCode(commandsList); GenerateMacro( frameInfo, DefaultMacro.Outermorphism.Transpose, inputsText, DefaultStructure.Outermorphism, commandsText, "newOm" ); }
//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 the default subspace of odd multivectors named @odd@ /// </summary> /// <returns></returns> private GMacFrameSubspace DefineDefaultSubspaces_Odd(GMacFrame frame) { var idsList = new List <int>(frame.GaSpaceDimension); for (var grade = 1; grade <= frame.VSpaceDimension; grade = grade + 2) { var basisCount = FrameUtils.KvSpaceDimension(frame.VSpaceDimension, grade); for (var index = 0; index < basisCount; index++) { idsList.Add(FrameUtils.BasisBladeId(grade, index)); } } const string subspaceName = "Odd"; var subspaceSignature = BooleanPattern.CreateFromTrueIndexes(frame.GaSpaceDimension, idsList); var subspace = frame.DefineSubspace(subspaceName, subspaceSignature); subspace.AddCodeLocation(Context.GetCodeLocation(frame.ParseNode)); return(subspace); }
public string BasisBladeName(int grade, int index) { return(BasisVectorNames.ConcatenateUsingPattern(FrameUtils.BasisBladeId(grade, index), "E0", "^")); }
private void translate_PredefinedBasisBladeIDs(string identName, ParseTreeNode node) { var firstChar = identName[0]; switch (firstChar) { case 'E': { int id; if (Int32.TryParse(identName.Substring(1), out id) && _frame.IsValidBasisBladeId(id)) { AddBasisBladeId(id); } else { CompilationLog.RaiseGeneratorError <int>("Basis blades set not recognized", node); } } break; case 'B': { var id = identName.Substring(1).StringToPattern(); if (_frame.IsValidBasisBladeId(id)) { AddBasisBladeId(id); } else { CompilationLog.RaiseGeneratorError <int>("Basis blades set not recognized", node); } } break; case 'G': { var pos = identName.IndexOf('I'); if (pos < 2 || pos == identName.Length - 1) { CompilationLog.RaiseGeneratorError <int>("Basis blades set not recognized", node); } var gradeText = identName.Substring(1, pos - 1); var indexText = identName.Substring(pos + 1); int grade, index; if ( Int32.TryParse(gradeText, out grade) && Int32.TryParse(indexText, out index) && _frame.IsValidBasisBladeGradeIndex(grade, index) ) { AddBasisBladeId(FrameUtils.BasisBladeId(grade, index)); } else { CompilationLog.RaiseGeneratorError <int>("Basis blades set not recognized", node); } } break; default: CompilationLog.RaiseGeneratorError <int>("Basis blades set not recognized", node); break; } }