------------------------------------------- lines 6-81 of file: speed/sacado/det_lu.cpp ------------------------------------------- {xrst_begin sacado_det_lu.cpp} Sacado Speed: Gradient of Determinant Using Lu Factorization ############################################################ Specifications ************** See :ref:`link_det_lu-name` . Implementation ************** {xrst_spell_off} {xrst_code cpp} */ // suppress conversion warnings before other includes # include // # include # include # include # include // list of possible options # include extern std::map global_option; bool link_det_lu( size_t size , size_t repeat , CppAD::vector &matrix , CppAD::vector &gradient ) { // speed test global option values if( global_option["onetape"] || global_option["atomic"] ) return false; if( global_option["memory"] || global_option["optimize"] ) return false; // ----------------------------------------------------- // setup // // object for computing determinant typedef Sacado::Rad::ADvar ADScalar; typedef CppAD::vector ADVector; CppAD::det_by_lu Det(size); size_t i; // temporary index size_t n = size * size; // number of independent variables ADScalar detA; // AD value of the determinant ADVector A(n); // AD version of matrix // ------------------------------------------------------ while(repeat--) { // get the next matrix CppAD::uniform_01(n, matrix); // set independent variable values for(i = 0; i < n; i++) A[i] = matrix[i]; // compute the determinant detA = Det(A); // compute the gradient of detA ADScalar::Gradcomp(); // evaluate and return gradient using reverse mode for(i =0; i < n; i++) gradient[i] = A[i].adj(); // partial detA w.r.t A[i] } // --------------------------------------------------------- return true; } /* {xrst_code} {xrst_spell_on} {xrst_end sacado_det_lu.cpp}