1 # ifndef CPPAD_LOCAL_ATANH_OP_HPP
2 # define CPPAD_LOCAL_ATANH_OP_HPP
3 # if CPPAD_USE_CPLUSPLUS_2011
17 namespace CppAD {
namespace local {
56 Base* x = taylor + i_x * cap_order;
57 Base* z = taylor + i_z * cap_order;
58 Base* b = z - cap_order;
62 { z[0] =
atanh( x[0] );
63 b[0] = Base(1.0) - x[0] * x[0];
66 for(
size_t j = p; j <= q; j++)
68 b[j] = - Base(2.0) * x[0] * x[j];
70 for(k = 1; k < j; k++)
71 { b[j] -= x[k] * x[j-k];
72 z[j] -= Base(
double(k)) * z[k] * b[j-k];
74 z[j] /= Base(
double(j));
112 size_t num_taylor_per_var = (cap_order-1) * r + 1;
113 Base* x = taylor + i_x * num_taylor_per_var;
114 Base* z = taylor + i_z * num_taylor_per_var;
115 Base* b = z - num_taylor_per_var;
117 size_t m = (q-1) * r + 1;
118 for(
size_t ell = 0; ell < r; ell++)
119 { b[m+ell] = - Base(2.0) * x[m+ell] * x[0];
120 z[m+ell] = Base(
double(q)) * x[m+ell];
121 for(
size_t k = 1; k < q; k++)
122 { b[m+ell] -= x[(k-1)*r+1+ell] * x[(q-k-1)*r+1+ell];
123 z[m+ell] -= Base(
double(k)) * z[(k-1)*r+1+ell] * b[(q-k-1)*r+1+ell];
125 z[m+ell] /= ( Base(
double(q)) * b[0] );
144 template <
class Base>
157 Base* x = taylor + i_x * cap_order;
158 Base* z = taylor + i_z * cap_order;
159 Base* b = z - cap_order;
161 z[0] =
atanh( x[0] );
162 b[0] = Base(1.0) - x[0] * x[0];
180 template <
class Base>
197 const Base* x = taylor + i_x * cap_order;
198 Base* px = partial + i_x * nc_partial;
201 const Base* z = taylor + i_z * cap_order;
202 Base* pz = partial + i_z * nc_partial;
205 const Base* b = z - cap_order;
206 Base* pb = pz - nc_partial;
208 Base inv_b0 = Base(1.0) / b[0];
215 pz[j] =
azmul(pz[j], inv_b0);
218 pb[0] -=
azmul(pz[j], z[j]);
219 px[j] += pz[j] -
azmul(pb[j], x[0]);
220 px[0] -=
azmul(pb[j], x[j]);
223 pz[j] /= Base(
double(j));
225 for(k = 1; k < j; k++)
226 { pb[j-k] -= Base(
double(k)) *
azmul(pz[j], z[k]);
227 pz[k] -= Base(
double(k)) *
azmul(pz[j], b[j-k]);
228 px[k] -=
azmul(pb[j], x[j-k]);
232 px[0] +=
azmul(pz[0], inv_b0) - Base(2.0) *
azmul(pb[0], x[0]);
AD< Base > azmul(const AD< Base > &x, const AD< Base > &y)
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.
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_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.
std::complex< double > atanh(const std::complex< double > &x)
#define CPPAD_ASSERT_UNKNOWN(exp)
Check that exp is true, if not terminate execution.
void forward_atanh_op_dir(size_t q, size_t r, size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Multiple direction Taylor coefficient for op = AtanhOp.
void reverse_atanh_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 = AtanhOp.