1 # ifndef CPPAD_LOCAL_LOG1P_OP_HPP
2 # define CPPAD_LOCAL_LOG1P_OP_HPP
3 # if CPPAD_USE_CPLUSPLUS_2011
16 namespace CppAD {
namespace local {
50 Base* x = taylor + i_x * cap_order;
51 Base* z = taylor + i_z * cap_order;
54 { z[0] =
log1p( x[0] );
60 { z[1] = x[1] / (Base(1.0) + x[0]);
63 for(
size_t j = p; j <= q; j++)
65 z[j] = -z[1] * x[j-1];
66 for(k = 2; k < j; k++)
67 z[j] -= Base(
double(k)) * z[k] * x[j-k];
68 z[j] /= Base(
double(j));
70 z[j] /= (Base(1.0) + x[0]);
101 size_t num_taylor_per_var = (cap_order-1) * r + 1;
102 Base* x = taylor + i_x * num_taylor_per_var;
103 Base* z = taylor + i_z * num_taylor_per_var;
105 size_t m = (q-1) * r + 1;
106 for(
size_t ell = 0; ell < r; ell++)
107 { z[m+ell] = Base(
double(q)) * x[m+ell];
108 for(
size_t k = 1; k < q; k++)
109 z[m+ell] -= Base(
double(k)) * z[(k-1)*r+1+ell] * x[(q-k-1)*r+1+ell];
110 z[m+ell] /= (Base(
double(q)) + Base(q) * x[0]);
124 template <
class Base>
138 Base* x = taylor + i_x * cap_order;
139 Base* z = taylor + i_z * cap_order;
141 z[0] =
log1p( x[0] );
155 template <
class Base>
173 const Base* x = taylor + i_x * cap_order;
174 Base* px = partial + i_x * nc_partial;
177 const Base* z = taylor + i_z * cap_order;
178 Base* pz = partial + i_z * nc_partial;
180 Base inv_1px0 = Base(1.0) / (Base(1) + x[0]);
185 pz[j] =
azmul(pz[j] , inv_1px0);
187 px[0] -=
azmul(pz[j], z[j]);
191 pz[j] /= Base(
double(j));
193 for(k = 1; k < j; k++)
194 { pz[k] -= Base(
double(k)) *
azmul(pz[j], x[j-k]);
195 px[j-k] -= Base(
double(k)) *
azmul(pz[j], z[k]);
199 px[0] +=
azmul(pz[0], inv_1px0);
AD< Base > azmul(const AD< Base > &x, const AD< Base > &y)
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.
void forward_log1p_op_dir(size_t q, size_t r, size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Muiltiple directions Taylor coefficient for op = Log1pOp.
void forward_log1p_op_0(size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Compute zero order forward mode Taylor coefficient for result of op = Log1pOp.
void reverse_log1p_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)
Compute reverse mode partial derivatives for result of op = Log1pOp.
#define CPPAD_ASSERT_UNKNOWN(exp)
Check that exp is true, if not terminate execution.
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.
std::complex< double > log1p(const std::complex< double > &x)