Ejemplo n.º 1
0
        /// <summary>
        /// Converts a tree of G25.rsep.FunctionApplication to a list of G25.rsbbp.BasisBlade.
        /// The allowed functions are concat(), assign(), op(), negate() and nop()
        /// </summary>
        /// <param name="O">O should be a chain of concat(string, concat(op(...), concat(op(....), or a String (name of basisvector, or "scalar")</param>
        /// <param name="originalStr">The full string (used only for error messages)</param>
        /// <returns>the tree converted to a list of basis blade (with a possible constant values assigned to it).</returns>
        private void ConvertParsedXMLtoBasisBladeList(Object O, List <G25.rsbbp.BasisBlade> L, String originalStr)
        {
            { // is 'O' a string? (can happen when last entry in concat list and the basis blade is just a scalar or a basis vector)
                String Ostr = O as String;
                if (Ostr != null)
                {
                    L.Add(ConvertParsedXMLtoBasisBlade(O, originalStr));
                    return;
                }
            }

            // not a string: O must be a function application (concat(...), assign(...) op(...), negate(...) or nop(...) )
            G25.rsep.FunctionApplication FA = O as G25.rsep.FunctionApplication;
            if (FA == null)
            {
                throw new Exception("Invalid contents of element '" + XML.XML_MV + "': " + originalStr);
            }

            if ((FA.FunctionName == "op") || (FA.FunctionName == "negate") || (FA.FunctionName == "nop") || (FA.FunctionName == "assign"))
            { // this is the last entry in the concat(...) list
                // assign(...), op(...), negate(...) or nop(...)
                L.Add(ConvertParsedXMLtoBasisBlade(FA, originalStr));
            }
            else if ((FA.FunctionName == "concat") && (FA.NbArguments == 2))
            {
                // concat(..., ....)
                L.Add(ConvertParsedXMLtoBasisBlade(FA.Arguments[0], originalStr));
                ConvertParsedXMLtoBasisBladeList(FA.Arguments[1], L, originalStr);
            }
            else
            {
                throw new Exception("Error in basis blade list " + originalStr);
            }
        }
Ejemplo n.º 2
0
        private double ConvertParsedXMLtoScalar(Object O, String originalStr)
        {
            // O is either a string or negate(...) or nop(...)

            { // is 'O' a string?
                String Ostr = O as String;
                if (Ostr != null)
                {
                    // Ostr is a scalar value
                    try
                    {
                        return(System.Double.Parse(Ostr));
                    }
                    catch (System.Exception)
                    {
                        throw new Exception("Invalid scalar value '" + Ostr + "' in basis blade list " + originalStr);
                    }
                }
            }

            // it must be a function application (negate or add (nop))
            G25.rsep.FunctionApplication FA = O as G25.rsep.FunctionApplication;

            if ((FA.FunctionName == "negate") && (FA.NbArguments == 1))
            {
                return(-ConvertParsedXMLtoScalar(FA.Arguments[0], originalStr));
            }
            else if ((FA.FunctionName == "nop") && (FA.NbArguments == 1))
            {
                return(ConvertParsedXMLtoScalar(FA.Arguments[0], originalStr));
            }
            else
            {
                throw new Exception("Error in basis blade list " + originalStr);
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Converts a tree of G25.rsep.FunctionApplication to a G25.rsbbp.BasisBlade.
        /// The allowed functions are assign(), op(), negate() and nop()
        /// </summary>
        /// <param name="O">Tree of G25.rsep.FunctionApplication, or a String (name of basisvector, or "scalar")</param>
        /// <param name="originalStr">The full string (used only for error messages)</param>
        /// <returns>the tree converted to a basis blade (with a possible constant value assigned to it).</returns>
        private G25.rsbbp.BasisBlade ConvertParsedXMLtoBasisBlade(Object O, String originalStr)
        {
            // O is either a string or assign(...), op(...), negate(...) or nop(...)

            { // is 'O' a string?
                String Ostr = O as String;
                if (Ostr != null)
                {
                    // either a basis blade name, or "scalar"
                    if (Ostr == "scalar")
                    {
                        return(new G25.rsbbp.BasisBlade(RefGA.BasisBlade.ONE));
                    }
                    else
                    {
                        return(new G25.rsbbp.BasisBlade(new RefGA.BasisBlade((uint)(1 << m_spec.BasisVectorNameToIndex(Ostr)))));
                    }
                }
            }

            G25.rsep.FunctionApplication FA = O as G25.rsep.FunctionApplication;

            if ((FA.FunctionName == "assign") && (FA.NbArguments == 2))
            {
                // assign(e1^e2^e3, scalarValue)
                G25.rsbbp.BasisBlade basisBlade = ConvertParsedXMLtoBasisBlade(FA.Arguments[0], originalStr);
                if (basisBlade.IsConstant)
                {
                    throw new Exception("Invalid assignment '=' in blade specification: " + originalStr);
                }
                double value = ConvertParsedXMLtoScalar(FA.Arguments[1], originalStr);
                // arg0 = basis blade (not const assignment
                // arg1 = scalar value
                return(new G25.rsbbp.BasisBlade(basisBlade.GetBasisBlade, value));
            }
            else if ((FA.FunctionName == "op") && (FA.NbArguments == 2))
            {
                G25.rsbbp.BasisBlade arg1 = ConvertParsedXMLtoBasisBlade(FA.Arguments[0], originalStr);
                G25.rsbbp.BasisBlade arg2 = ConvertParsedXMLtoBasisBlade(FA.Arguments[1], originalStr);

                if (arg1.IsConstant || arg2.IsConstant)
                {
                    throw new Exception("Invalid assignment '=' in blade specification: " + originalStr);
                }

                return(new G25.rsbbp.BasisBlade(RefGA.BasisBlade.op(arg1.GetBasisBlade, arg2.GetBasisBlade)));
            }
            else if ((FA.FunctionName == "negate") && (FA.NbArguments == 1))
            {
                G25.rsbbp.BasisBlade arg1 = ConvertParsedXMLtoBasisBlade(FA.Arguments[0], originalStr);
                if (arg1.IsConstant)
                {
                    throw new Exception("Invalid assignment '=' in blade specification: " + originalStr);
                }

                return(new G25.rsbbp.BasisBlade(RefGA.BasisBlade.op(RefGA.BasisBlade.MINUS_ONE, arg1.GetBasisBlade)));
            }
            else if ((FA.FunctionName == "nop") && (FA.NbArguments == 1))
            {
                return(ConvertParsedXMLtoBasisBlade(FA.Arguments[0], originalStr));
            }
            else
            {
                throw new Exception("Error in basis blade list " + originalStr);
            }
        }