1 # ifndef CPPAD_CORE_OPT_VAL_HES_HPP 
    2 # define CPPAD_CORE_OPT_VAL_HES_HPP 
  363 template <
class BaseVector, 
class Fun>
 
  365      const BaseVector&   x     ,
 
  366      const BaseVector&   y     ,
 
  374      CheckSimpleVector<Base, BaseVector>();
 
  377      typedef typename Fun::ad_vector ad_vector;
 
  380      CheckSimpleVector< AD<Base> , ad_vector >();
 
  383      size_t n = size_t(x.size());
 
  384      size_t m = size_t(y.size());
 
  387      size_t ell = fun.ell();
 
  391           size_t(jac.size()) == n || jac.size() == 0,
 
  392           "opt_val_hes: size of the vector jac is not equal to n or zero" 
  395           size_t(hes.size()) == n * n || hes.size() == 0,
 
  396           "opt_val_hes: size of the vector hes is not equal to n * n or zero" 
  419           for(j = 0; j < n; j++)
 
  421           for(j = 0; j < m; j++)
 
  425           for(j = 0; j < n; j++)
 
  429           for(k = 0; k < ell; k++)
 
  433                s_k[0] = fun.s(k, a_x, a_y);
 
  439                for(j = 0; j < n; j++)
 
  444      if( hes.size() == 0 )
 
  455      BaseVector xy(n + m);
 
  456      ad_vector a_xy(n + m);
 
  457      for(j = 0; j < n; j++)
 
  458           a_xy[j] = xy[j] = x[j];
 
  459      for(j = 0; j < m; j++)
 
  460           a_xy[n+j] = xy[n+j] = y[j];
 
  463      size_t nm_sq = (n + m) * (n + m);
 
  464      BaseVector F_hes(nm_sq);
 
  465      for(j = 0; j < nm_sq; j++)
 
  467      BaseVector hes_k(nm_sq);
 
  470      for(k = 0; k < ell; k++)
 
  474           for(j = 0; j < n; j++)
 
  477           for(j = 0; j < m; j++)
 
  480           s_k[0] = fun.s(k, a_x, a_y);
 
  488           for(j = 0; j < nm_sq; j++)
 
  489                F_hes[j] += hes_k[j];
 
  492      BaseVector F_yx(m * n);
 
  493      for(i = 0; i < m; i++)
 
  494      {    
for(j = 0; j < n; j++)
 
  495                F_yx[i * n + j] = F_hes[ (i+n)*(n+m) + j ];
 
  498      BaseVector F_yy(n * m);
 
  499      for(i = 0; i < m; i++)
 
  500      {    
for(j = 0; j < m; j++)
 
  501                F_yy[i * m + j] = F_hes[ (i+n)*(n+m) + j + n ];
 
  505      BaseVector neg_Y_x(m * n);
 
  512      for(i = 0; i < n; i++)
 
  513      {    
for(j = 0; j < n; j++)
 
  514           {    hes[i * n + j] = F_hes[ i*(n+m) + j ];
 
  515                for(k = 0; k < m; k++)
 
  516                     hes[i*n+j] -= F_hes[i*(n+m) + k+n] * neg_Y_x[k*n+j];
 
#define CPPAD_ASSERT_KNOWN(exp, msg)
Check that exp is true, if not print msg and terminate execution. 
 
Class used to hold function objects. 
 
int LuSolve(size_t n, size_t m, const FloatVector &A, const FloatVector &B, FloatVector &X, Float &logdet)
 
int opt_val_hes(const BaseVector &x, const BaseVector &y, Fun fun, BaseVector &jac, BaseVector &hes)
Computing Jabobians and Hessians of Optimal Values. 
 
VectorBase Jacobian(const VectorBase &x)
calculate entire Jacobian 
 
void Independent(VectorAD &x, size_t abort_op_index)
Declaration of independent variables. 
 
void Dependent(local::ADTape< Base > *tape, const ADvector &y)
change the operation sequence corresponding to this object 
 
void optimize(const std::string &options="")
Optimize a player object operation sequence. 
 
VectorBase Hessian(const VectorBase &x, const VectorBase &w)
calculate Hessian for one component of f