Prev Next Index-> contents reference index search external Up-> CppAD ADFun Reverse reverse_two reverse_two.cpp ADFun-> record_adfun drivers Forward Reverse sparsity_pattern sparse_derivative optimize abs_normal FunCheck check_for_nan Reverse-> reverse_one reverse_two reverse_any subgraph_reverse reverse_two-> reverse_two.cpp hes_times_dir.cpp reverse_two.cpp Headings

$\newcommand{\W}[1]{ \; #1 \; } \newcommand{\R}[1]{ {\rm #1} } \newcommand{\B}[1]{ {\bf #1} } \newcommand{\D}[2]{ \frac{\partial #1}{\partial #2} } \newcommand{\DD}[3]{ \frac{\partial^2 #1}{\partial #2 \partial #3} } \newcommand{\Dpow}[2]{ \frac{\partial^{#1}}{\partial {#2}^{#1}} } \newcommand{\dpow}[2]{ \frac{ {\rm d}^{#1}}{{\rm d}\, {#2}^{#1}} }$
Second Order Reverse ModeExample and Test
# include <cppad/cppad.hpp> namespace { // ---------------------------------------------------------- // define the template function reverse_two_cases<Vector> in empty namespace template <typename Vector> bool reverse_two_cases(void) { bool ok = true; using CppAD::AD; using CppAD::NearEqual; double eps99 = 99.0 * std::numeric_limits<double>::epsilon(); // domain space vector size_t n = 2; CPPAD_TESTVECTOR(AD<double>) X(n); X[0] = 0.; X[1] = 1.; // declare independent variables and start recording CppAD::Independent(X); // range space vector size_t m = 1; CPPAD_TESTVECTOR(AD<double>) Y(m); Y[0] = X[0] * X[0] * X[1]; // create f : X -> Y and stop recording CppAD::ADFun<double> f(X, Y); // use zero order forward mode to evaluate y at x = (3, 4) // use the template parameter Vector for the vector type Vector x(n), y(m); x[0] = 3.; x[1] = 4.; y = f.Forward(0, x); ok &= NearEqual(y[0] , x[0]*x[0]*x[1], eps99, eps99); // use first order forward mode in x[0] direction // (all second order partials below involve x[0]) Vector dx(n), dy(m); dx[0] = 1.; dx[1] = 1.; dy = f.Forward(1, dx); double check = 2.*x[0]*x[1]*dx[0] + x[0]*x[0]*dx[1]; ok &= NearEqual(dy[0], check, eps99, eps99); // use second order reverse mode to evalaute second partials of y[0] // with respect to (x[0], x[0]) and with respect to (x[0], x[1]) Vector w(m), dw( n * 2 ); w[0] = 1.; dw = f.Reverse(2, w); // check derivative of f ok &= NearEqual(dw[0*2+0] , 2.*x[0]*x[1], eps99, eps99); ok &= NearEqual(dw[1*2+0] , x[0]*x[0], eps99, eps99); // check derivative of f^{(1)} (x) * dx check = 2.*x[1]*dx[1] + 2.*x[0]*dx[1]; ok &= NearEqual(dw[0*2+1] , check, eps99, eps99); check = 2.*x[0]*dx[1]; ok &= NearEqual(dw[1*2+1] , check, eps99, eps99); return ok; } } // End empty namespace # include <vector> # include <valarray> bool reverse_two(void) { bool ok = true; ok &= reverse_two_cases< CppAD::vector <double> >(); ok &= reverse_two_cases< std::vector <double> >(); ok &= reverse_two_cases< std::valarray <double> >(); return ok; } 
Input File: example/general/reverse_two.cpp