class BOOptimizer(object): def __init__(self, hptuning_config): self.hptuning_config = hptuning_config self.n_initial_trials = self.hptuning_config.bo.n_initial_trials self.space = SearchSpace(hptuning_config=hptuning_config) self.utility_function = UtilityFunction( config=hptuning_config.bo.utility_function, seed=hptuning_config.seed) self.n_warmup = hptuning_config.bo.utility_function.n_warmup or 5000 self.n_iter = hptuning_config.bo.utility_function.n_iter or 150 def _maximize(self): """ Find argmax of the acquisition function.""" if not self.space.is_observations_valid(): return None y_max = self.space.y.max() self.utility_function.gaussian_process.fit(self.space.x, self.space.y) return self.utility_function.max_compute(y_max=y_max, bounds=self.space.bounds, n_warmup=self.n_warmup, n_iter=self.n_iter) def add_observations(self, configs, metrics): # Turn configs and metrics into data points self.space.add_observations(configs=configs, metrics=metrics) def get_suggestion(self): x = self._maximize() return self.space.get_suggestion(x)
def test_add_observation_to_space_search(self): space1 = SearchSpace(hptuning_config=self.manager1.hptuning_config) assert space1.x == [] assert space1.y == [] configs = [ {'feature1': 1, 'feature2': 1, 'feature3': 1}, {'feature1': 2, 'feature2': 1.2, 'feature3': 2}, {'feature1': 3, 'feature2': 1.3, 'feature3': 3} ] metrics = [1, 2, 3] space1.add_observations( configs=configs, metrics=metrics ) assert len(space1.x) == 3 assert len(space1.y) == 3 for i, feature in enumerate(space1.features): if feature == 'feature1': assert np.all(space1.x[:, i] == [1, 2, 3]) elif feature == 'feature2': assert np.all(space1.x[:, i] == [1, 1.2, 1.3]) elif feature == 'feature3': assert np.all(space1.x[:, i] == [1, 2, 3]) assert np.all(space1.y == np.array([-1, -2, -3])) space2 = SearchSpace(hptuning_config=self.manager2.hptuning_config) configs = [ {'feature1': 1, 'feature2': 1, 'feature3': 1, 'feature4': 1, 'feature5': 'a'}, {'feature1': 2, 'feature2': 1.2, 'feature3': 2, 'feature4': 4, 'feature5': 'b'}, {'feature1': 3, 'feature2': 1.3, 'feature3': 3, 'feature4': 3, 'feature5': 'a'} ] metrics = [1, 2, 3] space2.add_observations( configs=configs, metrics=metrics ) assert len(space2.x) == 3 assert len(space2.y) == 3 for i, feature in enumerate(space2.features): if feature == 'feature1': assert np.all(space2.x[:, i] == [1, 2, 3]) elif feature == 'feature2': assert np.all(space2.x[:, i] == [1, 1.2, 1.3]) elif feature == 'feature3': assert np.all(space2.x[:, i] == [1, 2, 3]) elif feature == 'feature4': assert np.all(space2.x[:, i] == [1, 4, 3]) elif feature == 'feature5': assert np.all(space2.x[:, i:i + 3] == [[1, 0, 0], [0, 1, 0], [1, 0, 0]]) assert np.all(space2.y == np.array(metrics))