1 # ifndef CPPAD_CORE_REV_SPARSE_JAC_HPP
2 # define CPPAD_CORE_REV_SPARSE_JAC_HPP
211 template <
class Base>
212 template <
class VectorSet>
220 {
size_t n = Domain();
227 CheckSimpleVector<bool, VectorSet>();
231 "RevSparseJac: q is not greater than zero"
234 size_t(r.size()) == q * m,
235 "RevSparseJac: size of r is not equal to\n"
236 "q times range dimension for ADFun object."
241 var_sparsity.
resize(num_var_tape_, q);
244 for(
size_t i = 0; i < m; i++)
247 {
for(
size_t j = 0; j < q; j++)
if( r[ i * q + j ] )
251 {
for(
size_t j = 0; j < q; j++)
if( r[ j * m + i ] )
256 for(
size_t i = 0; i < m; i++)
270 for(
size_t j = 0; j < n; j++)
278 {
for(
size_t i = 0; i < q; i++)
279 s[ j * q + i ] =
false;
282 {
for(
size_t i = 0; i < q; i++)
283 s[ i * n + j ] =
false;
290 s[ j * q + i ] =
true;
291 else s[ i * n + j ] =
true;
324 template <
class Base>
325 template <
class VectorSet>
327 const std::set<size_t>& set_type ,
335 s.resize( Domain() );
339 std::set<size_t>::const_iterator itr_1;
342 CheckSimpleVector<std::set<size_t>, VectorSet>(
343 local::one_element_std_set<size_t>(), local::two_element_std_set<size_t>()
347 size_t n = ind_taddr_.size();
348 size_t m = dep_taddr_.size();
352 "RevSparseJac: q is not greater than zero"
355 size_t(r.size()) == q || transpose,
356 "RevSparseJac: size of r is not equal to q and transpose is false."
359 size_t(r.size()) == m || ! transpose,
360 "RevSparseJac: size of r is not equal to m and transpose is true."
365 var_sparsity.
resize(num_var_tape_, q);
369 {
for(
size_t i = 0; i < m; i++)
370 { itr_1 = r[i].begin();
371 while(itr_1 != r[i].end())
372 {
size_t j = *itr_1++;
375 "RevSparseJac: transpose is true and element of the set\n"
376 "r[i] has value greater than or equal q."
384 {
for(
size_t i = 0; i < q; i++)
385 { itr_1 = r[i].begin();
386 while(itr_1 != r[i].end())
387 {
size_t j = *itr_1++;
390 "RevSparseJac: transpose is false and element of the set\n"
391 "r[i] has value greater than or equal range dimension."
399 for(
size_t i = 0; i < m; i++)
414 for(
size_t j = 0; j < n; j++)
481 template <
class Base>
482 template <
class VectorSet>
542 template <
class Base>
549 {
size_t n = Domain();
561 for(
size_t i = 0; i < m; i++)
567 var_sparsity.
resize(num_var_tape_, q);
571 {
for(
size_t i = 0; i < m; i++)
581 {
for(
size_t j = 0; j < q; j++)
591 for(
size_t i = 0; i < m; i++)
610 for(
size_t j = 0; j < n; j++)
629 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 process_post(size_t i)
process post entries for a specific set.
size_t end(void) const
Fetch end for this vector of sets object.
void post_element(size_t i, size_t element)
Post an element for delayed addition to a set.
void RevSparseJacCase(bool set_type, bool transpose, bool dependency, size_t p, const VectorSet &s, VectorSet &r)
Private helper function for RevSparseJac(q, r, transpose) boolean sparsity.
VectorSet RevSparseJac(size_t q, const VectorSet &s, bool transpose=false, bool dependency=false)
User API for Jacobian sparsity patterns using reverse mode.
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 RevSparseJacCheckpoint(size_t q, const local::sparse_list &r, bool transpose, bool dependency, local::sparse_list &s)
Reverse mode Jacobian sparsity calculation used by checkpoint functions.
Two constant standard sets (currently used for concept checking).
#define CPPAD_ASSERT_UNKNOWN(exp)
Check that exp is true, if not terminate execution.
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 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 resize(size_t n_set, size_t end)
Change number of sets, set end, and initialize all sets as empty.