Beispiel #1
0
        private void GenerateOutermorphismToLinearTransformMacro(AstFrame frameInfo)
        {
            var commandsList = GMacDslSyntaxFactory.SyntaxElementsList(
                GMacDslSyntaxFactory.DeclareLocalVariable(DefaultStructure.LinearTransform, "newTr"),
                GMacDslSyntaxFactory.EmptyLine(),
                GMacDslSyntaxFactory.FixedCode("let newTr.ImageE0 = Multivector(#E0# = '1')"),
                GMacDslSyntaxFactory.EmptyLine()
                );

            for (var index = 1; index <= frameInfo.VSpaceDimension; index++)
            {
                var id = FrameUtils.BasisVectorId(index - 1);

                commandsList.Add(
                    GMacDslSyntaxFactory.AssignToLocalVariable(
                        "newTr.ImageE" + id,
                        "om.ImageV" + index + ".@G1@"
                        )
                    );
            }

            commandsList.AddEmptyLine();

            for (var grade = 2; grade <= frameInfo.VSpaceDimension; grade++)
            {
                var kvSpaceDim = frameInfo.KvSpaceDimension(grade);

                for (var index = 0; index < kvSpaceDim; index++)
                {
                    int id = FrameUtils.BasisBladeId(grade, index);
                    int id1, id2;

                    id.SplitBySmallestBasisVectorId(out id1, out id2);

                    commandsList.Add(
                        GMacDslSyntaxFactory.AssignToLocalVariable(
                            "newTr.ImageE" + id,
                            " newTr.ImageE" + id1 + " op newTr.ImageE" + id2
                            )
                        );
                }

                commandsList.AddEmptyLine();
            }

            var commandsText = GMacLanguage.CodeGenerator.GenerateCode(commandsList);

            GenerateMacro(
                frameInfo,
                DefaultMacro.Outermorphism.ToLinearTransform,
                ComposeMacroInputs("om", DefaultStructure.Outermorphism),
                DefaultStructure.LinearTransform,
                commandsText,
                "newTr"
                );
        }
Beispiel #2
0
 public MathematicaScalar this[int grade, int index]
 {
     get
     {
         return(this[FrameUtils.BasisBladeId(grade, index)]);
     }
     set
     {
         this[FrameUtils.BasisBladeId(grade, index)] = value;
     }
 }
        /// <summary>
        /// Create a default subspaces of k-vectors with a given grade and name
        /// </summary>
        private void DefineDefaultSubspaces_KVectors(GMacFrame frame, int grade, string subspaceName)
        {
            var basisCount = FrameUtils.KvSpaceDimension(frame.VSpaceDimension, grade);
            var idsList    = new List <int>(basisCount);

            for (var index = 0; index < basisCount; index++)
            {
                idsList.Add(FrameUtils.BasisBladeId(grade, index));
            }

            var subspaceSignature = BooleanPattern.CreateFromTrueIndexes(frame.GaSpaceDimension, idsList);

            var subspace = frame.DefineSubspace(subspaceName, subspaceSignature);

            subspace.AddCodeLocation(Context.GetCodeLocation(frame.ParseNode));
        }
Beispiel #4
0
        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 = FrameUtils.BasisBladeId(1, index1 - 1);

                commandsList.AddFixedCode("let newOm.ImageV" + index1 + " = Multivector(");

                for (var index2 = 1; index2 <= frameInfo.VSpaceDimension; index2++)
                {
                    var id2 = FrameUtils.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"
                );
        }
Beispiel #5
0
        //public GAOuterMorphismFull(ISymbolicMatrix vector_transform_matrix)
        //    : base(vector_transform_matrix.CAS)
        //{
        //    int domain_ga_space_dim = GAUtils.GASpaceDim(vector_transform_matrix.Columns);
        //    int codomain_ga_space_dim = GAUtils.GASpaceDim(vector_transform_matrix.Rows);

        //    _TransformedBasisBlades  = new Multivector[domain_ga_space_dim];

        //    _TransformedBasisBlades[0] = Multivector.CreateScalar(codomain_ga_space_dim, MathematicaScalar.Create(CAS, 1));

        //    for (int id = 1 ; id <= domain_ga_space_dim - 1)
        //    {
        //        if (GAUtils.is_ID_Vector(id))
        //        {
        //            _TransformedBasisBlades[id] = CreateFromMatrixColumn(vector_transform_matrix, GAUtils.ID_To_Index(id));
        //        }
        //        else
        //        {
        //            int id1, id2;
        //            GAUtils.SeparateIDs(id, out id1, out id2);

        //            _TransformedBasisBlades[id] = Multivector.OuterProduct(_TransformedBasisBlades[id1], _TransformedBasisBlades[id2]);
        //        }
        //    }
        //}

        private void ComputeVectorTransformMatrix()
        {
            var matrixArray = new MathematicaScalar[CodomainVSpaceDim, DomainVSpaceDim];

            for (var col = 0; col < DomainVSpaceDim; col++)
            {
                var id = FrameUtils.BasisBladeId(1, col);
                var mv = _transformedBasisBlades[id];

                foreach (var term in mv)
                {
                    var row = term.Key.BasisBladeIndex();
                    matrixArray[row, col] = term.Value;
                }
            }

            _vectorTransformMatrix = MathematicaMatrix.CreateFullMatrix(CasInterface, matrixArray);
        }
        /// <summary>
        /// Create the default subspace of odd multivectors named @odd@
        /// </summary>
        /// <returns></returns>
        private GMacFrameSubspace DefineDefaultSubspaces_Odd(GMacFrame frame)
        {
            var idsList = new List <int>(frame.GaSpaceDimension);

            for (var grade = 1; grade <= frame.VSpaceDimension; grade = grade + 2)
            {
                var basisCount = FrameUtils.KvSpaceDimension(frame.VSpaceDimension, grade);

                for (var index = 0; index < basisCount; index++)
                {
                    idsList.Add(FrameUtils.BasisBladeId(grade, index));
                }
            }

            const string subspaceName      = "Odd";
            var          subspaceSignature = BooleanPattern.CreateFromTrueIndexes(frame.GaSpaceDimension, idsList);

            var subspace = frame.DefineSubspace(subspaceName, subspaceSignature);

            subspace.AddCodeLocation(Context.GetCodeLocation(frame.ParseNode));

            return(subspace);
        }
Beispiel #7
0
 public string BasisBladeName(int grade, int index)
 {
     return(BasisVectorNames.ConcatenateUsingPattern(FrameUtils.BasisBladeId(grade, index), "E0", "^"));
 }
        private void translate_PredefinedBasisBladeIDs(string identName, ParseTreeNode node)
        {
            var firstChar = identName[0];

            switch (firstChar)
            {
            case 'E':
            {
                int id;
                if (Int32.TryParse(identName.Substring(1), out id) && _frame.IsValidBasisBladeId(id))
                {
                    AddBasisBladeId(id);
                }

                else
                {
                    CompilationLog.RaiseGeneratorError <int>("Basis blades set not recognized", node);
                }
            }
            break;

            case 'B':
            {
                var id = identName.Substring(1).StringToPattern();

                if (_frame.IsValidBasisBladeId(id))
                {
                    AddBasisBladeId(id);
                }

                else
                {
                    CompilationLog.RaiseGeneratorError <int>("Basis blades set not recognized", node);
                }
            }
            break;

            case 'G':
            {
                var pos = identName.IndexOf('I');

                if (pos < 2 || pos == identName.Length - 1)
                {
                    CompilationLog.RaiseGeneratorError <int>("Basis blades set not recognized", node);
                }

                var gradeText = identName.Substring(1, pos - 1);
                var indexText = identName.Substring(pos + 1);

                int grade, index;

                if (
                    Int32.TryParse(gradeText, out grade) &&
                    Int32.TryParse(indexText, out index) &&
                    _frame.IsValidBasisBladeGradeIndex(grade, index)
                    )
                {
                    AddBasisBladeId(FrameUtils.BasisBladeId(grade, index));
                }

                else
                {
                    CompilationLog.RaiseGeneratorError <int>("Basis blades set not recognized", node);
                }
            }
            break;

            default:
                CompilationLog.RaiseGeneratorError <int>("Basis blades set not recognized", node);
                break;
            }
        }