Exemplo n.º 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());
        }
        public string GetCasesText()
        {
            var t2 = Templates["bilinearproduct_main_case"];

            var casesText = new ListComposer(Environment.NewLine);

            foreach (var grade1 in CurrentFrame.Grades())
            {
                foreach (var grade2 in CurrentFrame.Grades())
                {
                    if (IsLegalGrade(grade1, grade2) == false)
                    {
                        continue;
                    }

                    var grade = GetFinalGrade(grade1, grade2);

                    var id = grade1 + grade2 * CurrentFrame.GradesCount;

                    var name = BladesLibraryGenerator.GetBinaryFunctionName(OperatorName, grade1, grade2, grade);

                    casesText.Add(t2,
                                  "name", name,
                                  "id", id,
                                  "g1", grade1,
                                  "g2", grade2,
                                  "grade", grade,
                                  "frame", CurrentFrameName
                                  );
                }
            }

            return(casesText.ToString());
        }
Exemplo n.º 3
0
        private void GenerateMethods(int inGrade1, int inGrade2)
        {
            var gpCaseText = new ListComposer("," + Environment.NewLine);

            var gradesList =
                DualFlag
                ? Frame.GradesOfEGp(inGrade1, inGrade2)
                .Select(grade => Frame.VSpaceDimension - grade)

                : Frame.GradesOfEGp(inGrade1, inGrade2);

            foreach (var outGrade in gradesList)
            {
                var funcName = BladesLibraryGenerator.GetBinaryFunctionName(OperatorName, inGrade1, inGrade2, outGrade);

                BladesLibraryGenerator.GenerateBilinearProductMethodFile(
                    OperatorName,
                    funcName,
                    inGrade1,
                    inGrade2,
                    outGrade
                    );

                gpCaseText.Add(Templates["gp_case"],
                               "frame", FrameTargetName,
                               "grade", outGrade,
                               "name", funcName
                               );
            }

            var name = BladesLibraryGenerator.GetBinaryFunctionName(OperatorName, inGrade1, inGrade2);

            _mainFileGenerator.GenerateIntermediateMethod(gpCaseText.ToString(), name);
        }
Exemplo n.º 4
0
        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());
        }
Exemplo n.º 5
0
            public override string ToString()
            {
                var composer = new ListComposer(" + ")
                {
                    FinalPrefix = TargetBasisBladeId.BasisBladeIndexedName() + ": { ",
                    FinalSuffix = " }"
                };

                composer.AddRange(TermsText);

                return(composer.ToString());
            }
Exemplo n.º 6
0
        private string GenerateSubtractMethodCode(MvClassData resultClassData)
        {
            //The two classes are zero multivector classes
            if (resultClassData.ClassId == 0)
            {
                return("return Zero;");
            }

            var idCommon = ClassData.ClassId & CalcClassData.ClassId;

            var idDiff1 = ClassData.ClassId & ~CalcClassData.ClassId;

            var idDiff2 = ~ClassData.ClassId & CalcClassData.ClassId;

            var composer = new ListComposer("," + Environment.NewLine)
            {
                FinalPrefix      = "return new " + resultClassData.ClassName + "()" + Environment.NewLine + "{" + Environment.NewLine,
                FinalSuffix      = Environment.NewLine + "};",
                ActiveItemPrefix = "    "
            };

            var basisBlades = ClassData.Frame.BasisBladesOfGrades(idDiff1.PatternToPositions());

            foreach (var basisBlade in basisBlades)
            {
                composer.Add(
                    $"{basisBlade.GradeIndexName} = {basisBlade.GradeIndexName}"
                    );
            }

            basisBlades = ClassData.Frame.BasisBladesOfGrades(idDiff2.PatternToPositions());

            foreach (var basisBlade in basisBlades)
            {
                composer.Add(
                    $"{basisBlade.GradeIndexName} = {"-mv." + basisBlade.GradeIndexName}"
                    );
            }

            basisBlades = ClassData.Frame.BasisBladesOfGrades(idCommon.PatternToPositions());

            foreach (var basisBlade in basisBlades)
            {
                var term = basisBlade.GradeIndexName + " - mv." + basisBlade.GradeIndexName;

                composer.Add(
                    $"{basisBlade.GradeIndexName} = {term}"
                    );
            }

            return(composer.ToString());
        }
Exemplo n.º 7
0
        private string GenerateIsEqualMethodCode()
        {
            //The two classes are zero multivector classes
            if (ClassData.ClassId == 0 && CalcClassData.ClassId == 0)
            {
                return("return true;");
            }

            var idCommon = ClassData.ClassId & CalcClassData.ClassId;

            var idDiff1 = ClassData.ClassId & ~CalcClassData.ClassId;

            var idDiff2 = ~ClassData.ClassId & CalcClassData.ClassId;

            var composer = new ListComposer(" || " + Environment.NewLine)
            {
                FinalPrefix      = "return !(" + Environment.NewLine,
                FinalSuffix      = Environment.NewLine + ");",
                ActiveItemPrefix = "    "
            };

            var basisBlades = ClassData.Frame.BasisBladesOfGrades(idDiff1.PatternToPositions());

            foreach (var basisBlade in basisBlades)
            {
                composer.Add(
                    String.Format("{0} <= -Epsilon || {0} >= Epsilon", basisBlade.GradeIndexName)
                    );
            }

            basisBlades = ClassData.Frame.BasisBladesOfGrades(idDiff2.PatternToPositions());

            foreach (var basisBlade in basisBlades)
            {
                composer.Add(
                    String.Format("{0} <= -Epsilon || {0} >= Epsilon", "mv." + basisBlade.GradeIndexName)
                    );
            }

            basisBlades = ClassData.Frame.BasisBladesOfGrades(idCommon.PatternToPositions());

            foreach (var basisBlade in basisBlades)
            {
                var term = "(" + basisBlade.GradeIndexName + " - mv." + basisBlade.GradeIndexName + ")";

                composer.Add(
                    String.Format("{0} <= -Epsilon || {0} >= Epsilon", term)
                    );
            }

            return(composer.ToString());
        }
Exemplo n.º 8
0
        public override string ToString()
        {
            var composer = new ListComposer(" + ");

            foreach (var pair in _internalDictionary.OrderBy(p => p.Key))
            {
                composer.Add(
                    pair.Value + " " + pair.Key.BasisBladeName()
                    );
            }

            return(composer.ToString());
        }
Exemplo n.º 9
0
        private string GenerateOutermorphismApplyCasesCode()
        {
            var codeText = new ListComposer(Environment.NewLine);

            for (var inGrade = 1; inGrade <= CurrentFrame.VSpaceDimension; inGrade++)
            {
                codeText.Add(
                    Templates["om_apply_code_case"],
                    "grade", inGrade,
                    "frame", CurrentFrameName
                    );
            }

            return(codeText.ToString());
        }
Exemplo n.º 10
0
        private static string ComposeMacroInputs(params string[] inputsInfo)
        {
            if (inputsInfo.Length == 0)
            {
                return("");
            }

            var inputsText = new ListComposer(", ");

            for (var i = 0; i < inputsInfo.Length; i += 2)
            {
                inputsText.Add(inputsInfo[i].Trim() + " : " + inputsInfo[i + 1].Trim());
            }

            return(inputsText.ToString());
        }
Exemplo n.º 11
0
        private string GenerateOutermorphismTranposeCode()
        {
            var codeText = new ListComposer(Environment.NewLine);

            for (var i = 0; i < CurrentFrame.VSpaceDimension; i++)
            {
                for (var j = 0; j < CurrentFrame.VSpaceDimension; j++)
                {
                    codeText.Add(
                        "coefs".CoefPart(i, j) + " = " + "Coefs".CoefPart(j, i) + ";"
                        );
                }
            }

            return(codeText.ToString());
        }
Exemplo n.º 12
0
        private string GenerateAbstractMethodCases(string opName)
        {
            var composer = new ListComposer(Environment.NewLine);

            AbstractMethodCaseTemplate["op_name"] = opName;

            foreach (var classData in MvLibraryGenerator.MultivectorClassesData.Values)
            {
                composer.Add(
                    AbstractMethodCaseTemplate,
                    "id", classData.ClassId,
                    "class_name", classData.ClassName
                    );
            }

            return(composer.ToString());
        }
Exemplo n.º 13
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"
                );
        }
Exemplo n.º 14
0
        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"
                );
        }
Exemplo n.º 15
0
        /// <summary>
        /// Return a simple string to describe the given value
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public string AsString(AstValueMultivector value)
        {
            if (value.IsNullOrInvalid())
            {
                return("<Invalid Value>");
            }

            if (value.IsZero)
            {
                return("0");
            }

            var composer = new ListComposer(" + ");

            var terms = value.Terms.OrderBy(t => t.TermBasisBladeGrade).ThenBy(t => t.TermBasisBladeIndex);

            foreach (var term in terms)
            {
                if (term.TermBasisBladeId == 0)
                {
                    composer.Add(term.CoefValue);
                }

                else if (term.CoefValue.IsOne)
                {
                    composer.Add(term.BasisBlade.Name);
                }

                else if (term.CoefValue.IsMinusOne)
                {
                    composer.Add("-" + term.BasisBlade.Name);
                }

                else
                {
                    composer.Add(term.CoefValue + " " + term.BasisBlade.Name);
                }
            }

            return(composer.ToString());
        }
Exemplo n.º 16
0
        private string GenerateIsZeroCode()
        {
            if (ClassData.ClassId == 0)
            {
                return("return true;");
            }

            var composer = new ListComposer(" || " + Environment.NewLine)
            {
                FinalPrefix      = "return !(" + Environment.NewLine,
                FinalSuffix      = Environment.NewLine + ");",
                ActiveItemPrefix = "    "
            };

            foreach (var basisBlade in ClassData.ClassBasisBlades)
            {
                composer.Add(
                    String.Format("{0} <= -Epsilon || {0} >= Epsilon", basisBlade.GradeIndexName)
                    );
            }

            return(composer.ToString());
        }
Exemplo n.º 17
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));
        }