private void ForwardSweep(double[] arg)
        {
            for (int i = 0; i < Dimension; ++i)
            {
                tape[i].Value = arg[i];
            }

            var forwardDiffVisitor = new ForwardSweepVisitor(tape);

            for (int i = Dimension; i < tape.Length; ++i)
            {
                tape[i].Accept(forwardDiffVisitor);
            }
        }
        private void ForwardSweep <S>(S arg)
            where S : IList <double>
        {
            for (int i = 0; i < Dimension; ++i)
            {
                tape[i].Value = arg[i];
            }

            var forwardDiffVisitor = new ForwardSweepVisitor(tape);

            for (int i = Dimension; i < tape.Length; ++i)
            {
                tape[i].Accept(forwardDiffVisitor);
            }
        }