Skip to content

Commit 8acacf2

Browse files
committed
Raise specific Error type when duplicate point is registered, make log loading idempotent
1 parent 61e8fef commit 8acacf2

File tree

4 files changed

+21
-12
lines changed

4 files changed

+21
-12
lines changed

bayes_opt/target_space.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import numpy as np
2-
from .util import ensure_rng
3-
from .constraint import ConstraintModel
2+
from .util import ensure_rng, NotUniqueError
43

54

65
def _hashable(x):
@@ -177,7 +176,7 @@ def register(self, params, target, constraint_value=None):
177176
"""
178177
x = self._as_array(params)
179178
if x in self:
180-
raise KeyError('Data point {} is not unique'.format(x))
179+
raise NotUniqueError('Data point {} is not unique'.format(x))
181180

182181

183182
self._params = np.concatenate([self._params, x.reshape(1, -1)])

bayes_opt/util.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,11 @@ def _poi(x, gp, y_max, xi):
158158
return norm.cdf(z)
159159

160160

161+
class NotUniqueError(Exception):
162+
"""A point is non-unique."""
163+
pass
164+
165+
161166
def load_logs(optimizer, logs):
162167
"""Load previous ...
163168
@@ -176,11 +181,14 @@ def load_logs(optimizer, logs):
176181
break
177182

178183
iteration = json.loads(iteration)
179-
optimizer.register(
180-
params=iteration["params"],
181-
target=iteration["target"],
182-
constraint_value=iteration["constraint"] if optimizer.is_constrained else None
183-
)
184+
try:
185+
optimizer.register(
186+
params=iteration["params"],
187+
target=iteration["target"],
188+
constraint_value=iteration["constraint"] if optimizer.is_constrained else None
189+
)
190+
except NotUniqueError:
191+
continue
184192

185193
return optimizer
186194

tests/test_bayesian_optimization.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from bayes_opt import BayesianOptimization
55
from bayes_opt.logger import ScreenLogger
66
from bayes_opt.event import Events, DEFAULT_EVENTS
7+
from bayes_opt.util import NotUniqueError
78

89

910
def target_func(**kwargs):
@@ -26,9 +27,9 @@ def test_register():
2627
assert len(optimizer.res) == 2
2728
assert len(optimizer.space) == 2
2829

29-
with pytest.raises(KeyError):
30+
with pytest.raises(NotUniqueError):
3031
optimizer.register(params={"p1": 1, "p2": 2}, target=3)
31-
with pytest.raises(KeyError):
32+
with pytest.raises(NotUniqueError):
3233
optimizer.register(params={"p1": 5, "p2": 4}, target=9)
3334

3435

tests/test_target_space.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import pytest
22
import numpy as np
33
from bayes_opt.target_space import TargetSpace
4+
from bayes_opt.util import NotUniqueError
45

56

67
def target_func(**kwargs):
@@ -87,9 +88,9 @@ def test_register():
8788
assert all(space.params[1] == np.array([5, 4]))
8889
assert all(space.target == np.array([3, 9]))
8990

90-
with pytest.raises(KeyError):
91+
with pytest.raises(NotUniqueError):
9192
space.register(params={"p1": 1, "p2": 2}, target=3)
92-
with pytest.raises(KeyError):
93+
with pytest.raises(NotUniqueError):
9394
space.register(params={"p1": 5, "p2": 4}, target=9)
9495

9596

0 commit comments

Comments
 (0)