1 # ifndef CPPAD_CORE_FOR_SPARSE_HES_HPP
2 # define CPPAD_CORE_FOR_SPARSE_HES_HPP
151 # include <algorithm>
181 template <
class Base>
182 template <
class VectorSet>
188 {
size_t n = Domain();
192 CheckSimpleVector<bool, VectorSet>();
195 size_t(r.size()) == n,
196 "ForSparseHes: size of r is not equal to\n"
197 "domain dimension for ADFun object."
200 size_t(s.size()) == m,
201 "ForSparseHes: size of s is not equal to\n"
202 "range dimension for ADFun object."
207 for_jac_pattern.
resize(num_var_tape_, n + 1);
208 for(
size_t i = 0; i < n; i++)
215 for_jac_pattern.
add_element( ind_taddr_[i], ind_taddr_[i] );
218 bool dependency =
false;
228 rev_jac_pattern.
resize(num_var_tape_, 1);
229 for(
size_t i = 0; i < m; i++)
247 for_hes_pattern.
resize(n+1, n+1);
260 for(
size_t i = 0; i < n; i++)
261 {
for(
size_t j = 0; j < n; j++)
262 h[ i * n + j ] =
false;
266 for(
size_t i = 0; i < n; i++)
274 while( j < for_hes_pattern.
end() )
276 h[ i * n + (j-1) ] =
true;
301 template <
class Base>
302 template <
class VectorSet>
304 const std::set<size_t>& set_type ,
308 {
size_t n = Domain();
312 std::set<size_t>::const_iterator itr_1;
315 CheckSimpleVector<std::set<size_t>, VectorSet>(
316 local::one_element_std_set<size_t>(), local::two_element_std_set<size_t>()
320 "ForSparseHes: size of s is not equal to one."
324 "ForSparseHes: size of s is not equal to one."
329 for_jac_pattern.
resize(num_var_tape_, n + 1);
330 itr_1 = r[0].begin();
331 while( itr_1 != r[0].end() )
332 {
size_t i = *itr_1++;
338 for_jac_pattern.add_element( ind_taddr_[i], ind_taddr_[i] );
341 bool dependency =
false;
351 rev_jac_pattern.
resize(num_var_tape_, 1);
352 itr_1 = s[0].begin();
353 while( itr_1 != s[0].end() )
354 {
size_t i = *itr_1++;
357 "ForSparseHes: an element of the set s[0] has value "
358 "greater than or equal m"
378 for_hes_pattern.
resize(n+1, n+1);
393 for(
size_t i = 0; i < n; i++)
400 while( j < for_hes_pattern.
end() )
447 template <
class Base>
448 template <
class VectorSet>
450 const VectorSet& r,
const VectorSet& s
496 # ifdef CPPAD_NOT_DEFINED
497 template <
class Base>
514 for(
size_t i = 0; i < num_var_tape_; i++)
516 for(
size_t i = 0; i < m; i++)
518 RevJac[ dep_taddr_[i] ] = s[i];
522 local::sparse_list for_hes_pattern;
523 for_hes_pattern.resize(n+1, n+1);
542 for(
size_t j = 0; j < n; j++)
561 for(
size_t i = 0; i < n; ++i)
void ForSparseHesCheckpoint(vector< bool > &r, vector< bool > &s, local::sparse_list &h)
#define CPPAD_ASSERT_KNOWN(exp, msg)
Check that exp is true, if not print msg and terminate execution.
size_t end(void) const
Fetch end for this vector of sets object.
Vector of sets of positive integers, each set stored as a singly linked list.
void add_element(size_t i, size_t element)
Add one element to a set.
size_t end(void) const
Fetch end for this vector of sets object.
File used to define pod_vector class.
size_t size(void) const
number of elements currently in this vector.
Vector of sets of postivie integers, each set stored as a packed boolean array.
void post_element(size_t i, size_t element)
Post an element for delayed addition to a set.
void ForSparseHesCase(bool set_type, const VectorSet &r, const VectorSet &s, VectorSet &h)
Private helper function for ForSparseHes(q, s) bool sparsity.
Two constant standard sets (currently used for concept checking).
VectorSet ForSparseHes(const VectorSet &r, const VectorSet &s)
User API for Hessian sparsity patterns using reverse mode.
#define CPPAD_ASSERT_UNKNOWN(exp)
Check that exp is true, if not terminate execution.
void add_element(size_t i, size_t element)
Add one element to a set.
void resize(size_t n_set, size_t end)
Start a new vector of sets.
cons_iterator for one set of positive integers in a sparse_pack object.
void process_post(size_t i)
process post entries for a specific set.
cons_iterator for one set of positive integers in a sparse_list object.
void rev_jac_sweep(const local::player< Base > *play, bool dependency, size_t n, size_t numvar, Vector_set &var_sparsity)
Given the sparsity pattern for the dependent variables, RevJacSweep computes the sparsity pattern for...
void for_hes_sweep(const local::player< Base > *play, size_t n, size_t numvar, const Vector_set &for_jac_sparse, const Vector_set &rev_jac_sparse, Vector_set &for_hes_sparse)
Given the forward Jacobian sparsity pattern for all the variables, and the reverse Jacobian sparsity ...
void for_jac_sweep(const local::player< Base > *play, bool dependency, size_t n, size_t numvar, Vector_set &var_sparsity)
Given the sparsity pattern for the independent variables, ForJacSweep computes the sparsity pattern f...
void resize(size_t n_set, size_t end)
Change number of sets, set end, and initialize all sets as empty.