From 13095cf2d91413781ec424b39edbf2d7036662b0 Mon Sep 17 00:00:00 2001 From: till-m Date: Sat, 17 May 2025 18:18:51 +0200 Subject: [PATCH] Fix acq min bug --- bayes_opt/acquisition.py | 2 +- bayes_opt/bayesian_optimization.py | 16 ++++++++-------- tests/test_acquisition.py | 5 ++++- tests/test_bayesian_optimization.py | 2 +- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/bayes_opt/acquisition.py b/bayes_opt/acquisition.py index c29b117f8..f8dfef1c7 100644 --- a/bayes_opt/acquisition.py +++ b/bayes_opt/acquisition.py @@ -362,7 +362,7 @@ def _smart_minimize( continue # Store it if better than previous minimum(maximum). - if min_acq is None or np.squeeze(res.fun) >= min_acq: + if min_acq is None or np.squeeze(res.fun) < min_acq: x_try = res.x x_min = x_try min_acq = np.squeeze(res.fun) diff --git a/bayes_opt/bayesian_optimization.py b/bayes_opt/bayesian_optimization.py index fa5773c95..2cad5b8f9 100644 --- a/bayes_opt/bayesian_optimization.py +++ b/bayes_opt/bayesian_optimization.py @@ -422,14 +422,14 @@ def load_state(self, path: str | PathLike[str]) -> None: self._space.set_bounds(new_bounds) self._bounds_transformer.initialize(self._space) - self._gp.set_params(**state["gp_params"]) - if isinstance(self._gp.kernel, dict): - kernel_params = self._gp.kernel - self._gp.kernel = Matern( - length_scale=kernel_params["length_scale"], - length_scale_bounds=tuple(kernel_params["length_scale_bounds"]), - nu=kernel_params["nu"], - ) + # Construct the GP kernel + kernel = Matern(**state["gp_params"]["kernel"]) + # Re-construct the GP parameters + gp_params = {k: v for k, v in state["gp_params"].items() if k != "kernel"} + gp_params["kernel"] = kernel + + # Set the GP parameters + self.set_gp_params(**gp_params) self._gp.fit(self._space.params, self._space.target) diff --git a/tests/test_acquisition.py b/tests/test_acquisition.py index 0e46aba2f..5ecd04fbc 100644 --- a/tests/test_acquisition.py +++ b/tests/test_acquisition.py @@ -407,7 +407,10 @@ def verify_optimizers_match(optimizer1, optimizer2): rng = np.random.default_rng() assert rng.bit_generator.state["state"]["state"] == rng.bit_generator.state["state"]["state"] - assert optimizer1._gp.kernel.get_params() == optimizer2._gp.kernel.get_params() + kernel_params1 = optimizer1._gp.kernel.get_params() + kernel_params2 = optimizer2._gp.kernel.get_params() + for k in kernel_params1: + assert (np.array(kernel_params1[k]) == np.array(kernel_params2[k])).all() suggestion1 = optimizer1.suggest() suggestion2 = optimizer2.suggest() diff --git a/tests/test_bayesian_optimization.py b/tests/test_bayesian_optimization.py index 343ee0dc4..158b7478e 100644 --- a/tests/test_bayesian_optimization.py +++ b/tests/test_bayesian_optimization.py @@ -582,4 +582,4 @@ def area_of_triangle(sides): for _ in range(5): suggestion1 = optimizer.suggest() suggestion2 = new_optimizer.suggest() - np.testing.assert_array_almost_equal(suggestion1["sides"], suggestion2["sides"], decimal=10) + np.testing.assert_array_almost_equal(suggestion1["sides"], suggestion2["sides"], decimal=7)