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();
        }
        private void GenerateMainMiscFunctions()
        {
            var miscCasesTemplates =
                Templates.SubCollection(
                    "main_add_case",
                    "main_subt_case",
                    "main_times_case",
                    "main_divide_case",
                    "main_inverse_case",
                    "main_edual_case"
                    );

            var miscCasesText = new ListComposerCollection(
                "main_add_case",
                "main_subt_case",
                "main_times_case",
                "main_divide_case",
                "main_inverse_case",
                "main_edual_case"
                );

            miscCasesText.SetSeparator(Environment.NewLine);

            foreach (var grade in CurrentFrame.Grades())
            {
                miscCasesText.AddTextItems(miscCasesTemplates,
                                           "frame", CurrentFrameName,
                                           "grade", grade,
                                           "num", CurrentFrame.KvSpaceDimension(grade),
                                           "sign", grade.GradeHasNegativeReverse() ? "-" : "",
                                           "invgrade", CurrentFrame.VSpaceDimension - grade
                                           );
            }

            var mainFuncsTemplate = Templates["misc_main"];

            mainFuncsTemplate.SetParametersValues(miscCasesText);

            TextComposer.Append(
                mainFuncsTemplate,
                "frame", CurrentFrameName,
                "double", GMacLanguage.ScalarTypeName,
                "norm2_opname", DefaultMacro.MetricUnary.NormSquared,
                "emag2_opname", DefaultMacro.EuclideanUnary.MagnitudeSquared
                );

            GenerateMainSelfDpGradeFunction();
        }