1 # ifndef CPPAD_LOCAL_FORWARD0SWEEP_HPP
2 # define CPPAD_LOCAL_FORWARD0SWEEP_HPP
15 namespace CppAD {
namespace local {
36 # define CPPAD_ATOMIC_CALL user_atom->forward
38 # define CPPAD_ATOMIC_CALL user_ok = user_atom->forward
48 # define CPPAD_FORWARD0SWEEP_TRACE 0
137 template <
class Base>
148 size_t compare_change_count,
149 size_t& compare_change_number,
150 size_t& compare_change_op_index
172 const addr_t* arg = CPPAD_NULL;
176 { compare_change_number = 0;
177 compare_change_op_index = 0;
189 { isvar_by_ind.
extend(num);
191 for(i = 0; i < num; i++)
193 isvar_by_ind[i] =
false;
198 for(i = 0; i < num; i++)
210 bool user_ok =
false;
214 size_t user_old=0, user_m=0, user_n=0, user_i=0, user_j=0;
221 const Base* parameter = CPPAD_NULL;
223 parameter = play->
GetPar();
229 const char* text = CPPAD_NULL;
236 # if CPPAD_FORWARD0SWEEP_TRACE
238 bool user_trace =
false;
249 # if CPPAD_FORWARD0SWEEP_TRACE
250 std::cout << std::endl;
253 bool more_operators =
true;
254 while(more_operators)
261 while( cskip_op[i_op] )
270 i_op += user_m + user_n;
309 # if CPPAD_USE_CPLUSPLUS_2011
325 # if CPPAD_USE_CPLUSPLUS_2011
341 # if CPPAD_USE_CPLUSPLUS_2011
354 i_var, arg, num_par, parameter, J, taylor
375 i_var, arg, num_par, parameter, J, taylor, cskip_op
382 0, 0, i_var, arg, num_par, parameter, J, taylor
411 more_operators =
false;
416 if( compare_change_count )
418 compare_change_number, arg, parameter, J, taylor
420 {
if( compare_change_count == compare_change_number )
421 compare_change_op_index = i_op;
428 if( compare_change_count )
430 compare_change_number, arg, parameter, J, taylor
432 {
if( compare_change_count == compare_change_number )
433 compare_change_op_index = i_op;
439 # if CPPAD_USE_CPLUSPLUS_2011
451 # if CPPAD_USE_CPLUSPLUS_2011
473 var_by_load_op.
data()
488 var_by_load_op.
data()
494 if( compare_change_count )
496 compare_change_number, arg, parameter, J, taylor
498 {
if( compare_change_count == compare_change_number )
499 compare_change_op_index = i_op;
506 if( compare_change_count )
508 compare_change_number, arg, parameter, J, taylor
510 {
if( compare_change_count == compare_change_number )
511 compare_change_op_index = i_op;
518 if( compare_change_count )
520 compare_change_number, arg, parameter, J, taylor
522 {
if( compare_change_count == compare_change_number )
523 compare_change_op_index = i_op;
534 # if CPPAD_USE_CPLUSPLUS_2011
542 if( compare_change_count )
544 compare_change_number, arg, parameter, J, taylor
546 {
if( compare_change_count == compare_change_number )
547 compare_change_op_index = i_op;
554 if( compare_change_count )
556 compare_change_number, arg, parameter, J, taylor
558 {
if( compare_change_count == compare_change_number )
559 compare_change_op_index = i_op;
566 if( compare_change_count )
568 compare_change_number, arg, parameter, J, taylor
570 {
if( compare_change_count == compare_change_number )
571 compare_change_op_index = i_op;
589 if( compare_change_count )
591 compare_change_number, arg, parameter, J, taylor
593 {
if( compare_change_count == compare_change_number )
594 compare_change_op_index = i_op;
601 if( compare_change_count )
603 compare_change_number, arg, parameter, J, taylor
605 {
if( compare_change_count == compare_change_number )
606 compare_change_op_index = i_op;
614 i_var, arg, num_par, parameter, J, taylor
638 arg, num_text, text, num_par, parameter, J, taylor
755 user_atom = play->
get_user_info(op, arg, user_old, user_m, user_n);
763 # if CPPAD_FORWARD0SWEEP_TRACE
773 +
": atomic_base.forward: returned false";
777 # if CPPAD_FORWARD0SWEEP_TRACE
791 user_tx[user_j++] = parameter[ arg[0] ];
793 if( user_j == user_n )
797 user_vx, user_vy, user_tx, user_ty
810 user_tx[user_j++] = taylor[ arg[0] * J + 0 ];
812 if( user_j == user_n )
816 user_vx, user_vy, user_tx, user_ty
829 # if CPPAD_FORWARD0SWEEP_TRACE
833 if( user_i == user_m )
843 # if CPPAD_FORWARD0SWEEP_TRACE
844 user_iy[user_i] = i_var;
846 taylor[ i_var * J + 0 ] = user_ty[user_i++];
847 if( user_i == user_m )
872 # if CPPAD_FORWARD0SWEEP_TRACE
875 { user_trace =
false;
879 for(
size_t i = 0; i < user_m; i++) if( user_iy[i] > 0 )
880 {
size_t i_tmp = (i_op + i) - user_m;
889 Base* Z_tmp = taylor + user_iy[i] * J;
897 std::cout << std::endl;
900 Base* Z_tmp = taylor + i_var * J;
918 std::cout << std::endl;
921 std::cout << std::endl;
933 # undef CPPAD_FORWARD0SWEEP_TRACE
934 # undef CPPAD_ATOMIC_CALL
void forward_cos_op_0(size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Compute zero order forward mode Taylor coefficient for result of op = CosOp.
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.
#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_divpv_op_0(size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Compute zero order forward mode Taylor coefficient for result of op = DivpvOp.
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_abs_op_0(size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Compute zero order forward mode Taylor coefficient for result of op = AbsOp.
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
void forward_subvp_op_0(size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Compute zero order forward mode Taylor coefficients for result of op = SubvvOp.
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_powpv_op_0(size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Compute zero order forward mode Taylor coefficient for result of op = PowpvOp.
void forward_sinh_op_0(size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Compute zero order forward mode Taylor coefficient for result of op = SinhOp.
void forward_erf_op_0(size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Zero order Forward mode Taylor coefficient for result of op = ErfOp.
void forward_zmulvp_op_0(size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Compute zero order forward mode Taylor coefficient for result of op = ZmulvpOp.
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.
Class used to store and play back an operation sequence recording.
void forward_sin_op_0(size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Compute zero order forward mode Taylor coefficient for result of op = SinOp.
void forward_tanh_op_0(size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Compute zero order forward mode Taylor coefficient for result of op = TanOp.
size_t GetVecInd(size_t i) const
Fetch a VecAD index from the recording.
void forward_atan_op_0(size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Zero order forward mode Taylor coefficient for result of op = AtanOp.
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 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_subvv_op_0(size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Compute zero order forward mode Taylor coefficients for result of op = SubvvOp.
void forward_mulpv_op_0(size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Compute zero order forward mode Taylor coefficient for result of op = MulpvOp.
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_zmulpv_op_0(size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Compute zero order forward mode Taylor coefficient for result of op = ZmulpvOp.
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.
next UserOp marks end of a user atomic call
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.
void forward_atanh_op_0(size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Zero order forward mode Taylor coefficient for result of op = AtanhOp.
void forward_cosh_op_0(size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Compute zero order forward mode Taylor coefficient for result of op = CoshOp.
void forward0sweep(const local::player< Base > *play, std::ostream &s_out, bool print, size_t n, size_t numvar, 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 zero order forward mode Taylor coefficients.
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
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.
#define CPPAD_ATOMIC_CALL
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.
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_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_sign_op_0(size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Compute zero order forward mode Taylor coefficient for result of op = SignOp.
void forward_cond_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 coefficients for op = CExpOp.
void forward_acosh_op_0(size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Compute zero order 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_divvv_op_0(size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Compute zero order forward mode Taylor coefficients for result of op = DivvvOp.
void forward_log_op_0(size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Compute zero order forward mode Taylor coefficient for result of op = LogOp.
void forward_exp_op_0(size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Zero order forward mode Taylor coefficient for result of op = ExpOp.
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.
void forward_log1p_op_0(size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Compute zero order forward mode Taylor coefficient for result of op = Log1pOp.
void forward_asinh_op_0(size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Compute zero order forward mode Taylor coefficient for result of op = AsinhOp.
void forward_powvp_op_0(size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Compute zero order forward mode Taylor coefficients for result of op = PowvpOp.
void forward_zmulvv_op_0(size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Compute zero order forward mode Taylor coefficients for result of op = ZmulvvOp.
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_acos_op_0(size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Compute zero order forward mode Taylor coefficient for result of op = AcosOp.
size_t num_op_rec(void) const
Fetch number of operators in the recording.
void forward_asin_op_0(size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Compute zero order forward mode Taylor coefficient for result of op = AsinOp.
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_tan_op_0(size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Compute zero order forward mode Taylor coefficient for result of op = TanOp.
void forward_divvp_op_0(size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Compute zero order forward mode Taylor coefficients for result of op = DivvvOp.
void forward_addvv_op_0(size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Compute zero order forward mode Taylor coefficients for result of op = AddvvOp.
const std::string & afun_name(void) const
Name corresponding to a base_atomic object.
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_mulvv_op_0(size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Compute zero order forward mode Taylor coefficients for result of op = MulvvOp.
void forward_powvv_op_0(size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Compute zero order 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_expm1_op_0(size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Zero order forward mode Taylor coefficient for result of op = Expm1Op.
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.
void forward_addpv_op_0(size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Compute zero order forward mode Taylor coefficient for result of op = AddpvOp.
void forward_sqrt_op_0(size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Compute zero order forward mode Taylor coefficient for result of op = SqrtOp.
size_t num_var_rec(void) const
Fetch number of variables in the recording.
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_subpv_op_0(size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Compute zero order forward mode Taylor coefficient for result of op = SubpvOp.