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) {
70 virtual ~CGAtomicFun() =
default;
72 template <
class ADVector>
73 void operator()(
const ADVector& ax,
76 this->CGAbstractAtomicFun<Base>::operator()(ax, ay,
id);
79 bool for_sparse_jac(
size_t q,
80 const CppAD::vector<std::set<size_t> >& r,
81 CppAD::vector<std::set<size_t> >& s,
82 const CppAD::vector<CGB>& x)
override {
83 return atomicFun_.for_sparse_jac(q, r, s, sparsityIndeps(x));
86 bool for_sparse_jac(
size_t q,
87 const CppAD::vector<std::set<size_t> >& r,
88 CppAD::vector<std::set<size_t> >& s)
override {
89 return atomicFun_.for_sparse_jac(q, r, s);
92 bool for_sparse_jac(
size_t q,
93 const CppAD::vector<bool>& r,
94 CppAD::vector<bool>& s,
95 const CppAD::vector<CGB>& x)
override {
96 return atomicFun_.for_sparse_jac(q, r, s, sparsityIndeps(x));
99 bool for_sparse_jac(
size_t q,
100 const CppAD::vector<bool>& r,
101 CppAD::vector<bool>& s)
override {
102 return atomicFun_.for_sparse_jac(q, r, s);
105 bool rev_sparse_jac(
size_t q,
106 const CppAD::vector<std::set<size_t> >& rt,
107 CppAD::vector<std::set<size_t> >& st,
108 const CppAD::vector<CGB>& x)
override {
109 return atomicFun_.rev_sparse_jac(q, rt, st, sparsityIndeps(x));
112 bool rev_sparse_jac(
size_t q,
113 const CppAD::vector<std::set<size_t> >& rt,
114 CppAD::vector<std::set<size_t> >& st)
override {
115 return atomicFun_.rev_sparse_jac(q, rt, st);
118 bool rev_sparse_jac(
size_t q,
119 const CppAD::vector<bool>& rt,
120 CppAD::vector<bool>& st,
121 const CppAD::vector<CGB>& x)
override {
122 return atomicFun_.rev_sparse_jac(q, rt, st, sparsityIndeps(x));
125 bool rev_sparse_jac(
size_t q,
126 const CppAD::vector<bool>& rt,
127 CppAD::vector<bool>& st)
override {
128 return atomicFun_.rev_sparse_jac(q, rt, st);
131 bool rev_sparse_hes(
const CppAD::vector<bool>& vx,
132 const CppAD::vector<bool>& s,
133 CppAD::vector<bool>& t,
135 const CppAD::vector<std::set<size_t> >& r,
136 const CppAD::vector<std::set<size_t> >& u,
137 CppAD::vector<std::set<size_t> >& v,
138 const CppAD::vector<CGB>& x)
override {
139 return atomicFun_.rev_sparse_hes(vx, s, t, q, r, u, v, sparsityIndeps(x));
142 bool rev_sparse_hes(
const CppAD::vector<bool>& vx,
143 const CppAD::vector<bool>& s,
144 CppAD::vector<bool>& t,
146 const CppAD::vector<std::set<size_t> >& r,
147 const CppAD::vector<std::set<size_t> >& u,
148 CppAD::vector<std::set<size_t> >& v)
override {
149 return atomicFun_.rev_sparse_hes(vx, s, t, q, r, u, v);
152 bool rev_sparse_hes(
const CppAD::vector<bool>& vx,
153 const CppAD::vector<bool>& s,
154 CppAD::vector<bool>& t,
156 const CppAD::vector<bool>& r,
157 const CppAD::vector<bool>& u,
158 CppAD::vector<bool>& v,
159 const CppAD::vector<CGB>& x)
override {
160 return atomicFun_.rev_sparse_hes(vx, s, t, q, r, u, v, sparsityIndeps(x));
163 bool rev_sparse_hes(
const CppAD::vector<bool>& vx,
164 const CppAD::vector<bool>& s,
165 CppAD::vector<bool>& t,
167 const CppAD::vector<bool>& r,
168 const CppAD::vector<bool>& u,
169 CppAD::vector<bool>& v)
override {
170 return atomicFun_.rev_sparse_hes(vx, s, t, q, r, u, v);
175 void zeroOrderDependency(
const CppAD::vector<bool>& vx,
176 CppAD::vector<bool>& vy,
177 const CppAD::vector<CGB>& x)
override {
180 size_t m = vy.size();
181 size_t n = vx.size();
183 vector<std::set<size_t> > rt(m);
184 for (
size_t j = 0; j < m; j++) {
187 vector<std::set<size_t> > st(n);
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();
236 inline static CppAD::vector<Base> values(ArrayView<
const CppAD::AD<Base>> x) {
237 CppAD::vector<Base> out(x.size());
238 for (
size_t i = 0; i < out.size(); ++i) {
239 out[i] = CppAD::Value(CppAD::Var2Par(x[i]));
244 inline static CppAD::vector<Base> values(ArrayView<const Base> x) {
245 CppAD::vector<Base> out(x.size());
246 for (
size_t i = 0; i < out.size(); ++i) {