Prev Next double_sparse_hessian.cpp

Double Speed: Sparse Hessian

link_sparse_hessian
Routine that computes function values for sparse_evaluate
# include <cppad/vector.hpp>
# include <cppad/speed/uniform_01.hpp>

// must include cmath before sparse_evaluate so that exp is defined for double
# include <cmath>
# include <cppad/speed/sparse_evaluate.hpp>

bool link_sparse_hessian(
     size_t                     repeat   , 
     CppAD::vector<double>     &x        ,
     CppAD::vector<size_t>     &i        ,
     CppAD::vector<size_t>     &j        ,
     CppAD::vector<double>     &hessian  )
{
     // -----------------------------------------------------
     // setup
     using CppAD::vector;
     size_t order = 0;        // derivative order corresponding to function
     size_t n     = x.size(); // argument space dimension
     size_t ell   = i.size(); // size of index vectors
     vector<double> y(1);     // function value

     // temporaries
     size_t k;
     vector<double> tmp(2 * ell);

     // choose a value for x
     CppAD::uniform_01(n, x);
     
     // ------------------------------------------------------

     while(repeat--)
     {
          // get the next set of indices
          CppAD::uniform_01(2 * ell, tmp);
          for(k = 0; k < ell; k++)
          {    i[k] = size_t( n * tmp[k] );
               i[k] = std::min(n-1, i[k]);
               //
               j[k] = size_t( n * tmp[k + ell] );
               j[k] = std::min(n-1, j[k]);
          }

          // computation of the function
          CppAD::sparse_evaluate(x, i, j, order, y);
     }
     hessian[0] = y[0];

     return true;
}

Input File: speed/double/sparse_hessian.cpp