8 #ifndef SOT_OPTIMIZER_H 9 #define SOT_OPTIMIZER_H 38 std::shared_ptr<Surrogate>
mSurf;
50 std::string
mName =
"Surrogate Optimizer";
66 while(myEval < batch.n_cols) {
67 vec x = batch.col(myEval);
68 funVals[myEval] = mData->eval(x);
87 Optimizer(std::shared_ptr<Problem>& data, std::shared_ptr<ExpDesign>& expDes,
88 std::shared_ptr<Surrogate>& surf, std::shared_ptr<Sampling>& sampling,
90 mData = std::shared_ptr<Problem>(data);
91 mExpDes = std::shared_ptr<ExpDesign>(expDes);
92 mSurf = std::shared_ptr<Surrogate>(surf);
93 mSampling = std::shared_ptr<Sampling>(sampling);
96 mInitPoints = mExpDes->numPoints();
98 mxLow = data->lBounds();
99 mxUp = data->uBounds();
100 mFailTol = data->dim();
103 if(mMaxEvals < mInitPoints) {
104 throw std::logic_error(
"Experimental design larger than evaluation budget");
118 Optimizer(std::shared_ptr<Problem>& data, std::shared_ptr<ExpDesign>& expDes,
119 std::shared_ptr<Surrogate>& surf, std::shared_ptr<Sampling>& sampling,
120 int maxEvals,
int numThreads) :
Optimizer(data, expDes, surf, sampling, maxEvals)
122 mNumThreads = numThreads;
130 std::vector<std::thread> threads(mNumThreads);
131 Result res(mMaxEvals, mDim);
134 double fBestLoc = std::numeric_limits<double>::max();
143 vec initFunVal = arma::zeros(mInitPoints);
147 if(mNumThreads > 1) {
151 std::ref(initDes), std::ref(initFunVal));
160 vec x = initDes.col(i);
161 initFunVal(i) = mData->eval(x);
168 int iEnd = std::min<int>(mNumEvals + mInitPoints - 1, mMaxEvals - 1);
169 for(
int i=mNumEvals; i <= iEnd ; i++) {
170 vec x = initDes.col(i - iStart);
171 double fx = initFunVal[i - iStart];
181 mSurf->addPoints(res.
X().cols(iStart, iEnd), res.
fX().rows(iStart, iEnd));
184 while (mNumEvals < mMaxEvals) {
189 mat X = res.
X().cols(iStart, mNumEvals - 1);
191 mat batch = mSampling->makePoints(xBestLoc, X, sigma*(mxUp - mxLow), newEvals);
192 vec batchVals = arma::zeros(newEvals);
196 for(
int i=0; i < newEvals; i++) {
198 std::ref(batch), std::ref(batchVals));
201 for(
int i=0; i < newEvals; i++) {
206 batchVals(0) = mData->eval((
vec)batch);
210 mNumEvals += newEvals;
216 for(
int i=0; i < newEvals; i++) {
217 vec newx = batch.col(i);
218 double fVal = batchVals(i);
220 if(fVal < fBestLoc) {
221 if(fVal < fBestLoc - 1e-3 * fabs(fBestLoc)) {
238 if(fail == mFailTol) {
242 int budget = mMaxEvals - mNumEvals - 1;
245 if (sigma < mSigmaMin and budget > mInitPoints) {
246 fBestLoc = std::numeric_limits<double>::max();
248 mSampling->reset(mMaxEvals - mNumEvals - mInitPoints);
252 if(succ == mSuccTol) {
255 sigma = fmin(sigma * 2.0, mSigmaMax);
260 if (batch.n_cols > 1) {
261 mSurf->addPoints(batch, batchVals);
264 mSurf->addPoint((
vec)batch, batchVals(0));
Optimization result class.
Definition: utils.h:138
vec fX() const
Method for getting the values of the finished evaluations.
Definition: utils.h:182
Optimizer(std::shared_ptr< Problem > &data, std::shared_ptr< ExpDesign > &expDes, std::shared_ptr< Surrogate > &surf, std::shared_ptr< Sampling > &sampling, int maxEvals)
Constructor.
Definition: optimizer.h:87
const double mSigmaMax
Definition: optimizer.h:40
std::shared_ptr< Surrogate > mSurf
Definition: optimizer.h:38
vec mxLow
Definition: optimizer.h:48
int mEvalCount
Definition: optimizer.h:52
arma::vec vec
Default (column) vector class.
Definition: common.h:17
void addEvals(const mat &X, const vec &funVals)
Method for adding a finished evaluations.
Definition: utils.h:245
std::string mName
Definition: optimizer.h:50
Optimizer(std::shared_ptr< Problem > &data, std::shared_ptr< ExpDesign > &expDes, std::shared_ptr< Surrogate > &surf, std::shared_ptr< Sampling > &sampling, int maxEvals, int numThreads)
Constructor.
Definition: optimizer.h:118
The surrogate optimization algorithm.
Definition: optimizer.h:34
int mDim
Definition: optimizer.h:47
int mFailTol
Definition: optimizer.h:43
std::shared_ptr< ExpDesign > mExpDes
Definition: optimizer.h:37
std::shared_ptr< Problem > mData
Definition: optimizer.h:36
int mInitPoints
Definition: optimizer.h:46
const double mSigmaMin
Definition: optimizer.h:41
vec fromUnitBox(const vec &x, const vec &xLow, const vec &xUp)
Map one point from the unit box to another hypercube.
Definition: utils.h:94
int mNumEvals
Definition: optimizer.h:45
mat X() const
Method for getting the evaluated points.
Definition: utils.h:193
Result run()
Runs the optimization algorithm.
Definition: optimizer.h:129
int mSuccTol
Definition: optimizer.h:42
SOT namespace.
Definition: sot.h:27
vec mxUp
Definition: optimizer.h:49
arma::mat mat
Default matrix class.
Definition: common.h:16
void evalBatch(const mat &batch, vec &funVals)
Evalaute a batch of points in parallel.
Definition: optimizer.h:60
std::shared_ptr< Sampling > mSampling
Definition: optimizer.h:39
std::mutex mMutex
Definition: optimizer.h:53
int mMaxEvals
Definition: optimizer.h:44
int mNumThreads
Definition: optimizer.h:51