コード例 #1
0
        private void GenerateMethods(int inputGrade)
        {
            var gpCaseText = new ListComposer("," + Environment.NewLine);

            var gradesList = CurrentFrame.GradesOfEGp(inputGrade, inputGrade);

            foreach (var outputGrade in gradesList)
            {
                var funcName =
                    BladesLibraryGenerator
                    .GetBinaryFunctionName(OperatorName, inputGrade, inputGrade, outputGrade);

                GenerateMethod(
                    funcName,
                    inputGrade,
                    outputGrade
                    );

                gpCaseText.Add(Templates["selfgp_case"],
                               "frame", CurrentFrameName,
                               "grade", outputGrade,
                               "name", funcName
                               );
            }

            TextComposer.AppendAtNewLine(
                Templates["selfgp"],
                "frame", CurrentFrameName,
                "name", BladesLibraryGenerator.GetBinaryFunctionName(OperatorName, inputGrade, inputGrade),
                "double", GMacLanguage.ScalarTypeName,
                "selfgp_case", gpCaseText
                );
        }
コード例 #2
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);
        }
コード例 #3
0
        //private GMacInfoMacro AddEuclideanDualGMacMacro()
        //{
        //    var codeText =
        //        Templates["edual_macro"].GenerateUsing(CurrentFrameName);

        //    var gmacMacro =
        //        _tempSymbolsCompiler.CompileMacro(
        //            codeText,
        //            _currentFrame.AssociatedFrame.ChildScope
        //            );

        //    return new GMacInfoMacro(gmacMacro);
        //}

        private void GenerateEuclideanDualFunction(int inGrade, AstMacro macroInfo)
        {
            var macroGenerator = LibraryComposer.CreateMacroCodeGenerator(macroInfo);

            var outGrade = CurrentFrame.VSpaceDimension - inGrade;

            macroGenerator.ActionSetMacroParametersBindings =
                macroBinding =>
            {
                macroBinding.BindMultivectorPartToVariables("result", outGrade);
                macroBinding.BindMultivectorPartToVariables("mv", inGrade);
            };

            macroGenerator.ActionSetTargetVariablesNames =
                targetNaming =>
            {
                BladesLibraryGenerator.SetBasisBladeToArrayNaming(targetNaming, "result", outGrade, "c");
                BladesLibraryGenerator.SetBasisBladeToArrayNaming(targetNaming, "mv", inGrade, "coefs");
                BladesLibraryGenerator.SetTargetTempVariablesNames(targetNaming);
            };

            //Generate code from macro binding
            var computationsText = macroGenerator.Generate();

            TextComposer.Append(
                Templates["edual"],
                "double", GMacLanguage.ScalarTypeName,
                "grade", inGrade,
                "num", CurrentFrame.KvSpaceDimension(inGrade),
                "computations", computationsText
                );
        }
        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());
        }
コード例 #5
0
        private void GenerateMainMethod()
        {
            var casesText = new ListComposer(Environment.NewLine);

            foreach (var inGrade1 in CurrentFrame.Grades())
            {
                foreach (var inGrade2 in CurrentFrame.Grades())
                {
                    var id = inGrade1 + inGrade2 * CurrentFrame.GradesCount;

                    casesText.Add(Templates["dp_main_case"],
                                  "name", BladesLibraryGenerator.GetBinaryFunctionName(OperatorName, inGrade1, inGrade2),
                                  "id", id,
                                  "g1", inGrade1,
                                  "g2", inGrade2,
                                  "frame", CurrentFrameName
                                  );
                }
            }

            TextComposer.AppendAtNewLine(
                Templates["dp_main"],
                "name", OperatorName,
                "frame", CurrentFrameName,
                "cases", casesText
                );
        }
コード例 #6
0
        private void GenerateMethods(int inGrade1, int inGrade2)
        {
            var gpCaseText = new ListComposer(Environment.NewLine);
            var gradesList = CurrentFrame.GradesOfEGp(inGrade1, inGrade2).OrderByDescending(grade => grade);

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

                gpCaseText.Add(Templates["dp_case"],
                               "name", funcName,
                               "num", CurrentFrame.KvSpaceDimension(outGrade),
                               "frame", CurrentFrameName,
                               "grade", outGrade
                               );
            }

            TextComposer.AppendAtNewLine(
                Templates["dp"],
                "frame", CurrentFrameName,
                "name", BladesLibraryGenerator.GetBinaryFunctionName(OperatorName, inGrade1, inGrade2),
                "double", GMacLanguage.ScalarTypeName,
                "dp_case", gpCaseText
                );
        }
コード例 #7
0
        protected override void SetTargetVariablesNames(GMacTargetVariablesNaming targetNaming)
        {
            targetNaming.SetScalarParameter(targetNaming.BaseMacro.OutputParameterValueAccess, "result");

            BladesLibraryGenerator.SetBasisBladeToArrayNaming(targetNaming, "mv", _inGrade, "coefs");

            BladesLibraryGenerator.SetTargetTempVariablesNames(targetNaming);
        }
コード例 #8
0
        protected override void SetTargetVariablesNames(GMacTargetVariablesNaming targetNaming)
        {
            BladesLibraryGenerator.SetBasisBladeToArrayNaming(targetNaming, "result", OutputGrade, "c");

            BladesLibraryGenerator.SetBasisBladeToArrayNaming(targetNaming, "v", InputGrade1, "coefs1");
            BladesLibraryGenerator.SetBasisBladeToArrayNaming(targetNaming, "mv", InputGrade2, "coefs2");

            BladesLibraryGenerator.SetTargetTempVariablesNames(targetNaming);
        }
コード例 #9
0
        private void GenerateSelfDpGradeFunction(int inGrade, AstMacro selfEgpMacroInfo)
        {
            var macroGenerator = LibraryComposer.CreateMacroCodeGenerator(selfEgpMacroInfo);

            var outGradesList =
                CurrentFrame
                .GradesOfEGp(inGrade, inGrade)
                .Where(grade => grade > 0)
                .OrderByDescending(g => g);

            macroGenerator.ActionSetMacroParametersBindings =
                macroBinding =>
            {
                foreach (var outGrade in outGradesList)
                {
                    macroBinding.BindMultivectorPartToVariables("result", outGrade);
                }

                macroBinding.BindMultivectorPartToVariables("mv", inGrade);
            };

            macroGenerator.ActionSetTargetVariablesNames =
                targetNaming =>
            {
                foreach (var outGrade in outGradesList)
                {
                    targetNaming.SetMultivectorParameters("result", outGrade, id => "c");
                }

                BladesLibraryGenerator.SetBasisBladeToArrayNaming(targetNaming, "mv", inGrade, "coefs");

                BladesLibraryGenerator.SetTargetTempVariablesNames(targetNaming);
            };

            macroGenerator.ActionBeforeGenerateSingleComputation =
                TestSelfDpGradeFunctionComputationCondition;

            macroGenerator.ActionAfterGenerateSingleComputation =
                AddSelfDpGradeFunctionComputationCondition;

            macroGenerator.MacroBinding.FixOutputComputationsOrder = true;

            //Generate code from macro binding
            var computationsText = macroGenerator.Generate();

            TextComposer.Append(
                Templates["self_dp_grade"],
                "grade", inGrade,
                "double", GMacLanguage.ScalarTypeName,
                "computations", computationsText
                );
        }
コード例 #10
0
        protected override void SetTargetVariablesNames(GMacTargetVariablesNaming targetNaming)
        {
            BladesLibraryGenerator.SetBasisBladeToArrayNaming(targetNaming, "result", _outGrade, "coefs");

            for (var gradeIdx = 0; gradeIdx < _outGrade; gradeIdx++)
            {
                var vectorName = "vectors[" + gradeIdx + "].C";

                targetNaming.SetMultivectorParameters(
                    "v" + gradeIdx + ".@G1@",
                    id => vectorName + (CurrentFrame.BasisBladeIndex(id) + 1)
                    );
            }

            BladesLibraryGenerator.SetTargetTempVariablesNames(targetNaming);
        }
コード例 #11
0
        protected override void SetTargetVariablesNames(GMacTargetVariablesNaming targetNaming)
        {
            var outputParam = targetNaming.BaseMacro.OutputParameterValueAccess;

            if (outputParam.GMacType.IsValidMultivectorType)
            {
                BladesLibraryGenerator.SetBasisBladeToArrayNaming(targetNaming, outputParam, _outGrade, "c");
            }
            else
            {
                targetNaming.SetScalarParameter(outputParam, "c[0]");
            }

            BladesLibraryGenerator.SetBasisBladeToArrayNaming(targetNaming, "mv", _inGrade, "coefs");

            BladesLibraryGenerator.SetTargetTempVariablesNames(targetNaming);
        }
コード例 #12
0
        private string GenerateOutermorphismDeterminantCode(string opName)
        {
            var macroGenerator = CreateMacroCodeGenerator(opName);

            macroGenerator.ActionSetMacroParametersBindings =
                macroBinding =>
            {
                macroBinding.BindToVariables("result");

                for (var i = 0; i < CurrentFrame.VSpaceDimension; i++)
                {
                    var id = CurrentFrame.BasisVectorId(i);

                    for (var j = 0; j < CurrentFrame.VSpaceDimension; j++)
                    {
                        var valueAccessName = "om.ImageV" + (j + 1) + ".#E" + id + "#";

                        macroBinding.BindToVariables(valueAccessName);
                    }
                }
            };

            macroGenerator.ActionSetTargetVariablesNames =
                targetNaming =>
            {
                targetNaming.SetScalarParameter("result", "det");

                for (var i = 0; i < CurrentFrame.VSpaceDimension; i++)
                {
                    var id = CurrentFrame.BasisVectorId(i);

                    for (var j = 0; j < CurrentFrame.VSpaceDimension; j++)
                    {
                        var varName = "Coefs".CoefPart(i, j);

                        var valueAccessName = "om.ImageV" + (j + 1) + ".#E" + id + "#";

                        targetNaming.SetScalarParameter(valueAccessName, varName);
                    }
                }

                BladesLibraryGenerator.SetTargetTempVariablesNames(targetNaming);
            };

            return(macroGenerator.Generate());
        }
コード例 #13
0
        protected override void SetTargetVariablesNames(GMacTargetVariablesNaming targetNaming)
        {
            BladesLibraryGenerator.SetBasisBladeToArrayNaming(targetNaming, "B", InputGrade, "coefs");

            for (var idx = 1; idx <= InputGrade; idx++)
            {
                var valueAccessName = "result.f" + idx + ".@G1@";

                var outputName = "vectors[" + (idx - 1) + "].C";

                targetNaming.SetMultivectorParameters(
                    valueAccessName,
                    vectorId => outputName + (CurrentFrame.BasisBladeIndex(vectorId) + 1)
                    );
            }

            BladesLibraryGenerator.SetTargetTempVariablesNames(targetNaming);
        }
コード例 #14
0
        protected override void SetTargetVariablesNames(GMacTargetVariablesNaming targetNaming)
        {
            BladesLibraryGenerator.SetBasisBladeToArrayNaming(targetNaming, "result", InputGrade, "coefs");
            BladesLibraryGenerator.SetBasisBladeToArrayNaming(targetNaming, "mv", InputGrade, "bladeCoefs");

            for (var i = 0; i < CurrentFrame.VSpaceDimension; i++)
            {
                var id = CurrentFrame.BasisVectorId(i);

                for (var j = 0; j < CurrentFrame.VSpaceDimension; j++)
                {
                    var varName = "omCoefs".CoefPart(i, j);

                    var valueAccessName = "om.ImageV" + (j + 1) + ".#E" + id + "#";

                    targetNaming.SetScalarParameter(valueAccessName, varName);
                }
            }

            BladesLibraryGenerator.SetTargetTempVariablesNames(targetNaming);
        }
コード例 #15
0
        public override void Generate()
        {
            GenerateBladeFileStartCode();

            var t2 = Templates["applyversor_main_case"];

            var casesText = new ListComposer(Environment.NewLine);

            foreach (var inGrade1 in CurrentFrame.Grades())
            {
                foreach (var inGrade2 in CurrentFrame.Grades())
                {
                    var outGrade = inGrade2;

                    var id = inGrade1 + inGrade2 * CurrentFrame.GradesCount;

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

                    casesText.Add(t2,
                                  "name", name,
                                  "id", id,
                                  "g1", inGrade1,
                                  "g2", inGrade2,
                                  "grade", outGrade,
                                  "frame", CurrentFrameName
                                  );
                }
            }

            TextComposer.AppendAtNewLine(
                Templates["applyversor_main"],
                "name", OperatorName,
                "frame", CurrentFrameName,
                "cases", casesText
                );

            GenerateBladeFileFinishCode();

            FileComposer.FinalizeText();
        }
コード例 #16
0
        private void GenerateMainMethod()
        {
            var casesTemplate = Templates["selfgp_main_case"];

            var casesText = new ListComposer(Environment.NewLine);

            foreach (var grade in CurrentFrame.Grades())
            {
                casesText.Add(
                    casesTemplate,
                    "name", BladesLibraryGenerator.GetBinaryFunctionName(OperatorName, grade, grade),
                    "grade", grade,
                    "frame", CurrentFrameName
                    );
            }

            TextComposer.AppendAtNewLine(
                Templates["selfgp_main"],
                "name", OperatorName,
                "frame", CurrentFrameName,
                "cases", casesText
                );
        }