1 # ifndef CPPAD_CORE_SUBGRAPH_JAC_REV_HPP
2 # define CPPAD_CORE_SUBGRAPH_JAC_REV_HPP
198 template <
typename Base>
199 template <
typename SizeVector,
typename BaseVector>
201 const BaseVector& x ,
203 {
size_t m = Range();
208 "subgraph_jac_rev: subset.nr() not equal range dimension for f"
212 "subgraph_jac_rev: subset.nc() not equal domain dimension for f"
219 size_t nnz = subset.
nnz();
220 const SizeVector& row( subset.
row() );
221 const SizeVector& col( subset.
col() );
222 SizeVector row_major = subset.
row_major();
226 for(
size_t j = 0; j < n; j++)
227 select_domain[j] =
false;
228 for(
size_t k = 0; k < nnz; k++)
229 select_domain[ col[k] ] =
true;
232 subgraph_reverse(select_domain);
243 size_t i_dep = row[ row_major[k] ];
244 size_t i_ind = col[ row_major[k] ];
246 subgraph_reverse(q, ell, dw_col, dw);
249 while( i_dep == ell )
251 if( c <
size_t( dw_col.size() ) )
252 {
if( i_ind == dw_col[c++] )
253 subset.
set( row_major[k], dw[i_ind] );
255 subset.
set( row_major[k], zero);
258 subset.
set( row_major[k], zero);
265 { i_dep = row[ row_major[k] ];
266 i_ind = col[ row_major[k] ];
272 template <
typename Base>
273 template <
typename BoolVector,
typename SizeVector,
typename BaseVector>
275 const BoolVector& select_domain ,
276 const BoolVector& select_range ,
277 const BaseVector& x ,
279 {
size_t m = Range();
291 subgraph_reverse(select_domain);
298 for(
size_t i = 0; i < m; ++i)
if( select_range[i] )
301 subgraph_reverse(q, i, col, dw);
305 size_t index = row_out.
size();
310 size_t col_size = size_t( col.size() );
311 row_out.
extend( col_size );
312 col_out.
extend( col_size );
313 val_out.
extend( col_size );
316 for(
size_t c = 0; c < col_size; ++c)
317 { row_out[index + c] = i;
318 col_out[index + c] = col[c];
319 val_out[index + c] = dw[ col[c] ];
326 size_t nnz = row_out.
size();
328 for(
size_t k = 0; k < nnz; ++k)
329 pattern.
set(k, row_out[k], col_out[k]);
333 for(
size_t k = 0; k < nnz; ++k)
334 matrix.
set(k, val_out[k]);
#define CPPAD_ASSERT_KNOWN(exp, msg)
Check that exp is true, if not print msg and terminate execution.
size_t extend(size_t n)
Increase the number of elements the end of this vector (existing elements are always preserved)...
void set(size_t k, const value_type &v)
subgraph information attached to a operation sequence
size_t nnz(void) const
number of possibly non-zero elements in matrix
const SizeVector & col(void) const
column indices
void subgraph_jac_rev(const BaseVector &x, sparse_rcv< SizeVector, BaseVector > &subset)
Subgraph sparsity patterns.
size_t nc(void) const
number of columns in matrix
Sparse matrices with elements of type Scalar.
size_t nr(void) const
number of rows in matrix
sparsity pattern for a matrix with indices of type size_t
size_t size(void) const
current number of elements in this vector.
SizeVector row_major(void) const
row-major order
#define CPPAD_ASSERT_UNKNOWN(exp)
Check that exp is true, if not terminate execution.
File used to define the ADFun<Base> class.
void set(size_t k, size_t r, size_t c)
set row and column for a possibly non-zero element
const SizeVector & row(void) const
row indices