1 # ifndef CPPAD_CORE_FOR_SPARSE_JAC_HPP
2 # define CPPAD_CORE_FOR_SPARSE_JAC_HPP
256 template <
class Base>
257 template <
class VectorSet>
265 {
size_t m = Range();
269 CheckSimpleVector<bool, VectorSet>();
276 "ForSparseJac: q is not greater than zero"
279 size_t(r.size()) == n * q,
280 "ForSparseJac: size of r is not equal to\n"
281 "q times domain dimension for ADFun object."
285 for_jac_sparse_pack_.resize(num_var_tape_, q);
288 for(
size_t i = 0; i < n; i++)
295 {
for(
size_t j = 0; j < q; j++)
if( r[ j * n + i ] )
296 for_jac_sparse_pack_.post_element( ind_taddr_[i], j);
299 {
for(
size_t j = 0; j < q; j++)
if( r[ i * q + j ] )
300 for_jac_sparse_pack_.post_element( ind_taddr_[i], j);
304 for(
size_t j = 0; j < n; j++)
305 for_jac_sparse_pack_.process_post( ind_taddr_[j] );
318 for(
size_t i = 0; i < m; i++)
323 {
for(
size_t j = 0; j < q; j++)
324 s[ j * m + i ] =
false;
327 {
for(
size_t j = 0; j < q; j++)
328 s[ i * q + j ] =
false;
332 itr(for_jac_sparse_pack_, dep_taddr_[i] );
337 else s[i * q + j] =
true;
369 template <
class Base>
370 template <
class VectorSet>
372 const std::set<size_t>& set_type ,
378 {
size_t m = Range();
382 CheckSimpleVector<std::set<size_t>, VectorSet>(
383 local::one_element_std_set<size_t>(), local::two_element_std_set<size_t>()
392 std::set<size_t>::const_iterator itr_1;
396 "ForSparseJac: q is not greater than zero"
399 size_t(r.size()) == n || transpose,
400 "ForSparseJac: size of r is not equal to n and transpose is false."
403 size_t(r.size()) == q || ! transpose,
404 "ForSparseJac: size of r is not equal to q and transpose is true."
408 for_jac_sparse_set_.resize(num_var_tape_, q);
412 {
for(
size_t i = 0; i < q; i++)
414 itr_1 = r[i].begin();
415 while( itr_1 != r[i].end() )
416 {
size_t j = *itr_1++;
419 "ForSparseJac: transpose is true and element of the set\n"
420 "r[j] has value greater than or equal n."
427 for_jac_sparse_set_.post_element( ind_taddr_[j], i);
432 {
for(
size_t i = 0; i < n; i++)
438 itr_1 = r[i].begin();
439 while( itr_1 != r[i].end() )
440 {
size_t j = *itr_1++;
443 "ForSparseJac: an element of the set r[i] "
444 "has value greater than or equal q."
446 for_jac_sparse_set_.post_element( ind_taddr_[i], j);
451 for(
size_t j = 0; j < n; j++)
452 for_jac_sparse_set_.process_post( ind_taddr_[j] );
466 for(
size_t i = 0; i < m; i++)
473 itr_2(for_jac_sparse_set_, dep_taddr_[i] );
558 template <
class Base>
559 template <
class VectorSet>
569 for_jac_sparse_pack_.resize(0, 0);
570 for_jac_sparse_set_.resize(0, 0);
646 template <
class Base>
653 {
size_t n = Domain();
665 for(
size_t j = 0; j < n; j++)
672 for_jac_sparse_pack_.resize(0, 0);
673 for_jac_sparse_set_.resize(0, 0);
676 for_jac_sparse_set_.resize(num_var_tape_, q);
680 {
for(
size_t i = 0; i < q; i++)
684 { for_jac_sparse_set_.post_element( ind_taddr_[j], i );
690 {
for(
size_t j = 0; j < n; j++)
694 { for_jac_sparse_set_.post_element( ind_taddr_[j], i );
700 for(
size_t j = 0; j < n; j++)
701 for_jac_sparse_set_.process_post( ind_taddr_[j] );
719 for(
size_t i = 0; i < m; i++)
725 itr(for_jac_sparse_set_, dep_taddr_[i] );
736 for(
size_t i = 0; i < s.
n_set(); ++i)
#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 ForSparseJacCheckpoint(size_t q, const local::sparse_list &r, bool transpose, bool dependency, local::sparse_list &s)
Forward mode Jacobian sparsity calculation used by checkpoint functions.
void ForSparseJacCase(bool set_type, bool transpose, bool dependency, size_t q, const VectorSet &r, VectorSet &s)
Private helper function for ForSparseJac(q, r) boolean sparsity patterns.
void post_element(size_t i, size_t element)
Post an element for delayed addition to a set.
Two constant standard sets (currently used for concept checking).
#define CPPAD_ASSERT_UNKNOWN(exp)
Check that exp is true, if not terminate execution.
VectorSet ForSparseJac(size_t q, const VectorSet &r, bool transpose=false, bool dependency=false)
User API for Jacobian sparsity patterns using forward mode.
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.
size_t n_set(void) const
Fetch n_set for vector of sets object.
cons_iterator for one set of positive integers in a sparse_list object.
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...