CPPAD_INLINE_FRIEND_TEMPLATE_FUNCTION bool abs_geq(const AD<Base>& x, const AD<Base>& y) { return abs_geq(x.value_, y.value_); }
void ADFun<Base>::optimize(void) { // place to store the optimized version of the recording recorder<Base> rec; // number of independent variables size_t n = ind_taddr_.size(); # ifndef NDEBUG size_t i, j, m = dep_taddr_.size(); CppAD::vector<Base> x(n), y(m), check(m); bool check_zero_order = taylor_per_var_ > 0; Base max_taylor(0); if( check_zero_order ) { // zero order coefficients for independent vars for(j = 0; j < n; j++) { CPPAD_ASSERT_UNKNOWN( play_.GetOp(j+1) == InvOp ); CPPAD_ASSERT_UNKNOWN( ind_taddr_[j] == j+1 ); x[j] = taylor_[ ind_taddr_[j] * taylor_col_dim_ + 0]; } // zero order coefficients for dependent vars for(i = 0; i < m; i++) { CPPAD_ASSERT_UNKNOWN( dep_taddr_[i] < total_num_var_ ); y[i] = taylor_[ dep_taddr_[i] * taylor_col_dim_ + 0]; } // maximum zero order coefficient not counting BeginOp at beginning // (which is correpsonds to uninitialized memory). for(i = 1; i < total_num_var_; i++) { if( abs_geq(taylor_[i*taylor_col_dim_+0] , max_taylor) ) max_taylor = taylor_[i*taylor_col_dim_+0]; } } # endif // create the optimized recording CppAD::optimize<Base>(n, dep_taddr_, &play_, &rec); // number of variables in the recording total_num_var_ = rec.num_rec_var(); // now replace the recording play_.get(rec); // free memory allocated for sparse Jacobian calculation // (the results are no longer valid) for_jac_sparse_pack_.resize(0, 0); for_jac_sparse_set_.resize(0,0); // free old Taylor coefficient memory taylor_.free(); taylor_per_var_ = 0; taylor_col_dim_ = 0; # ifndef NDEBUG if( check_zero_order ) { // zero order forward calculation using new operation sequence check = Forward(0, x); // check results Base eps = 10. * epsilon<Base>(); for(i = 0; i < m; i++) CPPAD_ASSERT_KNOWN( abs_geq( eps * max_taylor , check[i] - y[i] ) , "Error during check of f.optimize()." ); // Erase memory that this calculation was done so NDEBUG gives // same final state for this object (from users perspective) taylor_per_var_ = 0; } # endif }