Prev Next Index-> contents reference index search external Up-> CppAD ADFun sparsity_pattern RevSparseHes CppAD-> Install Introduction AD ADFun preprocessor multi_thread utility ipopt_solve Example speed Appendix ADFun-> record_adfun drivers Forward Reverse sparsity_pattern sparse_derivative optimize abs_normal FunCheck check_for_nan sparsity_pattern-> for_jac_sparsity ForSparseJac rev_jac_sparsity RevSparseJac rev_hes_sparsity RevSparseHes for_hes_sparsity ForSparseHes dependency.cpp rc_sparsity.cpp subgraph_sparsity RevSparseHes-> rev_sparse_hes.cpp sparsity_sub.cpp Headings-> Syntax Purpose f x q transpose r s h ---..transpose false ---..transpose true VectorSet Entire Sparsity Pattern Example

Hessian Sparsity Pattern: Reverse Mode

Syntax
h = f.RevSparseHes(q, s)  h = f.RevSparseHes(q, s, transpose)

Purpose
We use $F : \B{R}^n \rightarrow \B{R}^m$ to denote the AD function corresponding to f . For a fixed matrix $R \in \B{R}^{n \times q}$ and a fixed vector $S \in \B{R}^{1 \times m}$, we define $$\begin{array}{rcl} H(x) & = & \partial_x \left[ \partial_u S * F[ x + R * u ] \right]_{u=0} \\ & = & R^\R{T} * (S * F)^{(2)} ( x ) \\ H(x)^\R{T} & = & (S * F)^{(2)} ( x ) * R \end{array}$$ Given a sparsity pattern for the matrix $R$ and the vector $S$, RevSparseHes returns a sparsity pattern for the $H(x)$.

f
The object f has prototype       const ADFun<Base> f 
x
If the operation sequence in f is independent of the independent variables in $x \in B^n$, the sparsity pattern is valid for all values of (even if it has CondExp or VecAD operations).

q
The argument q has prototype       size_t q  It specifies the number of columns in $R \in \B{R}^{n \times q}$ and the number of rows in $H(x) \in \B{R}^{q \times n}$. It must be the same value as in the previous ForSparseJac call       f.ForSparseJac(q, r, r_transpose)  Note that if r_transpose is true, r in the call above corresponding to $R^\R{T} \in \B{R}^{q \times n}$

transpose
The argument transpose has prototype       bool transpose  The default value false is used when transpose is not present.

r
The matrix $R$ is specified by the previous call       f.ForSparseJac(q, r, transpose)  see r . The type of the elements of VectorSet must be the same as the type of the elements of r .

s
The argument s has prototype       const VectorSet& s  (see VectorSet below) If it has elements of type bool, its size is $m$. If it has elements of type std::set<size_t>, its size is one and all the elements of s[0] are between zero and $m - 1$. It specifies a sparsity pattern for the vector S .

h
The result h has prototype       VectorSet& h  (see VectorSet below).

transpose false
If h has elements of type bool, its size is $q * n$. If it has elements of type std::set<size_t>, its size is $q$ and all the set elements are between zero and n-1 inclusive. It specifies a sparsity pattern for the matrix $H(x)$.

transpose true
If h has elements of type bool, its size is $n * q$. If it has elements of type std::set<size_t>, its size is $n$ and all the set elements are between zero and q-1 inclusive. It specifies a sparsity pattern for the matrix $H(x)^\R{T}$.

VectorSet
The type VectorSet must be a SimpleVector class with elements of type bool or std::set<size_t>; see sparsity pattern for a discussion of the difference. The type of the elements of VectorSet must be the same as the type of the elements of r .

Entire Sparsity Pattern
Suppose that $q = n$ and $R \in \B{R}^{n \times n}$ is the $n \times n$ identity matrix. Further suppose that the $S$ is the k-th elementary vector ; i.e. $$S_j = \left\{ \begin{array}{ll} 1 & {\rm if} \; j = k \\ 0 & {\rm otherwise} \end{array} \right.$$ In this case, the corresponding value h is a sparsity pattern for the Hessian matrix $F_k^{(2)} (x) \in \B{R}^{n \times n}$.

Example
The file rev_sparse_hes.cpp contains an example and test of this operation. It returns true if it succeeds and false otherwise. The file sparsity_sub.cpp contains an example and test of using RevSparseHes to compute the sparsity pattern for a subset of the Hessian.