$\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}} }$
# include <cppad/speed/sparse_jac_fun.hpp> # include <cppad/speed/uniform_01.hpp> # include <cppad/cppad.hpp> bool sparse_jac_fun(void) { using CppAD::NearEqual; using CppAD::AD; bool ok = true; size_t j, k; double eps = CppAD::numeric_limits<double>::epsilon(); size_t n = 3; size_t m = 4; size_t K = 5; CppAD::vector<size_t> row(K), col(K); CppAD::vector<double> x(n), yp(K); CppAD::vector< AD<double> > a_x(n), a_y(m); // choose x for(j = 0; j < n; j++) a_x[j] = x[j] = double(j + 1); // choose row, col for(k = 0; k < K; k++) { row[k] = k % m; col[k] = (K - k) % n; } // declare independent variables Independent(a_x); // evaluate function size_t order = 0; CppAD::sparse_jac_fun< AD<double> >(m, n, a_x, row, col, order, a_y); // evaluate derivative order = 1; CppAD::sparse_jac_fun<double>(m, n, x, row, col, order, yp); // use AD to evaluate derivative CppAD::ADFun<double> f(a_x, a_y); CppAD::vector<double> jac(m * n); jac = f.Jacobian(x); for(k = 0; k < K; k++) { size_t index = row[k] * n + col[k]; ok &= NearEqual(jac[index], yp[k] , eps, eps); } return ok; }