private IFormulaTree ConvertVariableNode(XmlFormulaTree node)
 {
     if (node.VariableValue != null)
     {
         UserVariable variable;
         if (_localVariables.TryGetValue(node.VariableValue, out variable))
         {
             return(FormulaTreeFactory.CreateLocalVariableNode(variable));
         }
         if (_globalVariables.TryGetValue(node.VariableValue, out variable))
         {
             return(FormulaTreeFactory.CreateGlobalVariableNode(variable));
         }
     }
     Debug.Assert(false, "Invalid project");
     return(null);
 }
        public IFormulaTree Convert(XmlFormulaTree formula)
        {
            if (formula == null)
            {
                return(null);
            }

            if (formula.VariableType == "NUMBER")
            {
                return(FormulaTreeFactory.CreateNumberNode(double.Parse(formula.VariableValue, CultureInfo.InvariantCulture)));
            }
            if (formula.VariableType == "OPERATOR")
            {
                return(ConvertOperatorNode(formula));
            }
            if (formula.VariableType == "FUNCTION")
            {
                return(ConvertFunctionNode(formula));
            }
            if (formula.VariableType == "SENSOR")
            {
                return(ConvertSensorOrPropertiesNode(formula));
            }
            if (formula.VariableType == "USER_VARIABLE")
            {
                return(ConvertVariableNode(formula));
            }
            if (formula.VariableType == "BRACKET")
            {
                return(ConvertParenthesesNode(formula));
            }

            if (String.IsNullOrEmpty(formula.VariableType))
            {
                return(null);
            }
            Debugger.Break();
            throw new NotImplementedException();
        }
 private TNode Convert <TNode>(XmlFormulaTree node, Func <IFormulaTree, IFormulaTree, TNode> creator) where TNode : BinaryFormulaTree
 {
     return(creator(Convert(node.LeftChild), Convert(node.RightChild)));
 }
 private TNode Convert <TNode>(XmlFormulaTree node, Func <IFormulaTree, TNode> creator, bool leftChild = true) where TNode : UnaryFormulaTree
 {
     return(creator(Convert(leftChild ? node.LeftChild : node.RightChild)));
 }
 private TNode Convert <TNode>(XmlFormulaTree node, Func <TNode> creator) where TNode : ConstantFormulaTree
 {
     return(creator());
 }
 private IFormulaTree ConvertParenthesesNode(XmlFormulaTree node)
 {
     return(Convert(node, FormulaTreeFactory.CreateParenthesesNode, false));
 }
        private IFormulaTree ConvertFunctionNode(XmlFormulaTree node)
        {
            // numbers
            if (node.VariableValue == "PI")
            {
                return(Convert(node, FormulaTreeFactory.CreatePiNode));
            }

            // logic
            if (node.VariableValue == "TRUE")
            {
                return(Convert(node, FormulaTreeFactory.CreateTrueNode));
            }
            if (node.VariableValue == "FALSE")
            {
                return(Convert(node, FormulaTreeFactory.CreateFalseNode));
            }

            // min/max
            if (node.VariableValue == "MIN")
            {
                return(Convert(node, FormulaTreeFactory.CreateMinNode));
            }
            if (node.VariableValue == "MAX")
            {
                return(Convert(node, FormulaTreeFactory.CreateMaxNode));
            }

            // exponential function and logarithms
            if (node.VariableValue == "EXP")
            {
                return(Convert(node, FormulaTreeFactory.CreateExpNode));
            }
            if (node.VariableValue == "LOG")
            {
                return(Convert(node, FormulaTreeFactory.CreateLogNode));
            }
            if (node.VariableValue == "LN")
            {
                return(Convert(node, FormulaTreeFactory.CreateLnNode));
            }

            // trigonometric functions
            if (node.VariableValue == "SIN")
            {
                return(Convert(node, FormulaTreeFactory.CreateSinNode));
            }
            if (node.VariableValue == "COS")
            {
                return(Convert(node, FormulaTreeFactory.CreateCosNode));
            }
            if (node.VariableValue == "TAN")
            {
                return(Convert(node, FormulaTreeFactory.CreateTanNode));
            }
            if (node.VariableValue == "ARCSIN")
            {
                return(Convert(node, FormulaTreeFactory.CreateArcsinNode));
            }
            if (node.VariableValue == "ARCCOS")
            {
                return(Convert(node, FormulaTreeFactory.CreateArccosNode));
            }
            if (node.VariableValue == "ARCTAN")
            {
                return(Convert(node, FormulaTreeFactory.CreateArctanNode));
            }

            // miscellaneous functions
            if (node.VariableValue == "SQRT")
            {
                return(Convert(node, FormulaTreeFactory.CreateSqrtNode));
            }
            if (node.VariableValue == "ABS")
            {
                return(Convert(node, FormulaTreeFactory.CreateAbsNode));
            }
            if (node.VariableValue == "MOD")
            {
                return(Convert(node, FormulaTreeFactory.CreateModuloNode));
            }
            if (node.VariableValue == "ROUND")
            {
                return(Convert(node, FormulaTreeFactory.CreateRoundNode));
            }
            if (node.VariableValue == "RAND")
            {
                return(Convert(node, FormulaTreeFactory.CreateRandomNode));
            }

            throw new NotImplementedException();
        }
 protected override XmlFormulaTree ToXml(XmlFormulaTree child)
 {
     return(XmlFormulaTreeFactory.CreateNegativeSignNode(child));
 }
 protected override XmlFormulaTree ToXml(XmlFormulaTree child)
 {
     return(XmlFormulaTreeFactory.CreateParenthesesNode(child));
 }
Example #10
0
 protected abstract XmlFormulaTree ToXml(XmlFormulaTree firstChild, XmlFormulaTree secondChild);
 protected override XmlFormulaTree ToXml(XmlFormulaTree child)
 {
     return(XmlFormulaTreeFactory.CreateSqrtNode(child));
 }
Example #12
0
 protected override XmlFormulaTree ToXml(XmlFormulaTree firstChild, XmlFormulaTree secondChild)
 {
     return(XmlFormulaTreeFactory.CreateRandomNode(firstChild, secondChild));
 }
Example #13
0
        public void XmlFormulaTreeTest()
        {
            TextReader sr    = new StringReader("<formula category=\"IF_CONDITION\"> <leftChild> <leftChild> <leftChild> <leftChild> <leftChild> <type>USER_VARIABLE</type> <value>x speed</value> </leftChild> <rightChild> <type>USER_VARIABLE</type> <value>x speed</value> </rightChild> <type>OPERATOR</type> <value>MULT</value> </leftChild> <rightChild> <leftChild> <type>USER_VARIABLE</type> <value>y speed</value> </leftChild> <rightChild> <type>USER_VARIABLE</type> <value>y speed</value> </rightChild> <type>OPERATOR</type> <value>MULT</value> </rightChild> <type>OPERATOR</type> <value>PLUS</value> </leftChild> <type>FUNCTION</type> <value>SQRT</value> </leftChild> <rightChild> <type>NUMBER</type> <value>2</value> </rightChild> <type>OPERATOR</type> <value>GREATER_THAN</value> </leftChild> <rightChild> <leftChild> <type>SENSOR</type> <value>OBJECT_X</value> </leftChild> <rightChild> <type>NUMBER</type> <value>55</value> </rightChild> <type>OPERATOR</type> <value>SMALLER_THAN</value> </rightChild> <type>OPERATOR</type> <value>LOGICAL_AND</value> </formula>");
            var        xRoot = XElement.Load(sr);

            var testObject = new XmlFormulaTree(xRoot);

            var referenceObject = new XmlFormulaTree()
            {
                VariableType  = "OPERATOR",
                VariableValue = "LOGICAL_AND",
                LeftChild     = new XmlFormulaTree()
                {
                    VariableType  = "OPERATOR",
                    VariableValue = "GREATER_THAN",
                    LeftChild     = new XmlFormulaTree()
                    {
                        VariableType  = "FUNCTION",
                        VariableValue = "SQRT",
                        LeftChild     = new XmlFormulaTree()
                        {
                            VariableType  = "OPERATOR",
                            VariableValue = "PLUS",
                            LeftChild     = new XmlFormulaTree()
                            {
                                VariableType  = "OPERATOR",
                                VariableValue = "MULT",
                                LeftChild     = new XmlFormulaTree()
                                {
                                    VariableType  = "USER_VARIABLE",
                                    VariableValue = "x speed",
                                },
                                RightChild = new XmlFormulaTree()
                                {
                                    VariableType  = "USER_VARIABLE",
                                    VariableValue = "x speed",
                                }
                            },
                            RightChild = new XmlFormulaTree()
                            {
                                VariableType  = "OPERATOR",
                                VariableValue = "MULT",
                                LeftChild     = new XmlFormulaTree()
                                {
                                    VariableType  = "USER_VARIABLE",
                                    VariableValue = "y speed",
                                },
                                RightChild = new XmlFormulaTree()
                                {
                                    VariableType  = "USER_VARIABLE",
                                    VariableValue = "y speed",
                                }
                            }
                        }
                        // SQRT no RightChild
                    },
                    RightChild = new XmlFormulaTree()
                    {
                        VariableType  = "NUMBER",
                        VariableValue = "2",
                    }
                },
                RightChild = new XmlFormulaTree()
                {
                    VariableType  = "OPERATOR",
                    VariableValue = "SMALLER_THAN",
                    LeftChild     = new XmlFormulaTree()
                    {
                        VariableType  = "SENSOR",
                        VariableValue = "OBJECT_X",
                    },
                    RightChild = new XmlFormulaTree()
                    {
                        VariableType  = "NUMBER",
                        VariableValue = "55",
                    }
                }
            };

            Assert.AreEqual(referenceObject, testObject);
        }
        private IFormulaTree ConvertOperatorNode(XmlFormulaTree node)
        {
            // arithmetic
            if (node.VariableValue == "PLUS")
            {
                return(Convert(node, FormulaTreeFactory.CreateAddNode));
            }
            if (node.VariableValue == "MINUS" && node.LeftChild == null)
            {
                return(Convert(node, FormulaTreeFactory.CreateNegativeSignNode, false));
            }
            if (node.VariableValue == "MINUS")
            {
                return(Convert(node, FormulaTreeFactory.CreateSubtractNode));
            }
            if (node.VariableValue == "MULT")
            {
                return(Convert(node, FormulaTreeFactory.CreateMultiplyNode));
            }
            if (node.VariableValue == "DIVIDE")
            {
                return(Convert(node, FormulaTreeFactory.CreateDivideNode));
            }
            if (node.VariableValue == "POW")
            {
                return(Convert(node, FormulaTreeFactory.CreatePowerNode));
            }

            // relational operators
            if (node.VariableValue == "EQUAL")
            {
                return(Convert(node, FormulaTreeFactory.CreateEqualsNode));
            }
            if (node.VariableValue == "NOT_EQUAL")
            {
                return(Convert(node, FormulaTreeFactory.CreateNotEqualsNode));
            }
            if (node.VariableValue == "SMALLER_THAN")
            {
                return(Convert(node, FormulaTreeFactory.CreateLessNode));
            }
            if (node.VariableValue == "SMALLER_OR_EQUAL")
            {
                return(Convert(node, FormulaTreeFactory.CreateLessEqualNode));
            }
            if (node.VariableValue == "GREATER_THAN")
            {
                return(Convert(node, FormulaTreeFactory.CreateGreaterNode));
            }
            if (node.VariableValue == "GREATER_OR_EQUAL")
            {
                return(Convert(node, FormulaTreeFactory.CreateGreaterEqualNode));
            }

            // logic
            if (node.VariableValue == "LOGICAL_AND")
            {
                return(Convert(node, FormulaTreeFactory.CreateAndNode));
            }
            if (node.VariableValue == "LOGICAL_OR")
            {
                return(Convert(node, FormulaTreeFactory.CreateOrNode));
            }
            if (node.VariableValue == "LOGICAL_NOT")
            {
                return(Convert(node, FormulaTreeFactory.CreateNotNode, false));
            }

            throw new NotImplementedException();
        }
        private IFormulaTree ConvertSensorOrPropertiesNode(XmlFormulaTree node)
        {
            // sensors
            if (node.VariableValue == "X_ACCELERATION")
            {
                return(Convert(node, FormulaTreeFactory.CreateAccelerationXNode));
            }
            if (node.VariableValue == "Y_ACCELERATION")
            {
                return(Convert(node, FormulaTreeFactory.CreateAccelerationYNode));
            }
            if (node.VariableValue == "Z_ACCELERATION")
            {
                return(Convert(node, FormulaTreeFactory.CreateAccelerationZNode));
            }
            if (node.VariableValue == "COMPASS_DIRECTION")
            {
                return(Convert(node, FormulaTreeFactory.CreateCompassNode));
            }
            if (node.VariableValue == "X_INCLINATION")
            {
                return(Convert(node, FormulaTreeFactory.CreateInclinationXNode));
            }
            if (node.VariableValue == "Y_INCLINATION")
            {
                return(Convert(node, FormulaTreeFactory.CreateInclinationYNode));
            }
            if (node.VariableValue == "LOUDNESS")
            {
                return(Convert(node, FormulaTreeFactory.CreateLoudnessNode));
            }

            // properties
            if (node.VariableValue == "OBJECT_BRIGHTNESS")
            {
                return(Convert(node, FormulaTreeFactory.CreateBrightnessNode));
            }
            if (node.VariableValue == "OBJECT_LAYER")
            {
                return(Convert(node, FormulaTreeFactory.CreateLayerNode));
            }
            if (node.VariableValue == "OBJECT_X")
            {
                return(Convert(node, FormulaTreeFactory.CreatePositionXNode));
            }
            if (node.VariableValue == "OBJECT_Y")
            {
                return(Convert(node, FormulaTreeFactory.CreatePositionYNode));
            }
            if (node.VariableValue == "OBJECT_ROTATION")
            {
                return(Convert(node, FormulaTreeFactory.CreateRotationNode));
            }
            if (node.VariableValue == "OBJECT_SIZE")
            {
                return(Convert(node, FormulaTreeFactory.CreateSizeNode));
            }
            if (node.VariableValue == "OBJECT_GHOSTEFFECT")
            {
                return(Convert(node, FormulaTreeFactory.CreateTransparencyNode));
            }

            throw new NotImplementedException();
        }
Example #16
0
 protected abstract XmlFormulaTree ToXml(XmlFormulaTree child);
 protected override XmlFormulaTree ToXml(XmlFormulaTree leftChild, XmlFormulaTree rightChild)
 {
     return(XmlFormulaTreeFactory.CreateLessEqualNode(leftChild, rightChild));
 }