def next_candidates()

in syne_tune/optimizer/schedulers/searchers/bayesopt/tuning_algorithms/bo_algorithm.py [0:0]


    def next_candidates(self) -> List[Configuration]:
        if self.greedy_batch_selection:
            # Select batch greedily, one candidate at a time, updating the
            # model in between
            num_outer_iterations = self.num_requested_candidates
            num_inner_candidates = 1
        else:
            # Select batch in one go
            num_outer_iterations = 1
            num_inner_candidates = self.num_requested_candidates
        next_trial_id = None
        if num_outer_iterations > 1:
            assert self.pending_candidate_state_transformer, \
                "Need pending_candidate_state_transformer for greedy batch selection"
            # For greedy batch selection, we need to assign new trial_id's to
            # configs included into the batch, in order to update the state
            # maintained in `pending_candidate_state_transformer`.
            # This is just to make batch suggestion work: neither the state
            # nor these trial_id's are used in the future.
            # Note: This code also works if trial_id's are arbitrary strings.
            # It guarantees that `str(next_trial_id + i)` is not equal to an
            # existing trial_id for all i >= 0.
            next_trial_id = 0
            for trial_id in self.pending_candidate_state_transformer.state.config_for_trial.keys():
                try:
                    next_trial_id = max(next_trial_id, int(trial_id))
                except ValueError:
                    pass
            next_trial_id += 1
        candidates = []
        just_added = True
        model = None  # SurrogateModel, if num_outer_iterations > 1
        for outer_iter in range(num_outer_iterations):
            if just_added:
                if self.exclusion_candidates.config_space_exhausted():
                    logger.warning(
                        "All entries of finite config space (size " +
                        f"{self.exclusion_candidates.configspace_size}) have been selected. Returning " +
                        f"{len(candidates)} configs instead of {self.num_requested_candidates}")
                    break
                just_added = False
            if self.num_initial_candidates_for_batch is not None \
                    and self.greedy_batch_selection and outer_iter > 0:
                num_initial_candidates = self.num_initial_candidates_for_batch
            else:
                num_initial_candidates = self.num_initial_candidates
            inner_candidates = self._get_next_candidates(
                num_inner_candidates, model=model,
                num_initial_candidates=num_initial_candidates)
            candidates.extend(inner_candidates)
            if outer_iter < num_outer_iterations - 1 and len(inner_candidates) > 0:
                just_added = True
                # This is not the last outer iteration
                for cand in inner_candidates:
                    self.exclusion_candidates.add(cand)
                # State transformer is used to produce new model
                # Note: We suppress fit_hyperpars for models obtained during
                # batch selection
                for candidate in inner_candidates:
                    self.pending_candidate_state_transformer.append_trial(
                        trial_id=str(next_trial_id), config=candidate)
                    next_trial_id += 1
                model = self.pending_candidate_state_transformer.model(
                    skip_optimization=True)
            if len(inner_candidates) < num_inner_candidates and \
                    len(candidates) < self.num_requested_candidates:
                logger.warning(
                    "All entries of finite config space (size " +
                    f"{self.exclusion_candidates.configspace_size}) have been selected. Returning " +
                    f"{len(candidates)} configs instead of {self.num_requested_candidates}")
                break

        return candidates