1 #ifndef CPPAD_CG_ATOMIC_FUN_INCLUDED 2 #define CPPAD_CG_ATOMIC_FUN_INCLUDED 32 atomic_base<Base>& atomicFun_;
52 bool standAlone =
false) :
54 atomicFun_(atomicFun),
55 xSparsity_(xSparsity) {
60 bool standAlone =
false) :
61 CGAtomicFun(atomicFun, values(xSparsity), standAlone) {
66 bool standAlone =
false) :
67 CGAtomicFun(atomicFun, values(xSparsity), standAlone) {
72 template <
class ADVector>
73 void operator()(
const ADVector& ax,
79 bool for_sparse_jac(
size_t q,
83 return atomicFun_.for_sparse_jac(q, r, s, sparsityIndeps(x));
86 bool for_sparse_jac(
size_t q,
89 return atomicFun_.for_sparse_jac(q, r, s);
92 bool for_sparse_jac(
size_t q,
96 return atomicFun_.for_sparse_jac(q, r, s, sparsityIndeps(x));
99 bool for_sparse_jac(
size_t q,
102 return atomicFun_.for_sparse_jac(q, r, s);
105 bool rev_sparse_jac(
size_t q,
109 return atomicFun_.rev_sparse_jac(q, rt, st, sparsityIndeps(x));
112 bool rev_sparse_jac(
size_t q,
115 return atomicFun_.rev_sparse_jac(q, rt, st);
118 bool rev_sparse_jac(
size_t q,
122 return atomicFun_.rev_sparse_jac(q, rt, st, sparsityIndeps(x));
125 bool rev_sparse_jac(
size_t q,
128 return atomicFun_.rev_sparse_jac(q, rt, st);
139 return atomicFun_.rev_sparse_hes(vx, s, t, q, r, u, v, sparsityIndeps(x));
149 return atomicFun_.rev_sparse_hes(vx, s, t, q, r, u, v);
160 return atomicFun_.rev_sparse_hes(vx, s, t, q, r, u, v, sparsityIndeps(x));
170 return atomicFun_.rev_sparse_hes(vx, s, t, q, r, u, v);
180 size_t m = vy.size();
181 size_t n = vx.size();
184 for (
size_t j = 0; j < m; j++) {
189 bool ok = rev_sparse_jac(m, rt, st, x);
191 throw CGException(
"False returned from rev_sparse_jac() in the atomic function \"", this->atomic_name(),
"\".");
193 for (
size_t j = 0; j < n; j++) {
194 for (
size_t i : st[j]) {
207 return atomicFun_.forward(q, p, vx, vy, tx, ty);
215 return atomicFun_.reverse(p, tx, ty, px, py);
220 CPPADCG_ASSERT_UNKNOWN(x.size() == xSparsity_.size());
224 for (
size_t i = 0; i < n; ++i) {
225 if (x[i].isValueDefined()) {
226 out[i] = x[i].getValue();
238 for (
size_t i = 0; i < out.size(); ++i) {
239 out[i] = CppAD::Value(CppAD::Var2Par(x[i]));
246 for (
size_t i = 0; i < out.size(); ++i) {
CGAtomicFun(atomic_base< Base > &atomicFun, const CppAD::vector< Base > &xSparsity, bool standAlone=false)
bool atomicReverse(size_t p, const CppAD::vector< Base > &tx, const CppAD::vector< Base > &ty, CppAD::vector< Base > &px, const CppAD::vector< Base > &py) override
bool atomicForward(size_t q, size_t p, const CppAD::vector< Base > &tx, CppAD::vector< Base > &ty) override
size_t size() const noexcept