Prev Next fadbad_poly.cpp

Fadbad Speed: Second Derivative of a Polynomial

Operation Sequence
Note that the polynomial evaluation operation sequence does not depend on the argument to the polynomial. Yet there does not seem to be a way to reuse the DAG to compute derivatives for other values of z.

compute_poly
Routine that computes the derivative of a polynomial using Fadbad:
# include <cppad/vector.hpp>
# include <cppad/poly.hpp>
# include <cppad/speed/uniform_01.hpp>
# include <FADBAD++/tadiff.h>

bool compute_poly(
     size_t                     size     , 
     size_t                     repeat   , 
     CppAD::vector<double>     &a        ,  // coefficients of polynomial
     CppAD::vector<double>     &z        ,  // polynomial argument value
     CppAD::vector<double>     &ddp      )  // second derivative w.r.t z  
{
     // -----------------------------------------------------
     // setup
     size_t i;     // temporary index     
     T<double>  Z; // domain space AD value
     T<double>  P; // range space AD value

     // choose the polynomial coefficients
     CppAD::uniform_01(size, a);

     // AD copy of the polynomial coefficients
     CppAD::vector< T<double> > A(size);
     for(i = 0; i < size; i++)
          A[i] = a[i];

     // ------------------------------------------------------
     while(repeat--)
     {    // get the next argument value
          CppAD::uniform_01(1, z);

          // independent variable value
          Z    = z[0]; // argument value
          Z[1] = 1;    // argument first order Taylor coefficient

          // AD computation of the dependent variable
          P = CppAD::Poly(0, A, Z);

          // Taylor-expand P to degree one
          P.eval(2);

          // second derivative is twice second order Taylor coefficient
          ddp[0] = 2. * P[2];

          // Free DAG corresponding to P does not seem to improve speed.
          // Probably because it gets freed the next time P is assigned.
          // P.reset();
     }
     // ------------------------------------------------------
     return true;
}

Input File: speed/fadbad/poly.cpp