Exemple #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
                );
        }
Exemple #2
0
        private void GenerateMainInvolutionFunction(string macroName, Func <int, bool> useNegative)
        {
            var caseTemplate1 = Templates["main_negative_case"];
            var caseTemplate2 = Templates["main_negative_case2"];

            var casesText = new ListComposer(Environment.NewLine);

            foreach (var grade in CurrentFrame.Grades())
            {
                if (useNegative(grade))
                {
                    casesText.Add(caseTemplate1,
                                  "frame", CurrentFrameName,
                                  "grade", grade,
                                  "num", CurrentFrame.KvSpaceDimension(grade)
                                  );
                }
                else
                {
                    casesText.Add(caseTemplate2,
                                  "grade", grade
                                  );
                }
            }

            TextComposer.AppendAtNewLine(
                Templates["main_involution"],
                "frame", CurrentFrameName,
                "name", macroName,
                "cases", casesText
                );
        }
        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
                );
        }
Exemple #4
0
        public override void Generate()
        {
            GenerateBladeFileStartCode();

            var computationsText = GenerateComputationsCode();

            var newVectorsText = new ListComposer("," + Environment.NewLine);

            for (var i = 0; i < InputGrade; i++)
            {
                newVectorsText.Add("new " + CurrentFrameName + "Vector()");
            }

            TextComposer.AppendAtNewLine(
                Templates["factor"],
                "frame", CurrentFrameName,
                "id", InputId,
                "double", GMacLanguage.ScalarTypeName,
                "newvectors", newVectorsText,
                "computations", computationsText
                );

            GenerateBladeFileFinishCode();

            FileComposer.FinalizeText();
        }
        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
                );
        }
Exemple #6
0
        public void Visit(SteSwitchCase code)
        {
            TextComposer.AppendAtNewLine("switch (");

            code.SwitchExpression.AcceptVisitor(this);

            TextComposer
            .AppendLine(")")
            .AppendLine("{")
            .IncreaseIndentation();

            foreach (var item in code.CasesList)
            {
                item.AcceptVisitor(this);
            }

            if (code.DefaultCode != null)
            {
                TextComposer.AppendLineAtNewLine("default:").IncreaseIndentation();
                code.DefaultCode.AcceptVisitor(this);
                TextComposer.AppendLineAtNewLine("break;");
            }

            TextComposer
            .DecreaseIndentation()
            .AppendLineAtNewLine("}");
        }
Exemple #7
0
        internal void GenerateDotCode(IDotStatement statement)
        {
            TextComposer.AppendAtNewLine();

            var fixedCode = statement as DotFixedCode;

            if (fixedCode != null)
            {
                GenerateDotCode(fixedCode);

                return;
            }

            var edge = statement as DotEdge;

            if (edge != null)
            {
                GenerateDotCode(edge);

                return;
            }

            var graphAttr = statement as DotGraphAttribute;

            if (graphAttr != null)
            {
                GenerateDotCode(graphAttr);

                return;
            }

            var node = statement as DotNode;

            if (node != null)
            {
                GenerateDotCode(node);

                return;
            }

            var subGraph = statement as DotSubGraph;

            if (subGraph != null)
            {
                GenerateDotCode(subGraph);

                return;
            }

            var subGraphDefault = statement as DotSubGraphDefaults;

            if (subGraphDefault != null)
            {
                GenerateDotCode(subGraphDefault);

                return;
            }

            throw new InvalidOperationException();
        }
Exemple #8
0
        public void Visit(SteIfElse code)
        {
            TextComposer.AppendAtNewLine("if (");

            code.Condition.AcceptVisitor(this);

            TextComposer
            .AppendLine(")")
            .AppendLine("{")
            .IncreaseIndentation();

            code.TrueCode.AcceptVisitor(this);

            TextComposer
            .DecreaseIndentation()
            .AppendLineAtNewLine("}");

            if (code.ElseCode == null)
            {
                return;
            }

            TextComposer.AppendLine("else")
            .AppendLine("{")
            .IncreaseIndentation();

            code.ElseCode.AcceptVisitor(this);

            TextComposer
            .DecreaseIndentation()
            .AppendLineAtNewLine("}");
        }
Exemple #9
0
        private void GenerateMainIsZeroFunction()
        {
            var t1 = Templates["main_iszero"];
            var t2 = Templates["main_iszero_case"];
            var t3 = Templates["main_trimcoefs_case"];

            var iszeroCasesText    = new ListComposer(Environment.NewLine);
            var trimcoefsCasesText = new ListComposer(Environment.NewLine);

            foreach (var grade in CurrentFrame.Grades())
            {
                iszeroCasesText.Add(t2,
                                    "grade", grade,
                                    "num", CurrentFrame.KvSpaceDimension(grade)
                                    );

                trimcoefsCasesText.Add(t3,
                                       "frame", CurrentFrameName,
                                       "grade", grade,
                                       "num", CurrentFrame.KvSpaceDimension(grade)
                                       );
            }

            TextComposer.AppendAtNewLine(t1,
                                         "frame", CurrentFrameName,
                                         "main_iszero_case", iszeroCasesText,
                                         "main_trimcoefs_case", trimcoefsCasesText
                                         );
        }
Exemple #10
0
        public override void Visit(SteDeclareDataStore code)
        {
            if (code.LocalDataStore == false)
            {
                AddInternalComment("Non-local declaration not implemented: ", code.ToString());

                return;
            }

            if (code.InitialValue == null)
            {
                TextComposer
                .Append("declare ")
                .Append(code.DataStoreName)
                .Append(" : ")
                .Append(code.DataStoreType);

                TextComposer.AppendAtNewLine();

                return;
            }

            TextComposer
            .Append("let ")
            .Append(code.DataStoreName)
            .Append(" : ")
            .Append(code.DataStoreType)
            .Append(" = ");

            code.InitialValue.AcceptVisitor(this);

            TextComposer.AppendAtNewLine();
        }
Exemple #11
0
        public override void Visit(SteComment code)
        {
            foreach (var commentLine in code.CommentedTextLines)
            {
                TextComposer.Append("//").AppendLine(commentLine);
            }

            TextComposer.AppendAtNewLine();
        }
Exemple #12
0
 internal void GenerateIntermediateMethod(string gpCaseText, string name)
 {
     TextComposer.AppendAtNewLine(
         Templates["gp"],
         "frame", CurrentFrameName,
         "name", name,
         "double", GMacLanguage.ScalarTypeName,
         "gp_case", gpCaseText
         );
 }
        private void GenerateNormFunction(string opName, int inGrade)
        {
            _inGrade = inGrade;

            SetBaseMacro(CurrentFrame.Macro(opName));

            var computationsCode = GenerateComputationsCode();

            TextComposer.AppendAtNewLine(
                Templates["norm"],
                "name", opName,
                "grade", inGrade,
                "double", GMacLanguage.ScalarTypeName,
                "computations", computationsCode
                );
        }
Exemple #14
0
        public void Visit(TccSwitchCaseItem code)
        {
            TextComposer.AppendAtNewLine("case ");

            code.CaseValue.AcceptVisitor(this);

            TextComposer.AppendLine(":").IncreaseIndentation();

            code.CaseCode.AcceptVisitor(this);

            if (code.BreakCase)
            {
                TextComposer.AppendLineAtNewLine("break;");
            }

            TextComposer.DecreaseIndentation();
        }
Exemple #15
0
        private void GenerateMethod(string funcName, int inputGrade, int outputGrade)
        {
            _inGrade  = inputGrade;
            _outGrade = outputGrade;

            var computationsText = GenerateComputationsCode();

            var kvSpaceDim = CurrentFrame.KvSpaceDimension(_outGrade);

            TextComposer.AppendAtNewLine(
                Templates["self_bilinearproduct"],
                "name", funcName,
                "num", kvSpaceDim,
                "double", GMacLanguage.ScalarTypeName,
                "computations", computationsText
                );
        }
Exemple #16
0
        public void Visit(SteIf code)
        {
            TextComposer.AppendAtNewLine("if (");

            code.Condition.AcceptVisitor(this);

            TextComposer
            .AppendLine(")")
            .AppendLine("{")
            .IncreaseIndentation();

            code.TrueCode.AcceptVisitor(this);

            TextComposer
            .DecreaseIndentation()
            .AppendLineAtNewLine("}");
        }
Exemple #17
0
        public void Visit(SteIfElseIfElse code)
        {
            var flag = false;

            foreach (var item in code.IfList)
            {
                if (flag == false)
                {
                    TextComposer.AppendAtNewLine("if (");
                    flag = true;
                }
                else
                {
                    TextComposer.AppendAtNewLine("else if (");
                }

                item.Condition.AcceptVisitor(this);

                TextComposer
                .AppendLine(")")
                .AppendLine("{")
                .IncreaseIndentation();

                item.TrueCode.AcceptVisitor(this);

                TextComposer
                .DecreaseIndentation()
                .AppendLineAtNewLine("}");
            }

            if (code.ElseCode == null)
            {
                return;
            }

            TextComposer.AppendLine("else")
            .AppendLine("{")
            .IncreaseIndentation();

            code.ElseCode.AcceptVisitor(this);

            TextComposer
            .DecreaseIndentation()
            .AppendLineAtNewLine("}");
        }
        public override void Generate()
        {
            GenerateBladeFileStartCode();

            var casesText = GetCasesText();

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

            GenerateBladeFileFinishCode();

            FileComposer.FinalizeText();
        }
Exemple #19
0
        private void GenerateNegativeFunction(int kvSpaceDim)
        {
            var caseTemplate = Templates["negative_case"];

            var casesText = new ListComposer("," + Environment.NewLine);

            for (var i = 0; i < kvSpaceDim; i++)
            {
                casesText.Add(caseTemplate, "num", i);
            }

            TextComposer.AppendAtNewLine(
                Templates["negative"],
                "num", kvSpaceDim,
                "double", GMacLanguage.ScalarTypeName,
                "cases", casesText
                );
        }
Exemple #20
0
        public override void Visit(SteAssign code)
        {
            if (code.LocalAssignment == false)
            {
                AddInternalComment("Non-local assignment not implemented: ", code.ToString());

                return;
            }

            TextComposer.Append("let ");

            code.LeftHandSide.AcceptVisitor(this);

            TextComposer.Append(" = ");

            code.RightHandSide.AcceptVisitor(this);

            TextComposer.AppendAtNewLine();
        }
Exemple #21
0
        public void Visit(SteForLoop code)
        {
            TextComposer.AppendAtNewLine("for (");

            code.LoopInitialization.AcceptVisitor(this);

            TextComposer.Append("; ");

            code.LoopCondition.AcceptVisitor(this);

            TextComposer.Append("; ");

            code.LoopUpdate.AcceptVisitor(this);

            TextComposer.AppendLine(")").Append("{").IncreaseIndentation();

            code.LoopCode.AcceptVisitor(this);

            TextComposer.DecreaseIndentation().AppendLineAtNewLine("}");
        }
        private void GenerateMainEqualsFunction()
        {
            var caseTemplate = Templates["main_equals_case"];

            var casesText = new ListComposer(Environment.NewLine);

            foreach (var grade in CurrentFrame.Grades())
            {
                casesText.Add(caseTemplate,
                              "grade", grade,
                              "num", CurrentFrame.KvSpaceDimension(grade)
                              );
            }

            TextComposer.AppendAtNewLine(
                Templates["main_equals"],
                "frame", CurrentFrameName,
                "cases", casesText
                );
        }
Exemple #23
0
        public override void Generate()
        {
            GenerateBladeFileStartCode();

            var computationsText = GenerateComputationsCode();

            var kvSpaceDim = CurrentFrame.KvSpaceDimension(OutputGrade);

            TextComposer.AppendAtNewLine(
                Templates["bilinearproduct"],
                "name", MethodName,
                "num", kvSpaceDim,
                "double", GMacLanguage.ScalarTypeName,
                "computations", computationsText
                );

            GenerateBladeFileFinishCode();

            FileComposer.FinalizeText();
        }
Exemple #24
0
        public void Visit(SteForEachLoop code)
        {
            TextComposer
            .AppendAtNewLine("foreach (")
            .Append(code.LoopVariableType)
            .Append(code.LoopVariableName)
            .Append(" in ");

            code.LoopCollection.AcceptVisitor(this);

            TextComposer
            .AppendLine(")")
            .Append("{")
            .IncreaseIndentation();

            code.LoopCode.AcceptVisitor(this);

            TextComposer
            .DecreaseIndentation()
            .AppendLineAtNewLine("}");
        }
        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();
        }
        private void GenerateMainNormFunction(string opName)
        {
            var caseTemplate = Templates["main_norm_case"];

            var casesText = new ListComposer(Environment.NewLine);

            foreach (var grade in CurrentFrame.Grades())
            {
                casesText.Add(
                    caseTemplate,
                    "name", opName,
                    "grade", grade
                    );
            }

            TextComposer.AppendAtNewLine(
                Templates["main_norm"],
                "name", opName,
                "double", GMacLanguage.ScalarTypeName,
                "main_norm_case", casesText
                );
        }
Exemple #27
0
        internal void GenerateDotCode(DotFixedCode fixedCode)
        {
            if (fixedCode.CodeType == DotFixedCodeType.MultiLineComment)
            {
                TextComposer.AppendAtNewLine(@"/*");
                TextComposer.AppendAtNewLine(fixedCode.Code);
                TextComposer.AppendAtNewLine(@"*/");

                return;
            }

            if (fixedCode.CodeType == DotFixedCodeType.SingleLineComment)
            {
                TextComposer.IncreaseIndentation("// ");
                TextComposer.AppendAtNewLine(fixedCode.Code);
                TextComposer.DecreaseIndentation();

                return;
            }

            TextComposer.AppendAtNewLine(fixedCode.Code);
        }
Exemple #28
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
                );
        }
Exemple #29
0
        private void GenerateIsZeroFunction(int kvSpaceDim)
        {
            var t1 = Templates["iszero"];
            var t2 = Templates["iszero_case"];
            var t3 = Templates["trimcoefs_case"];

            var iszeroCasesText    = new ListComposer(" ||" + Environment.NewLine);
            var trimCoefsCasesText = new ListComposer("," + Environment.NewLine);

            for (var i = 0; i < kvSpaceDim; i++)
            {
                iszeroCasesText.Add(t2, "num", i);
                trimCoefsCasesText.Add(t3, "num", i);
            }

            TextComposer.AppendAtNewLine(
                t1,
                "num", kvSpaceDim,
                "double", GMacLanguage.ScalarTypeName,
                "iszero_case", iszeroCasesText,
                "trimcoefs_case", trimCoefsCasesText
                );
        }
Exemple #30
0
        public void Visit(SteWhileLoop code)
        {
            if (code.DoLoop)
            {
                TextComposer
                .AppendAtNewLine("do")
                .AppendLine("{")
                .IncreaseIndentation();

                code.LoopCode.AcceptVisitor(this);

                TextComposer
                .DecreaseIndentation()
                .AppendAtNewLine("} while (");

                code.LoopCondition.AcceptVisitor(this);

                TextComposer.AppendNewLine(");");

                return;
            }

            TextComposer.AppendAtNewLine("while (");

            code.LoopCondition.AcceptVisitor(this);

            TextComposer
            .AppendLine(")")
            .AppendLine("{")
            .IncreaseIndentation();

            code.LoopCode.AcceptVisitor(this);

            TextComposer
            .DecreaseIndentation()
            .AppendLineAtNewLine("}");
        }