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));
 }