Example #1
0
File: xml.cs Project: Sciumo/gaigen
        /// <summary>
        /// Parses an XML_MV element and stores the result.
        /// 
        /// The XML_MV element should contain the name, compression method (by grade or by group), 
        /// coordinate order (default or custom) 
        /// and memory allocation method of the general multivector.
        /// </summary>
        /// <param name="E">XML_MV element</param>
        private static void ParseMVelementAndAttributes(Specification S, XmlElement E)
        {
            String name = "mv";
            bool compressByGrade = true; // false means 'by group'
            bool defaultCoordinateOrder = true; // false means 'custom'
            GMV.MEM_ALLOC_METHOD memAllocMethod = GMV.MEM_ALLOC_METHOD.FULL;

            { // handle attributes
                XmlAttributeCollection A = E.Attributes;

                // handle all attributes
                for (int i = 0; i < A.Count; i++)
                {
                    // name
                    if (A[i].Name == XML_NAME)
                        name = A[i].Value;

                    // compress method (grade or group
                    else if (A[i].Name == XML_COMPRESS)
                    {
                        if (A[i].Value == XML_BY_GRADE)
                            compressByGrade = true;
                        else if (A[i].Value == XML_BY_GROUP)
                            compressByGrade = false;
                        else throw new G25.UserException("XML parsing error: Invalid compression '" + A[i].Value + "' in element '" + XML_MV + "'.");
                    }

                    // coordinate order
                    else if (A[i].Name == XML_COORDINATE_ORDER)
                    {
                        if (A[i].Value == XML_DEFAULT)
                            defaultCoordinateOrder = true;
                        else if (A[i].Value == XML_CUSTOM)
                            defaultCoordinateOrder = false;
                        else throw new G25.UserException("XML parsing error: Invalid coordinate order '" + A[i].Value + "' in element '" + XML_MV + "'.");
                    }

                    // memory allocation method
                    else if (A[i].Name == XML_MEM_ALLOC)
                    {
                        if (A[i].Value == XML_PARITY_PURE)
                            memAllocMethod = GMV.MEM_ALLOC_METHOD.PARITY_PURE;
                        else if (A[i].Value == XML_FULL)
                            memAllocMethod = GMV.MEM_ALLOC_METHOD.FULL;
                        else if (A[i].Value == XML_DYNAMIC)
                            memAllocMethod = GMV.MEM_ALLOC_METHOD.DYNAMIC;
                        else throw new G25.UserException("XML parsing error: Invalid memory allocation method '" + A[i].Value + "' in element '" + XML_MV + "'.");
                    }
                }

            } // end of 'handle attributes'

            // check for sanity
            if ((compressByGrade == false) && (defaultCoordinateOrder == true))
            {
                throw new G25.UserException("Cannot compress by group without a custom coordinate order. Please specify a coordinate order in the '" + XML_MV + "' element.");
            }

            // basis blades go here
            List<List<G25.rsbbp.BasisBlade>> basisBlades = null;

            if (defaultCoordinateOrder)
            {
                // check for sanity
                if (E.FirstChild != null)
                    throw new G25.UserException("The coordinate order is set to default, but the multivector definition element '" + XML_MV + "' contains a custom coordinate order.");

                basisBlades = S.m_basisBladeParser.GetDefaultBasisBlades();
            }
            else
            {
                basisBlades = S.m_basisBladeParser.ParseMVbasisBlades(E);
                if (compressByGrade)
                    basisBlades = S.m_basisBladeParser.SortBasisBladeListByGrade(basisBlades);
            }

            if (rsbbp.ConstantsInList(basisBlades))
                throw new G25.UserException("Constant coordinate(s) were specified in the general multivector type (XML element '" + XML_MV + "')");

            S.SetGeneralMV(new GMV(name, rsbbp.ListToDoubleArray(basisBlades), memAllocMethod));
        }