Skip to content

Commit 3740fa8

Browse files
committed
Allow loading of logs with constraint
1 parent eba4ff5 commit 3740fa8

File tree

5 files changed

+44
-10
lines changed

5 files changed

+44
-10
lines changed

bayes_opt/bayesian_optimization.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,9 +153,9 @@ def max(self):
153153
def res(self):
154154
return self._space.res()
155155

156-
def register(self, params, target):
156+
def register(self, params, target, constraint_value=None):
157157
"""Expect observation with known target"""
158-
self._space.register(params, target)
158+
self._space.register(params, target, constraint_value)
159159
self.dispatch(Events.OPTIMIZATION_STEP)
160160

161161
def probe(self, params, lazy=True):

bayes_opt/target_space.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,10 +183,14 @@ def register(self, params, target, constraint_value=None):
183183
self._params = np.concatenate([self._params, x.reshape(1, -1)])
184184
self._target = np.concatenate([self._target, [target]])
185185

186-
if constraint_value is None:
186+
if self._constraint is None:
187187
# Insert data into unique dictionary
188188
self._cache[_hashable(x.ravel())] = target
189189
else:
190+
if constraint_value is None:
191+
msg = ("When registering a point to a constrained TargetSpace" +
192+
" a constraint value needs to be present.")
193+
raise ValueError(msg)
190194
# Insert data into unique dictionary
191195
self._cache[_hashable(x.ravel())] = (target, constraint_value)
192196
self._constraint_values = np.concatenate([self._constraint_values,

bayes_opt/util.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -176,13 +176,11 @@ def load_logs(optimizer, logs):
176176
break
177177

178178
iteration = json.loads(iteration)
179-
try:
180-
optimizer.register(
181-
params=iteration["params"],
182-
target=iteration["target"],
183-
)
184-
except KeyError:
185-
pass
179+
optimizer.register(
180+
params=iteration["params"],
181+
target=iteration["target"],
182+
constraint_value=iteration["constraint"] if optimizer.is_constrained else None
183+
)
186184

187185
return optimizer
188186

tests/test_logs_constrained.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{"target": -0.44299100812007164, "constraint": 1.9671294186934094, "params": {"x": -1.1774463661021484, "y": 0.7620692052866689}, "allowed": true, "datetime": {"datetime": "2022-10-13 11:04:33", "elapsed": 0.0, "delta": 0.0}}
2+
{"target": -3.80499987207446, "constraint": 1.7401939200536138, "params": {"x": -0.8211808663007414, "y": -1.032402976010423}, "allowed": true, "datetime": {"datetime": "2022-10-13 11:04:33", "elapsed": 0.000253, "delta": 0.000253}}
3+
{"target": 0.6173973697366524, "constraint": 1.4074565522579112, "params": {"x": -0.6184239653374695, "y": 1.0124269609972818}, "allowed": true, "datetime": {"datetime": "2022-10-13 11:04:33", "elapsed": 0.289497, "delta": 0.289244}}
4+
{"target": -0.0044260558252411375, "constraint": 4.004426055825241, "params": {"x": 0.06652860907339889, "y": 2.0}, "allowed": false, "datetime": {"datetime": "2022-10-13 11:04:33", "elapsed": 0.644552, "delta": 0.355055}}
5+
{"target": -0.48387082383442337, "constraint": 2.0734433009323867, "params": {"x": 1.2007323331806918, "y": 0.7947862385489817}, "allowed": true, "datetime": {"datetime": "2022-10-13 11:04:34", "elapsed": 1.040863, "delta": 0.396311}}
6+
{"target": -1.7071222601388523, "constraint": 5.694318845373349, "params": {"x": -1.3114437437598845, "y": 1.9935982926172482}, "allowed": false, "datetime": {"datetime": "2022-10-13 11:04:34", "elapsed": 1.360582, "delta": 0.319719}}
7+
{"target": 0.9685285807415294, "constraint": 0.9465681677055823, "params": {"x": 0.17224772488310958, "y": 0.9575483742235558}, "allowed": true, "datetime": {"datetime": "2022-10-13 11:04:35", "elapsed": 1.816862, "delta": 0.45628}}

tests/test_util.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from sklearn.gaussian_process.kernels import Matern
99
from sklearn.gaussian_process import GaussianProcessRegressor
1010

11+
from scipy.optimize import NonlinearConstraint
1112

1213
def get_globals():
1314
X = np.array([
@@ -146,6 +147,30 @@ def f(x, y):
146147
load_logs(other_optimizer, ["./tests/test_logs.json"])
147148

148149

150+
def test_logs_constraint():
151+
import pytest
152+
def f(x, y):
153+
return -x ** 2 - (y - 1) ** 2 + 1
154+
155+
def c(x, y):
156+
return x ** 2 + y ** 2
157+
158+
constraint = NonlinearConstraint(c, -np.inf, 3)
159+
160+
optimizer = BayesianOptimization(
161+
f=f,
162+
pbounds={"x": (-2, 2), "y": (-2, 2)},
163+
constraint=constraint
164+
)
165+
166+
with pytest.raises(KeyError):
167+
load_logs(optimizer, ["./tests/test_logs.json"])
168+
169+
load_logs(optimizer, ["./tests/test_logs_constrained.json"])
170+
171+
assert len(optimizer.space) == 7
172+
173+
149174
def test_colours():
150175
colour_wrappers = [
151176
(Colours.END, Colours.black),

0 commit comments

Comments
 (0)