public double Eval(Binding bind) { Bind = bind; LanguageTreeNode tempNode = root; return(_Eval(tempNode)); }
/* * 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}"); } } }
public SolverLanguageTree(object value, LanguageTreeNode left, LanguageTreeNode right) { root = new LanguageTreeNode(value, left, right); }
public LanguageTreeNode(Object value, LanguageTreeNode left, LanguageTreeNode right) { this.value = value; this.left = left; this.right = right; }