inline void reverse_tan_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 ) { // check assumptions CPPAD_ASSERT_UNKNOWN( NumArg(TanOp) == 1 ); CPPAD_ASSERT_UNKNOWN( NumRes(TanOp) == 2 ); CPPAD_ASSERT_UNKNOWN( d < cap_order ); CPPAD_ASSERT_UNKNOWN( d < nc_partial ); // Taylor coefficients and partials corresponding to argument const Base* x = taylor + i_x * cap_order; Base* px = partial + i_x * nc_partial; // Taylor coefficients and partials corresponding to first result const Base* z = taylor + i_z * cap_order; // called z in doc Base* pz = partial + i_z * nc_partial; // Taylor coefficients and partials corresponding to auxillary result const Base* y = z - cap_order; // called y in documentation Base* py = pz - nc_partial; // If pz is zero, make sure this operation has no effect // (zero times infinity or nan would be non-zero). bool skip(true); for(size_t i_d = 0; i_d <= d; i_d++) skip &= IdenticalZero(pz[i_d]); if( skip ) return; size_t j = d; size_t k; Base base_two(2); while(j) { px[j] += pz[j]; pz[j] /= Base(j); for(k = 1; k <= j; k++) { px[k] += pz[j] * y[j-k] * Base(k); py[j-k] += pz[j] * x[k] * Base(k); } for(k = 0; k < j; k++) pz[k] += py[j-1] * z[j-k-1] * base_two; --j; } px[0] += pz[0] * (Base(1) + y[0]); }
inline void reverse_tanh_op( size_t d , size_t i_z , size_t i_x , size_t nc_taylor , const Base* taylor , size_t nc_partial , Base* partial ) { // check assumptions CPPAD_ASSERT_UNKNOWN( NumArg(TanOp) == 1 ); CPPAD_ASSERT_UNKNOWN( NumRes(TanOp) == 2 ); CPPAD_ASSERT_UNKNOWN( i_x + 1 < i_z ); CPPAD_ASSERT_UNKNOWN( d < nc_taylor ); CPPAD_ASSERT_UNKNOWN( d < nc_partial ); // Taylor coefficients and partials corresponding to argument const Base* x = taylor + i_x * nc_taylor; Base* px = partial + i_x * nc_partial; // Taylor coefficients and partials corresponding to first result const Base* z = taylor + i_z * nc_taylor; // called z in doc Base* pz = partial + i_z * nc_partial; // Taylor coefficients and partials corresponding to auxillary result const Base* y = z - nc_taylor; // called y in documentation Base* py = pz - nc_partial; size_t j = d; size_t k; Base base_two(2); while(j) { px[j] += pz[j]; pz[j] /= Base(j); for(k = 1; k <= j; k++) { px[k] -= pz[j] * y[j-k] * Base(k); py[j-k] -= pz[j] * x[k] * Base(k); } for(k = 0; k < j; k++) pz[k] += py[j-1] * z[j-k-1] * base_two; --j; } px[0] += pz[0] * (Base(1) - y[0]); }