CppAD: A C++ Algorithmic Differentiation Package  20171217
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
forward1sweep.hpp
Go to the documentation of this file.
1 # ifndef CPPAD_LOCAL_FORWARD1SWEEP_HPP
2 # define CPPAD_LOCAL_FORWARD1SWEEP_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 forward1sweep.hpp
18 Compute one Taylor coefficient for each order requested.
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 macro is undefined at the end of this file to facillitate its
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_FORWARD1SWEEP_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 forward1sweep computation is printed.
46 */
47 # define CPPAD_FORWARD1SWEEP_TRACE 0
48 
49 /*!
50 Compute arbitrary order forward mode Taylor coefficients.
51 
52 <!-- replace forward0sweep_doc_define -->
53 \tparam Base
54 The type used during the forward mode computations; i.e., the corresponding
55 recording of operations used the type AD<Base>.
56 
57 \param s_out
58 Is the stream where output corresponding to PriOp operations will
59 be written.
60 
61 \param print
62 If print is false,
63 suppress the output that is otherwise generated by the c PriOp instructions.
64 
65 \param n
66 is the number of independent variables on the tape.
67 
68 \param numvar
69 is the total number of variables on the tape.
70 This is also equal to the number of rows in the matrix taylor; i.e.,
71 play->num_var_rec().
72 
73 \param play
74 The information stored in play
75 is a recording of the operations corresponding to the function
76 \f[
77  F : {\bf R}^n \rightarrow {\bf R}^m
78 \f]
79 where \f$ n \f$ is the number of independent variables and
80 \f$ m \f$ is the number of dependent variables.
81 
82 \param J
83 Is the number of columns in the coefficient matrix taylor.
84 This must be greater than or equal one.
85 
86 <!-- end forward0sweep_doc_define -->
87 
88 \param cskip_op
89 Is a vector with size play->num_op_rec().
90 \n
91 \n
92 <tt>p = 0</tt>
93 \n
94 In this case,
95 the input value of the elements does not matter.
96 Upon return, if cskip_op[i] is true, the operator with index i
97 does not affect any of the dependent variable
98 (given the value of the independent variables).
99 \n
100 \n
101 <tt>p > 0</tt>
102 \n
103 In this case cskip_op is not modified and has the same meaning
104 as its return value above.
105 
106 \param var_by_load_op
107 is a vector with size play->num_load_op_rec().
108 \n
109 \n
110 <tt>p == 0</tt>
111 \n
112 In this case,
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 \n
120 \n
121 <tt>p > 0</tt>
122 \n
123 In this case var_by_load_op is not modified and has the meaning
124 as its return value above.
125 
126 \param p
127 is the lowest order of the Taylor coefficients
128 that are computed during this call.
129 
130 \param q
131 is the highest order of the Taylor coefficients
132 that are computed during this call.
133 
134 \param taylor
135 \n
136 \b Input:
137 For <code>i = 1 , ... , numvar-1</code>,
138 <code>k = 0 , ... , p-1</code>,
139 <code>taylor[ J*i + k]</code>
140 is the k-th order Taylor coefficient corresponding to
141 the i-th variable.
142 \n
143 \n
144 \b Input:
145 For <code>i = 1 , ... , n</code>,
146 <code>k = p , ... , q</code>,
147 <code>taylor[ J*j + k]</code>
148 is the k-th order Taylor coefficient corresponding to
149 the i-th variable
150 (these are the independent varaibles).
151 \n
152 \n
153 \b Output:
154 For <code>i = n+1 , ... , numvar-1</code>, and
155 <code>k = 0 , ... , p-1</code>,
156 <code>taylor[ J*i + k]</code>
157 is the k-th order Taylor coefficient corresponding to
158 the i-th variable.
159 
160 
161 \param compare_change_count
162 Is the count value for changing number and op_index during
163 zero order foward mode.
164 
165 \param compare_change_number
166 If p is non-zero, this value is not changed, otherwise:
167 If compare_change_count is zero, this value is set to zero, otherwise:
168 this value is set to the number of comparision operations
169 that have a different result from when the information in
170 play was recorded.
171 
172 \param compare_change_op_index
173 if p is non-zero, this value is not changed, otherwise:
174 If compare_change_count is zero, this value is set to zero.
175 Otherwise it is the operator index (see forward_next) for the count-th
176 comparision operation that has a different result from when the information in
177 play was recorded.
178 */
179 
180 template <class Base>
182  const local::player<Base>* play,
183  std::ostream& s_out,
184  const bool print,
185  const size_t p,
186  const size_t q,
187  const size_t n,
188  const size_t numvar,
189  const size_t J,
190  Base* taylor,
191  bool* cskip_op,
192  pod_vector<addr_t>& var_by_load_op,
193  size_t compare_change_count,
194  size_t& compare_change_number,
195  size_t& compare_change_op_index
196 )
197 {
198  // number of directions
199  const size_t r = 1;
200 
201  CPPAD_ASSERT_UNKNOWN( p <= q );
202  CPPAD_ASSERT_UNKNOWN( J >= q + 1 );
203  CPPAD_ASSERT_UNKNOWN( play->num_var_rec() == numvar );
204 
205  /*
206  <!-- replace forward0sweep_code_define -->
207  */
208  // op code for current instruction
209  OpCode op;
210 
211  // index for current instruction
212  size_t i_op;
213 
214  // next variables
215  size_t i_var;
216 
217  // operation argument indices
218  const addr_t* arg = CPPAD_NULL;
219 
220  // initialize the comparision operator counter
221  if( p == 0 )
222  { compare_change_number = 0;
223  compare_change_op_index = 0;
224  }
225 
226  // If this includes a zero calculation, initialize this information
227  pod_vector<bool> isvar_by_ind;
228  pod_vector<size_t> index_by_ind;
229  if( p == 0 )
230  { size_t i;
231 
232  // this includes order zero calculation, initialize vector indices
233  size_t num = play->num_vec_ind_rec();
234  if( num > 0 )
235  { isvar_by_ind.extend(num);
236  index_by_ind.extend(num);
237  for(i = 0; i < num; i++)
238  { index_by_ind[i] = play->GetVecInd(i);
239  isvar_by_ind[i] = false;
240  }
241  }
242  // includes zero order, so initialize conditional skip flags
243  num = play->num_op_rec();
244  for(i = 0; i < num; i++)
245  cskip_op[i] = false;
246  }
247 
248  // work space used by UserOp.
249  vector<bool> user_vx; // empty vecotor
250  vector<bool> user_vy; // empty vecotor
251  vector<Base> user_tx; // argument vector Taylor coefficients
252  vector<Base> user_ty; // result vector Taylor coefficients
253  //
254  atomic_base<Base>* user_atom = CPPAD_NULL; // user's atomic op calculator
255 # ifndef NDEBUG
256  bool user_ok = false; // atomic op return value
257 # endif
258  //
259  // information defined by forward_user
260  size_t user_old=0, user_m=0, user_n=0, user_i=0, user_j=0;
261  enum_user_state user_state = start_user; // proper initialization
262 
263  // length of the parameter vector (used by CppAD assert macros)
264  const size_t num_par = play->num_par_rec();
265 
266  // pointer to the beginning of the parameter vector
267  const Base* parameter = CPPAD_NULL;
268  if( num_par > 0 )
269  parameter = play->GetPar();
270 
271  // length of the text vector (used by CppAD assert macros)
272  const size_t num_text = play->num_text_rec();
273 
274  // pointer to the beginning of the text vector
275  const char* text = CPPAD_NULL;
276  if( num_text > 0 )
277  text = play->GetTxt(0);
278  /*
279  <!-- end forward0sweep_code_define -->
280  */
281  // temporary indices
282  size_t i, k;
283 
284  // number of orders for this user calculation
285  // (not needed for order zero)
286  const size_t user_q1 = q+1;
287 
288  // variable indices for results vector
289  // (done differently for order zero).
290  vector<size_t> user_iy;
291 
292  // skip the BeginOp at the beginning of the recording
293  i_op = 0;
294  play->get_op_info(i_op, op, arg, i_var);
295  CPPAD_ASSERT_UNKNOWN( op == BeginOp );
296  //
297 # if CPPAD_FORWARD1SWEEP_TRACE
298  bool user_trace = false;
299  std::cout << std::endl;
300 # endif
301  //
302  bool flag; // a temporary flag to use in switch cases
303  bool more_operators = true;
304  while(more_operators)
305  {
306  // this op
307  play->get_op_info(++i_op, op, arg, i_var);
308  CPPAD_ASSERT_UNKNOWN( i_op < play->num_op_rec() );
309 
310  // check if we are skipping this operation
311  while( cskip_op[i_op] )
312  { switch(op)
313  {
314  case UserOp:
315  { // get information for this user atomic call
316  CPPAD_ASSERT_UNKNOWN( user_state == start_user );
317  play->get_user_info(op, arg, user_old, user_m, user_n);
318  //
319  // skip to the second UserOp
320  i_op += user_m + user_n;
321  play->get_op_info(++i_op, op, arg, i_var);
322  CPPAD_ASSERT_UNKNOWN( op == UserOp );
323  }
324  break;
325 
326  default:
327  break;
328  }
329  play->get_op_info(++i_op, op, arg, i_var);
330  CPPAD_ASSERT_UNKNOWN( i_op < play->num_op_rec() );
331  }
332 
333  // action depends on the operator
334  switch( op )
335  {
336  case AbsOp:
337  forward_abs_op(p, q, i_var, arg[0], J, taylor);
338  break;
339  // -------------------------------------------------
340 
341  case AddvvOp:
342  forward_addvv_op(p, q, i_var, arg, parameter, J, taylor);
343  break;
344  // -------------------------------------------------
345 
346  case AddpvOp:
347  CPPAD_ASSERT_UNKNOWN( size_t(arg[0]) < num_par );
348  forward_addpv_op(p, q, i_var, arg, parameter, J, taylor);
349  break;
350  // -------------------------------------------------
351 
352  case AcosOp:
353  // sqrt(1 - x * x), acos(x)
354  CPPAD_ASSERT_UNKNOWN( i_var < numvar );
355  forward_acos_op(p, q, i_var, arg[0], J, taylor);
356  break;
357  // -------------------------------------------------
358 
359 # if CPPAD_USE_CPLUSPLUS_2011
360  case AcoshOp:
361  // sqrt(x * x - 1), acosh(x)
362  CPPAD_ASSERT_UNKNOWN( i_var < numvar );
363  forward_acosh_op(p, q, i_var, arg[0], J, taylor);
364  break;
365 # endif
366  // -------------------------------------------------
367 
368  case AsinOp:
369  // sqrt(1 - x * x), asin(x)
370  CPPAD_ASSERT_UNKNOWN( i_var < numvar );
371  forward_asin_op(p, q, i_var, arg[0], J, taylor);
372  break;
373  // -------------------------------------------------
374 
375 # if CPPAD_USE_CPLUSPLUS_2011
376  case AsinhOp:
377  // sqrt(1 + x * x), asinh(x)
378  CPPAD_ASSERT_UNKNOWN( i_var < numvar );
379  forward_asinh_op(p, q, i_var, arg[0], J, taylor);
380  break;
381 # endif
382  // -------------------------------------------------
383 
384  case AtanOp:
385  // 1 + x * x, atan(x)
386  CPPAD_ASSERT_UNKNOWN( i_var < numvar );
387  forward_atan_op(p, q, i_var, arg[0], J, taylor);
388  break;
389  // -------------------------------------------------
390 
391 # if CPPAD_USE_CPLUSPLUS_2011
392  case AtanhOp:
393  // 1 - x * x, atanh(x)
394  CPPAD_ASSERT_UNKNOWN( i_var < numvar );
395  forward_atanh_op(p, q, i_var, arg[0], J, taylor);
396  break;
397 # endif
398  // -------------------------------------------------
399 
400  case CExpOp:
402  p, q, i_var, arg, num_par, parameter, J, taylor
403  );
404  break;
405  // ---------------------------------------------------
406 
407  case CosOp:
408  // sin(x), cos(x)
409  CPPAD_ASSERT_UNKNOWN( i_var < numvar );
410  forward_cos_op(p, q, i_var, arg[0], J, taylor);
411  break;
412  // ---------------------------------------------------
413 
414  case CoshOp:
415  // sinh(x), cosh(x)
416  CPPAD_ASSERT_UNKNOWN( i_var < numvar );
417  forward_cosh_op(p, q, i_var, arg[0], J, taylor);
418  break;
419  // -------------------------------------------------
420 
421  case CSkipOp:
422  if( p == 0 )
424  i_var, arg, num_par, parameter, J, taylor, cskip_op
425  );
426  }
427  break;
428  // -------------------------------------------------
429 
430  case CSumOp:
432  p, q, i_var, arg, num_par, parameter, J, taylor
433  );
434  break;
435  // -------------------------------------------------
436 
437  case DisOp:
438  forward_dis_op(p, q, r, i_var, arg, J, taylor);
439  break;
440  // -------------------------------------------------
441 
442  case DivvvOp:
443  forward_divvv_op(p, q, i_var, arg, parameter, J, taylor);
444  break;
445  // -------------------------------------------------
446 
447  case DivpvOp:
448  CPPAD_ASSERT_UNKNOWN( size_t(arg[0]) < num_par );
449  forward_divpv_op(p, q, i_var, arg, parameter, J, taylor);
450  break;
451  // -------------------------------------------------
452 
453  case DivvpOp:
454  CPPAD_ASSERT_UNKNOWN( size_t(arg[1]) < num_par );
455  forward_divvp_op(p, q, i_var, arg, parameter, J, taylor);
456  break;
457  // -------------------------------------------------
458 
459  case EndOp:
460  CPPAD_ASSERT_NARG_NRES(op, 0, 0);
461  more_operators = false;
462  break;
463  // -------------------------------------------------
464 
465  case EqpvOp:
466  if( ( p == 0 ) & ( compare_change_count > 0 ) )
468  compare_change_number, arg, parameter, J, taylor
469  );
470  if( compare_change_count == compare_change_number )
471  compare_change_op_index = i_op;
472  }
473  break;
474  // -------------------------------------------------
475 
476  case EqvvOp:
477  if( ( p == 0 ) & ( compare_change_count > 0 ) )
479  compare_change_number, arg, parameter, J, taylor
480  );
481  if( compare_change_count == compare_change_number )
482  compare_change_op_index = i_op;
483  }
484  break;
485  // -------------------------------------------------
486 
487 # if CPPAD_USE_CPLUSPLUS_2011
488  case ErfOp:
489  CPPAD_ASSERT_UNKNOWN( CPPAD_USE_CPLUSPLUS_2011 );
490  forward_erf_op(p, q, i_var, arg, parameter, J, taylor);
491  break;
492 # endif
493  // -------------------------------------------------
494 
495  case ExpOp:
496  forward_exp_op(p, q, i_var, arg[0], J, taylor);
497  break;
498  // ---------------------------------------------------
499 
500 # if CPPAD_USE_CPLUSPLUS_2011
501  case Expm1Op:
502  forward_expm1_op(p, q, i_var, arg[0], J, taylor);
503  break;
504 # endif
505  // ---------------------------------------------------
506 
507  case InvOp:
508  CPPAD_ASSERT_NARG_NRES(op, 0, 1);
509  break;
510  // -------------------------------------------------
511 
512  case LdpOp:
513  if( p == 0 )
515  play,
516  i_var,
517  arg,
518  parameter,
519  J,
520  taylor,
521  isvar_by_ind.data(),
522  index_by_ind.data(),
523  var_by_load_op.data()
524  );
525  if( p < q ) forward_load_op(
526  play,
527  op,
528  p+1,
529  q,
530  r,
531  J,
532  i_var,
533  arg,
534  var_by_load_op.data(),
535  taylor
536  );
537  }
538  else forward_load_op(
539  play,
540  op,
541  p,
542  q,
543  r,
544  J,
545  i_var,
546  arg,
547  var_by_load_op.data(),
548  taylor
549  );
550  break;
551  // -------------------------------------------------
552 
553  case LdvOp:
554  if( p == 0 )
556  play,
557  i_var,
558  arg,
559  parameter,
560  J,
561  taylor,
562  isvar_by_ind.data(),
563  index_by_ind.data(),
564  var_by_load_op.data()
565  );
566  if( p < q ) forward_load_op(
567  play,
568  op,
569  p+1,
570  q,
571  r,
572  J,
573  i_var,
574  arg,
575  var_by_load_op.data(),
576  taylor
577  );
578  }
579  else forward_load_op(
580  play,
581  op,
582  p,
583  q,
584  r,
585  J,
586  i_var,
587  arg,
588  var_by_load_op.data(),
589  taylor
590  );
591  break;
592  // -------------------------------------------------
593 
594  case LepvOp:
595  if( ( p == 0 ) & ( compare_change_count > 0 ) )
597  compare_change_number, arg, parameter, J, taylor
598  );
599  if( compare_change_count == compare_change_number )
600  compare_change_op_index = i_op;
601  }
602  break;
603 
604  case LevpOp:
605  if( ( p == 0 ) & ( compare_change_count > 0 ) )
607  compare_change_number, arg, parameter, J, taylor
608  );
609  if( compare_change_count == compare_change_number )
610  compare_change_op_index = i_op;
611  }
612  break;
613  // -------------------------------------------------
614 
615  case LevvOp:
616  if( ( p == 0 ) & ( compare_change_count > 0 ) )
618  compare_change_number, arg, parameter, J, taylor
619  );
620  if( compare_change_count == compare_change_number )
621  compare_change_op_index = i_op;
622  }
623  break;
624  // -------------------------------------------------
625 
626  case LogOp:
627  forward_log_op(p, q, i_var, arg[0], J, taylor);
628  break;
629  // -------------------------------------------------
630 
631 # if CPPAD_USE_CPLUSPLUS_2011
632  case Log1pOp:
633  forward_log1p_op(p, q, i_var, arg[0], J, taylor);
634  break;
635 # endif
636  // -------------------------------------------------
637 
638  case LtpvOp:
639  if( ( p == 0 ) & ( compare_change_count > 0 ) )
641  compare_change_number, arg, parameter, J, taylor
642  );
643  if( compare_change_count == compare_change_number )
644  compare_change_op_index = i_op;
645  }
646  break;
647 
648  case LtvpOp:
649  if( ( p == 0 ) & ( compare_change_count > 0 ) )
651  compare_change_number, arg, parameter, J, taylor
652  );
653  if( compare_change_count == compare_change_number )
654  compare_change_op_index = i_op;
655  }
656  break;
657  // -------------------------------------------------
658 
659  case LtvvOp:
660  if( ( p == 0 ) & ( compare_change_count > 0 ) )
662  compare_change_number, arg, parameter, J, taylor
663  );
664  if( compare_change_count == compare_change_number )
665  compare_change_op_index = i_op;
666  }
667  break;
668  // -------------------------------------------------
669 
670  case MulpvOp:
671  CPPAD_ASSERT_UNKNOWN( size_t(arg[0]) < num_par );
672  forward_mulpv_op(p, q, i_var, arg, parameter, J, taylor);
673  break;
674  // -------------------------------------------------
675 
676  case MulvvOp:
677  forward_mulvv_op(p, q, i_var, arg, parameter, J, taylor);
678  break;
679  // -------------------------------------------------
680 
681  case NepvOp:
682  if( ( p == 0 ) & ( compare_change_count > 0 ) )
684  compare_change_number, arg, parameter, J, taylor
685  );
686  if( compare_change_count == compare_change_number )
687  compare_change_op_index = i_op;
688  }
689  break;
690  // -------------------------------------------------
691 
692  case NevvOp:
693  if( ( p == 0 ) & ( compare_change_count > 0 ) )
695  compare_change_number, arg, parameter, J, taylor
696  );
697  if( compare_change_count == compare_change_number )
698  compare_change_op_index = i_op;
699  }
700  break;
701  // -------------------------------------------------
702 
703  case ParOp:
704  i = p;
705  if( i == 0 )
707  i_var, arg, num_par, parameter, J, taylor
708  );
709  i++;
710  }
711  while(i <= q)
712  { taylor[ i_var * J + i] = Base(0.0);
713  i++;
714  }
715  break;
716  // -------------------------------------------------
717 
718  case PowvpOp:
719  CPPAD_ASSERT_UNKNOWN( size_t(arg[1]) < num_par );
720  forward_powvp_op(p, q, i_var, arg, parameter, J, taylor);
721  break;
722  // -------------------------------------------------
723 
724  case PowpvOp:
725  CPPAD_ASSERT_UNKNOWN( size_t(arg[0]) < num_par );
726  forward_powpv_op(p, q, i_var, arg, parameter, J, taylor);
727  break;
728  // -------------------------------------------------
729 
730  case PowvvOp:
731  forward_powvv_op(p, q, i_var, arg, parameter, J, taylor);
732  break;
733  // -------------------------------------------------
734 
735  case PriOp:
736  if( (p == 0) & print ) forward_pri_0(s_out,
737  arg, num_text, text, num_par, parameter, J, taylor
738  );
739  break;
740  // -------------------------------------------------
741 
742  case SignOp:
743  // sign(x)
744  CPPAD_ASSERT_UNKNOWN( i_var < numvar );
745  forward_sign_op(p, q, i_var, arg[0], J, taylor);
746  break;
747  // -------------------------------------------------
748 
749  case SinOp:
750  // cos(x), sin(x)
751  CPPAD_ASSERT_UNKNOWN( i_var < numvar );
752  forward_sin_op(p, q, i_var, arg[0], J, taylor);
753  break;
754  // -------------------------------------------------
755 
756  case SinhOp:
757  // cosh(x), sinh(x)
758  CPPAD_ASSERT_UNKNOWN( i_var < numvar );
759  forward_sinh_op(p, q, i_var, arg[0], J, taylor);
760  break;
761  // -------------------------------------------------
762 
763  case SqrtOp:
764  forward_sqrt_op(p, q, i_var, arg[0], J, taylor);
765  break;
766  // -------------------------------------------------
767 
768  case StppOp:
769  if( p == 0 )
771  i_var,
772  arg,
773  num_par,
774  J,
775  taylor,
776  isvar_by_ind.data(),
777  index_by_ind.data()
778  );
779  }
780  break;
781  // -------------------------------------------------
782 
783  case StpvOp:
784  if( p == 0 )
786  i_var,
787  arg,
788  num_par,
789  J,
790  taylor,
791  isvar_by_ind.data(),
792  index_by_ind.data()
793  );
794  }
795  break;
796  // -------------------------------------------------
797 
798  case StvpOp:
799  if( p == 0 )
801  i_var,
802  arg,
803  num_par,
804  J,
805  taylor,
806  isvar_by_ind.data(),
807  index_by_ind.data()
808  );
809  }
810  break;
811  // -------------------------------------------------
812 
813  case StvvOp:
814  if( p == 0 )
816  i_var,
817  arg,
818  num_par,
819  J,
820  taylor,
821  isvar_by_ind.data(),
822  index_by_ind.data()
823  );
824  }
825  break;
826  // -------------------------------------------------
827 
828  case SubvvOp:
829  forward_subvv_op(p, q, i_var, arg, parameter, J, taylor);
830  break;
831  // -------------------------------------------------
832 
833  case SubpvOp:
834  CPPAD_ASSERT_UNKNOWN( size_t(arg[0]) < num_par );
835  forward_subpv_op(p, q, i_var, arg, parameter, J, taylor);
836  break;
837  // -------------------------------------------------
838 
839  case SubvpOp:
840  CPPAD_ASSERT_UNKNOWN( size_t(arg[1]) < num_par );
841  forward_subvp_op(p, q, i_var, arg, parameter, J, taylor);
842  break;
843  // -------------------------------------------------
844 
845  case TanOp:
846  // tan(x)^2, tan(x)
847  CPPAD_ASSERT_UNKNOWN( i_var < numvar );
848  forward_tan_op(p, q, i_var, arg[0], J, taylor);
849  break;
850  // -------------------------------------------------
851 
852  case TanhOp:
853  // tanh(x)^2, tanh(x)
854  CPPAD_ASSERT_UNKNOWN( i_var < numvar );
855  forward_tanh_op(p, q, i_var, arg[0], J, taylor);
856  break;
857  // -------------------------------------------------
858 
859  case UserOp:
860  // start or end an atomic function call
861  flag = user_state == start_user;
862  user_atom = play->get_user_info(op, arg, user_old, user_m, user_n);
863  if( flag )
864  { user_state = arg_user;
865  user_i = 0;
866  user_j = 0;
867  //
868  user_tx.resize(user_n * user_q1);
869  user_ty.resize(user_m * user_q1);
870  user_iy.resize(user_m);
871  }
872  else
873  { user_state = start_user;
874  //
875  // call users function for this operation
876  user_atom->set_old(user_old);
878  p, q, user_vx, user_vy, user_tx, user_ty
879  );
880 # ifndef NDEBUG
881  if( ! user_ok )
882  { std::string msg =
883  user_atom->afun_name()
884  + ": atomic_base.forward: returned false";
885  CPPAD_ASSERT_KNOWN(false, msg.c_str() );
886  }
887 # endif
888  for(i = 0; i < user_m; i++)
889  if( user_iy[i] > 0 )
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
894  user_trace = true;
895 # endif
896  }
897  break;
898 
899  case UsrapOp:
900  // parameter argument for a user atomic function
901  CPPAD_ASSERT_UNKNOWN( NumArg(op) == 1 );
902  CPPAD_ASSERT_UNKNOWN( user_state == arg_user );
903  CPPAD_ASSERT_UNKNOWN( user_i == 0 );
904  CPPAD_ASSERT_UNKNOWN( user_j < user_n );
905  CPPAD_ASSERT_UNKNOWN( size_t( arg[0] ) < num_par );
906  //
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);
910  //
911  ++user_j;
912  if( user_j == user_n )
913  user_state = ret_user;
914  break;
915 
916  case UsravOp:
917  // variable argument for a user atomic function
918  CPPAD_ASSERT_UNKNOWN( NumArg(op) == 1 );
919  CPPAD_ASSERT_UNKNOWN( user_state == arg_user );
920  CPPAD_ASSERT_UNKNOWN( user_i == 0 );
921  CPPAD_ASSERT_UNKNOWN( user_j < user_n );
922  //
923  for(k = 0; k < user_q1; k++)
924  user_tx[user_j * user_q1 + k] = taylor[ arg[0] * J + k];
925  //
926  ++user_j;
927  if( user_j == user_n )
928  user_state = ret_user;
929  break;
930 
931  case UsrrpOp:
932  // parameter result for a user atomic function
933  CPPAD_ASSERT_NARG_NRES(op, 1, 0);
934  CPPAD_ASSERT_UNKNOWN( user_state == ret_user );
935  CPPAD_ASSERT_UNKNOWN( user_i < user_m );
936  CPPAD_ASSERT_UNKNOWN( user_j == user_n );
937  CPPAD_ASSERT_UNKNOWN( size_t( arg[0] ) < num_par );
938  //
939  user_iy[user_i] = 0;
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);
943  //
944  ++user_i;
945  if( user_i == user_m )
946  user_state = end_user;
947  break;
948 
949  case UsrrvOp:
950  // variable result for a user atomic function
951  CPPAD_ASSERT_NARG_NRES(op, 0, 1);
952  CPPAD_ASSERT_UNKNOWN( user_state == ret_user );
953  CPPAD_ASSERT_UNKNOWN( user_i < user_m );
954  CPPAD_ASSERT_UNKNOWN( user_j == user_n );
955  //
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];
959  //
960  ++user_i;
961  if( user_i == user_m )
962  user_state = end_user;
963  break;
964  // -------------------------------------------------
965 
966  case ZmulpvOp:
967  CPPAD_ASSERT_UNKNOWN( size_t(arg[0]) < num_par );
968  forward_zmulpv_op(p, q, i_var, arg, parameter, J, taylor);
969  break;
970  // -------------------------------------------------
971 
972  case ZmulvpOp:
973  CPPAD_ASSERT_UNKNOWN( size_t(arg[1]) < num_par );
974  forward_zmulvp_op(p, q, i_var, arg, parameter, J, taylor);
975  break;
976  // -------------------------------------------------
977 
978  case ZmulvvOp:
979  forward_zmulvv_op(p, q, i_var, arg, parameter, J, taylor);
980  break;
981  // -------------------------------------------------
982 
983  default:
985  }
986 # if CPPAD_FORWARD1SWEEP_TRACE
987  if( user_trace )
988  { user_trace = false;
989 
990  CPPAD_ASSERT_UNKNOWN( op == UserOp );
992  for(i = 0; i < user_m; i++) if( user_iy[i] > 0 )
993  { size_t i_tmp = (i_op + i) - user_m;
994  printOp(
995  std::cout,
996  play,
997  i_tmp,
998  user_iy[i],
999  UsrrvOp,
1000  CPPAD_NULL
1001  );
1002  Base* Z_tmp = taylor + user_iy[i] * J;
1003  printOpResult(
1004  std::cout,
1005  q + 1,
1006  Z_tmp,
1007  0,
1008  (Base *) CPPAD_NULL
1009  );
1010  std::cout << std::endl;
1011  }
1012  }
1013  Base* Z_tmp = taylor + J * i_var;
1014  if( op != UsrrvOp )
1015  {
1016  printOp(
1017  std::cout,
1018  play,
1019  i_op,
1020  i_var,
1021  op,
1022  arg
1023  );
1024  if( NumRes(op) > 0 ) printOpResult(
1025  std::cout,
1026  q + 1,
1027  Z_tmp,
1028  0,
1029  (Base *) CPPAD_NULL
1030  );
1031  std::cout << std::endl;
1032  }
1033  }
1034  std::cout << std::endl;
1035 # else
1036  }
1037 # endif
1038  CPPAD_ASSERT_UNKNOWN( user_state == start_user );
1039 
1040  if( (p == 0) & (compare_change_count == 0) )
1041  compare_change_number = 0;
1042  return;
1043 }
1044 
1045 // preprocessor symbols that are local to this file
1046 # undef CPPAD_FORWARD1SWEEP_TRACE
1047 # undef CPPAD_ATOMIC_CALL
1048 
1049 } } // END_CPPAD_LOCAL_NAMESPACE
1050 # endif
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
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.
Definition: abs_op.hpp:33
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.
Definition: sign_op.hpp:34
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.
Definition: sqrt_op.hpp:34
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.
Definition: zmul_op.hpp:210
#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_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.
Definition: sub_op.hpp:355
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.
Definition: sub_op.hpp:38
#define CPPAD_ATOMIC_CALL
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_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.
Definition: asin_op.hpp:40
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
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_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.
Definition: atanh_op.hpp:41
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.
Definition: div_op.hpp:417
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
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.
Definition: pow_op.hpp:471
Class used to store and play back an operation sequence recording.
Definition: declare_ad.hpp:27
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.
Definition: acos_op.hpp:40
size_t GetVecInd(size_t i) const
Fetch a VecAD index from the recording.
Definition: player.hpp:571
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 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.
Definition: erf_op.hpp:96
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_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_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
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.
Definition: cond_op.hpp:290
next UserOp marks end of a user atomic call
Definition: user_state.hpp:28
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.
Definition: log_op.hpp:32
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.
Definition: zmul_op.hpp:370
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
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
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.
Definition: load_op.hpp:414
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
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
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.
Definition: sub_op.hpp:196
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_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.
Definition: cosh_op.hpp:40
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.
Definition: atan_op.hpp:40
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.
Definition: mul_op.hpp:37
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.
Definition: mul_op.hpp:211
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_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.
Definition: zmul_op.hpp:37
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.
Definition: acosh_op.hpp:41
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_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.
Definition: div_op.hpp:227
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.
Definition: cos_op.hpp:39
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
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.
Definition: sin_op.hpp:40
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_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_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.
Definition: div_op.hpp:37
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.
Definition: sinh_op.hpp:40
size_t num_op_rec(void) const
Fetch number of operators in the recording.
Definition: player.hpp:622
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.
Definition: add_op.hpp:38
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_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.
Definition: expm1_op.hpp:35
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.
Definition: log1p_op.hpp:33
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_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.
Definition: pow_op.hpp:33
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_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.
Definition: tanh_op.hpp:40
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.
Definition: add_op.hpp:195
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.
Definition: exp_op.hpp:34
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
size_t num_var_rec(void) const
Fetch number of variables in the recording.
Definition: player.hpp:614
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.
Definition: tan_op.hpp:40
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.
Definition: asinh_op.hpp:41
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_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.
Definition: pow_op.hpp:231