lines 6-87 of file: speed/fadbad/mat_mul.cpp {xrst_begin fadbad_mat_mul.cpp} Fadbad Speed: Matrix Multiplication ################################### Specifications ************** See :ref:`link_mat_mul-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_mat_mul( size_t size , size_t repeat , CppAD::vector& x , CppAD::vector& z , CppAD::vector& dz ) { // speed test global option values if( global_option["memory"] || global_option["onetape"] || global_option["atomic"] || global_option["optimize"] ) return false; // The correctness check for this test is failing, so abort (for now). return false; // ----------------------------------------------------- // setup // object for computing determinant typedef fadbad::B ADScalar; typedef CppAD::vector ADVector; size_t j; // temporary index size_t m = 1; // number of dependent variables size_t n = size * size; // number of independent variables ADVector X(n); // AD domain space vector ADVector Y(n); // Store product matrix ADVector Z(m); // AD range space vector // ------------------------------------------------------ while(repeat--) { // get the next matrix CppAD::uniform_01(n, x); // set independent variable values for(j = 0; j < n; j++) X[j] = x[j]; // do the computation mat_sum_sq(size, X, Y, Z); // create function object f : X -> Z Z[0].diff(0, m); // index 0 of m dependent variables // evaluate and return gradient using reverse mode for(j = 0; j < n; j++) dz[j] = X[j].d(0); // partial Z[0] w.r.t X[j] } // return function value z[0] = Z[0].x(); // --------------------------------------------------------- return true; } /* {xrst_code} {xrst_spell_on} {xrst_end fadbad_mat_mul.cpp}