Skip to content

Commit 0b4ad1c

Browse files
authored
Allow saving and loading optimizer state without probes/registrations (#582)
1 parent d60b99d commit 0b4ad1c

File tree

2 files changed

+10
-19
lines changed

2 files changed

+10
-19
lines changed

bayes_opt/bayesian_optimization.py

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -352,19 +352,7 @@ def save_state(self, path: str | PathLike[str]) -> None:
352352
----------
353353
path : str or PathLike
354354
Path to save the optimization state
355-
356-
Raises
357-
------
358-
ValueError
359-
If attempting to save state before collecting any samples.
360355
"""
361-
if len(self._space) == 0:
362-
msg = (
363-
"Cannot save optimizer state before collecting any samples. "
364-
"Please probe or register at least one point before saving."
365-
)
366-
raise ValueError(msg)
367-
368356
random_state = None
369357
if self._random_state is not None:
370358
state_tuple = self._random_state.get_state()
@@ -443,7 +431,8 @@ def load_state(self, path: str | PathLike[str]) -> None:
443431
# Set the GP parameters
444432
self.set_gp_params(**gp_params)
445433

446-
self._gp.fit(self._space.params, self._space.target)
434+
if len(self._space):
435+
self._gp.fit(self._space.params, self._space.target)
447436

448437
if state["random_state"] is not None:
449438
random_state_tuple = (

tests/test_bayesian_optimization.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -372,14 +372,16 @@ def test_save_load_unused_optimizer(tmp_path):
372372
"""Test saving and loading optimizer state with unused optimizer."""
373373
optimizer = BayesianOptimization(f=target_func, pbounds=PBOUNDS, random_state=1, verbose=0)
374374

375-
# Test that saving without samples raises an error
376-
with pytest.raises(ValueError, match="Cannot save optimizer state before collecting any samples"):
377-
optimizer.save_state(tmp_path / "optimizer_state.json")
375+
# Test that saving without samples does not raise an error
376+
optimizer.save_state(tmp_path / "unprobed_optimizer_state.json")
378377

379-
# Add a sample point
380-
optimizer.probe(params={"p1": 1, "p2": 2}, lazy=False)
378+
# Check that we load the original state
379+
first_suggestion = optimizer.suggest()
380+
optimizer.load_state(tmp_path / "unprobed_optimizer_state.json")
381+
assert optimizer.suggest() == first_suggestion
381382

382-
# Now saving should work
383+
# Save an optimizer state with a probed point
384+
optimizer.probe(params={"p1": 1, "p2": 2}, lazy=False)
383385
optimizer.save_state(tmp_path / "optimizer_state.json")
384386

385387
new_optimizer = BayesianOptimization(f=target_func, pbounds=PBOUNDS, random_state=1, verbose=0)

0 commit comments

Comments
 (0)