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 ); }
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); }
//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()); }
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 ); }
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 ); }
protected override void SetTargetVariablesNames(GMacTargetVariablesNaming targetNaming) { targetNaming.SetScalarParameter(targetNaming.BaseMacro.OutputParameterValueAccess, "result"); BladesLibraryGenerator.SetBasisBladeToArrayNaming(targetNaming, "mv", _inGrade, "coefs"); BladesLibraryGenerator.SetTargetTempVariablesNames(targetNaming); }
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); }
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 ); }
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); }
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); }
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()); }
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); }
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); }
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 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 ); }