2 # ifndef CPPAD_LOCAL_SPARSE_BINARY_OP_HPP
3 # define CPPAD_LOCAL_SPARSE_BINARY_OP_HPP
15 namespace CppAD {
namespace local {
79 template <
class Vector_set>
83 Vector_set& sparsity )
89 sparsity.binary_union(i_z, arg[0], arg[1], sparsity);
155 template <
class Vector_set>
159 Vector_set& sparsity )
165 sparsity.binary_union(arg[0], arg[0], i_z, sparsity);
166 sparsity.binary_union(arg[1], arg[1], i_z, sparsity);
182 template <
class Vector_set>
187 const Vector_set& for_jac_sparsity ,
188 Vector_set& rev_hes_sparsity )
194 rev_hes_sparsity.binary_union(arg[0], arg[0], i_z, rev_hes_sparsity);
195 rev_hes_sparsity.binary_union(arg[1], arg[1], i_z, rev_hes_sparsity);
197 jac_reverse[arg[0]] |= jac_reverse[i_z];
198 jac_reverse[arg[1]] |= jac_reverse[i_z];
214 template <
class Vector_set>
219 const Vector_set& for_jac_sparsity ,
220 Vector_set& rev_hes_sparsity )
226 rev_hes_sparsity.binary_union(arg[0], arg[0], i_z, rev_hes_sparsity);
227 rev_hes_sparsity.binary_union(arg[1], arg[1], i_z, rev_hes_sparsity);
229 if( jac_reverse[i_z] )
230 { rev_hes_sparsity.binary_union(
231 arg[0], arg[0], arg[1], for_jac_sparsity);
232 rev_hes_sparsity.binary_union(
233 arg[1], arg[1], arg[0], for_jac_sparsity);
236 jac_reverse[arg[0]] |= jac_reverse[i_z];
237 jac_reverse[arg[1]] |= jac_reverse[i_z];
252 template <
class Vector_set>
257 const Vector_set& for_jac_sparsity ,
258 Vector_set& rev_hes_sparsity )
264 rev_hes_sparsity.binary_union(arg[0], arg[0], i_z, rev_hes_sparsity);
265 rev_hes_sparsity.binary_union(arg[1], arg[1], i_z, rev_hes_sparsity);
267 if( jac_reverse[i_z] )
268 { rev_hes_sparsity.binary_union(
269 arg[0], arg[0], arg[1], for_jac_sparsity);
270 rev_hes_sparsity.binary_union(
271 arg[1], arg[1], arg[0], for_jac_sparsity);
272 rev_hes_sparsity.binary_union(
273 arg[1], arg[1], arg[1], for_jac_sparsity);
276 jac_reverse[arg[0]] |= jac_reverse[i_z];
277 jac_reverse[arg[1]] |= jac_reverse[i_z];
292 template <
class Vector_set>
297 const Vector_set& for_jac_sparsity ,
298 Vector_set& rev_hes_sparsity )
304 rev_hes_sparsity.binary_union(arg[0], arg[0], i_z, rev_hes_sparsity);
305 rev_hes_sparsity.binary_union(arg[1], arg[1], i_z, rev_hes_sparsity);
307 if( jac_reverse[i_z] )
309 rev_hes_sparsity.binary_union(
310 arg[0], arg[0], arg[0], for_jac_sparsity);
311 rev_hes_sparsity.binary_union(
312 arg[0], arg[0], arg[1], for_jac_sparsity);
314 rev_hes_sparsity.binary_union(
315 arg[1], arg[1], arg[0], for_jac_sparsity);
316 rev_hes_sparsity.binary_union(
317 arg[1], arg[1], arg[1], for_jac_sparsity);
322 jac_reverse[arg[0]] |= jac_reverse[i_z];
323 jac_reverse[arg[1]] |= jac_reverse[i_z];
348 template <
class Vector_set>
351 const Vector_set& for_jac_sparsity ,
352 Vector_set& for_hes_sparsity )
355 typename Vector_set::const_iterator itr_0(for_jac_sparsity, arg[0]);
359 while( i_x < for_jac_sparsity.end() )
361 for_hes_sparsity.binary_union(i_x, i_x, arg[1], for_jac_sparsity);
366 typename Vector_set::const_iterator itr_1(for_jac_sparsity, arg[1]);
370 while( i_x < for_jac_sparsity.end() )
372 for_hes_sparsity.binary_union(i_x, i_x, arg[0], for_jac_sparsity);
398 template <
class Vector_set>
401 const Vector_set& for_jac_sparsity ,
402 Vector_set& for_hes_sparsity )
405 typename Vector_set::const_iterator itr_0(for_jac_sparsity, arg[0]);
409 while( i_x < for_jac_sparsity.end() )
411 for_hes_sparsity.binary_union(i_x, i_x, arg[1], for_jac_sparsity);
416 typename Vector_set::const_iterator itr_1(for_jac_sparsity, arg[1]);
420 while( i_x < for_jac_sparsity.end() )
422 for_hes_sparsity.binary_union(i_x, i_x, arg[0], for_jac_sparsity);
424 for_hes_sparsity.binary_union(i_x, i_x, arg[1], for_jac_sparsity);
450 template <
class Vector_set>
453 const Vector_set& for_jac_sparsity ,
454 Vector_set& for_hes_sparsity )
457 typename Vector_set::const_iterator itr_0(for_jac_sparsity, arg[0]);
461 while( i_x < for_jac_sparsity.end() )
463 for_hes_sparsity.binary_union(i_x, i_x, arg[0], for_jac_sparsity);
465 for_hes_sparsity.binary_union(i_x, i_x, arg[1], for_jac_sparsity);
470 typename Vector_set::const_iterator itr_1(for_jac_sparsity, arg[1]);
474 while( i_x < for_jac_sparsity.end() )
476 for_hes_sparsity.binary_union(i_x, i_x, arg[0], for_jac_sparsity);
478 for_hes_sparsity.binary_union(i_x, i_x, arg[1], for_jac_sparsity);
CPPAD_TAPE_ADDR_TYPE addr_t
void reverse_sparse_hessian_addsub_op(size_t i_z, const addr_t *arg, bool *jac_reverse, const Vector_set &for_jac_sparsity, Vector_set &rev_hes_sparsity)
Reverse mode Hessian sparsity pattern for add and subtract operators.
void forward_sparse_hessian_mul_op(const addr_t *arg, const Vector_set &for_jac_sparsity, Vector_set &for_hes_sparsity)
Forward mode Hessian sparsity pattern for multiplication operator.
void forward_sparse_hessian_pow_op(const addr_t *arg, const Vector_set &for_jac_sparsity, Vector_set &for_hes_sparsity)
Forward mode Hessian sparsity pattern for power operator.
void reverse_sparse_hessian_pow_op(size_t i_z, const addr_t *arg, bool *jac_reverse, const Vector_set &for_jac_sparsity, Vector_set &rev_hes_sparsity)
Reverse mode Hessian sparsity pattern for power function.
void reverse_sparse_hessian_mul_op(size_t i_z, const addr_t *arg, bool *jac_reverse, const Vector_set &for_jac_sparsity, Vector_set &rev_hes_sparsity)
Reverse mode Hessian sparsity pattern for multiplication operator.
#define CPPAD_ASSERT_UNKNOWN(exp)
Check that exp is true, if not terminate execution.
void reverse_sparse_hessian_div_op(size_t i_z, const addr_t *arg, bool *jac_reverse, const Vector_set &for_jac_sparsity, Vector_set &rev_hes_sparsity)
Reverse mode Hessian sparsity pattern for division operator.
void forward_sparse_jacobian_binary_op(size_t i_z, const addr_t *arg, Vector_set &sparsity)
Forward mode Jacobian sparsity pattern for all binary operators.
void reverse_sparse_jacobian_binary_op(size_t i_z, const addr_t *arg, Vector_set &sparsity)
Reverse mode Jacobian sparsity pattern for all binary operators.
void forward_sparse_hessian_div_op(const addr_t *arg, const Vector_set &for_jac_sparsity, Vector_set &for_hes_sparsity)
Forward mode Hessian sparsity pattern for division operator.