1 # ifndef CPPAD_LOCAL_DIV_OP_HPP
2 # define CPPAD_LOCAL_DIV_OP_HPP
15 namespace CppAD {
namespace local {
42 const Base* parameter ,
53 Base* x = taylor + arg[0] * cap_order;
54 Base* y = taylor + arg[1] * cap_order;
55 Base* z = taylor + i_z * cap_order;
61 for(
size_t d = p; d <= q; d++)
63 for(k = 1; k <= d; k++)
64 z[d] -= z[d-k] * y[k];
88 const Base* parameter ,
99 size_t num_taylor_per_var = (cap_order-1) * r + 1;
100 Base* x = taylor + arg[0] * num_taylor_per_var;
101 Base* y = taylor + arg[1] * num_taylor_per_var;
102 Base* z = taylor + i_z * num_taylor_per_var;
107 size_t m = (q-1) * r + 1;
108 for(
size_t ell = 0; ell < r; ell++)
109 { z[m+ell] = x[m+ell] - z[0] * y[m+ell];
110 for(
size_t k = 1; k < q; k++)
111 z[m+ell] -= z[(q-k-1)*r+1+ell] * y[(k-1)*r+1+ell];
131 template <
class Base>
135 const Base* parameter ,
144 Base* x = taylor + arg[0] * cap_order;
145 Base* y = taylor + arg[1] * cap_order;
146 Base* z = taylor + i_z * cap_order;
165 template <
class Base>
170 const Base* parameter ,
183 const Base* y = taylor + arg[1] * cap_order;
184 const Base* z = taylor + i_z * cap_order;
187 Base* px = partial + arg[0] * nc_partial;
188 Base* py = partial + arg[1] * nc_partial;
189 Base* pz = partial + i_z * nc_partial;
193 Base inv_y0 = Base(1.0) / y[0];
201 pz[j] =
azmul(pz[j], inv_y0);
204 for(k = 1; k <= j; k++)
205 { pz[j-k] -=
azmul(pz[j], y[k] );
206 py[k] -=
azmul(pz[j], z[j-k]);
208 py[0] -=
azmul(pz[j], z[j]);
226 template <
class Base>
232 const Base* parameter ,
243 Base* y = taylor + arg[1] * cap_order;
244 Base* z = taylor + i_z * cap_order;
247 Base x = parameter[ arg[0] ];
256 for(
size_t d = p; d <= q; d++)
258 for(k = 1; k <= d; k++)
259 z[d] -= z[d-k] * y[k];
276 template <
class Base>
282 const Base* parameter ,
293 size_t num_taylor_per_var = (cap_order-1) * r + 1;
294 Base* y = taylor + arg[1] * num_taylor_per_var;
295 Base* z = taylor + i_z * num_taylor_per_var;
299 size_t m = (q-1) * r + 1;
300 for(
size_t ell = 0; ell < r; ell++)
301 { z[m+ell] = - z[0] * y[m+ell];
302 for(
size_t k = 1; k < q; k++)
303 z[m+ell] -= z[(q-k-1)*r+1+ell] * y[(k-1)*r+1+ell];
321 template <
class Base>
325 const Base* parameter ,
334 Base x = parameter[ arg[0] ];
337 Base* y = taylor + arg[1] * cap_order;
338 Base* z = taylor + i_z * cap_order;
356 template <
class Base>
361 const Base* parameter ,
374 const Base* y = taylor + arg[1] * cap_order;
375 const Base* z = taylor + i_z * cap_order;
378 Base* py = partial + arg[1] * nc_partial;
379 Base* pz = partial + i_z * nc_partial;
383 Base inv_y0 = Base(1.0) / y[0];
391 pz[j] =
azmul(pz[j], inv_y0);
393 for(k = 1; k <= j; k++)
394 { pz[j-k] -=
azmul(pz[j], y[k] );
395 py[k] -=
azmul(pz[j], z[j-k] );
397 py[0] -=
azmul(pz[j], z[j]);
416 template <
class Base>
422 const Base* parameter ,
433 Base* x = taylor + arg[0] * cap_order;
434 Base* z = taylor + i_z * cap_order;
437 Base y = parameter[ arg[1] ];
441 for(
size_t d = p; d <= q; d++)
457 template <
class Base>
463 const Base* parameter ,
474 size_t num_taylor_per_var = (cap_order-1) * r + 1;
475 Base* x = taylor + arg[0] * num_taylor_per_var;
476 Base* z = taylor + i_z * num_taylor_per_var;
479 Base y = parameter[ arg[1] ];
483 size_t m = (q-1)*r + 1;
484 for(
size_t ell = 0; ell < r; ell++)
485 z[m + ell] = x[m + ell] / y;
502 template <
class Base>
506 const Base* parameter ,
515 Base y = parameter[ arg[1] ];
518 Base* x = taylor + arg[0] * cap_order;
519 Base* z = taylor + i_z * cap_order;
537 template <
class Base>
542 const Base* parameter ,
555 Base y = parameter[ arg[1] ];
558 Base* px = partial + arg[0] * nc_partial;
559 Base* pz = partial + i_z * nc_partial;
563 Base inv_y = Base(1.0) / y;
569 px[j] +=
azmul(pz[j], inv_y);
AD< Base > azmul(const AD< Base > &x, const AD< Base > &y)
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.
CPPAD_TAPE_ADDR_TYPE addr_t
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.
size_t NumArg(OpCode op)
Number of arguments for a specified operator.
void forward_divvp_op_dir(size_t q, size_t r, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Multiple direction forward mode Taylor coefficients for op = DivvvOp.
size_t NumRes(OpCode op)
Number of variables resulting from the specified operation.
void reverse_divpv_op(size_t d, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, const Base *taylor, size_t nc_partial, Base *partial)
Compute reverse mode partial derivative for result of op = DivpvOp.
void forward_divpv_op_dir(size_t q, size_t r, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Multiple directions forward mode Taylor coefficients for op = DivpvOp.
void reverse_divvp_op(size_t d, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, const Base *taylor, size_t nc_partial, Base *partial)
Compute reverse mode partial derivative for result of op = DivvpOp.
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_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.
#define CPPAD_ASSERT_UNKNOWN(exp)
Check that exp is true, if not terminate execution.
void forward_divvv_op(size_t p, size_t q, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Compute forward mode Taylor coefficients for result of op = DivvvOp.
void 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_divvv_op_dir(size_t q, size_t r, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, Base *taylor)
Multiple directions forward mode Taylor coefficients for op = DivvvOp.
void reverse_divvv_op(size_t d, size_t i_z, const addr_t *arg, const Base *parameter, size_t cap_order, const Base *taylor, size_t nc_partial, Base *partial)
Compute reverse mode partial derivatives for result of op = DivvvOp.