lines 8-163 of file: include/cppad/speed/sparse_hes_fun.hpp {xrst_begin sparse_hes_fun} {xrst_spell fp } Evaluate a Function That Has a Sparse Hessian ############################################# Syntax ****** # ``include `` ``sparse_hes_fun`` ( *n* , *x* , *row* , *col* , *p* , *fp* ) Purpose ******* This routine evaluates :math:`f(x)`, :math:`f^{(1)} (x)`, or :math:`f^{(2)} (x)` where the Hessian :math:`f^{(2)} (x)` is sparse. The function :math:`f : \B{R}^n \rightarrow \B{R}` only depends on the size and contents of the index vectors *row* and *col* . The non-zero entries in the Hessian of this function have one of the following forms: .. math:: \DD{f}{x[row[k]]}{x[row[k]]} \; , \; \DD{f}{x[row[k]]}{x[col[k]]} \; , \; \DD{f}{x[col[k]]}{x[row[k]]} \; , \; \DD{f}{x[col[k]]}{x[col[k]]} for some :math:`k` between zero and :math:`K-1`. All the other terms of the Hessian are zero. Inclusion ********* The template function ``sparse_hes_fun`` is defined in the ``CppAD`` namespace by including the file ``cppad/speed/sparse_hes_fun.hpp`` (relative to the CppAD distribution directory). Float ***** The type *Float* must be a :ref:`NumericType-name` . In addition, if *y* and *z* are *Float* objects, *y* = ``exp`` ( *z* ) must set the *y* equal the exponential of *z* , i.e., the derivative of *y* with respect to *z* is equal to *y* . FloatVector *********** The type *FloatVector* is any :ref:`SimpleVector-name` , or it can be a raw pointer, with elements of type *Float* . n * The argument *n* has prototype ``size_t`` *n* It specifies the dimension for the domain space for :math:`f(x)`. x * The argument *x* has prototype ``const`` *FloatVector* & *x* It contains the argument value for which the function, or its derivative, is being evaluated. We use :math:`n` to denote the size of the vector *x* . row *** The argument *row* has prototype ``const CppAD::vector&`` *row* It specifies one of the first index of :math:`x` for each non-zero Hessian term (see :ref:`sparse_hes_fun@Purpose` above). All the elements of *row* must be between zero and *n* ``-1`` . The value :math:`K` is defined by *K* = *row* . ``size`` () . col *** The argument *col* has prototype ``const CppAD::vector&`` *col* and its size must be :math:`K`; i.e., the same as for *col* . It specifies the second index of :math:`x` for the non-zero Hessian terms. All the elements of *col* must be between zero and *n* ``-1`` . There are no duplicated entries requested, to be specific, if *k1* != *k2* then ( *row* [ *k1* ] , *col* [ *k1* ] ) != ( *row* [ *k2* ] , *col* [ *k2* ] ) p * The argument *p* has prototype ``size_t`` *p* It is either zero or two and specifies the order of the derivative of :math:`f` that is being evaluated, i.e., :math:`f^{(p)} (x)` is evaluated. fp ** The argument *fp* has prototype *FloatVector* & *fp* The input value of the elements of *fp* does not matter. Function ======== If *p* is zero, *fp* has size one and *fp* [0] is the value of :math:`f(x)`. Hessian ======= If *p* is two, *fp* has size *K* and for :math:`k = 0 , \ldots , K-1`, .. math:: \DD{f}{ x[ \R{row}[k] ] }{ x[ \R{col}[k] ]} = fp [k] {xrst_toc_hidden speed/example/sparse_hes_fun.cpp xrst/sparse_hes_fun.xrst } Example ******* The file :ref:`sparse_hes_fun.cpp-name` contains an example and test of ``sparse_hes_fun.hpp`` . Source Code *********** The file :ref:`sparse_hes_fun.hpp-name` contains the source code for this template function. {xrst_end sparse_hes_fun}