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}} }@)@

*h* = *f*.RevSparseHes(*q*, *s*)

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

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)
@)@.
The object

*f*

has prototype

const ADFun<*Base*> *f*

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).
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}
@)@
The argument

*transpose*

has prototype

bool *transpose*

The default value `false`

is used when
*transpose*

is not present.
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*

.
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*

.
The result

*h*

has prototype

*VectorSet*& *h*

(see VectorSet
below).
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)
@)@.
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}
@)@.
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*

.
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}
@)@.
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