1 # ifndef CPPAD_LOCAL_SQRT_OP_HPP
2 # define CPPAD_LOCAL_SQRT_OP_HPP
16 namespace CppAD {
namespace local {
49 Base* x = taylor + i_x * cap_order;
50 Base* z = taylor + i_z * cap_order;
54 { z[0] =
sqrt( x[0] );
57 for(
size_t j = p; j <= q; j++)
60 for(k = 1; k < j; k++)
61 z[j] -= Base(
double(k)) * z[k] * z[j-k];
62 z[j] /= Base(
double(j));
63 z[j] += x[j] / Base(2.0);
94 size_t num_taylor_per_var = (cap_order-1) * r + 1;
95 Base* z = taylor + i_z * num_taylor_per_var;
96 Base* x = taylor + i_x * num_taylor_per_var;
98 size_t m = (q-1) * r + 1;
99 for(
size_t ell = 0; ell < r; ell++)
100 { z[m+ell] = Base(0.0);
101 for(
size_t k = 1; k < q; k++)
102 z[m+ell] -= Base(
double(k)) * z[(k-1)*r+1+ell] * z[(q-k-1)*r+1+ell];
103 z[m+ell] /= Base(
double(q));
104 z[m+ell] += x[m+ell] / Base(2.0);
119 template <
class Base>
132 Base* x = taylor + i_x * cap_order;
133 Base* z = taylor + i_z * cap_order;
148 template <
class Base>
165 Base* px = partial + i_x * nc_partial;
168 const Base* z = taylor + i_z * cap_order;
169 Base* pz = partial + i_z * nc_partial;
172 Base inv_z0 = Base(1.0) / z[0];
181 pz[j] =
azmul(pz[j], inv_z0);
183 pz[0] -=
azmul(pz[j], z[j]);
184 px[j] += pz[j] / Base(2.0);
185 for(k = 1; k < j; k++)
186 pz[k] -=
azmul(pz[j], z[j-k]);
189 px[0] +=
azmul(pz[0], inv_z0) / Base(2.0);
void forward_sqrt_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 = SqrtOp.
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.
AD< Base > sqrt(const AD< Base > &x)
#define CPPAD_ASSERT_UNKNOWN(exp)
Check that exp is true, if not terminate execution.
void reverse_sqrt_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 = SqrtOp.
void forward_sqrt_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 = SqrtOp.
void forward_sqrt_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 = SqrtOp.