double run_nlopt(nlopt::algorithm algo, eval_func fpointer, vectord& Xnext, int maxf, const std::vector<double>& vd, const std::vector<double>& vu, void* objPointer) { double fmin = 0.0; size_t n = Xnext.size(); nlopt::opt opt (algo,n); std::vector<double> xstd(n); opt.set_lower_bounds(vd); opt.set_upper_bounds(vu); opt.set_min_objective(fpointer, objPointer); opt.set_maxeval(maxf); // It seems BOBYQA can be unstable if the same point is repeated // tested over and over. NLOPT bug? opt.set_ftol_rel(1e-12); opt.set_ftol_abs(1e-12); std::copy(Xnext.begin(),Xnext.end(),xstd.begin()); try { opt.optimize(xstd, fmin); } catch (nlopt::roundoff_limited& e) { FILE_LOG(logDEBUG) << "NLOPT Warning: Potential roundoff error. " << "In general, this can be ignored."; } std::copy(xstd.begin(),xstd.end(),Xnext.begin()); return fmin; }
void setHyperParameters(const vectord &theta) { if(theta.size() != n_params) { throw std::invalid_argument("Wrong number of kernel hyperparameters"); } params = theta; //TODO: To make enough space. Make it more efficient. std::transform(theta.begin(), theta.end(), params.begin(), (double (*)(double)) exp); };
inline void NLOPT_Optimization::setLimits(const vectord& down, const vectord& up) { std::copy(down.begin(),down.end(),mDown.begin()); std::copy(up.begin(),up.end(),mUp.begin()); }