private string GenerateDeclarations(int grade) { var kvDim = CurrentFrame.KvSpaceDimension(grade); var template = Templates["static_basisblade_declare"]; var declaresText = new ListComposer(Environment.NewLine); var coefsText = new ListComposer(", "); for (var index = 0; index < kvDim; index++) { coefsText.Clear(); for (var i = 0; i < kvDim; i++) { coefsText.Add((i == index) ? "1.0D" : "0.0D"); } declaresText.Add( template, "frame", CurrentFrameName, "id", CurrentFrame.BasisBladeId(grade, index), "grade", grade, "coefs", coefsText ); } declaresText.Add(""); return(declaresText.ToString()); }
private string GenerateOutermorphismComposeCode() { var codeText = new ListComposer(Environment.NewLine); var sumText = new ListComposer(" + "); for (var i = 0; i < CurrentFrame.VSpaceDimension; i++) { for (var j = 0; j < CurrentFrame.VSpaceDimension; j++) { sumText.Clear(); for (var k = 0; k < CurrentFrame.VSpaceDimension; k++) { sumText.Add( "om1.Coefs".CoefPart(i, k) + " * " + "om2.Coefs".CoefPart(k, j) ); } codeText.Add( "coefs".CoefPart(i, j) + " = " + sumText + ";" ); } } return(codeText.ToString()); }
public override void Generate() { var textCollection = new ListComposerCollection( "basis_vectors", "members_declare", "init_inputs", "init_assign", "init_assign_array", "members_list", "normalize", "enorm2" ) { ["basis_vectors"] = { Separator = "," + Environment.NewLine }, ["members_declare"] = { Separator = Environment.NewLine }, ["init_inputs"] = { Separator = ", " }, ["init_assign"] = { Separator = Environment.NewLine }, ["init_assign_array"] = { Separator = Environment.NewLine }, ["members_list"] = { Separator = ", " }, ["normalize"] = { Separator = Environment.NewLine }, ["enorm2"] = { Separator = " + " } }; var basisVectorsCoefsText = new ListComposer(", "); for (var idx = 1; idx <= CurrentFrame.VSpaceDimension; idx++) { basisVectorsCoefsText.Clear(); basisVectorsCoefsText.AddRange( (1 << (idx - 1)).PatternToSequence(CurrentFrame.VSpaceDimension, "0.0D", "1.0D") ); textCollection["basis_vectors"].Add("new " + CurrentFrameName + "Vector(" + basisVectorsCoefsText + ")"); textCollection["members_declare"].Add("public double C" + idx + " { get; set; }"); textCollection["init_inputs"].Add(GMacLanguage.ScalarTypeName + " c" + idx); textCollection["init_assign"].Add("C" + idx + " = c" + idx + ";"); textCollection["init_assign_array"].Add("C" + idx + " = c[" + (idx - 1) + "];"); textCollection["members_list"].Add("C" + idx); textCollection["normalize"].Add("C" + idx + " *= invScalar;"); textCollection["enorm2"].Add("C" + idx + " * C" + idx); } Templates["vector"].SetParametersValues(textCollection); TextComposer.Append(Templates["vector"], "frame", CurrentFrameName, "double", GMacLanguage.ScalarTypeName, "norm2", textCollection["enorm2"].ToString() //TODO: This must be computed from the frame ); FileComposer.FinalizeText(); }
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 = GMacMathUtils.BasisBladeId(1, index1 - 1); commandsList.AddFixedCode("let newOm.ImageV" + index1 + " = Multivector("); for (var index2 = 1; index2 <= frameInfo.VSpaceDimension; index2++) { var id2 = GMacMathUtils.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" ); }
private void GenerateTransposeLinearTransformMacro(AstFrame frameInfo) { var inputsText = ComposeMacroInputs( "tr", DefaultStructure.LinearTransform ); var commandsList = GMacDslSyntaxFactory.SyntaxElementsList( GMacDslSyntaxFactory.DeclareLocalVariable(DefaultStructure.LinearTransform, "newTr"), GMacDslSyntaxFactory.EmptyLine() ); var componentsText = new ListComposer("," + Environment.NewLine); for (var id1 = 0; id1 <= frameInfo.MaxBasisBladeId; id1++) { componentsText.Clear(); commandsList.AddFixedCode("let newTr.ImageE" + id1 + " = Multivector("); for (var id2 = 0; id2 <= frameInfo.MaxBasisBladeId; id2++) { componentsText.Add(" #E" + id2 + "# = tr.ImageE" + id2 + ".#E" + id1 + "#"); } commandsList.AddFixedCode(componentsText.ToString()); commandsList.AddFixedCode(")"); commandsList.AddEmptyLine(); } var commandsText = GMacLanguage.CodeGenerator.GenerateCode(commandsList); GenerateMacro( frameInfo, DefaultMacro.LinearTransform.Transpose, inputsText, DefaultStructure.LinearTransform, commandsText, "newTr" ); }
private void GenerateStructures(AstFrame frameInfo) { var membersText = new ListComposer("," + Environment.NewLine); for (var id = 0; id <= frameInfo.MaxBasisBladeId; id++) { membersText.Add( Templates["structure_member"], "name", "ImageE" + id, "type", frameInfo.FrameMultivector.Name ); } ActiveFileTextComposer.Append( Templates["structure"], "frame", frameInfo.Name, "name", DefaultStructure.LinearTransform, "members", membersText ); membersText.Clear(); for (var index = 1; index <= frameInfo.VSpaceDimension; index++) { membersText.Add( Templates["structure_member"], "name", "ImageV" + index, "type", frameInfo.FrameMultivector.Name ); } ActiveFileTextComposer.Append( Templates["structure"], "frame", frameInfo.Name, "name", DefaultStructure.Outermorphism, "members", membersText ); }