1 # ifndef CPPAD_LOCAL_FORWARD1SWEEP_HPP
2 # define CPPAD_LOCAL_FORWARD1SWEEP_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_FORWARD1SWEEP_TRACE 0
180 template <
class Base>
193 size_t compare_change_count,
194 size_t& compare_change_number,
195 size_t& compare_change_op_index
218 const addr_t* arg = CPPAD_NULL;
222 { compare_change_number = 0;
223 compare_change_op_index = 0;
235 { isvar_by_ind.
extend(num);
237 for(i = 0; i < num; i++)
239 isvar_by_ind[i] =
false;
244 for(i = 0; i < num; i++)
256 bool user_ok =
false;
260 size_t user_old=0, user_m=0, user_n=0, user_i=0, user_j=0;
267 const Base* parameter = CPPAD_NULL;
269 parameter = play->
GetPar();
275 const char* text = CPPAD_NULL;
286 const size_t user_q1 = q+1;
297 # if CPPAD_FORWARD1SWEEP_TRACE
298 bool user_trace =
false;
299 std::cout << std::endl;
303 bool more_operators =
true;
304 while(more_operators)
311 while( cskip_op[i_op] )
320 i_op += user_m + user_n;
359 # if CPPAD_USE_CPLUSPLUS_2011
375 # if CPPAD_USE_CPLUSPLUS_2011
391 # if CPPAD_USE_CPLUSPLUS_2011
402 p, q, i_var, arg, num_par, parameter, J, taylor
424 i_var, arg, num_par, parameter, J, taylor, cskip_op
432 p, q, i_var, arg, num_par, parameter, J, taylor
461 more_operators =
false;
466 if( ( p == 0 ) & ( compare_change_count > 0 ) )
468 compare_change_number, arg, parameter, J, taylor
470 if( compare_change_count == compare_change_number )
471 compare_change_op_index = i_op;
477 if( ( p == 0 ) & ( compare_change_count > 0 ) )
479 compare_change_number, arg, parameter, J, taylor
481 if( compare_change_count == compare_change_number )
482 compare_change_op_index = i_op;
487 # if CPPAD_USE_CPLUSPLUS_2011
500 # if CPPAD_USE_CPLUSPLUS_2011
523 var_by_load_op.
data()
534 var_by_load_op.
data(),
547 var_by_load_op.
data(),
564 var_by_load_op.
data()
575 var_by_load_op.
data(),
588 var_by_load_op.
data(),
595 if( ( p == 0 ) & ( compare_change_count > 0 ) )
597 compare_change_number, arg, parameter, J, taylor
599 if( compare_change_count == compare_change_number )
600 compare_change_op_index = i_op;
605 if( ( p == 0 ) & ( compare_change_count > 0 ) )
607 compare_change_number, arg, parameter, J, taylor
609 if( compare_change_count == compare_change_number )
610 compare_change_op_index = i_op;
616 if( ( p == 0 ) & ( compare_change_count > 0 ) )
618 compare_change_number, arg, parameter, J, taylor
620 if( compare_change_count == compare_change_number )
621 compare_change_op_index = i_op;
631 # if CPPAD_USE_CPLUSPLUS_2011
639 if( ( p == 0 ) & ( compare_change_count > 0 ) )
641 compare_change_number, arg, parameter, J, taylor
643 if( compare_change_count == compare_change_number )
644 compare_change_op_index = i_op;
649 if( ( p == 0 ) & ( compare_change_count > 0 ) )
651 compare_change_number, arg, parameter, J, taylor
653 if( compare_change_count == compare_change_number )
654 compare_change_op_index = i_op;
660 if( ( p == 0 ) & ( compare_change_count > 0 ) )
662 compare_change_number, arg, parameter, J, taylor
664 if( compare_change_count == compare_change_number )
665 compare_change_op_index = i_op;
682 if( ( p == 0 ) & ( compare_change_count > 0 ) )
684 compare_change_number, arg, parameter, J, taylor
686 if( compare_change_count == compare_change_number )
687 compare_change_op_index = i_op;
693 if( ( p == 0 ) & ( compare_change_count > 0 ) )
695 compare_change_number, arg, parameter, J, taylor
697 if( compare_change_count == compare_change_number )
698 compare_change_op_index = i_op;
707 i_var, arg, num_par, parameter, J, taylor
712 { taylor[ i_var * J + i] = Base(0.0);
737 arg, num_text, text, num_par, parameter, J, taylor
862 user_atom = play->
get_user_info(op, arg, user_old, user_m, user_n);
868 user_tx.
resize(user_n * user_q1);
869 user_ty.
resize(user_m * user_q1);
878 p, q, user_vx, user_vy, user_tx, user_ty
884 +
": atomic_base.forward: returned false";
888 for(i = 0; i < user_m; i++)
890 for(k = p; k <= q; k++)
891 taylor[ user_iy[i] * J + k ] =
892 user_ty[ i * user_q1 + k ];
893 # if CPPAD_FORWARD1SWEEP_TRACE
907 user_tx[user_j * user_q1 + 0] = parameter[ arg[0]];
908 for(k = 1; k < user_q1; k++)
909 user_tx[user_j * user_q1 + k] = Base(0.0);
912 if( user_j == user_n )
923 for(k = 0; k < user_q1; k++)
924 user_tx[user_j * user_q1 + k] = taylor[ arg[0] * J + k];
927 if( user_j == user_n )
940 user_ty[user_i * user_q1 + 0] = parameter[ arg[0]];
941 for(k = 1; k < p; k++)
942 user_ty[user_i * user_q1 + k] = Base(0.0);
945 if( user_i == user_m )
956 user_iy[user_i] = i_var;
957 for(k = 0; k < p; k++)
958 user_ty[user_i * user_q1 + k] = taylor[ i_var * J + k];
961 if( user_i == user_m )
986 # if CPPAD_FORWARD1SWEEP_TRACE
988 { user_trace =
false;
992 for(i = 0; i < user_m; i++) if( user_iy[i] > 0 )
993 {
size_t i_tmp = (i_op + i) - user_m;
1002 Base* Z_tmp = taylor + user_iy[i] * J;
1010 std::cout << std::endl;
1013 Base* Z_tmp = taylor + J * i_var;
1031 std::cout << std::endl;
1034 std::cout << std::endl;
1040 if( (p == 0) & (compare_change_count == 0) )
1041 compare_change_number = 0;
1046 # undef CPPAD_FORWARD1SWEEP_TRACE
1047 # undef CPPAD_ATOMIC_CALL
void forward_levp_op_0(size_t &count, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Zero order forward mode comparison check that left <= right.
void forward_abs_op(size_t p, size_t q, size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Compute forward mode Taylor coefficient for result of op = AbsOp.
void forward_sign_op(size_t p, size_t q, size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Compute forward mode Taylor coefficient for result of op = SignOp.
void forward_sqrt_op(size_t p, size_t q, size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Compute forward mode Taylor coefficient for result of op = SqrtOp.
void forward_zmulpv_op(size_t p, size_t q, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Compute forward mode Taylor coefficients for result of op = ZmulpvOp.
#define CPPAD_ASSERT_KNOWN(exp, msg)
Check that exp is true, if not print msg and terminate execution.
void forward_nepv_op_0(size_t &count, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Zero order forward mode comparison check that left != right.
void forward_subvp_op(size_t p, size_t q, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Compute forward mode Taylor coefficients for result of op = SubvvOp.
void forward_subvv_op(size_t p, size_t q, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Compute forward mode Taylor coefficients for result of op = SubvvOp.
#define CPPAD_ATOMIC_CALL
size_t num_par_rec(void) const
Fetch number of parameters in the recording.
size_t extend(size_t n)
Increase the number of elements the end of this vector (existing elements are always preserved)...
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_asin_op(size_t p, size_t q, size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Compute forward mode Taylor coefficient for result of op = AsinOp.
void forward_pri_0(std::ostream &s_out, const addr_t *arg, size_t num_text, const char *text, size_t num_par, const Base *parameter, size_t cap_order, const Base *taylor)
Print operation for parameters; i.e., op = PriOp.
size_t num_vec_ind_rec(void) const
Fetch number of VecAD indices in the recording.
CPPAD_TAPE_ADDR_TYPE addr_t
next UsrrpOp (UsrrvOp) is a parameter (variable) result
void forward_nevv_op_0(size_t &count, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Zero order forward mode comparison check that left != right.
void forward_atanh_op(size_t p, size_t q, size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Forward mode Taylor coefficient for result of op = AtanhOp.
void forward_divvp_op(size_t p, size_t q, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Compute forward mode Taylor coefficients for result of op = DivvvOp.
const char * GetTxt(size_t i) const
Fetch a '\0' terminated string from the recording.
size_t NumArg(OpCode op)
Number of arguments for a specified operator.
void forward_powvp_op(size_t p, size_t q, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Compute forward mode Taylor coefficients for result of op = PowvpOp.
Class used to store and play back an operation sequence recording.
void forward_acos_op(size_t p, size_t q, size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Compute forward mode Taylor coefficient for result of op = AcosOp.
size_t GetVecInd(size_t i) const
Fetch a VecAD index from the recording.
void forward_cskip_op_0(size_t i_z, const addr_t *arg, size_t num_par, const Base *parameter, size_t cap_order, Base *taylor, bool *cskip_op)
Zero order forward mode execution of op = CSkipOp.
void forward_erf_op(size_t p, size_t q, 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 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_store_pp_op_0(size_t i_z, const addr_t *arg, size_t num_par, size_t cap_order, Base *taylor, bool *isvar_by_ind, size_t *index_by_ind)
Zero order forward mode implementation of op = StppOp.
void forward_eqpv_op_0(size_t &count, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Zero order forward mode comparison check that left == right.
void forward_cond_op(size_t p, size_t q, size_t i_z, const addr_t *arg, size_t num_par, const Base *parameter, size_t cap_order, Base *taylor)
Compute forward mode Taylor coefficients for op = CExpOp.
next UserOp marks end of a user atomic call
void forward_log_op(size_t p, size_t q, size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Compute forward mode Taylor coefficient for result of op = LogOp.
void forward_zmulvp_op(size_t p, size_t q, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Compute forward mode Taylor coefficients for result of op = ZmulvpOp.
void forward_eqvv_op_0(size_t &count, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Zero order forward mode comparison check that left == right.
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_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.
virtual void set_old(size_t id)
Set value of id (used by deprecated old_atomic class)
OpCode
Type used to distinguish different AD< Base > atomic operations.
void forward_levv_op_0(size_t &count, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Zero order forward mode comparison check that left <= right.
void forward_subpv_op(size_t p, size_t q, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Compute forward mode Taylor coefficients for result of op = SubpvOp.
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_cosh_op(size_t p, size_t q, 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_atan_op(size_t p, size_t q, size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Forward mode Taylor coefficient for result of op = AtanOp.
void forward_mulvv_op(size_t p, size_t q, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Compute forward mode Taylor coefficients for result of op = MulvvOp.
void forward_mulpv_op(size_t p, size_t q, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Compute forward mode Taylor coefficients for result of op = MulpvOp.
void forward_csum_op(size_t p, size_t q, size_t i_z, const addr_t *arg, size_t num_par, const Base *parameter, size_t cap_order, Base *taylor)
Compute forward mode Taylor coefficients for result of op = CsumOp.
void forward_zmulvv_op(size_t p, size_t q, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Compute forward mode Taylor coefficients for result of op = ZmulvvOp.
void forward_acosh_op(size_t p, size_t q, size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Compute forward mode Taylor coefficient for result of op = AcoshOp.
void forward_store_vv_op_0(size_t i_z, const addr_t *arg, size_t num_par, size_t cap_order, Base *taylor, bool *isvar_by_ind, size_t *index_by_ind)
Zero order forward mode implementation of op = StvvOp.
void forward_par_op_0(size_t i_z, const addr_t *arg, size_t num_par, const Base *parameter, size_t cap_order, Base *taylor)
Compute zero order forward mode Taylor coefficient for result of op = ParOp.
void forward_divpv_op(size_t p, size_t q, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Compute forward mode Taylor coefficients for result of op = DivpvOp.
void forward_cos_op(size_t p, size_t q, size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Compute forward mode Taylor coefficient for result of op = CosOp.
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.
void forward_sin_op(size_t p, size_t q, size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Compute forward mode Taylor coefficient for result of op = SinOp.
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.
void forward_store_vp_op_0(size_t i_z, const addr_t *arg, size_t num_par, size_t cap_order, Base *taylor, bool *isvar_by_ind, size_t *index_by_ind)
Zero order forward mode implementation of op = StvpOp.
#define CPPAD_ASSERT_UNKNOWN(exp)
Check that exp is true, if not terminate execution.
void forward_store_pv_op_0(size_t i_z, const addr_t *arg, size_t num_par, size_t cap_order, Base *taylor, bool *isvar_by_ind, size_t *index_by_ind)
Zero order forward mode implementation of op = StpvOp.
void forward_divvv_op(size_t p, size_t q, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Compute forward mode Taylor coefficients for result of op = DivvvOp.
void forward1sweep(const local::player< Base > *play, std::ostream &s_out, const bool print, const size_t p, const size_t q, const size_t n, const size_t numvar, const size_t J, Base *taylor, bool *cskip_op, pod_vector< addr_t > &var_by_load_op, size_t compare_change_count, size_t &compare_change_number, size_t &compare_change_op_index)
Compute arbitrary order forward mode Taylor coefficients.
void forward_sinh_op(size_t p, size_t q, size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Compute forward mode Taylor coefficient for result of op = SinhOp.
size_t num_op_rec(void) const
Fetch number of operators in the recording.
void forward_addvv_op(size_t p, size_t q, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Compute forward mode Taylor coefficients for result of op = AddvvOp.
void forward_ltvp_op_0(size_t &count, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Zero order forward mode comparison check that left < right.
size_t num_text_rec(void) const
Fetch number of characters (representing strings) in the recording.
void forward_ltpv_op_0(size_t &count, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Zero order forward mode comparison check that left < right.
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 forward_expm1_op(size_t p, size_t q, size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Forward mode Taylor coefficient for result of op = Expm1Op.
const std::string & afun_name(void) const
Name corresponding to a base_atomic object.
void forward_log1p_op(size_t p, size_t q, size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Compute forward mode Taylor coefficient for result of op = Log1pOp.
void forward_lepv_op_0(size_t &count, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Zero order forward mode comparison check that left <= right.
void forward_powvv_op(size_t p, size_t q, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Compute forward mode Taylor coefficients for result of op = PowvvOp.
Base GetPar(size_t i) const
Fetch a parameter from the recording.
void forward_ltvv_op_0(size_t &count, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Zero order forward mode comparison check that left < right.
void forward_tanh_op(size_t p, size_t q, size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Compute forward mode Taylor coefficient for result of op = TanOp.
void forward_addpv_op(size_t p, size_t q, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Compute forward mode Taylor coefficients for result of op = AddpvOp.
void forward_exp_op(size_t p, size_t q, size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Forward mode Taylor coefficient for result of op = ExpOp.
void forward_load_v_op_0(const local::player< Base > *play, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor, bool *isvar_by_ind, size_t *index_by_ind, addr_t *var_by_load_op)
Zero order forward mode implementation of op = LdvOp.
size_t num_var_rec(void) const
Fetch number of variables in the recording.
void forward_tan_op(size_t p, size_t q, size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Compute forward mode Taylor coefficient for result of op = TanOp.
void forward_asinh_op(size_t p, size_t q, size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Compute forward mode Taylor coefficient for result of op = AsinhOp.
void forward_load_p_op_0(const local::player< Base > *play, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor, bool *isvar_by_ind, size_t *index_by_ind, addr_t *var_by_load_op)
Zero order forward mode implementation of op = LdpOp.
void forward_powpv_op(size_t p, size_t q, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Compute forward mode Taylor coefficients for result of op = PowpvOp.