![]() |
Prev | Next | atomic_two_rev_sparse_hes |
ok = afun.rev_sparse_hes(vx, s, t, q, r, u, v, x)
ok = afun.rev_sparse_hes(vx, s, t, q, r, u, v)
There is an unspecified scalar valued function
g : \B{R}^m \rightarrow \B{R}
.
Given a sparsity pattern
for
R \in \B{R}^{n \times q}
,
and information about the function
z = g(y)
,
this routine computes the sparsity pattern for
V(x) = (g \circ f)^{(2)}( x ) R
vx
has prototype
const CppAD:vector<bool>& vx
vx.size() == n
, and
for
j = 0 , \ldots , n-1
,
vx[j]
is true if and only if
ax[j]
is a variable
or dynamic parameter
in the corresponding call to
afun(ax, ay)
s
has prototype
const CppAD:vector<bool>& s
and its size is
m
.
It is a sparsity pattern for
S(x) = g^{(1)} [ f(x) ] \in \B{R}^{1 \times m}
.
CppAD:vector<bool>& t
and its size is
m
.
The input values of its elements
are not specified (must not matter).
Upon return,
t
is a
sparsity pattern for
T(x) \in \B{R}^{1 \times n}
where
T(x) = (g \circ f)^{(1)} (x) = S(x) * f^{(1)} (x)
q
has prototype
size_t q
It specifies the number of columns in
R \in \B{R}^{n \times q}
,
U(x) \in \B{R}^{m \times q}
, and
V(x) \in \B{R}^{n \times q}
.
const atomic_sparsity& r
and is a atomic_sparsity
pattern for
R \in \B{R}^{n \times q}
.
const atomic_sparsity& u
and is a atomic_sparsity
pattern for
U(x) \in \B{R}^{m \times q}
which is defined by
\begin{array}{rcl}
U(x)
& = &
\{ \partial_u \{ \partial_y g[ y + f^{(1)} (x) R u ] \}_{y=f(x)} \}_{u=0}
\\
& = &
\partial_u \{ g^{(1)} [ f(x) + f^{(1)} (x) R u ] \}_{u=0}
\\
& = &
g^{(2)} [ f(x) ] f^{(1)} (x) R
\end{array}
atomic_sparsity& v
The input value of its elements
are not specified (must not matter).
Upon return,
v
is a
atomic_sparsity
pattern for
V(x) \in \B{R}^{n \times q}
which is defined by
\begin{array}{rcl}
V(x)
& = &
\partial_u [ \partial_x (g \circ f) ( x + R u ) ]_{u=0}
\\
& = &
\partial_u [ (g \circ f)^{(1)}( x + R u ) ]_{u=0}
\\
& = &
(g \circ f)^{(2)}( x ) R
\\
& = &
f^{(1)} (x)^\R{T} g^{(2)} [ f(x) ] f^{(1)} (x) R
+
\sum_{i=1}^m g_i^{(1)} [ f(x) ] \; f_i^{(2)} (x) R
\\
& = &
f^{(1)} (x)^\R{T} U(x)
+
\sum_{i=1}^m S_i (x) \; f_i^{(2)} (x) R
\end{array}
const CppAD::vector<Base>& x
and size is equal to the
n
.
This is the Value
value corresponding to the parameters in the
vector ax
(when the atomic function was called).
To be specific, if
if( Parameter(ax[i]) == true )
x[i] = Value( ax[i] );
else
x[i] = CppAD::numeric_limits<Base>::quiet_NaN();
The version of this function with out the
x
argument is deprecated;
i.e., you should include the argument even if you do not use it.