1 #ifndef CPPAD_CG_ATOMIC_EXTERNAL_FUNCTION_INCLUDED 2 #define CPPAD_CG_ATOMIC_EXTERNAL_FUNCTION_INCLUDED 25 atomic_base<Base>* atomic_;
40 size_t n = tx[0].
size;
44 convert(tx, libModel._tx, n, p, p + 1);
46 size_t ty_size = m * (p + 1);
47 libModel._ty.resize(ty_size);
49 std::fill(&libModel._ty[0], &libModel._ty[0] + ty_size, Base(0));
51 bool ret = atomic_->forward(q, p, vx, vy, libModel._tx, libModel._ty);
53 convertAdd(libModel._ty, ty, m, p, p);
62 const Array py[])
override {
63 size_t m = py[0].
size;
64 size_t n = tx[0].
size;
66 convert(tx, libModel._tx, n, p, p + 1);
68 libModel._ty.resize(m * (p + 1));
69 std::fill(&libModel._ty[0], &libModel._ty[0] + libModel._ty.size(), Base(0));
71 convert(py, libModel._py, m, p, p + 1);
73 size_t px_size = n * (p + 1);
74 libModel._px.resize(px_size);
76 std::fill(&libModel._px[0], &libModel._px[0] + px_size, Base(0));
79 if (libModel._evalAtomicForwardOne4CppAD) {
82 if (!atomic_->forward(p, p, vx, vy, libModel._tx, libModel._ty))
87 bool ret = atomic_->reverse(p, libModel._tx, libModel._ty, libModel._px, libModel._py);
89 convertAdd(libModel._px, px, n, p, 0);
96 inline void convert(
const Array from[],
104 for (
size_t k = 0; k < kmax; k++) {
105 Base* values =
static_cast<Base*
> (from[k].
data);
106 if (from[k].sparse) {
108 std::fill(&to[0], &to[0] + n, Base(0));
110 for (
size_t j = 0; j < n; j++) {
111 to[j * p1 + k] = Base(0);
115 for (
size_t e = 0; e < from[k].
nnz; e++) {
116 size_t j = from[k].
idx[e];
117 to[j * p1 + k] = values[e];
120 for (
size_t j = 0; j < n; j++) {
121 to[j * p1 + k] = values[j];
132 CPPADCG_ASSERT_KNOWN(!to.
sparse,
"output must be a dense array")
133 CPPADCG_ASSERT_KNOWN(to.
size >= n,
"invalid size")
135 Base* values =
static_cast<Base*
> (to.
data);
138 std::copy(&from[0], &from[0] + n, values);
142 for (
size_t j = 0; j < n; j++) {
143 values[j] += from[j * p1 + k];
const unsigned long * idx
bool reverse(FunctorGenericModel< Base > &libModel, int p, const Array tx[], Array &px, const Array py[]) override
bool forward(FunctorGenericModel< Base > &libModel, int q, int p, const Array tx[], Array &ty) override