Prev Next

@(@\newcommand{\W}[1]{ \; #1 \; } \newcommand{\R}[1]{ {\rm #1} } \newcommand{\B}[1]{ {\bf #1} } \newcommand{\D}[2]{ \frac{\partial #1}{\partial #2} } \newcommand{\DD}[3]{ \frac{\partial^2 #1}{\partial #2 \partial #3} } \newcommand{\Dpow}[2]{ \frac{\partial^{#1}}{\partial {#2}^{#1}} } \newcommand{\dpow}[2]{ \frac{ {\rm d}^{#1}}{{\rm d}\, {#2}^{#1}} }@)@
Hessian Sparsity Pattern: Reverse Mode

Syntax
h = f.RevSparseHes(qs)
h = f.RevSparseHes(qstranspose)

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<
Basef

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(qrr_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(qrtranspose)
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 
VectorSets
(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
     
VectorSeth
(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.
Input File: cppad/core/rev_sparse_hes.hpp