1 # ifndef CPPAD_LOCAL_FORWARD2SWEEP_HPP
2 # define CPPAD_LOCAL_FORWARD2SWEEP_HPP
15 namespace CppAD {
namespace local {
36 # define CPPAD_ATOMIC_CALL user_atom->forward
38 # define CPPAD_ATOMIC_CALL user_ok = user_atom->forward
47 # define CPPAD_FORWARD2SWEEP_TRACE 0
132 template <
class Base>
141 const bool* cskip_op,
162 const addr_t* arg = CPPAD_NULL;
173 size_t user_old=0, user_m=0, user_n=0, user_i=0, user_j=0;
178 bool user_ok =
false;
185 const Base* parameter = CPPAD_NULL;
187 parameter = play->
GetPar();
194 const size_t user_q1 = q+1;
204 # if CPPAD_FORWARD2SWEEP_TRACE
205 bool user_trace =
false;
206 std::cout << std::endl;
210 bool more_operators =
true;
211 while(more_operators)
218 while( cskip_op[i_op] )
227 i_op += user_m + user_n;
266 # if CPPAD_USE_CPLUSPLUS_2011
282 # if CPPAD_USE_CPLUSPLUS_2011
298 # if CPPAD_USE_CPLUSPLUS_2011
309 q, r, i_var, arg, num_par, parameter, J, taylor
336 q, r, i_var, arg, num_par, parameter, J, taylor
366 more_operators =
false;
370 # if CPPAD_USE_CPLUSPLUS_2011
382 # if CPPAD_USE_CPLUSPLUS_2011
405 var_by_load_op.
data(),
430 # if CPPAD_USE_CPLUSPLUS_2011
449 k = i_var*(J-1)*r + i_var + (q-1)*r + 1;
450 for(ell = 0; ell < r; ell++)
451 taylor[k + ell] = Base(0.0);
545 user_atom = play->
get_user_info(op, arg, user_old, user_m, user_n);
551 user_tx_one.
resize(user_n * user_q1);
552 user_tx_all.
resize(user_n * (q * r + 1));
554 user_ty_one.
resize(user_m * user_q1);
555 user_ty_all.
resize(user_m * (q * r + 1));
564 for(ell = 0; ell < r; ell++)
566 for(j = 0; j < user_n; j++)
567 {
size_t j_all = j * (q * r + 1);
568 size_t j_one = j * user_q1;
569 user_tx_one[j_one+0] = user_tx_all[j_all+0];
570 for(k = 1; k < user_q1; k++)
571 {
size_t k_all = j_all + (k-1)*r+1+ell;
572 size_t k_one = j_one + k;
573 user_tx_one[k_one] = user_tx_all[k_all];
577 for(i = 0; i < user_m; i++)
578 {
size_t i_all = i * (q * r + 1);
579 size_t i_one = i * user_q1;
580 user_ty_one[i_one+0] = user_ty_all[i_all+0];
581 for(k = 1; k < q; k++)
582 {
size_t k_all = i_all + (k-1)*r+1+ell;
583 size_t k_one = i_one + k;
584 user_ty_one[k_one] = user_ty_all[k_all];
588 q, q, user_vx, user_vy, user_tx_one, user_ty_one
594 +
": atomic_base.forward: returned false";
598 for(i = 0; i < user_m; i++)
599 {
if( user_iy[i] > 0 )
600 {
size_t i_taylor = user_iy[i]*((J-1)*r+1);
601 size_t q_taylor = i_taylor + (q-1)*r+1+ell;
602 size_t q_one = i * user_q1 + q;
603 taylor[q_taylor] = user_ty_one[q_one];
607 # if CPPAD_FORWARD2SWEEP_TRACE
621 user_tx_all[user_j*(q*r+1) + 0] = parameter[ arg[0]];
622 for(ell = 0; ell < r; ell++)
623 for(k = 1; k < user_q1; k++)
624 user_tx_all[user_j*(q*r+1) + (k-1)*r+1+ell] = Base(0.0);
627 if( user_j == user_n )
638 user_tx_all[user_j*(q*r+1)+0] = taylor[arg[0]*((J-1)*r+1)+0];
639 for(ell = 0; ell < r; ell++)
640 {
for(k = 1; k < user_q1; k++)
641 { user_tx_all[user_j*(q*r+1) + (k-1)*r+1+ell] =
642 taylor[arg[0]*((J-1)*r+1) + (k-1)*r+1+ell];
647 if( user_j == user_n )
659 user_ty_all[user_i*(q*r+1) + 0] = parameter[ arg[0]];
660 for(ell = 0; ell < r; ell++)
661 for(k = 1; k < user_q1; k++)
662 user_ty_all[user_i*(q*r+1) + (k-1)*r+1+ell] = Base(0.0);
665 if( user_i == user_m )
676 user_iy[user_i] = i_var;
677 user_ty_all[user_i*(q*r+1)+0] = taylor[i_var*((J-1)*r+1)+0];
678 for(ell = 0; ell < r; ell++)
679 {
for(k = 1; k < user_q1; k++)
680 { user_ty_all[user_i*(q*r+1) + (k-1)*r+1+ell] =
681 taylor[i_var*((J-1)*r+1) + (k-1)*r+1+ell];
685 if( user_i == user_m )
710 # if CPPAD_FORWARD2SWEEP_TRACE
712 { user_trace =
false;
715 for(i = 0; i < user_m; i++) if( user_iy[i] > 0 )
716 {
size_t i_tmp = (i_op + i) - user_m;
725 Base* Z_tmp = taylor + user_iy[i]*((J-1) * r + 1);
726 { Z_vec[0] = Z_tmp[0];
727 for(ell = 0; ell < r; ell++)
728 { std::cout << std::endl <<
" ";
729 for(
size_t p_tmp = 1; p_tmp <= q; p_tmp++)
730 Z_vec[p_tmp] = Z_tmp[(p_tmp-1)*r+ell+1];
740 std::cout << std::endl;
752 Base* Z_tmp = CPPAD_NULL;
754 Z_tmp = taylor + arg[0]*((J-1) * r + 1);
756 Z_tmp = taylor + i_var*((J-1)*r + 1);
757 if( Z_tmp != CPPAD_NULL )
758 { Z_vec[0] = Z_tmp[0];
759 for(ell = 0; ell < r; ell++)
760 { std::cout << std::endl <<
" ";
761 for(
size_t p_tmp = 1; p_tmp <= q; p_tmp++)
762 Z_vec[p_tmp] = Z_tmp[ (p_tmp-1)*r + ell + 1];
772 std::cout << std::endl;
775 std::cout << std::endl;
785 # undef CPPAD_FORWARD2SWEEP_TRACE
786 # undef CPPAD_ATOMIC_CALL
void forward_acos_op_dir(size_t q, size_t r, size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Multiple directions forward mode Taylor coefficient for op = AcosOp.
#define CPPAD_ASSERT_KNOWN(exp, msg)
Check that exp is true, if not print msg and terminate execution.
void forward_expm1_op_dir(size_t q, size_t r, size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Multiple direction forward mode Taylor coefficient for op = Expm1Op.
void forward_sin_op_dir(size_t q, size_t r, size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Compute forward mode Taylor coefficient for result of op = SinOp.
size_t num_par_rec(void) const
Fetch number of parameters in the recording.
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.
void forward_powvp_op_dir(size_t q, size_t r, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Multiple directions forward mode Taylor coefficients for op = PowvpOp.
void forward_acosh_op_dir(size_t q, size_t r, size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Multiple directions forward mode Taylor coefficient for op = AcoshOp.
void forward_atan_op_dir(size_t q, size_t r, size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Multiple direction Taylor coefficient for op = AtanOp.
CPPAD_TAPE_ADDR_TYPE addr_t
next UsrrpOp (UsrrvOp) is a parameter (variable) result
void forward_subpv_op_dir(size_t q, size_t r, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Multiple directions forward mode Taylor coefficients for op = SubpvOp.
void forward_sign_op_dir(size_t q, size_t r, size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Multiple direction forward mode Taylor coefficient for op = SignOp.
size_t NumArg(OpCode op)
Number of arguments for a specified operator.
Class used to store and play back an operation sequence recording.
Type * data(void)
raw pointer to the data
void forward_divvp_op_dir(size_t q, size_t r, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Multiple direction forward mode Taylor coefficients for op = DivvvOp.
void forward_subvv_op_dir(size_t q, size_t r, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Multiple directions forward mode Taylor coefficients for op = SubvvOp.
void forward_addpv_op_dir(size_t q, size_t r, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Multiple directions forward mode Taylor coefficients for op = AddpvOp.
void forward_zmulvv_op_dir(size_t q, size_t r, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Multiple directions forward mode Taylor coefficients for op = ZmulvvOp.
#define CPPAD_ATOMIC_CALL
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 forward_zmulpv_op_dir(size_t q, size_t r, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Multiple directions forward mode Taylor coefficients for op = ZmulpvOp.
void forward_erf_op_dir(size_t q, size_t r, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Forward mode Taylor coefficient for result of op = ErfOp.
void forward_log1p_op_dir(size_t q, size_t r, size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Muiltiple directions Taylor coefficient for op = Log1pOp.
next UserOp marks end of a user atomic call
void forward_divpv_op_dir(size_t q, size_t r, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Multiple directions forward mode Taylor coefficients for op = DivpvOp.
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 forward_powvv_op_dir(size_t q, size_t r, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Multiple directions forward mode Taylor coefficients for op = PowvvOp.
void forward_load_op(const local::player< Base > *play, OpCode op, size_t p, size_t q, size_t r, size_t cap_order, size_t i_z, const addr_t *arg, const addr_t *var_by_load_op, Base *taylor)
Forward mode, except for zero order, for op = LdpOp or op = LdvOp.
void forward_abs_op_dir(size_t q, size_t r, size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Multiple directions forward mode Taylor coefficient for op = AbsOp.
virtual void set_old(size_t id)
Set value of id (used by deprecated old_atomic class)
void forward_exp_op_dir(size_t q, size_t r, size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Multiple direction forward mode Taylor coefficient for op = ExpOp.
OpCode
Type used to distinguish different AD< Base > atomic operations.
void forward_asinh_op_dir(size_t q, size_t r, size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Multiple directions forward mode Taylor coefficient for op = AsinhOp.
void forward_csum_op_dir(size_t q, size_t r, size_t i_z, const addr_t *arg, size_t num_par, const Base *parameter, size_t cap_order, Base *taylor)
Multiple direction forward mode Taylor coefficients for op = CsumOp.
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 forward_tanh_op_dir(size_t q, size_t r, size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Multiple directions forward mode Taylor coefficient for op = TanOp.
void forward_mulvv_op_dir(size_t q, size_t r, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Multiple directions forward mode Taylor coefficients for op = MulvvOp.
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 forward_dis_op(size_t p, size_t q, size_t r, size_t i_z, const addr_t *arg, size_t cap_order, Base *taylor)
forward mode Taylor coefficient for result of op = DisOp.
#define CPPAD_ASSERT_UNKNOWN(exp)
Check that exp is true, if not terminate execution.
void forward_cosh_op_dir(size_t q, size_t r, size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Compute forward mode Taylor coefficient for result of op = CoshOp.
void forward_zmulvp_op_dir(size_t q, size_t r, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Multiple directions forward mode Taylor coefficients for op = ZmulvpOp.
void forward_subvp_op_dir(size_t q, size_t r, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Multiple directions forward mode Taylor coefficients for op = SubvvOp.
void forward_log_op_dir(size_t q, size_t r, size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Muiltiple directions Taylor coefficient for op = LogOp.
void forward_mulpv_op_dir(size_t q, size_t r, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Multiple directions forward mode Taylor coefficients for op = MulpvOp.
void forward_asin_op_dir(size_t q, size_t r, size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Multiple directions forward mode Taylor coefficient for op = AsinOp.
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.
void forward_cond_op_dir(size_t q, size_t r, size_t i_z, const addr_t *arg, size_t num_par, const Base *parameter, size_t cap_order, Base *taylor)
Multiple directions forward mode Taylor coefficients for op = CExpOp.
#define CPPAD_ASSERT_NARG_NRES(op, n_arg, n_res)
Check that operator op has the specified number of of arguments and results.
void forward_sinh_op_dir(size_t q, size_t r, size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Compute forward mode Taylor coefficient for result of op = SinhOp.
void forward_powpv_op_dir(size_t q, size_t r, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Multiple directions forward mode Taylor coefficients for op = PowpvOp.
void forward_cos_op_dir(size_t q, size_t r, size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Compute forward mode Taylor coefficient for result of op = CosOp.
const std::string & afun_name(void) const
Name corresponding to a base_atomic object.
void forward_atanh_op_dir(size_t q, size_t r, size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Multiple direction Taylor coefficient for op = AtanhOp.
void forward_divvv_op_dir(size_t q, size_t r, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Multiple directions forward mode Taylor coefficients for op = DivvvOp.
void forward_tan_op_dir(size_t q, size_t r, size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Multiple directions forward mode Taylor coefficient for op = TanOp.
Base GetPar(size_t i) const
Fetch a parameter from the recording.
void forward_addvv_op_dir(size_t q, size_t r, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Multiple directions forward mode Taylor coefficients for op = AddvvOp.
void forward2sweep(const local::player< Base > *play, const size_t q, const size_t r, const size_t n, const size_t numvar, const size_t J, Base *taylor, const bool *cskip_op, const pod_vector< addr_t > &var_by_load_op)
Compute multiple directions forward mode Taylor coefficients.
size_t num_var_rec(void) const
Fetch number of variables in the recording.
void forward_sqrt_op_dir(size_t q, size_t r, size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Multiple direction forward mode Taylor coefficient for op = SqrtOp.