Esempio n. 1
0
        public double Eval(Binding bind)
        {
            Bind = bind;
            LanguageTreeNode tempNode = root;

            return(_Eval(tempNode));
        }
Esempio n. 2
0
        /*
         * We need to set the number value to double type before we eval the tree
         */
        private double _Eval(LanguageTreeNode root)
        {
            if (root == null)
            {
                return(0);
            }
            else
            {
                if (root.value.GetType() == typeof(double))
                {
                    return((double)root.value);
                }
                else if (root.value.GetType() == typeof(char))
                {
                    switch (root.value)
                    {
                    case '+':
                        return(_Eval(root.left) + _Eval(root.right));

                    case '*':
                        return(_Eval(root.left) * _Eval(root.right));

                    case '-':
                        return(_Eval(root.left) - _Eval(root.right));

                    case '/':
                        return(_Eval(root.left) / _Eval(root.right));

                    case '^':
                    {
                        // a ^ b
                        var a = _Eval(root.left);
                        var b = _Eval(root.right);
                        return(Math.Pow(a, b));
                    }

                    case '=':
                        return(Convert.ToDouble(_Eval(root.left) == _Eval(root.right)));

                    case '@':
                    {
                        /*
                         * df/dx
                         */
                        const double deltaX     = 0.000000001;
                        Binding      xAndDeltaX = new Binding();
                        xAndDeltaX.SetBind(Bind.GetMagic(), Bind.GetBind(Bind.GetMagic()) + deltaX);
                        var f_x  = _Eval(root.left);
                        var temp = Bind;
                        Bind = xAndDeltaX;
                        var f_xAndDeltaX = _Eval(root.left);
                        Bind = temp;
                        return((f_xAndDeltaX - f_x) / deltaX);
                    }

                    default:
                        throw new FormatException($"{ErrMessage}unknown operator");
                    }
                }
                else if (root.value.GetType() == typeof(string))
                {
                    string valueOfRoot = (string)root.value;
                    if (Bind.Contain(valueOfRoot))
                    {
                        return(Bind.GetBind(valueOfRoot));
                    }
                    else
                    {
                        throw new FormatException($"{ErrMessage}unbind symbol : {valueOfRoot}");
                    }
                }
                else
                {
                    throw new FormatException($"{ErrMessage}unknown value type : {root.value}");
                }
            }
        }
Esempio n. 3
0
 public SolverLanguageTree(object value, LanguageTreeNode left, LanguageTreeNode right)
 {
     root = new LanguageTreeNode(value, left, right);
 }
Esempio n. 4
0
 public LanguageTreeNode(Object value, LanguageTreeNode left, LanguageTreeNode right)
 {
     this.value = value;
     this.left  = left;
     this.right = right;
 }