public int Visit(BinaryFunc func) { return(Compile(func, () => { var leftIndex = func.Left.Accept(this); var rightIndex = func.Right.Accept(this); var element = new Compiled.BinaryFunc { Eval = func.Eval, Diff = func.Diff, Left = leftIndex, Right = rightIndex, Inputs = new Compiled.InputEdge[] { new Compiled.InputEdge { Index = leftIndex }, new Compiled.InputEdge { Index = rightIndex }, } }; return element; })); }
public void Visit(Compiled.BinaryFunc elem) { double left = ValueOf(elem.Left); double right = ValueOf(elem.Right); elem.Value = elem.Eval(left, right); var grad = elem.Diff(left, right); elem.Inputs[0].Weight = grad.Item1; elem.Inputs[1].Weight = grad.Item2; }
public TapeElement Visit(BinaryFunc func) { return(Compile(func, () => { var leftElement = func.Left.Accept(this); var rightElement = func.Right.Accept(this); var element = new Compiled.BinaryFunc(func.Eval, func.Diff) { Inputs = MakeInputEdges(() => { edges.Add(new InputEdge { Element = leftElement }); edges.Add(new InputEdge { Element = rightElement }); }) }; return element; })); }
public void Visit(Compiled.BinaryFunc elem) { elem.Value = elem.Eval(ValueOf(elem.Left), ValueOf(elem.Right)); }