1 # ifndef CPPAD_LOCAL_TANH_OP_HPP
2 # define CPPAD_LOCAL_TANH_OP_HPP
16 namespace CppAD {
namespace local {
55 Base* x = taylor + i_x * cap_order;
56 Base* z = taylor + i_z * cap_order;
57 Base* y = z - cap_order;
61 { z[0] =
tanh( x[0] );
65 for(
size_t j = p; j <= q; j++)
66 { Base base_j =
static_cast<Base
>(double(j));
69 for(k = 1; k <= j; k++)
70 z[j] -= Base(
double(k)) * x[k] * y[j-k] / base_j;
73 for(k = 1; k <= j; k++)
74 y[j] += z[k] * z[j-k];
110 size_t num_taylor_per_var = (cap_order-1) * r + 1;
111 Base* x = taylor + i_x * num_taylor_per_var;
112 Base* z = taylor + i_z * num_taylor_per_var;
113 Base* y = z - num_taylor_per_var;
116 size_t m = (q-1) * r + 1;
117 for(
size_t ell = 0; ell < r; ell++)
118 { z[m+ell] = Base(
double(q)) * ( x[m+ell] - x[m+ell] * y[0] );
119 for(k = 1; k < q; k++)
120 z[m+ell] -= Base(
double(k)) * x[(k-1)*r+1+ell] * y[(q-k-1)*r+1+ell];
121 z[m+ell] /= Base(
double(q));
123 y[m+ell] = Base(2.0) * z[m+ell] * z[0];
124 for(k = 1; k < q; k++)
125 y[m+ell] += z[(k-1)*r+1+ell] * z[(q-k-1)*r+1+ell];
144 template <
class Base>
157 Base* x = taylor + i_x * cap_order;
158 Base* z = taylor + i_z * cap_order;
159 Base* y = z - cap_order;
181 template <
class Base>
198 const Base* x = taylor + i_x * cap_order;
199 Base* px = partial + i_x * nc_partial;
202 const Base* z = taylor + i_z * cap_order;
203 Base* pz = partial + i_z * nc_partial;
206 const Base* y = z - cap_order;
207 Base* py = pz - nc_partial;
216 pz[j] /= Base(
double(j));
217 for(k = 1; k <= j; k++)
218 { px[k] -=
azmul(pz[j], y[j-k]) * Base(
double(k));
219 py[j-k] -=
azmul(pz[j], x[k]) * Base(
double(k));
221 for(k = 0; k < j; k++)
222 pz[k] +=
azmul(py[j-1], z[j-k-1]) * base_two;
226 px[0] +=
azmul(pz[0], Base(1.0) - y[0]);
AD< Base > azmul(const AD< Base > &x, const AD< Base > &y)
size_t NumArg(OpCode op)
Number of arguments for a specified operator.
void forward_tanh_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 = TanOp.
size_t NumRes(OpCode op)
Number of variables resulting from the specified operation.
void reverse_tanh_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 = TanOp.
void forward_tanh_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 = TanOp.
AD< Base > tanh(const AD< Base > &x)
#define CPPAD_ASSERT_UNKNOWN(exp)
Check that exp is true, if not terminate execution.
void forward_tanh_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 = TanOp.