VectorBase ADFun<Base>::SparseJacobian( const VectorBase& x ) { typedef CppAD::vectorBool VectorBool; size_t m = Range(); size_t n = Domain(); // sparsity pattern for Jacobian VectorBool p(m * n); if( n <= m ) { size_t j, k; // use forward mode VectorBool r(n * n); for(j = 0; j < n; j++) { for(k = 0; k < n; k++) r[j * n + k] = false; r[j * n + j] = true; } p = ForSparseJac(n, r); } else { size_t i, k; // use reverse mode VectorBool s(m * m); for(i = 0; i < m; i++) { for(k = 0; k < m; k++) s[i * m + k] = false; s[i * m + i] = true; } p = RevSparseJac(m, s); } return SparseJacobian(x, p); }
VectorBase ADFun<Base>::SparseJacobian( const VectorBase& x ) { typedef CppAD::vectorBool VectorBool; size_t m = Range(); size_t n = Domain(); // sparsity pattern for Jacobian VectorBool p(m * n); // return result VectorBase jac(m * n); if( n <= m ) { size_t j, k; // use forward mode VectorBool r(n * n); for(j = 0; j < n; j++) { for(k = 0; k < n; k++) r[j * n + k] = false; r[j * n + j] = true; } p = ForSparseJac(n, r); } else { size_t i, k; // use reverse mode VectorBool s(m * m); for(i = 0; i < m; i++) { for(k = 0; k < m; k++) s[i * m + k] = false; s[i * m + i] = true; } p = RevSparseJac(m, s); } bool set_type = true; // only used to dispatch compiler to proper case SparseJacobianCase(set_type, x, p, jac); return jac; }