private string GenerateDeclarations(int grade) { var kvDim = CurrentFrame.KvSpaceDimension(grade); var template = Templates["static_basisblade_declare"]; var declaresText = new ListComposer(Environment.NewLine); var coefsText = new ListComposer(", "); for (var index = 0; index < kvDim; index++) { coefsText.Clear(); for (var i = 0; i < kvDim; i++) { coefsText.Add((i == index) ? "1.0D" : "0.0D"); } declaresText.Add( template, "frame", CurrentFrameName, "id", CurrentFrame.BasisBladeId(grade, index), "grade", grade, "coefs", coefsText ); } declaresText.Add(""); return(declaresText.ToString()); }
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 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 string GenerateOutermorphismComposeCode() { var codeText = new ListComposer(Environment.NewLine); var sumText = new ListComposer(" + "); for (var i = 0; i < CurrentFrame.VSpaceDimension; i++) { for (var j = 0; j < CurrentFrame.VSpaceDimension; j++) { sumText.Clear(); for (var k = 0; k < CurrentFrame.VSpaceDimension; k++) { sumText.Add( "om1.Coefs".CoefPart(i, k) + " * " + "om2.Coefs".CoefPart(k, j) ); } codeText.Add( "coefs".CoefPart(i, j) + " = " + sumText + ";" ); } } return(codeText.ToString()); }
public override string ToString() { var composer = new ListComposer(" + ") { FinalPrefix = TargetBasisBladeId.BasisBladeIndexedName() + ": { ", FinalSuffix = " }" }; composer.AddRange(TermsText); return(composer.ToString()); }
private string GenerateSubtractMethodCode(MvClassData resultClassData) { //The two classes are zero multivector classes if (resultClassData.ClassId == 0) { return("return Zero;"); } var idCommon = ClassData.ClassId & CalcClassData.ClassId; var idDiff1 = ClassData.ClassId & ~CalcClassData.ClassId; var idDiff2 = ~ClassData.ClassId & CalcClassData.ClassId; var composer = new ListComposer("," + Environment.NewLine) { FinalPrefix = "return new " + resultClassData.ClassName + "()" + Environment.NewLine + "{" + Environment.NewLine, FinalSuffix = Environment.NewLine + "};", ActiveItemPrefix = " " }; var basisBlades = ClassData.Frame.BasisBladesOfGrades(idDiff1.PatternToPositions()); foreach (var basisBlade in basisBlades) { composer.Add( $"{basisBlade.GradeIndexName} = {basisBlade.GradeIndexName}" ); } basisBlades = ClassData.Frame.BasisBladesOfGrades(idDiff2.PatternToPositions()); foreach (var basisBlade in basisBlades) { composer.Add( $"{basisBlade.GradeIndexName} = {"-mv." + basisBlade.GradeIndexName}" ); } basisBlades = ClassData.Frame.BasisBladesOfGrades(idCommon.PatternToPositions()); foreach (var basisBlade in basisBlades) { var term = basisBlade.GradeIndexName + " - mv." + basisBlade.GradeIndexName; composer.Add( $"{basisBlade.GradeIndexName} = {term}" ); } return(composer.ToString()); }
private string GenerateIsEqualMethodCode() { //The two classes are zero multivector classes if (ClassData.ClassId == 0 && CalcClassData.ClassId == 0) { return("return true;"); } var idCommon = ClassData.ClassId & CalcClassData.ClassId; var idDiff1 = ClassData.ClassId & ~CalcClassData.ClassId; var idDiff2 = ~ClassData.ClassId & CalcClassData.ClassId; var composer = new ListComposer(" || " + Environment.NewLine) { FinalPrefix = "return !(" + Environment.NewLine, FinalSuffix = Environment.NewLine + ");", ActiveItemPrefix = " " }; var basisBlades = ClassData.Frame.BasisBladesOfGrades(idDiff1.PatternToPositions()); foreach (var basisBlade in basisBlades) { composer.Add( String.Format("{0} <= -Epsilon || {0} >= Epsilon", basisBlade.GradeIndexName) ); } basisBlades = ClassData.Frame.BasisBladesOfGrades(idDiff2.PatternToPositions()); foreach (var basisBlade in basisBlades) { composer.Add( String.Format("{0} <= -Epsilon || {0} >= Epsilon", "mv." + basisBlade.GradeIndexName) ); } basisBlades = ClassData.Frame.BasisBladesOfGrades(idCommon.PatternToPositions()); foreach (var basisBlade in basisBlades) { var term = "(" + basisBlade.GradeIndexName + " - mv." + basisBlade.GradeIndexName + ")"; composer.Add( String.Format("{0} <= -Epsilon || {0} >= Epsilon", term) ); } return(composer.ToString()); }
public override string ToString() { var composer = new ListComposer(" + "); foreach (var pair in _internalDictionary.OrderBy(p => p.Key)) { composer.Add( pair.Value + " " + pair.Key.BasisBladeName() ); } return(composer.ToString()); }
private string GenerateOutermorphismApplyCasesCode() { var codeText = new ListComposer(Environment.NewLine); for (var inGrade = 1; inGrade <= CurrentFrame.VSpaceDimension; inGrade++) { codeText.Add( Templates["om_apply_code_case"], "grade", inGrade, "frame", CurrentFrameName ); } return(codeText.ToString()); }
private static string ComposeMacroInputs(params string[] inputsInfo) { if (inputsInfo.Length == 0) { return(""); } var inputsText = new ListComposer(", "); for (var i = 0; i < inputsInfo.Length; i += 2) { inputsText.Add(inputsInfo[i].Trim() + " : " + inputsInfo[i + 1].Trim()); } return(inputsText.ToString()); }
private string GenerateOutermorphismTranposeCode() { var codeText = new ListComposer(Environment.NewLine); for (var i = 0; i < CurrentFrame.VSpaceDimension; i++) { for (var j = 0; j < CurrentFrame.VSpaceDimension; j++) { codeText.Add( "coefs".CoefPart(i, j) + " = " + "Coefs".CoefPart(j, i) + ";" ); } } return(codeText.ToString()); }
private string GenerateAbstractMethodCases(string opName) { var composer = new ListComposer(Environment.NewLine); AbstractMethodCaseTemplate["op_name"] = opName; foreach (var classData in MvLibraryGenerator.MultivectorClassesData.Values) { composer.Add( AbstractMethodCaseTemplate, "id", classData.ClassId, "class_name", classData.ClassName ); } return(composer.ToString()); }
private void GenerateTransposeOutermorphismMacro(AstFrame frameInfo) { var inputsText = ComposeMacroInputs( "om", DefaultStructure.Outermorphism ); var commandsList = GMacDslSyntaxFactory.SyntaxElementsList( GMacDslSyntaxFactory.DeclareLocalVariable(DefaultStructure.Outermorphism, "newOm"), GMacDslSyntaxFactory.EmptyLine() ); var componentsText = new ListComposer("," + Environment.NewLine); for (var index1 = 1; index1 <= frameInfo.VSpaceDimension; index1++) { componentsText.Clear(); var id1 = GMacMathUtils.BasisBladeId(1, index1 - 1); commandsList.AddFixedCode("let newOm.ImageV" + index1 + " = Multivector("); for (var index2 = 1; index2 <= frameInfo.VSpaceDimension; index2++) { var id2 = GMacMathUtils.BasisBladeId(1, index2 - 1); componentsText.Add(" #E" + id2 + "# = om.ImageV" + index2 + ".#E" + id1 + "#"); } commandsList.AddFixedCode(componentsText.ToString()); commandsList.AddFixedCode(")"); commandsList.AddEmptyLine(); } var commandsText = GMacLanguage.CodeGenerator.GenerateCode(commandsList); GenerateMacro( frameInfo, DefaultMacro.Outermorphism.Transpose, inputsText, DefaultStructure.Outermorphism, commandsText, "newOm" ); }
private void GenerateTransposeLinearTransformMacro(AstFrame frameInfo) { var inputsText = ComposeMacroInputs( "tr", DefaultStructure.LinearTransform ); var commandsList = GMacDslSyntaxFactory.SyntaxElementsList( GMacDslSyntaxFactory.DeclareLocalVariable(DefaultStructure.LinearTransform, "newTr"), GMacDslSyntaxFactory.EmptyLine() ); var componentsText = new ListComposer("," + Environment.NewLine); for (var id1 = 0; id1 <= frameInfo.MaxBasisBladeId; id1++) { componentsText.Clear(); commandsList.AddFixedCode("let newTr.ImageE" + id1 + " = Multivector("); for (var id2 = 0; id2 <= frameInfo.MaxBasisBladeId; id2++) { componentsText.Add(" #E" + id2 + "# = tr.ImageE" + id2 + ".#E" + id1 + "#"); } commandsList.AddFixedCode(componentsText.ToString()); commandsList.AddFixedCode(")"); commandsList.AddEmptyLine(); } var commandsText = GMacLanguage.CodeGenerator.GenerateCode(commandsList); GenerateMacro( frameInfo, DefaultMacro.LinearTransform.Transpose, inputsText, DefaultStructure.LinearTransform, commandsText, "newTr" ); }
/// <summary> /// Return a simple string to describe the given value /// </summary> /// <param name="value"></param> /// <returns></returns> public string AsString(AstValueMultivector value) { if (value.IsNullOrInvalid()) { return("<Invalid Value>"); } if (value.IsZero) { return("0"); } var composer = new ListComposer(" + "); var terms = value.Terms.OrderBy(t => t.TermBasisBladeGrade).ThenBy(t => t.TermBasisBladeIndex); foreach (var term in terms) { if (term.TermBasisBladeId == 0) { composer.Add(term.CoefValue); } else if (term.CoefValue.IsOne) { composer.Add(term.BasisBlade.Name); } else if (term.CoefValue.IsMinusOne) { composer.Add("-" + term.BasisBlade.Name); } else { composer.Add(term.CoefValue + " " + term.BasisBlade.Name); } } return(composer.ToString()); }
private string GenerateIsZeroCode() { if (ClassData.ClassId == 0) { return("return true;"); } var composer = new ListComposer(" || " + Environment.NewLine) { FinalPrefix = "return !(" + Environment.NewLine, FinalSuffix = Environment.NewLine + ");", ActiveItemPrefix = " " }; foreach (var basisBlade in ClassData.ClassBasisBlades) { composer.Add( String.Format("{0} <= -Epsilon || {0} >= Epsilon", basisBlade.GradeIndexName) ); } return(composer.ToString()); }
public static GaSymFrameNonOrthogonal CreateConformal(int vSpaceDim) { VerifyVSpaceDim(vSpaceDim, 3); var eSpaceDim = vSpaceDim - 2; var listComposer = new ListComposer(",") { FinalPrefix = "{", FinalSuffix = "}" }; for (var i = 0; i < eSpaceDim; i++) { listComposer.Add( (1 << i) .PatternToSequence(vSpaceDim, "0", "1") .Concatenate(",", "{", "}") ); } listComposer.Add( "{" + 0.PatternToSequence(eSpaceDim, "0", "1").Concatenate(",") + ",0,-1}" ); listComposer.Add( "{" + 0.PatternToSequence(eSpaceDim, "0", "1").Concatenate(",") + ",-1,0}" ); var ipm = MathematicaMatrix.Create(SymbolicUtils.Cas, listComposer.ToString()); return(CreateNonOrthogonalFromIpm(ipm)); }