58 while(myEval < batch.n_cols) {
59 vec x = batch.col(myEval);
60 funVals[myEval] = mData->eval(x);
75 DDS(std::shared_ptr<Problem>& data, std::shared_ptr<ExpDesign>& expDes,
int maxEvals) {
76 mData = std::shared_ptr<Problem>(data);
77 mExpDes = std::shared_ptr<ExpDesign>(expDes);
80 mInitPoints = expDes->numPoints();
82 mxLow = data->lBounds();
83 mxUp = data->uBounds();
86 if(mMaxEvals < mInitPoints) {
87 throw std::logic_error(
"Experimental design larger than evaluation budget");
97 DDS(std::shared_ptr<Problem>& data, std::shared_ptr<ExpDesign>& expDes,
int maxEvals,
int numThreads)
98 :
DDS(data, expDes, maxEvals) {
99 mNumThreads = numThreads;
107 std::vector<std::thread> threads(mNumThreads);
108 Result res(mMaxEvals, mDim);
113 vec initFunVal = arma::zeros(mInitPoints);
115 if(mNumThreads > 1) {
119 std::ref(initDes), std::ref(initFunVal));
128 vec x = initDes.col(i);
129 initFunVal(i) = mData->eval(x);
136 while (mNumEvals < mMaxEvals) {
139 double ddsProb = 1 - std::log((
double)mNumEvals - mInitPoints)/
140 std::log((
double)mMaxEvals - mInitPoints);
141 ddsProb = fmax(ddsProb, 1.0/mDim);
144 mat batch = arma::zeros<mat>(
mDim, newEvals);
145 vec batchVals = arma::zeros(newEvals);
147 for(
int i=0; i < newEvals; i++) {
150 for(
int j=0; j <
mDim; j++) {
151 if(
rand() < ddsProb) {
153 cand(j) += sigma(j) *
randn();
154 if(cand(j) >
mxUp(j)) {
155 cand(j) = fmax(2*
mxUp(j) - cand(j),
mxLow(j));
157 else if(cand(j) <
mxLow(j)) {
158 cand(j) = fmin(2*
mxLow(j) - cand(j),
mxUp(j));
164 int ind =
randi(mDim-1);
165 cand(ind) += sigma(ind) *
randn();
166 if(cand(ind) >
mxUp(ind)) {
167 cand(ind) = fmax(2*
mxUp(ind) - cand(ind),
mxLow(ind));
169 else if(cand(ind) <
mxLow(ind)) {
170 cand(ind) = fmin(2*
mxLow(ind) - cand(ind),
mxUp(ind));
179 for(
int i=0; i < newEvals; i++) {
181 std::ref(batch), std::ref(batchVals));
184 for(
int i=0; i < newEvals; i++) {
189 batchVals(0) = mData->eval((
vec)batch);
193 mNumEvals += newEvals;
Optimization result class.
Definition: utils.h:138
void evalBatch(const mat &batch, vec &funVals)
Evalaute a batch of points in parallel.
Definition: dds.h:52
int mNumThreads
Definition: dds.h:43
Result run()
Runs the optimization algorithm.
Definition: dds.h:106
arma::vec vec
Default (column) vector class.
Definition: common.h:17
vec xBest() const
Method for getting the best solution found so far.
Definition: utils.h:204
void addEvals(const mat &X, const vec &funVals)
Method for adding a finished evaluations.
Definition: utils.h:245
int mNumEvals
Definition: dds.h:37
DDS(std::shared_ptr< Problem > &data, std::shared_ptr< ExpDesign > &expDes, int maxEvals, int numThreads)
Constructor.
Definition: dds.h:97
The Dynamically Dimensioned Search optimization algorithm.
Definition: dds.h:32
int mInitPoints
Definition: dds.h:38
double rand()
Generate a U[0,1] realization.
Definition: utils.h:386
int mMaxEvals
Definition: dds.h:36
double randi(int i)
Generate a random integer.
Definition: utils.h:364
std::shared_ptr< Problem > mData
Definition: dds.h:34
vec mxLow
Definition: dds.h:40
std::shared_ptr< ExpDesign > mExpDes
Definition: dds.h:35
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
double randn()
Generate a N(0,1) realization.
Definition: utils.h:375
SOT namespace.
Definition: sot.h:27
std::mutex mMutex
Definition: dds.h:45
vec mxUp
Definition: dds.h:41
arma::mat mat
Default matrix class.
Definition: common.h:16
DDS(std::shared_ptr< Problem > &data, std::shared_ptr< ExpDesign > &expDes, int maxEvals)
Constructor.
Definition: dds.h:75
std::string mName
Definition: dds.h:42
int mEvalCount
Definition: dds.h:44
int mDim
Definition: dds.h:39