1 #ifndef CPPAD_CG_BASE_ABSTRACT_ATOMIC_FUN_INCLUDED 2 #define CPPAD_CG_BASE_ABSTRACT_ATOMIC_FUN_INCLUDED 41 atomic_base<
CGB>(name) {
42 CPPADCG_ASSERT_KNOWN(!name.empty(),
"The atomic function name cannot be empty")
47 template <class ADVector>
48 void operator()(
const ADVector& ax,
51 this->atomic_base<CGB>::operator()(ax, ay,
id);
58 static inline void appendAsArguments(
typename std::vector<Arg>::iterator begin,
60 std::vector<Arg> arguments(tx.size());
61 typename std::vector<Arg>::iterator it = begin;
62 for (
size_t i = 0; i < arguments.size(); i++, ++it) {
63 if (tx[i].isParameter()) {
64 *it =
Arg(tx[i].getValue());
66 *it =
Arg(*tx[i].getOperationNode());
73 std::vector<Arg> arrayArgs = asArguments(tx);
74 std::vector<size_t> info;
76 return handler.makeNode(CGOpCode::ArrayCreation, info, arrayArgs);
83 CPPADCG_ASSERT_UNKNOWN(k <= p)
84 size_t n = tx.size() / (p + 1);
85 std::vector<Arg> arrayArgs(n);
86 for (
size_t i = 0; i < n; i++) {
87 arrayArgs[i] = asArgument(tx[i * (p + 1) + k]);
90 return handler.makeNode(CGOpCode::ArrayCreation,{}, arrayArgs);
96 std::vector<Arg> arrayArgs = asArguments(tx2);
98 return handler.makeNode(CGOpCode::ArrayCreation,{}, arrayArgs);
103 return handler.makeNode(CGOpCode::SparseArrayCreation,{size}, {});
111 CPPADCG_ASSERT_UNKNOWN(k < p1)
112 size_t n = py.size() / p1;
114 std::vector<Arg> arrayArgs;
115 std::vector<size_t> arrayIdx(1);
118 arrayArgs.reserve(py.size() / 3);
119 arrayIdx.reserve(1 + py.size() / 3);
121 for (
size_t i = 0; i < n; i++) {
122 if (!py[i * p1 + k].isIdenticalZero()) {
123 arrayArgs.push_back(asArgument(py[i * p1 + k]));
124 arrayIdx.push_back(i);
128 return handler.makeNode(CGOpCode::SparseArrayCreation, arrayIdx, arrayArgs);
132 for (
size_t i = 0; i < tx.size(); i++) {
133 if (!tx[i].isParameter()) {
141 for (
size_t i = 0; i < tx.size(); i++) {
142 if (!tx[i].isValueDefined()) {
BaseAbstractAtomicFun(const std::string &name)