1 # ifndef CPPAD_LOCAL_ACOSH_OP_HPP
2 # define CPPAD_LOCAL_ACOSH_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;
63 { z[0] =
acosh( x[0] );
64 uj = x[0] * x[0] - Base(1.0);
68 for(
size_t j = p; j <= q; j++)
70 for(k = 0; k <= j; k++)
74 for(k = 1; k < j; k++)
75 { b[j] -= Base(
double(k)) * b[k] * b[j-k];
76 z[j] -= Base(
double(k)) * z[k] * b[j-k];
78 b[j] /= Base(
double(j));
79 z[j] /= Base(
double(j));
81 b[j] += uj / Base(2.0);
104 template <
class Base>
120 size_t num_taylor_per_var = (cap_order-1) * r + 1;
121 Base* x = taylor + i_x * num_taylor_per_var;
122 Base* z = taylor + i_z * num_taylor_per_var;
123 Base* b = z - num_taylor_per_var;
126 size_t m = (q-1) * r + 1;
127 for(ell = 0; ell < r; ell ++)
128 { Base uq = 2.0 * x[m + ell] * x[0];
129 for(k = 1; k < q; k++)
130 uq += x[(k-1)*r+1+ell] * x[(q-k-1)*r+1+ell];
131 b[m+ell] = Base(0.0);
132 z[m+ell] = Base(0.0);
133 for(k = 1; k < q; k++)
134 { b[m+ell] += Base(
double(k)) * b[(k-1)*r+1+ell] * b[(q-k-1)*r+1+ell];
135 z[m+ell] += Base(
double(k)) * z[(k-1)*r+1+ell] * b[(q-k-1)*r+1+ell];
137 b[m+ell] = ( uq / Base(2.0) - b[m+ell] / Base(
double(q)) ) / b[0];
138 z[m+ell] = ( x[m+ell] - z[m+ell] / Base(
double(q)) ) / b[0];
157 template <
class Base>
170 Base* x = taylor + i_x * cap_order;
171 Base* z = taylor + i_z * cap_order;
172 Base* b = z - cap_order;
174 z[0] =
acosh( x[0] );
175 b[0] =
sqrt( x[0] * x[0] - Base(1.0) );
193 template <
class Base>
210 const Base* x = taylor + i_x * cap_order;
211 Base* px = partial + i_x * nc_partial;
214 const Base* z = taylor + i_z * cap_order;
215 Base* pz = partial + i_z * nc_partial;
218 const Base* b = z - cap_order;
219 Base* pb = pz - nc_partial;
221 Base inv_b0 = Base(1.0) / b[0];
229 pb[j] =
azmul(pb[j], inv_b0);
232 pz[j] =
azmul(pz[j], inv_b0);
235 pb[0] -=
azmul(pz[j], z[j]) +
azmul(pb[j], b[j]);
238 px[0] +=
azmul(pb[j], x[j]);
241 px[j] += pz[j] +
azmul(pb[j], x[0]);
244 pz[j] /= Base(
double(j));
246 for(k = 1; k < j; k++)
248 pb[j-k] -= Base(
double(k)) *
azmul(pz[j], z[k]) +
azmul(pb[j], b[k]);
251 px[k] +=
azmul(pb[j], x[j-k]);
254 pz[k] -= Base(
double(k)) *
azmul(pz[j], b[j-k]);
260 px[0] +=
azmul(pz[0] +
azmul(pb[0], x[0]), inv_b0);
AD< Base > azmul(const AD< Base > &x, const AD< Base > &y)
void forward_acosh_op_dir(size_t q, size_t r, size_t i_z, size_t i_x, size_t cap_order, Base *taylor)
Multiple directions forward mode Taylor coefficient for op = AcoshOp.
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.
std::complex< double > acosh(const std::complex< double > &x)
AD< Base > sqrt(const AD< Base > &x)
void forward_acosh_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 = AcoshOp.
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.
#define CPPAD_ASSERT_UNKNOWN(exp)
Check that exp is true, if not terminate execution.
void reverse_acosh_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 = AcoshOp.