CppAD: A C++ Algorithmic Differentiation Package  20171217
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
forward0sweep.hpp
Go to the documentation of this file.
1 # ifndef CPPAD_LOCAL_FORWARD0SWEEP_HPP
2 # define CPPAD_LOCAL_FORWARD0SWEEP_HPP
3 
4 /* --------------------------------------------------------------------------
5 CppAD: C++ Algorithmic Differentiation: Copyright (C) 2003-17 Bradley M. Bell
6 
7 CppAD is distributed under multiple licenses. This distribution is under
8 the terms of the
9  Eclipse Public License Version 1.0.
10 
11 A copy of this license is included in the COPYING file of this distribution.
12 Please visit http://www.coin-or.org/CppAD/ for information on other licenses.
13 -------------------------------------------------------------------------- */
14 
15 namespace CppAD { namespace local { // BEGIN_CPPAD_LOCAL_NAMESPACE
16 /*!
17 \file forward0sweep.hpp
18 Compute zero order forward mode Taylor coefficients.
19 */
20 
21 /*
22 \def CPPAD_ATOMIC_CALL
23 This avoids warnings when NDEBUG is defined and user_ok is not used.
24 If NDEBUG is defined, this resolves to
25 \code
26  user_atom->forward
27 \endcode
28 otherwise, it respolves to
29 \code
30  user_ok = user_atom->forward
31 \endcode
32 This maco is undefined at the end of this file to facillitate is
33 use with a different definition in other files.
34 */
35 # ifdef NDEBUG
36 # define CPPAD_ATOMIC_CALL user_atom->forward
37 # else
38 # define CPPAD_ATOMIC_CALL user_ok = user_atom->forward
39 # endif
40 
41 /*!
42 \def CPPAD_FORWARD0SWEEP_TRACE
43 This value is either zero or one.
44 Zero is the normal operational value.
45 If it is one, a trace of every forward0sweep computation is printed.
46 (Note that forward0sweep is not used if CPPAD_USE_FORWARD0SWEEP is zero).
47 */
48 # define CPPAD_FORWARD0SWEEP_TRACE 0
49 
50 /*!
51 Compute zero order forward mode Taylor coefficients.
52 
53 <!-- define forward0sweep_doc_define -->
54 \tparam Base
55 The type used during the forward mode computations; i.e., the corresponding
56 recording of operations used the type AD<Base>.
57 
58 \param s_out
59 Is the stream where output corresponding to PriOp operations will
60 be written.
61 
62 \param print
63 If print is false,
64 suppress the output that is otherwise generated by the c PriOp instructions.
65 
66 \param n
67 is the number of independent variables on the tape.
68 
69 \param numvar
70 is the total number of variables on the tape.
71 This is also equal to the number of rows in the matrix taylor; i.e.,
72 play->num_var_rec().
73 
74 \param play
75 The information stored in play
76 is a recording of the operations corresponding to the function
77 \f[
78  F : {\bf R}^n \rightarrow {\bf R}^m
79 \f]
80 where \f$ n \f$ is the number of independent variables and
81 \f$ m \f$ is the number of dependent variables.
82 
83 \param J
84 Is the number of columns in the coefficient matrix taylor.
85 This must be greater than or equal one.
86 
87 <!-- end forward0sweep_doc_define -->
88 
89 \param taylor
90 \n
91 \b Input:
92 For i = 1 , ... , n,
93 <code>taylor [i * J + 0]</code>
94 variable with index j on the tape
95 (these are the independent variables).
96 \n
97 \n
98 \b Output:
99 For i = n + 1, ... , numvar - 1,
100 <code>taylor [i * J + 0]</code>
101 is the zero order Taylor coefficient for the variable with
102 index i on the tape.
103 
104 \param cskip_op
105 Is a vector with size play->num_op_rec().
106 The input value of the elements does not matter.
107 Upon return, if cskip_op[i] is true, the operator index i
108 does not affect any of the dependent variable
109 (given the value of the independent variables).
110 
111 \param var_by_load_op
112 Is a vector with size play->num_load_op_rec().
113 The input value of the elements does not matter.
114 Upon return,
115 it is the variable index corresponding the result for each load operator.
116 In the case where the index is zero,
117 the load operator results in a parameter (not a variable).
118 Note that the is no variable with index zero on the tape.
119 
120 \param compare_change_count
121 Is the count value for changing number and op_index during
122 zero order foward mode.
123 
124 \param compare_change_number
125 If compare_change_count is zero, this value is set to zero.
126 Otherwise, the return value is the number of comparision operations
127 that have a different result from when the information in
128 play was recorded.
129 
130 \param compare_change_op_index
131 If compare_change_count is zero, this value is set to zero.
132 Otherwise it is the operator index (see forward_next) for the count-th
133 comparision operation that has a different result from when the information in
134 play was recorded.
135 */
136 
137 template <class Base>
139  const local::player<Base>* play,
140  std::ostream& s_out,
141  bool print,
142  size_t n,
143  size_t numvar,
144  size_t J,
145  Base* taylor,
146  bool* cskip_op,
147  pod_vector<addr_t>& var_by_load_op,
148  size_t compare_change_count,
149  size_t& compare_change_number,
150  size_t& compare_change_op_index
151 )
152 { CPPAD_ASSERT_UNKNOWN( J >= 1 );
153  CPPAD_ASSERT_UNKNOWN( play->num_var_rec() == numvar );
154 
155  // use p, q, r so other forward sweeps can use code defined here
156  size_t p = 0;
157  size_t q = 0;
158  size_t r = 1;
159  /*
160  <!-- define forward0sweep_code_define -->
161  */
162  // op code for current instruction
163  OpCode op;
164 
165  // index for current instruction
166  size_t i_op;
167 
168  // next variables
169  size_t i_var;
170 
171  // operation argument indices
172  const addr_t* arg = CPPAD_NULL;
173 
174  // initialize the comparision operator counter
175  if( p == 0 )
176  { compare_change_number = 0;
177  compare_change_op_index = 0;
178  }
179 
180  // If this includes a zero calculation, initialize this information
181  pod_vector<bool> isvar_by_ind;
182  pod_vector<size_t> index_by_ind;
183  if( p == 0 )
184  { size_t i;
185 
186  // this includes order zero calculation, initialize vector indices
187  size_t num = play->num_vec_ind_rec();
188  if( num > 0 )
189  { isvar_by_ind.extend(num);
190  index_by_ind.extend(num);
191  for(i = 0; i < num; i++)
192  { index_by_ind[i] = play->GetVecInd(i);
193  isvar_by_ind[i] = false;
194  }
195  }
196  // includes zero order, so initialize conditional skip flags
197  num = play->num_op_rec();
198  for(i = 0; i < num; i++)
199  cskip_op[i] = false;
200  }
201 
202  // work space used by UserOp.
203  vector<bool> user_vx; // empty vecotor
204  vector<bool> user_vy; // empty vecotor
205  vector<Base> user_tx; // argument vector Taylor coefficients
206  vector<Base> user_ty; // result vector Taylor coefficients
207  //
208  atomic_base<Base>* user_atom = CPPAD_NULL; // user's atomic op calculator
209 # ifndef NDEBUG
210  bool user_ok = false; // atomic op return value
211 # endif
212  //
213  // information defined by forward_user
214  size_t user_old=0, user_m=0, user_n=0, user_i=0, user_j=0;
215  enum_user_state user_state = start_user; // proper initialization
216 
217  // length of the parameter vector (used by CppAD assert macros)
218  const size_t num_par = play->num_par_rec();
219 
220  // pointer to the beginning of the parameter vector
221  const Base* parameter = CPPAD_NULL;
222  if( num_par > 0 )
223  parameter = play->GetPar();
224 
225  // length of the text vector (used by CppAD assert macros)
226  const size_t num_text = play->num_text_rec();
227 
228  // pointer to the beginning of the text vector
229  const char* text = CPPAD_NULL;
230  if( num_text > 0 )
231  text = play->GetTxt(0);
232  /*
233  <!-- end forward0sweep_code_define -->
234  */
235 
236 # if CPPAD_FORWARD0SWEEP_TRACE
237  // flag as to when to trace user function values
238  bool user_trace = false;
239 
240  // variable indices for results vector
241  // (done differently for order zero).
242  vector<size_t> user_iy;
243 # endif
244 
245  // skip the BeginOp at the beginning of the recording
246  i_op = 0;
247  play->get_op_info(i_op, op, arg, i_var);
248  CPPAD_ASSERT_UNKNOWN( op == BeginOp );
249 # if CPPAD_FORWARD0SWEEP_TRACE
250  std::cout << std::endl;
251 # endif
252  bool flag; // a temporary flag to use in switch cases
253  bool more_operators = true;
254  while(more_operators)
255  {
256  // this op
257  play->get_op_info(++i_op, op, arg, i_var);
258  CPPAD_ASSERT_UNKNOWN( i_op < play->num_op_rec() );
259 
260  // check if we are skipping this operation
261  while( cskip_op[i_op] )
262  { switch(op)
263  {
264  case UserOp:
265  { // get information for this user atomic call
266  CPPAD_ASSERT_UNKNOWN( user_state == start_user );
267  play->get_user_info(op, arg, user_old, user_m, user_n);
268  //
269  // skip to the second UserOp
270  i_op += user_m + user_n;
271  play->get_op_info(++i_op, op, arg, i_var);
272  CPPAD_ASSERT_UNKNOWN( op == UserOp );
273  }
274  break;
275 
276  default:
277  break;
278  }
279  play->get_op_info(++i_op, op, arg, i_var);
280  CPPAD_ASSERT_UNKNOWN( i_op < play->num_op_rec() );
281  }
282 
283  // action to take depends on the case
284  switch( op )
285  {
286  case AbsOp:
287  forward_abs_op_0(i_var, arg[0], J, taylor);
288  break;
289  // -------------------------------------------------
290 
291  case AddvvOp:
292  forward_addvv_op_0(i_var, arg, parameter, J, taylor);
293  break;
294  // -------------------------------------------------
295 
296  case AddpvOp:
297  CPPAD_ASSERT_UNKNOWN( size_t(arg[0]) < num_par );
298  forward_addpv_op_0(i_var, arg, parameter, J, taylor);
299  break;
300  // -------------------------------------------------
301 
302  case AcosOp:
303  // sqrt(1 - x * x), acos(x)
304  CPPAD_ASSERT_UNKNOWN( i_var < numvar );
305  forward_acos_op_0(i_var, arg[0], J, taylor);
306  break;
307  // -------------------------------------------------
308 
309 # if CPPAD_USE_CPLUSPLUS_2011
310  case AcoshOp:
311  // sqrt(x * x - 1), acosh(x)
312  CPPAD_ASSERT_UNKNOWN( i_var < numvar );
313  forward_acosh_op_0(i_var, arg[0], J, taylor);
314  break;
315 # endif
316  // -------------------------------------------------
317 
318  case AsinOp:
319  // sqrt(1 - x * x), asin(x)
320  CPPAD_ASSERT_UNKNOWN( i_var < numvar );
321  forward_asin_op_0(i_var, arg[0], J, taylor);
322  break;
323  // -------------------------------------------------
324 
325 # if CPPAD_USE_CPLUSPLUS_2011
326  case AsinhOp:
327  // sqrt(1 + x * x), asinh(x)
328  CPPAD_ASSERT_UNKNOWN( i_var < numvar );
329  forward_asinh_op_0(i_var, arg[0], J, taylor);
330  break;
331 # endif
332  // -------------------------------------------------
333 
334  case AtanOp:
335  // 1 + x * x, atan(x)
336  CPPAD_ASSERT_UNKNOWN( i_var < numvar );
337  forward_atan_op_0(i_var, arg[0], J, taylor);
338  break;
339  // -------------------------------------------------
340 
341 # if CPPAD_USE_CPLUSPLUS_2011
342  case AtanhOp:
343  // 1 - x * x, atanh(x)
344  CPPAD_ASSERT_UNKNOWN( i_var < numvar );
345  forward_atanh_op_0(i_var, arg[0], J, taylor);
346  break;
347 # endif
348  // -------------------------------------------------
349 
350  case CExpOp:
351  // Use the general case with d == 0
352  // (could create an optimzied verison for this case)
354  i_var, arg, num_par, parameter, J, taylor
355  );
356  break;
357  // ---------------------------------------------------
358 
359  case CosOp:
360  // sin(x), cos(x)
361  CPPAD_ASSERT_UNKNOWN( i_var < numvar );
362  forward_cos_op_0(i_var, arg[0], J, taylor);
363  break;
364  // ---------------------------------------------------
365 
366  case CoshOp:
367  // sinh(x), cosh(x)
368  CPPAD_ASSERT_UNKNOWN( i_var < numvar );
369  forward_cosh_op_0(i_var, arg[0], J, taylor);
370  break;
371  // -------------------------------------------------
372 
373  case CSkipOp:
375  i_var, arg, num_par, parameter, J, taylor, cskip_op
376  );
377  break;
378  // -------------------------------------------------
379 
380  case CSumOp:
382  0, 0, i_var, arg, num_par, parameter, J, taylor
383  );
384  break;
385  // -------------------------------------------------
386 
387  case DisOp:
388  forward_dis_op(p, q, r, i_var, arg, J, taylor);
389  break;
390  // -------------------------------------------------
391 
392  case DivvvOp:
393  forward_divvv_op_0(i_var, arg, parameter, J, taylor);
394  break;
395  // -------------------------------------------------
396 
397  case DivpvOp:
398  CPPAD_ASSERT_UNKNOWN( size_t(arg[0]) < num_par );
399  forward_divpv_op_0(i_var, arg, parameter, J, taylor);
400  break;
401  // -------------------------------------------------
402 
403  case DivvpOp:
404  CPPAD_ASSERT_UNKNOWN( size_t(arg[1]) < num_par );
405  forward_divvp_op_0(i_var, arg, parameter, J, taylor);
406  break;
407  // -------------------------------------------------
408 
409  case EndOp:
410  CPPAD_ASSERT_NARG_NRES(op, 0, 0);
411  more_operators = false;
412  break;
413  // -------------------------------------------------
414 
415  case EqpvOp:
416  if( compare_change_count )
418  compare_change_number, arg, parameter, J, taylor
419  );
420  { if( compare_change_count == compare_change_number )
421  compare_change_op_index = i_op;
422  }
423  }
424  break;
425  // -------------------------------------------------
426 
427  case EqvvOp:
428  if( compare_change_count )
430  compare_change_number, arg, parameter, J, taylor
431  );
432  { if( compare_change_count == compare_change_number )
433  compare_change_op_index = i_op;
434  }
435  }
436  break;
437  // -------------------------------------------------
438 
439 # if CPPAD_USE_CPLUSPLUS_2011
440  case ErfOp:
441  forward_erf_op_0(i_var, arg, parameter, J, taylor);
442  break;
443 # endif
444  // -------------------------------------------------
445 
446  case ExpOp:
447  forward_exp_op_0(i_var, arg[0], J, taylor);
448  break;
449  // -------------------------------------------------
450 
451 # if CPPAD_USE_CPLUSPLUS_2011
452  case Expm1Op:
453  forward_expm1_op_0(i_var, arg[0], J, taylor);
454  break;
455 # endif
456  // -------------------------------------------------
457 
458  case InvOp:
459  CPPAD_ASSERT_NARG_NRES(op, 0, 1);
460  break;
461  // ---------------------------------------------------
462 
463  case LdpOp:
465  play,
466  i_var,
467  arg,
468  parameter,
469  J,
470  taylor,
471  isvar_by_ind.data(),
472  index_by_ind.data(),
473  var_by_load_op.data()
474  );
475  break;
476  // -------------------------------------------------
477 
478  case LdvOp:
480  play,
481  i_var,
482  arg,
483  parameter,
484  J,
485  taylor,
486  isvar_by_ind.data(),
487  index_by_ind.data(),
488  var_by_load_op.data()
489  );
490  break;
491  // -------------------------------------------------
492 
493  case LepvOp:
494  if( compare_change_count )
496  compare_change_number, arg, parameter, J, taylor
497  );
498  { if( compare_change_count == compare_change_number )
499  compare_change_op_index = i_op;
500  }
501  }
502  break;
503  // -------------------------------------------------
504 
505  case LevpOp:
506  if( compare_change_count )
508  compare_change_number, arg, parameter, J, taylor
509  );
510  { if( compare_change_count == compare_change_number )
511  compare_change_op_index = i_op;
512  }
513  }
514  break;
515  // -------------------------------------------------
516 
517  case LevvOp:
518  if( compare_change_count )
520  compare_change_number, arg, parameter, J, taylor
521  );
522  { if( compare_change_count == compare_change_number )
523  compare_change_op_index = i_op;
524  }
525  }
526  break;
527  // -------------------------------------------------
528 
529  case LogOp:
530  forward_log_op_0(i_var, arg[0], J, taylor);
531  break;
532  // -------------------------------------------------
533 
534 # if CPPAD_USE_CPLUSPLUS_2011
535  case Log1pOp:
536  forward_log1p_op_0(i_var, arg[0], J, taylor);
537  break;
538 # endif
539  // -------------------------------------------------
540 
541  case LtpvOp:
542  if( compare_change_count )
544  compare_change_number, arg, parameter, J, taylor
545  );
546  { if( compare_change_count == compare_change_number )
547  compare_change_op_index = i_op;
548  }
549  }
550  break;
551  // -------------------------------------------------
552 
553  case LtvpOp:
554  if( compare_change_count )
556  compare_change_number, arg, parameter, J, taylor
557  );
558  { if( compare_change_count == compare_change_number )
559  compare_change_op_index = i_op;
560  }
561  }
562  break;
563  // -------------------------------------------------
564 
565  case LtvvOp:
566  if( compare_change_count )
568  compare_change_number, arg, parameter, J, taylor
569  );
570  { if( compare_change_count == compare_change_number )
571  compare_change_op_index = i_op;
572  }
573  }
574  break;
575  // -------------------------------------------------
576 
577  case MulpvOp:
578  CPPAD_ASSERT_UNKNOWN( size_t(arg[0]) < num_par );
579  forward_mulpv_op_0(i_var, arg, parameter, J, taylor);
580  break;
581  // -------------------------------------------------
582 
583  case MulvvOp:
584  forward_mulvv_op_0(i_var, arg, parameter, J, taylor);
585  break;
586  // -------------------------------------------------
587 
588  case NepvOp:
589  if( compare_change_count )
591  compare_change_number, arg, parameter, J, taylor
592  );
593  { if( compare_change_count == compare_change_number )
594  compare_change_op_index = i_op;
595  }
596  }
597  break;
598  // -------------------------------------------------
599 
600  case NevvOp:
601  if( compare_change_count )
603  compare_change_number, arg, parameter, J, taylor
604  );
605  { if( compare_change_count == compare_change_number )
606  compare_change_op_index = i_op;
607  }
608  }
609  break;
610  // -------------------------------------------------
611 
612  case ParOp:
614  i_var, arg, num_par, parameter, J, taylor
615  );
616  break;
617  // -------------------------------------------------
618 
619  case PowvpOp:
620  CPPAD_ASSERT_UNKNOWN( size_t(arg[1]) < num_par );
621  forward_powvp_op_0(i_var, arg, parameter, J, taylor);
622  break;
623  // -------------------------------------------------
624 
625  case PowpvOp:
626  CPPAD_ASSERT_UNKNOWN( size_t(arg[0]) < num_par );
627  forward_powpv_op_0(i_var, arg, parameter, J, taylor);
628  break;
629  // -------------------------------------------------
630 
631  case PowvvOp:
632  forward_powvv_op_0(i_var, arg, parameter, J, taylor);
633  break;
634  // -------------------------------------------------
635 
636  case PriOp:
637  if( print ) forward_pri_0(s_out,
638  arg, num_text, text, num_par, parameter, J, taylor
639  );
640  break;
641  // -------------------------------------------------
642 
643  case SignOp:
644  // cos(x), sin(x)
645  CPPAD_ASSERT_UNKNOWN( i_var < numvar );
646  forward_sign_op_0(i_var, arg[0], J, taylor);
647  break;
648  // -------------------------------------------------
649 
650  case SinOp:
651  // cos(x), sin(x)
652  CPPAD_ASSERT_UNKNOWN( i_var < numvar );
653  forward_sin_op_0(i_var, arg[0], J, taylor);
654  break;
655  // -------------------------------------------------
656 
657  case SinhOp:
658  // cosh(x), sinh(x)
659  CPPAD_ASSERT_UNKNOWN( i_var < numvar );
660  forward_sinh_op_0(i_var, arg[0], J, taylor);
661  break;
662  // -------------------------------------------------
663 
664  case SqrtOp:
665  forward_sqrt_op_0(i_var, arg[0], J, taylor);
666  break;
667  // -------------------------------------------------
668 
669  case StppOp:
671  i_var,
672  arg,
673  num_par,
674  J,
675  taylor,
676  isvar_by_ind.data(),
677  index_by_ind.data()
678  );
679  break;
680  // -------------------------------------------------
681 
682  case StpvOp:
684  i_var,
685  arg,
686  num_par,
687  J,
688  taylor,
689  isvar_by_ind.data(),
690  index_by_ind.data()
691  );
692  break;
693  // -------------------------------------------------
694 
695  case StvpOp:
697  i_var,
698  arg,
699  num_par,
700  J,
701  taylor,
702  isvar_by_ind.data(),
703  index_by_ind.data()
704  );
705  break;
706  // -------------------------------------------------
707 
708  case StvvOp:
710  i_var,
711  arg,
712  num_par,
713  J,
714  taylor,
715  isvar_by_ind.data(),
716  index_by_ind.data()
717  );
718  break;
719  // -------------------------------------------------
720 
721  case SubvvOp:
722  forward_subvv_op_0(i_var, arg, parameter, J, taylor);
723  break;
724  // -------------------------------------------------
725 
726  case SubpvOp:
727  CPPAD_ASSERT_UNKNOWN( size_t(arg[0]) < num_par );
728  forward_subpv_op_0(i_var, arg, parameter, J, taylor);
729  break;
730  // -------------------------------------------------
731 
732  case SubvpOp:
733  CPPAD_ASSERT_UNKNOWN( size_t(arg[1]) < num_par );
734  forward_subvp_op_0(i_var, arg, parameter, J, taylor);
735  break;
736  // -------------------------------------------------
737 
738  case TanOp:
739  // tan(x)^2, tan(x)
740  CPPAD_ASSERT_UNKNOWN( i_var < numvar );
741  forward_tan_op_0(i_var, arg[0], J, taylor);
742  break;
743  // -------------------------------------------------
744 
745  case TanhOp:
746  // tanh(x)^2, tanh(x)
747  CPPAD_ASSERT_UNKNOWN( i_var < numvar );
748  forward_tanh_op_0(i_var, arg[0], J, taylor);
749  break;
750  // -------------------------------------------------
751 
752  case UserOp:
753  // start or end an atomic function call
754  flag = user_state == start_user;
755  user_atom = play->get_user_info(op, arg, user_old, user_m, user_n);
756  if( flag )
757  { user_state = arg_user;
758  user_i = 0;
759  user_j = 0;
760  //
761  user_tx.resize(user_n);
762  user_ty.resize(user_m);
763 # if CPPAD_FORWARD0SWEEP_TRACE
764  user_iy.resize(user_m);
765 # endif
766  }
767  else
768  { user_state = start_user;
769 # ifndef NDEBUG
770  if( ! user_ok )
771  { std::string msg =
772  user_atom->afun_name()
773  + ": atomic_base.forward: returned false";
774  CPPAD_ASSERT_KNOWN(false, msg.c_str() );
775  }
776 # endif
777 # if CPPAD_FORWARD0SWEEP_TRACE
778  user_trace = true;
779 # endif
780  }
781  break;
782 
783  case UsrapOp:
784  // parameter argument for a user atomic function
785  CPPAD_ASSERT_UNKNOWN( NumArg(op) == 1 );
786  CPPAD_ASSERT_UNKNOWN( user_state == arg_user );
787  CPPAD_ASSERT_UNKNOWN( user_i == 0 );
788  CPPAD_ASSERT_UNKNOWN( user_j < user_n );
789  CPPAD_ASSERT_UNKNOWN( size_t( arg[0] ) < num_par );
790  //
791  user_tx[user_j++] = parameter[ arg[0] ];
792  //
793  if( user_j == user_n )
794  { // call users function for this operation
795  user_atom->set_old(user_old);
796  CPPAD_ATOMIC_CALL(p, q,
797  user_vx, user_vy, user_tx, user_ty
798  );
799  user_state = ret_user;
800  }
801  break;
802 
803  case UsravOp:
804  // variable argument for a user atomic function
805  CPPAD_ASSERT_UNKNOWN( NumArg(op) == 1 );
806  CPPAD_ASSERT_UNKNOWN( user_state == arg_user );
807  CPPAD_ASSERT_UNKNOWN( user_i == 0 );
808  CPPAD_ASSERT_UNKNOWN( user_j < user_n );
809  //
810  user_tx[user_j++] = taylor[ arg[0] * J + 0 ];
811  //
812  if( user_j == user_n )
813  { // call users function for this operation
814  user_atom->set_old(user_old);
815  CPPAD_ATOMIC_CALL(p, q,
816  user_vx, user_vy, user_tx, user_ty
817  );
818  user_state = ret_user;
819  }
820  break;
821 
822  case UsrrpOp:
823  // parameter result for a user atomic function
824  CPPAD_ASSERT_NARG_NRES(op, 1, 0);
825  CPPAD_ASSERT_UNKNOWN( user_state == ret_user );
826  CPPAD_ASSERT_UNKNOWN( user_i < user_m );
827  CPPAD_ASSERT_UNKNOWN( user_j == user_n );
828  CPPAD_ASSERT_UNKNOWN( size_t( arg[0] ) < num_par );
829 # if CPPAD_FORWARD0SWEEP_TRACE
830  user_iy[user_i] = 0;
831 # endif
832  user_i++;
833  if( user_i == user_m )
834  user_state = end_user;
835  break;
836 
837  case UsrrvOp:
838  // variable result for a user atomic function
839  CPPAD_ASSERT_NARG_NRES(op, 0, 1);
840  CPPAD_ASSERT_UNKNOWN( user_state == ret_user );
841  CPPAD_ASSERT_UNKNOWN( user_i < user_m );
842  CPPAD_ASSERT_UNKNOWN( user_j == user_n );
843 # if CPPAD_FORWARD0SWEEP_TRACE
844  user_iy[user_i] = i_var;
845 # endif
846  taylor[ i_var * J + 0 ] = user_ty[user_i++];
847  if( user_i == user_m )
848  user_state = end_user;
849  break;
850  // -------------------------------------------------
851 
852  case ZmulpvOp:
853  CPPAD_ASSERT_UNKNOWN( size_t(arg[0]) < num_par );
854  forward_zmulpv_op_0(i_var, arg, parameter, J, taylor);
855  break;
856  // -------------------------------------------------
857 
858  case ZmulvpOp:
859  CPPAD_ASSERT_UNKNOWN( size_t(arg[1]) < num_par );
860  forward_zmulvp_op_0(i_var, arg, parameter, J, taylor);
861  break;
862  // -------------------------------------------------
863 
864  case ZmulvvOp:
865  forward_zmulvv_op_0(i_var, arg, parameter, J, taylor);
866  break;
867  // -------------------------------------------------
868 
869  default:
870  CPPAD_ASSERT_UNKNOWN(false);
871  }
872 # if CPPAD_FORWARD0SWEEP_TRACE
873  size_t d = 0;
874  if( user_trace )
875  { user_trace = false;
876 
877  CPPAD_ASSERT_UNKNOWN( op == UserOp );
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;
881  printOp(
882  std::cout,
883  play,
884  i_tmp,
885  user_iy[i],
886  UsrrvOp,
887  CPPAD_NULL
888  );
889  Base* Z_tmp = taylor + user_iy[i] * J;
891  std::cout,
892  d + 1,
893  Z_tmp,
894  0,
895  (Base *) CPPAD_NULL
896  );
897  std::cout << std::endl;
898  }
899  }
900  Base* Z_tmp = taylor + i_var * J;
901  if( op != UsrrvOp )
902  {
903  printOp(
904  std::cout,
905  play,
906  i_op,
907  i_var,
908  op,
909  arg
910  );
911  if( NumRes(op) > 0 ) printOpResult(
912  std::cout,
913  d + 1,
914  Z_tmp,
915  0,
916  (Base *) CPPAD_NULL
917  );
918  std::cout << std::endl;
919  }
920  }
921  std::cout << std::endl;
922 # else
923  }
924 # endif
925  CPPAD_ASSERT_UNKNOWN( user_state == start_user );
926 
927  return;
928 }
929 
930 } } // END_CPPAD_LOCAL_NAMESPACE
931 
932 // preprocessor symbols that are local to this file
933 # undef CPPAD_FORWARD0SWEEP_TRACE
934 # undef CPPAD_ATOMIC_CALL
935 
936 # endif
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.
Definition: cos_op.hpp:150
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 &lt;= right.
Definition: comp_op.hpp:82
#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.
Definition: comp_op.hpp:262
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.
Definition: div_op.hpp:322
size_t num_par_rec(void) const
Fetch number of parameters in the recording.
Definition: player.hpp:638
size_t extend(size_t n)
Increase the number of elements the end of this vector (existing elements are always preserved)...
Definition: pod_vector.hpp:115
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.
Definition: op_code.hpp:852
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.
Definition: abs_op.hpp:101
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.
Definition: print_op.hpp:103
size_t num_vec_ind_rec(void) const
Fetch number of VecAD indices in the recording.
Definition: player.hpp:626
CPPAD_TAPE_ADDR_TYPE addr_t
Definition: declare_ad.hpp:44
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.
Definition: sub_op.hpp:437
next UsrrpOp (UsrrvOp) is a parameter (variable) result
Definition: user_state.hpp:25
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.
Definition: comp_op.hpp:285
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.
Definition: pow_op.hpp:364
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.
Definition: sinh_op.hpp:151
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.
Definition: erf_op.hpp:212
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.
Definition: zmul_op.hpp:450
const char * GetTxt(size_t i) const
Fetch a &#39;\0&#39; terminated string from the recording.
Definition: player.hpp:608
size_t NumArg(OpCode op)
Number of arguments for a specified operator.
Definition: op_code.hpp:175
Class used to store and play back an operation sequence recording.
Definition: declare_ad.hpp:27
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.
Definition: sin_op.hpp:151
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.
Definition: tanh_op.hpp:145
size_t GetVecInd(size_t i) const
Fetch a VecAD index from the recording.
Definition: player.hpp:571
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.
Definition: atan_op.hpp:144
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.
Definition: cskip_op.hpp:119
void resize(size_t n)
change the number of elements in this vector.
Definition: vector.hpp:399
size_t NumRes(OpCode op)
Number of variables resulting from the specified operation.
Definition: op_code.hpp:281
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.
Definition: sub_op.hpp:117
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.
Definition: mul_op.hpp:291
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.
Definition: store_op.hpp:219
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.
Definition: zmul_op.hpp:290
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.
Definition: comp_op.hpp:215
next UserOp marks end of a user atomic call
Definition: user_state.hpp:28
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.
Definition: comp_op.hpp:238
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.
Definition: atanh_op.hpp:145
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.
Definition: cosh_op.hpp:150
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
Definition: player.hpp:517
virtual void set_old(size_t id)
Set value of id (used by deprecated old_atomic class)
OpCode
Type used to distinguish different AD&lt; Base &gt; atomic operations.
Definition: op_code.hpp:49
#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 &lt;= right.
Definition: comp_op.hpp:121
next UserOp marks beginning of a user atomic call
Definition: user_state.hpp:19
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
Definition: player.hpp:485
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.
Definition: csum_op.hpp:92
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.
Definition: sign_op.hpp:104
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.
Definition: cond_op.hpp:631
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.
Definition: acosh_op.hpp:158
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.
Definition: store_op.hpp:306
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.
Definition: div_op.hpp:132
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.
Definition: log_op.hpp:124
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.
Definition: exp_op.hpp:117
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.
Definition: pod_vector.hpp:89
next UsrapOp (UsravOp) is a parameter (variable) argument
Definition: user_state.hpp:22
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.
Definition: discrete_op.hpp:90
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.
Definition: log1p_op.hpp:125
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.
Definition: asinh_op.hpp:158
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.
Definition: pow_op.hpp:571
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.
Definition: zmul_op.hpp:124
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.
Definition: store_op.hpp:276
#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.
Definition: store_op.hpp:248
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.
Definition: acos_op.hpp:157
size_t num_op_rec(void) const
Fetch number of operators in the recording.
Definition: player.hpp:622
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.
Definition: asin_op.hpp:157
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 &lt; right.
Definition: comp_op.hpp:168
size_t num_text_rec(void) const
Fetch number of characters (representing strings) in the recording.
Definition: player.hpp:642
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 &lt; right.
Definition: comp_op.hpp:145
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.
Definition: op_code.hpp:547
#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.
Definition: tan_op.hpp:146
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.
Definition: div_op.hpp:503
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.
Definition: add_op.hpp:117
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 &lt;= right.
Definition: comp_op.hpp:45
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.
Definition: mul_op.hpp:124
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.
Definition: pow_op.hpp:135
Base GetPar(size_t i) const
Fetch a parameter from the recording.
Definition: player.hpp:584
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 &lt; right.
Definition: comp_op.hpp:191
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.
Definition: expm1_op.hpp:120
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.
Definition: load_op.hpp:291
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.
Definition: add_op.hpp:274
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.
Definition: sqrt_op.hpp:120
size_t num_var_rec(void) const
Fetch number of variables in the recording.
Definition: player.hpp:614
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.
Definition: load_op.hpp:247
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.
Definition: sub_op.hpp:277