in nevergrad/optimization/optimizerlib.py [0:0]
def _internal_ask_candidate(self) -> p.Parameter:
# optimizer selection if budget is over
if self._warmup_budget is not None:
if self._selected_ind is None and self._warmup_budget < self.num_tell:
ind = self.current_bests["pessimistic"].parameter._meta.get("optim_index", -1)
if ind >= 0: # not a tell not asked
if self.num_workers == 1 or self.optims[ind].num_workers > 1:
self._selected_ind = ind # don't select non-parallelizable in parallel settings
optim_index = self._selected_ind
if optim_index is None:
num = len(self.optims)
for k in range(2 * num):
self._current += 1
optim_index = self._current % len(self.optims)
opt = self.optims[optim_index]
if opt.num_workers > opt.num_ask - (opt.num_tell - opt.num_tell_not_asked):
break # if there are workers left, use this optimizer
if k > num:
if not opt.no_parallelization:
break # if no worker is available, try the first parallelizable optimizer
if optim_index is None:
raise RuntimeError("Something went wrong in optimizer selection")
opt = self.optims[optim_index]
candidate = opt.ask()
candidate._meta["optim_index"] = optim_index
return candidate