1 # ifndef CPPAD_LOCAL_EXPM1_OP_HPP
2 # define CPPAD_LOCAL_EXPM1_OP_HPP
3 # if CPPAD_USE_CPLUSPLUS_2011
17 namespace CppAD {
namespace local {
50 Base* x = taylor + i_x * cap_order;
51 Base* z = taylor + i_z * cap_order;
55 { z[0] =
expm1( x[0] );
58 for(
size_t j = p; j <= q; j++)
61 for(k = 2; k <= j; k++)
62 z[j] += Base(
double(k)) * x[k] * z[j-k];
63 z[j] /= Base(
double(j));
95 size_t num_taylor_per_var = (cap_order-1) * r + 1;
96 Base* x = taylor + i_x * num_taylor_per_var;
97 Base* z = taylor + i_z * num_taylor_per_var;
99 size_t m = (q-1)*r + 1;
100 for(
size_t ell = 0; ell < r; ell++)
101 { z[m+ell] = Base(
double(q)) * x[m+ell] * z[0];
102 for(
size_t k = 1; k < q; k++)
103 z[m+ell] += Base(
double(k)) * x[(k-1)*r+ell+1] * z[(q-k-1)*r+ell+1];
104 z[m+ell] /= Base(
double(q));
105 z[m+ell] += x[m+ell];
119 template <
class Base>
132 Base* x = taylor + i_x * cap_order;
133 Base* z = taylor + i_z * cap_order;
135 z[0] =
expm1( x[0] );
148 template <
class Base>
165 const Base* x = taylor + i_x * cap_order;
166 Base* px = partial + i_x * nc_partial;
169 const Base* z = taylor + i_z * cap_order;
170 Base* pz = partial + i_z * nc_partial;
175 for(
size_t i_d = 0; i_d <= d; i_d++)
187 pz[j] /= Base(
double(j));
189 for(k = 1; k <= j; k++)
190 { px[k] += Base(
double(k)) *
azmul(pz[j], z[j-k]);
191 pz[j-k] += Base(
double(k)) *
azmul(pz[j], x[k]);
195 px[0] += pz[0] +
azmul(pz[0], z[0]);
AD< Base > azmul(const AD< Base > &x, const AD< Base > &y)
void forward_expm1_op_dir(size_t q, size_t r, size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Multiple direction forward mode Taylor coefficient for op = Expm1Op.
size_t NumArg(OpCode op)
Number of arguments for a specified operator.
size_t NumRes(OpCode op)
Number of variables resulting from the specified operation.
bool IdenticalZero(const std::complex< double > &x)
void reverse_expm1_op(size_t d, size_t i_z, size_t i_x, size_t cap_order, const Base *taylor, size_t nc_partial, Base *partial)
Reverse mode partial derivatives for result of op = Expm1Op.
std::complex< double > expm1(const std::complex< double > &x)
#define CPPAD_ASSERT_UNKNOWN(exp)
Check that exp is true, if not terminate execution.
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.
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.