1 # ifndef CPPAD_LOCAL_REVERSE_SWEEP_HPP
2 # define CPPAD_LOCAL_REVERSE_SWEEP_HPP
16 namespace CppAD {
namespace local {
37 # define CPPAD_ATOMIC_CALL user_atom->reverse
39 # define CPPAD_ATOMIC_CALL user_ok = user_atom->reverse
48 # define CPPAD_REVERSE_SWEEP_TRACE 0
182 template <
class Base>
205 const Base* parameter = CPPAD_NULL;
207 parameter = play->
GetPar();
210 const size_t user_k = d;
211 const size_t user_k1 = d+1;
220 bool user_ok =
false;
224 size_t user_old=0, user_m=0, user_n=0, user_i=0, user_j=0;
231 # if CPPAD_REVERSE_SWEEP_TRACE
232 std::cout << std::endl;
234 size_t subgraph_index = subgraph.
size();
235 while(subgraph_index > 0)
239 size_t i_op = subgraph[--subgraph_index];
247 while( cskip_op[i_op] )
257 subgraph_index -= user_m + user_n;
258 i_op = subgraph[--subgraph_index];
268 i_op = subgraph[--subgraph_index];
271 # if CPPAD_REVERSE_SWEEP_TRACE
272 size_t i_tmp = i_var;
273 const Base* Z_tmp = Taylor + i_var * J;
274 const Base* pZ_tmp = Partial + i_var * K;
290 std::cout << std::endl;
296 d, i_var, arg[0], J, Taylor, K, Partial
305 d, i_var, arg[0], J, Taylor, K, Partial
310 # if CPPAD_USE_CPLUSPLUS_2011
315 d, i_var, arg[0], J, Taylor, K, Partial
323 d, i_var, arg, parameter, J, Taylor, K, Partial
331 d, i_var, arg, parameter, J, Taylor, K, Partial
340 d, i_var, arg[0], J, Taylor, K, Partial
345 # if CPPAD_USE_CPLUSPLUS_2011
350 d, i_var, arg[0], J, Taylor, K, Partial
360 d, i_var, arg[0], J, Taylor, K, Partial
365 # if CPPAD_USE_CPLUSPLUS_2011
370 d, i_var, arg[0], J, Taylor, K, Partial
389 d, i_var, arg, K, Partial
413 d, i_var, arg[0], J, Taylor, K, Partial
421 d, i_var, arg[0], J, Taylor, K, Partial
434 d, i_var, arg, parameter, J, Taylor, K, Partial
442 d, i_var, arg, parameter, J, Taylor, K, Partial
450 d, i_var, arg, parameter, J, Taylor, K, Partial
462 # if CPPAD_USE_CPLUSPLUS_2011
465 d, i_var, arg, parameter, J, Taylor, K, Partial
473 d, i_var, arg[0], J, Taylor, K, Partial
478 # if CPPAD_USE_CPLUSPLUS_2011
481 d, i_var, arg[0], J, Taylor, K, Partial
493 op, d, i_var, arg, J, Taylor, K, Partial, var_by_load_op.
data()
500 op, d, i_var, arg, J, Taylor, K, Partial, var_by_load_op.
data()
520 d, i_var, arg[0], J, Taylor, K, Partial
525 # if CPPAD_USE_CPLUSPLUS_2011
528 d, i_var, arg[0], J, Taylor, K, Partial
537 d, i_var, arg, parameter, J, Taylor, K, Partial
544 d, i_var, arg, parameter, J, Taylor, K, Partial
556 d, i_var, arg, parameter, J, Taylor, K, Partial
564 d, i_var, arg, parameter, J, Taylor, K, Partial
571 d, i_var, arg, parameter, J, Taylor, K, Partial
584 d, i_var, arg[0], J, Taylor, K, Partial
592 d, i_var, arg[0], J, Taylor, K, Partial
600 d, i_var, arg[0], J, Taylor, K, Partial
607 d, i_var, arg[0], J, Taylor, K, Partial
630 d, i_var, arg, parameter, J, Taylor, K, Partial
638 d, i_var, arg, parameter, J, Taylor, K, Partial
646 d, i_var, arg, parameter, J, Taylor, K, Partial
654 d, i_var, arg[0], J, Taylor, K, Partial
662 d, i_var, arg[0], J, Taylor, K, Partial
670 user_atom = play->
get_user_info(op, arg, user_old, user_m, user_n);
677 if(user_tx.
size() != user_n * user_k1)
678 { user_tx.
resize(user_n * user_k1);
679 user_px.
resize(user_n * user_k1);
681 if(user_ty.
size() != user_m * user_k1)
682 { user_ty.
resize(user_m * user_k1);
683 user_py.
resize(user_m * user_k1);
692 user_k, user_tx, user_ty, user_px, user_py
698 +
": atomic_base.reverse: returned false";
702 for(j = 0; j < user_n; j++) if( user_ix[j] > 0 )
703 {
for(ell = 0; ell < user_k1; ell++)
704 Partial[user_ix[j] * K + ell] +=
705 user_px[j * user_k1 + ell];
720 user_tx[user_j * user_k1 + 0] = parameter[ arg[0]];
721 for(ell = 1; ell < user_k1; ell++)
722 user_tx[user_j * user_k1 + ell] = Base(0.);
736 user_ix[user_j] = arg[0];
737 for(ell = 0; ell < user_k1; ell++)
738 user_tx[user_j*user_k1 + ell] = Taylor[ arg[0] * J + ell];
753 for(ell = 0; ell < user_k1; ell++)
754 { user_py[user_i * user_k1 + ell] = Base(0.);
755 user_ty[user_i * user_k1 + ell] = Base(0.);
757 user_ty[user_i * user_k1 + 0] = parameter[ arg[0] ];
771 for(ell = 0; ell < user_k1; ell++)
772 { user_py[user_i * user_k1 + ell] =
773 Partial[i_var * K + ell];
774 user_ty[user_i * user_k1 + ell] =
775 Taylor[i_var * J + ell];
785 d, i_var, arg, parameter, J, Taylor, K, Partial
793 d, i_var, arg, parameter, J, Taylor, K, Partial
800 d, i_var, arg, parameter, J, Taylor, K, Partial
809 # if CPPAD_REVERSE_SWEEP_TRACE
810 std::cout << std::endl;
817 # undef CPPAD_REVERSE_SWEEP_TRACE
818 # undef CPPAD_ATOMIC_CALL
#define CPPAD_ASSERT_KNOWN(exp, msg)
Check that exp is true, if not print msg and terminate execution.
void reverse_subvv_op(size_t d, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, const Base *taylor, size_t nc_partial, Base *partial)
Compute reverse mode partial derivatives for result of op = SubvvOp.
void reverse_sin_op(size_t d, size_t i_z, size_t i_x, size_t cap_order, const Base *taylor, size_t nc_partial, Base *partial)
Compute reverse mode partial derivatives for result of op = SinOp.
void reverse_atan_op(size_t d, size_t i_z, size_t i_x, size_t cap_order, const Base *taylor, size_t nc_partial, Base *partial)
Reverse mode partial derivatives for result of op = AtanOp.
void reverse_mulvv_op(size_t d, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, const Base *taylor, size_t nc_partial, Base *partial)
Compute reverse mode partial derivatives for result of op = MulvvOp.
size_t num_par_rec(void) const
Fetch number of parameters in the recording.
void reverse_asin_op(size_t d, size_t i_z, size_t i_x, size_t cap_order, const Base *taylor, size_t nc_partial, Base *partial)
Compute reverse mode partial derivatives for result of op = AsinOp.
void printOpResult(std::ostream &os, size_t nfz, const Value *fz, size_t nrz, const Value *rz)
Prints the result values correspnding to an operator.
CPPAD_TAPE_ADDR_TYPE addr_t
next UsrrpOp (UsrrvOp) is a parameter (variable) result
size_t NumArg(OpCode op)
Number of arguments for a specified operator.
void reverse_powvv_op(size_t d, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, const Base *taylor, size_t nc_partial, Base *partial)
Compute reverse mode partial derivatives for result of op = PowvvOp.
#define CPPAD_ATOMIC_CALL
Class used to store and play back an operation sequence recording.
void reverse_sign_op(size_t d, size_t i_z, size_t i_x, size_t cap_order, const Base *taylor, size_t nc_partial, Base *partial)
Compute reverse mode partial derivatives for result of op = SignOp.
void reverse_mulpv_op(size_t d, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, const Base *taylor, size_t nc_partial, Base *partial)
Compute reverse mode partial derivative for result of op = MulpvOp.
void reverse_exp_op(size_t d, size_t i_z, size_t i_x, size_t cap_order, const Base *taylor, size_t nc_partial, Base *partial)
Reverse mode partial derivatives for result of op = ExpOp.
void resize(size_t n)
change the number of elements in this vector.
size_t NumRes(OpCode op)
Number of variables resulting from the specified operation.
void reverse_erf_op(size_t d, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, const Base *taylor, size_t nc_partial, Base *partial)
Compute reverse mode partial derivatives for result of op = ErfOp.
void reverse_powpv_op(size_t d, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, const Base *taylor, size_t nc_partial, Base *partial)
Compute reverse mode partial derivative for result of op = PowpvOp.
void reverse_divpv_op(size_t d, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, const Base *taylor, size_t nc_partial, Base *partial)
Compute reverse mode partial derivative for result of op = DivpvOp.
next UserOp marks end of a user atomic call
void reverse_addpv_op(size_t d, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, const Base *taylor, size_t nc_partial, Base *partial)
Compute reverse mode partial derivative for result of op = AddpvOp.
atomic_base< Base > * get_user_info(const OpCode op, const addr_t *op_arg, size_t &user_old, size_t &user_m, size_t &user_n) const
unpack extra information corresponding to a UserOp
void reverse_tanh_op(size_t d, size_t i_z, size_t i_x, size_t cap_order, const Base *taylor, size_t nc_partial, Base *partial)
Compute reverse mode partial derivatives for result of op = TanOp.
virtual void set_old(size_t id)
Set value of id (used by deprecated old_atomic class)
void reverse_expm1_op(size_t d, size_t i_z, size_t i_x, size_t cap_order, const Base *taylor, size_t nc_partial, Base *partial)
Reverse mode partial derivatives for result of op = Expm1Op.
size_t size(void) const
number of elements currently in this vector.
OpCode
Type used to distinguish different AD< Base > atomic operations.
void reverse_divvp_op(size_t d, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, const Base *taylor, size_t nc_partial, Base *partial)
Compute reverse mode partial derivative for result of op = DivvpOp.
void reverse_zmulpv_op(size_t d, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, const Base *taylor, size_t nc_partial, Base *partial)
Compute reverse mode partial derivative for result of op = ZmulpvOp.
next UserOp marks beginning of a user atomic call
void get_op_info(size_t op_index, OpCode &op, const addr_t *&op_arg, size_t &var_index) const
fetch the information corresponding to an operator
void reverse_load_op(OpCode op, size_t d, size_t i_z, const addr_t *arg, size_t cap_order, const Base *taylor, size_t nc_partial, Base *partial, const addr_t *var_by_load_op)
Reverse mode for op = LdpOp or LdvOp.
void reverse_asinh_op(size_t d, size_t i_z, size_t i_x, size_t cap_order, const Base *taylor, size_t nc_partial, Base *partial)
Compute reverse mode partial derivatives for result of op = AsinhOp.
void reverse_powvp_op(size_t d, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, const Base *taylor, size_t nc_partial, Base *partial)
Compute reverse mode partial derivative for result of op = PowvpOp.
void reverse_acos_op(size_t d, size_t i_z, size_t i_x, size_t cap_order, const Base *taylor, size_t nc_partial, Base *partial)
Compute reverse mode partial derivatives for result of op = AcosOp.
size_t size(void) const
current number of elements in this vector.
Type * data(void)
current data pointer is no longer valid after any of the following: extend, erase, operator=, and ~pod_vector. Take extreem care when using this function.
next UsrapOp (UsravOp) is a parameter (variable) argument
void reverse_log1p_op(size_t d, size_t i_z, size_t i_x, size_t cap_order, const Base *taylor, size_t nc_partial, Base *partial)
Compute reverse mode partial derivatives for result of op = Log1pOp.
void reverse_zmulvv_op(size_t d, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, const Base *taylor, size_t nc_partial, Base *partial)
Compute reverse mode partial derivatives for result of op = ZmulvvOp.
void reverse_subpv_op(size_t d, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, const Base *taylor, size_t nc_partial, Base *partial)
Compute reverse mode partial derivative for result of op = SubpvOp.
#define CPPAD_ASSERT_UNKNOWN(exp)
Check that exp is true, if not terminate execution.
void reverse_csum_op(size_t d, size_t i_z, const addr_t *arg, size_t nc_partial, Base *partial)
Compute reverse mode Taylor coefficients for result of op = CsumOp.
void reverse_sqrt_op(size_t d, size_t i_z, size_t i_x, size_t cap_order, const Base *taylor, size_t nc_partial, Base *partial)
Compute reverse mode partial derivatives for result of op = SqrtOp.
size_t num_op_rec(void) const
Fetch number of operators in the recording.
void printOp(std::ostream &os, const local::player< Base > *play, size_t i_op, size_t i_var, OpCode op, const addr_t *ind)
Prints a single operator and its operands.
#define CPPAD_ASSERT_NARG_NRES(op, n_arg, n_res)
Check that operator op has the specified number of of arguments and results.
void reverse_cos_op(size_t d, size_t i_z, size_t i_x, size_t cap_order, const Base *taylor, size_t nc_partial, Base *partial)
Compute reverse mode partial derivatives for result of op = CosOp.
void reverse_acosh_op(size_t d, size_t i_z, size_t i_x, size_t cap_order, const Base *taylor, size_t nc_partial, Base *partial)
Compute reverse mode partial derivatives for result of op = AcoshOp.
void reverse_sweep(size_t d, size_t n, size_t numvar, const local::player< Base > *play, size_t J, const Base *Taylor, size_t K, Base *Partial, bool *cskip_op, const pod_vector< addr_t > &var_by_load_op, const pod_vector< addr_t > &subgraph)
Compute derivative of arbitrary order forward mode Taylor coefficients.
const std::string & afun_name(void) const
Name corresponding to a base_atomic object.
void reverse_abs_op(size_t d, size_t i_z, size_t i_x, size_t cap_order, const Base *taylor, size_t nc_partial, Base *partial)
Compute reverse mode partial derivatives for result of op = AbsOp.
void reverse_cosh_op(size_t d, size_t i_z, size_t i_x, size_t cap_order, const Base *taylor, size_t nc_partial, Base *partial)
Compute reverse mode partial derivatives for result of op = CoshOp.
void reverse_addvv_op(size_t d, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, const Base *taylor, size_t nc_partial, Base *partial)
Compute reverse mode partial derivatives for result of op = AddvvOp.
void reverse_log_op(size_t d, size_t i_z, size_t i_x, size_t cap_order, const Base *taylor, size_t nc_partial, Base *partial)
Compute reverse mode partial derivatives for result of op = LogOp.
Base GetPar(size_t i) const
Fetch a parameter from the recording.
void reverse_subvp_op(size_t d, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, const Base *taylor, size_t nc_partial, Base *partial)
Compute reverse mode partial derivative for result of op = SubvpOp.
void reverse_atanh_op(size_t d, size_t i_z, size_t i_x, size_t cap_order, const Base *taylor, size_t nc_partial, Base *partial)
Reverse mode partial derivatives for result of op = AtanhOp.
OpCode GetOp(size_t i) const
fetch an operator from the recording.
void reverse_zmulvp_op(size_t d, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, const Base *taylor, size_t nc_partial, Base *partial)
Compute reverse mode partial derivative for result of op = ZmulvpOp.
void reverse_tan_op(size_t d, size_t i_z, size_t i_x, size_t cap_order, const Base *taylor, size_t nc_partial, Base *partial)
Compute reverse mode partial derivatives for result of op = TanOp.
void reverse_cond_op(size_t d, size_t i_z, const addr_t *arg, size_t num_par, const Base *parameter, size_t cap_order, const Base *taylor, size_t nc_partial, Base *partial)
Compute reverse mode Taylor coefficients for op = CExpOp.
void reverse_divvv_op(size_t d, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, const Base *taylor, size_t nc_partial, Base *partial)
Compute reverse mode partial derivatives for result of op = DivvvOp.
size_t num_var_rec(void) const
Fetch number of variables in the recording.
void reverse_sinh_op(size_t d, size_t i_z, size_t i_x, size_t cap_order, const Base *taylor, size_t nc_partial, Base *partial)
Compute reverse mode partial derivatives for result of op = SinhOp.