@@ -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;
0 commit comments