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