lines 6-147 of file: speed/adolc/poly.cpp {xrst_begin adolc_poly.cpp} Adolc Speed: Second Derivative of a Polynomial ############################################## Specifications ************** See :ref:`link_poly-name` . Implementation ************** {xrst_spell_off} {xrst_code cpp} */ // suppress conversion warnings before other includes # include // # include # include # include # include # include # include # include "adolc_alloc_mat.hpp" // list of possible options # include extern std::map global_option; bool link_poly( size_t size , size_t repeat , CppAD::vector &a , // coefficients of polynomial CppAD::vector &z , // polynomial argument value CppAD::vector &ddp ) // second derivative w.r.t z { if( global_option["atomic"] ) return false; if( global_option["memory"] || global_option["optimize"] ) return false; // ----------------------------------------------------- // setup size_t i; int tag = 0; // tape identifier int keep = 0; // do not keep forward mode results in buffer int m = 1; // number of dependent variables int n = 1; // number of independent variables int d = 2; // highest derivative degree double f; // function value // set up for thread_alloc memory allocator (fast and checks for leaks) using CppAD::thread_alloc; // the allocator size_t capacity; // capacity of an allocation // choose a vector of polynomial coefficients CppAD::uniform_01(size, a); // AD copy of the polynomial coefficients std::vector A(size); for(i = 0; i < size; i++) A[i] = a[i]; // domain and range space AD values adouble Z, P; // allocate arguments to hos_forward double* x0 = thread_alloc::create_array(size_t(n), capacity); double* y0 = thread_alloc::create_array(size_t(m), capacity); double** x = adolc_alloc_mat(size_t(n), size_t(d)); double** y = adolc_alloc_mat(size_t(m), size_t(d)); // Taylor coefficient for argument x[0][0] = 1.; // first order x[0][1] = 0.; // second order // ---------------------------------------------------------------------- if( ! global_option["onetape"] ) while(repeat--) { // choose an argument value CppAD::uniform_01(1, z); // declare independent variables trace_on(tag, keep); Z <<= z[0]; // AD computation of the function value P = CppAD::Poly(0, A, Z); // create function object f : Z -> P P >>= f; trace_off(); // set the argument value x0[0] = z[0]; // evaluate the polynomial at the new argument value hos_forward(tag, m, n, d, keep, x0, x, y0, y); // second derivative is twice second order Taylor coef ddp[0] = 2. * y[0][1]; } else { // choose an argument value CppAD::uniform_01(1, z); // declare independent variables trace_on(tag, keep); Z <<= z[0]; // AD computation of the function value P = CppAD::Poly(0, A, Z); // create function object f : Z -> P P >>= f; trace_off(); while(repeat--) { // get the next argument value CppAD::uniform_01(1, z); x0[0] = z[0]; // evaluate the polynomial at the new argument value hos_forward(tag, m, n, d, keep, x0, x, y0, y); // second derivative is twice second order Taylor coef ddp[0] = 2. * y[0][1]; } } // ------------------------------------------------------ // tear down adolc_free_mat(x); adolc_free_mat(y); thread_alloc::delete_array(x0); thread_alloc::delete_array(y0); return true; } /* {xrst_code} {xrst_spell_on} {xrst_end adolc_poly.cpp}