示例#1
0
        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();
        }
示例#4
0
        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"
                );
        }
示例#6
0
        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
                );
        }