Skip to content

Commit ce710a8

Browse files
authored
Merge pull request #254 from berndbischl/feat-bipop-budgets
IPOP and BIPOP: cap sub-runs by remaining max_fevals
2 parents 75ecb9e + 167fc1c commit ce710a8

File tree

2 files changed

+38
-8
lines changed

2 files changed

+38
-8
lines changed

src/bipopcmastrategy.cc

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,12 +77,23 @@ namespace libcmaes
7777
{
7878
std::array<int,2> budgets = {{0,0}}; // 0: r1, 1: r2
7979
CMASolutions best_run;
80+
const bool has_max_fevals = CMAStrategy<TCovarianceUpdate,TGenoPheno>::_parameters._max_fevals > 0;
81+
const int fevals_max = CMAStrategy<TCovarianceUpdate,TGenoPheno>::_parameters._max_fevals;
8082
for (int r=0;r<CMAStrategy<TCovarianceUpdate,TGenoPheno>::_parameters._nrestarts;r++)
8183
{
8284
while(budgets[0]>budgets[1])
8385
{
8486
r2();
85-
CMAStrategy<TCovarianceUpdate,TGenoPheno>::_parameters.set_max_fevals(0.5*budgets[0]);
87+
// cap r2 run by remaining global budget
88+
int fevals_remaining = fevals_max - CMAStrategy<TCovarianceUpdate,TGenoPheno>::_nevals;
89+
if (has_max_fevals && fevals_remaining <= 0)
90+
break;
91+
int half_0 = budgets[0]/2;
92+
int fevals_r2 = has_max_fevals ? std::min(fevals_remaining, half_0) : half_0;
93+
LOG_IF(INFO,!(CMAStrategy<TCovarianceUpdate,TGenoPheno>::_parameters._quiet)) << "Running BIPOP R2 phase => r2_max_fevals=" << fevals_r2 <<
94+
" budgets[0]=" << budgets[0] << " budgets[1]=" << budgets[1] <<
95+
" fevals_remaining=" << fevals_remaining << " / " << fevals_max << std::endl;
96+
CMAStrategy<TCovarianceUpdate,TGenoPheno>::_parameters.set_max_fevals(fevals_r2);
8697
IPOPCMAStrategy<TCovarianceUpdate,TGenoPheno>::reset_search_state();
8798
CMAStrategy<TCovarianceUpdate,TGenoPheno>::optimize(evalf,askf,tellf);
8899
budgets[1] += CMAStrategy<TCovarianceUpdate,TGenoPheno>::_solutions._niter * CMAStrategy<TCovarianceUpdate,TGenoPheno>::_parameters._lambda;
@@ -93,11 +104,21 @@ namespace libcmaes
93104
r1();
94105
IPOPCMAStrategy<TCovarianceUpdate,TGenoPheno>::reset_search_state();
95106
}
96-
CMAStrategy<TCovarianceUpdate,TGenoPheno>::_parameters.set_max_fevals(_max_fevals); // resets the budget
107+
// cap r1 run by remaining global budget
108+
int fevals_remaining = fevals_max - CMAStrategy<TCovarianceUpdate,TGenoPheno>::_nevals;
109+
if (has_max_fevals && fevals_remaining <= 0)
110+
break;
111+
int fevals_r1 = has_max_fevals ? fevals_remaining : _max_fevals;
112+
LOG_IF(INFO,!(CMAStrategy<TCovarianceUpdate,TGenoPheno>::_parameters._quiet)) << "Running BIPOP R1 phase => r1_max_fevals=" << fevals_r1 <<
113+
" budgets[0]=" << budgets[0] << " budgets[1]=" << budgets[1] <<
114+
" fevals_remaining=" << fevals_remaining << " / " << fevals_max << std::endl;
115+
CMAStrategy<TCovarianceUpdate,TGenoPheno>::_parameters.set_max_fevals(fevals_r1);
97116
CMAStrategy<TCovarianceUpdate,TGenoPheno>::optimize(evalf,askf,tellf);
98117
budgets[0] += CMAStrategy<TCovarianceUpdate,TGenoPheno>::_solutions._niter * CMAStrategy<TCovarianceUpdate,TGenoPheno>::_parameters._lambda;
99118
IPOPCMAStrategy<TCovarianceUpdate,TGenoPheno>::capture_best_solution(best_run);
100119
}
120+
LOG_IF(INFO,!(CMAStrategy<TCovarianceUpdate,TGenoPheno>::_parameters._quiet)) << "BIPOP restarts ended on max fevals="
121+
<< CMAStrategy<TCovarianceUpdate,TGenoPheno>::_nevals << ">=" << fevals_max << std::endl;
101122
CMAStrategy<TCovarianceUpdate,TGenoPheno>::_solutions = best_run;
102123
if (CMAStrategy<TCovarianceUpdate,TGenoPheno>::_solutions._run_status >= 0)
103124
return OPTI_SUCCESS;

src/ipopcmastrategy.cc

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,25 +58,34 @@ namespace libcmaes
5858
const TellFunc &tellf)
5959
{
6060
CMASolutions best_run;
61+
bool has_max_fevals = CMAStrategy<TCovarianceUpdate,TGenoPheno>::_parameters._max_fevals > 0;
62+
int fevals_max = CMAStrategy<TCovarianceUpdate,TGenoPheno>::_parameters._max_fevals;
6163
for (int r=0;r<CMAStrategy<TCovarianceUpdate,TGenoPheno>::_parameters._nrestarts;r++)
6264
{
65+
6366
LOG_IF(INFO,!(CMAStrategy<TCovarianceUpdate,TGenoPheno>::_parameters._quiet)) << "r: " << r << " / lambda=" << CMAStrategy<TCovarianceUpdate,TGenoPheno>::_parameters._lambda << std::endl;
6467
CMAStrategy<TCovarianceUpdate,TGenoPheno>::optimize(evalf,askf,tellf);
65-
68+
6669
// capture best solution.
6770
capture_best_solution(best_run);
68-
71+
6972
// reset parameters and solutions.
7073
lambda_inc();
7174
reset_search_state();
72-
75+
76+
// Update remaining budget
77+
int fevals_global = CMAStrategy<TCovarianceUpdate,TGenoPheno>::_nevals;
78+
int fevals_remaining = fevals_max - fevals_global;
79+
7380
// do not restart if max budget function calls is reached.
74-
if (CMAStrategy<TCovarianceUpdate,TGenoPheno>::_parameters._max_fevals > 0
75-
&& CMAStrategy<TCovarianceUpdate,TGenoPheno>::_nevals >= CMAStrategy<TCovarianceUpdate,TGenoPheno>::_parameters._max_fevals)
81+
if (has_max_fevals && fevals_remaining <= 0)
7682
{
77-
LOG_IF(INFO,!(CMAStrategy<TCovarianceUpdate,TGenoPheno>::_parameters._quiet)) << "IPOP restarts ended on max fevals=" << CMAStrategy<TCovarianceUpdate,TGenoPheno>::_nevals << ">=" << CMAStrategy<TCovarianceUpdate,TGenoPheno>::_parameters._max_fevals << std::endl;
83+
LOG_IF(INFO,!(CMAStrategy<TCovarianceUpdate,TGenoPheno>::_parameters._quiet)) << "IPOP restarts ended on max fevals=" << fevals_global << ">=" << fevals_max << std::endl;
7884
break;
7985
}
86+
LOG_IF(INFO,!(CMAStrategy<TCovarianceUpdate,TGenoPheno>::_parameters._quiet)) << "IPOP per-run budget set to remaining=" << fevals_remaining << std::endl;
87+
CMAStrategy<TCovarianceUpdate,TGenoPheno>::_parameters.set_max_fevals(fevals_remaining);
88+
8089
}
8190
CMAStrategy<TCovarianceUpdate,TGenoPheno>::_solutions = best_run;
8291
if (CMAStrategy<TCovarianceUpdate,TGenoPheno>::_solutions._run_status >= 0)

0 commit comments

Comments
 (0)