コード例 #1
0
        private string GenerateClassCode()
        {
            var composer = new LinearComposer();

            composer.AppendLineAtNewLine(GenerateDeclareCoefsText());

            composer.AppendLineAtNewLine(GenerateAbstractCoefsText());

            composer.AppendAtNewLine(
                MainCodeTemplate,
                "mv_class_name", ClassData.ClassName,
                "mv_class_id", ClassData.ClassId,
                "frame", CurrentFrameName,
                "double", GMacLanguage.ScalarTypeName,
                "iszero_code", GenerateIsZeroCode(),
                "norm2_code", GenerateNorm2Code(),
                "isequal_cases", GenerateAbstractMethodCases("IsEqual"),
                "op_cases", GenerateAbstractMethodCases("OP"),
                "gp_cases", GenerateAbstractMethodCases("GP"),
                "lcp_cases", GenerateAbstractMethodCases("LCP"),
                "rcp_cases", GenerateAbstractMethodCases("RCP"),
                "sp_cases", GenerateAbstractMethodCases("SP"),
                "add_cases", GenerateAbstractMethodCases("Add"),
                "subtract_cases", GenerateAbstractMethodCases("Subtract")
                );

            return(composer.ToString());
        }
コード例 #2
0
 public virtual void Visit(SteEmptyLines code)
 {
     for (var i = 0; i < code.LinesCount; i++)
     {
         TextComposer.AppendLineAtNewLine();
     }
 }
コード例 #3
0
ファイル: FilesComposer.cs プロジェクト: phreed/GMac
        /// <summary>
        /// Generate a string containing some statistics about the final text inside
        /// the files of this composer
        /// </summary>
        /// <returns></returns>
        public string GenerateStatistics()
        {
            var composer = new LinearComposer();

            composer
            .AppendLineAtNewLine("Composer Log:")
            .AppendLineAtNewLine(_log.ToString())
            .AppendLine();

            var totalLines      = 0;
            var totalCharacters = 0;

            foreach (var pair in _fileComposersDictionary)
            {
                int linesCount, charsCount;

                composer.AppendAtNewLine(
                    pair.Value.GenerateStatistics(RootFolder, FilesEncoding, out linesCount, out charsCount)
                    );

                totalLines      += linesCount;
                totalCharacters += charsCount;
            }

            composer
            .AppendLine()
            .AppendAtNewLine("Total Files: ")
            .AppendLine(_fileComposersDictionary.Count.ToString("###,###,###,###"))
            .AppendAtNewLine("Total Lines: ")
            .AppendLine(totalLines.ToString("###,###,###,###"))
            .AppendAtNewLine("Total Characters: ")
            .AppendLine(totalCharacters.ToString("###,###,###,###"));

            return(composer.ToString());
        }
コード例 #4
0
ファイル: FilesComposer.cs プロジェクト: phreed/GMac
        /// <summary>
        /// Save all files and their text contents to disk under the given root folder
        /// </summary>
        /// <param name="rootFolder"></param>
        /// <returns>True if saving files resulted in no errors</returns>
        public bool SaveToFolder(string rootFolder)
        {
            var success = true;

            //Finalize all files without calling the FinalizeAllFiles() method
            //to prevent un-intended recursion
            foreach (var fileComposer in Files)
            {
                if (!fileComposer.IsFinalized)
                {
                    fileComposer.FinalizeText();
                }
            }

            foreach (var pair in _fileComposersDictionary)
            {
                try
                {
                    pair.Value.SaveToDisk(rootFolder, true, FilesEncoding);
                }
                catch (Exception e)
                {
                    success = false;

                    _log
                    .AppendLineAtNewLine($"Error saving file <{pair.Key}>")
                    .AppendLineAtNewLine(e.Message);
                }
            }

            return(success);
        }
コード例 #5
0
        private string GenerateProductMethodCode(string macroName, out string resultClassName)
        {
            SetBaseMacro(CurrentFrame.Macro(macroName));

            var computationsText = GenerateComputationsCode();

            //The result is zero
            if (MacroCodeGenerator.CodeBlock.NonZeroOutputVariables.Any() == false)
            {
                //The result is the zero multivector
                if (BaseMacro.OutputType.IsValidMultivectorType)
                {
                    resultClassName = MvLibraryGenerator.MultivectorClassesData[0].ClassName;
                    return("return Zero;");
                }

                //The result is the scalar zero
                resultClassName = GMacLanguage.ScalarTypeName;
                return("return " + GMacLanguage.ScalarZero + ";");
            }

            //The result is not zero
            string resultDeclarationText;

            if (BaseMacro.OutputType.IsValidMultivectorType)
            {
                var grades =
                    MacroCodeGenerator
                    .CodeBlock
                    .NonZeroOutputVariables
                    .Select(v => v.ValueAccess.GetBasisBlade().Grade)
                    .Distinct();

                var id = grades.Sum(grade => 1 << grade);

                resultClassName = MvLibraryGenerator.MultivectorClassesData[id].ClassName;

                resultDeclarationText = "var result = new " + resultClassName + "();";
            }
            else
            {
                resultClassName = GMacLanguage.ScalarTypeName;

                resultDeclarationText = "var result = " + GMacLanguage.ScalarZero + ";";
            }

            var composer = new LinearComposer();

            composer
            .AppendLineAtNewLine(resultDeclarationText)
            .AppendLine()
            .AppendLineAtNewLine(computationsText)
            .AppendAtNewLine("return result;");

            return(composer.ToString());
        }
コード例 #6
0
        public override string ToString()
        {
            var composer = new LinearComposer();

            composer
            .AppendLineAtNewLine(@"<TR>")
            .IncreaseIndentation();

            foreach (var cell in _cells)
            {
                composer.AppendLineAtNewLine(cell.ToString());
            }

            composer
            .DecreaseIndentation()
            .AppendAtNewLine(@"</TR>");

            return(composer.ToString());
        }
コード例 #7
0
        public override string ToString()
        {
            var s = new LinearComposer();

            s.Append(ProgressId.ToString("D6")).Append(": ").Append(FullTimingText);

            s.AppendLineAtNewLine(FullTitle);

            if (String.IsNullOrEmpty(Details) == false)
            {
                s.AppendLineAtNewLine()
                .AppendLineAtNewLine("Begin Details")
                .IncreaseIndentation()
                .AppendAtNewLine(Details)
                .DecreaseIndentation()
                .AppendLineAtNewLine("End Details");
            }

            return(s.ToString());
        }
コード例 #8
0
        public string Execute()
        {
            var composer = new LinearComposer();

            foreach (var test in this)
            {
                composer
                .AppendLineAtNewLine(test.Execute())
                .AppendLine();
            }

            return(composer.ToString());
        }
コード例 #9
0
        private static string PatternsRangeSample()
        {
            Composer.Clear();

            Composer.AppendLine("PatternsBetween(3, 12):");
            AddPatternsListToComposer(BitUtils.PatternsBetween(3, 12));
            Composer.AppendLineAtNewLine(PageSeparator).AppendLine();

            Composer.AppendLine("PatternsBetween(12, 3):");
            AddPatternsListToComposer(BitUtils.PatternsBetween(12, 3));
            Composer.AppendLineAtNewLine(PageSeparator).AppendLine();

            Composer.AppendLine("OnesPermutations(5, 2):");
            AddPatternsListToComposer(BitUtils.OnesPermutations(5, 2));
            Composer.AppendLineAtNewLine(PageSeparator).AppendLine();

            Composer.AppendLine("OnesPermutations(5, 3):");
            AddPatternsListToComposer(BitUtils.OnesPermutations(5, 3));
            Composer.AppendLineAtNewLine(PageSeparator).AppendLine();

            Composer.AppendLine("ZerosPermutations(5, 2):");
            AddPatternsListToComposer(BitUtils.ZerosPermutations(5, 2));
            Composer.AppendLineAtNewLine(PageSeparator).AppendLine();

            Composer.AppendLine("ZerosPermutations(5, 3):");
            AddPatternsListToComposer(BitUtils.ZerosPermutations(5, 3));
            Composer.AppendLineAtNewLine(PageSeparator).AppendLine();

            return(Composer.ToString());
        }
コード例 #10
0
        public string Execute()
        {
            var randGen      = new GMacRandomGenerator(10);
            var textComposer = new LinearComposer();

            var numFrame = GaNumFrame.CreateConformal(5);
            var symFrame = GaSymFrame.CreateConformal(5);

            var numMv1 = randGen.GetNumMultivectorFull(numFrame.GaSpaceDimension);
            var numMv2 = randGen.GetNumMultivectorFull(numFrame.GaSpaceDimension);
            var symMv1 = numMv1.ToSymbolic();
            var symMv2 = numMv2.ToSymbolic();

            var symMvGp = symFrame.Gp[symMv1, symMv2];

            //textComposer.AppendLineAtNewLine("Symbolic Multivector 1: ").AppendLine(symMv1);
            //textComposer.AppendLineAtNewLine("Numeric Multivector 1: ").AppendLine(numMv1);

            //textComposer.AppendLineAtNewLine("Symbolic Multivector 2: ").AppendLine(symMv2);
            //textComposer.AppendLineAtNewLine("Numeric Multivector 2: ").AppendLine(numMv2);

            //textComposer.AppendLineAtNewLine("Symbolic Gp: ").AppendLine(symMvGp);
            //textComposer.AppendLineAtNewLine("Numeric GP: ").AppendLine(numMvGp);


            numFrame.SetProductsImplementation(GaBilinearProductImplementation.Computed);
            GaNumMultivector.ResetAddFactorsCallCount();
            var numMvGp    = numFrame.Gp[numMv1, numMv2];
            var callsCount = GaNumMultivector.AddFactorsCallCount;
            var diff       = symMvGp.ToNumeric() - numMvGp;

            diff.Simplify();
            GaNumMultivector.ResetAddFactorsCallCount();
            textComposer
            .AppendLineAtNewLine("Difference, Computed Tree: ")
            .AppendLine(callsCount)
            .AppendLine(diff);


            numFrame.SetProductsImplementation(GaBilinearProductImplementation.LookupArray);
            GaNumMultivector.ResetAddFactorsCallCount();
            numMvGp    = numFrame.Gp[numMv1, numMv2];
            callsCount = GaNumMultivector.AddFactorsCallCount;
            //var factorsCount = ((GaNumMapBilinearArray) numFrame.Gp).FactorsCount;
            diff = symMvGp.ToNumeric() - numMvGp;
            diff.Simplify();
            GaNumMultivector.ResetAddFactorsCallCount();
            textComposer
            .AppendLineAtNewLine("Difference, Lookup Array: ")
            .AppendLine(callsCount)
            //.AppendLine(factorsCount)
            .AppendLine(diff);


            numFrame.SetProductsImplementation(GaBilinearProductImplementation.LookupHash);
            GaNumMultivector.ResetAddFactorsCallCount();
            numMvGp    = numFrame.Gp[numMv1, numMv2];
            callsCount = GaNumMultivector.AddFactorsCallCount;
            //factorsCount = ((GaNumMapBilinearHash)numFrame.Gp).FactorsCount;
            diff = symMvGp.ToNumeric() - numMvGp;
            diff.Simplify();
            GaNumMultivector.ResetAddFactorsCallCount();
            textComposer
            .AppendLineAtNewLine("Difference, Lookup Hash: ")
            .AppendLine(callsCount)
            //.AppendLine(factorsCount)
            .AppendLine(diff);


            numFrame.SetProductsImplementation(GaBilinearProductImplementation.LookupTree);
            GaNumMultivector.ResetAddFactorsCallCount();
            numMvGp    = numFrame.Gp[numMv1, numMv2];
            callsCount = GaNumMultivector.AddFactorsCallCount;
            //factorsCount = ((GaNumMapBilinearTree)numFrame.Gp).FactorsCount;
            diff = symMvGp.ToNumeric() - numMvGp;
            diff.Simplify();
            GaNumMultivector.ResetAddFactorsCallCount();
            textComposer
            .AppendLineAtNewLine("Difference, Lookup Tree: ")
            .AppendLine(callsCount)
            //.AppendLine(factorsCount)
            .AppendLine(diff);


            numFrame.SetProductsImplementation(GaBilinearProductImplementation.LookupCoefSums);
            GaNumMultivector.ResetAddFactorsCallCount();
            numMvGp    = numFrame.Gp[numMv1, numMv2];
            callsCount = GaNumMultivector.AddFactorsCallCount;
            //factorsCount = ((GaNumMapBilinearCoefSums)numFrame.Gp).FactorsCount;
            diff = symMvGp.ToNumeric() - numMvGp;
            diff.Simplify();
            GaNumMultivector.ResetAddFactorsCallCount();
            textComposer
            .AppendLineAtNewLine("Difference, Lookup CoefSums: ")
            .AppendLine(callsCount)
            //.AppendLine(factorsCount)
            .AppendLine(diff);


            return(textComposer.ToString());
        }
コード例 #11
0
ファイル: TestUtils.cs プロジェクト: phreed/GMac
 public static void AddTestStartingMessage(string text)
 {
     Log.AppendLineAtNewLine("".PadLeft(80, '='));
     Log.AppendLine(text);
     Log.AppendLine();
 }