Skip to content

Commit 80f20f2

Browse files
authored
Merge pull request #371 from bwheelz36/master
possible fix for #370
2 parents 31f69cc + 8e7c678 commit 80f20f2

File tree

3 files changed

+84
-45
lines changed

3 files changed

+84
-45
lines changed

bayes_opt/bayesian_optimization.py

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import warnings
2-
from queue import Queue, Empty
32

43
from bayes_opt.constraint import ConstraintModel
54

@@ -12,6 +11,29 @@
1211
from sklearn.gaussian_process import GaussianProcessRegressor
1312

1413

14+
class Queue:
15+
def __init__(self):
16+
self._queue = []
17+
18+
@property
19+
def empty(self):
20+
return len(self) == 0
21+
22+
def __len__(self):
23+
return len(self._queue)
24+
25+
def __next__(self):
26+
if self.empty:
27+
raise StopIteration("Queue is empty, no more objects to retrieve.")
28+
obj = self._queue[0]
29+
self._queue = self._queue[1:]
30+
return obj
31+
32+
def add(self, obj):
33+
"""Add object to end of queue."""
34+
self._queue.append(obj)
35+
36+
1537
class Observable(object):
1638
"""
1739
@@ -173,7 +195,7 @@ def probe(self, params, lazy=True):
173195
"""
174196

175197
if lazy:
176-
self._queue.put(params)
198+
self._queue.add(params)
177199
else:
178200
self._space.probe(params)
179201
self.dispatch(Events.OPTIMIZATION_STEP)
@@ -204,11 +226,11 @@ def suggest(self, utility_function):
204226

205227
def _prime_queue(self, init_points):
206228
"""Make sure there's something in the queue at the very beginning."""
207-
if self._queue.empty() and self._space.empty:
229+
if self._queue.empty and self._space.empty:
208230
init_points = max(init_points, 1)
209231

210232
for _ in range(init_points):
211-
self._queue.put(self._space.random_sample())
233+
self._queue.add(self._space.random_sample())
212234

213235
def _prime_subscriptions(self):
214236
if not any([len(subs) for subs in self._events.values()]):
@@ -273,10 +295,10 @@ def maximize(self,
273295
kappa_decay=kappa_decay,
274296
kappa_decay_delay=kappa_decay_delay)
275297
iteration = 0
276-
while not self._queue.empty() or iteration < n_iter:
298+
while not self._queue.empty or iteration < n_iter:
277299
try:
278-
x_probe = self._queue.get(block=False)
279-
except Empty:
300+
x_probe = next(self._queue)
301+
except StopIteration:
280302
util.update_params()
281303
x_probe = self.suggest(util)
282304
iteration += 1

tests/test_bayesian_optimization.py

Lines changed: 34 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
from bayes_opt import BayesianOptimization
55
from bayes_opt.logger import ScreenLogger
66
from bayes_opt.event import Events, DEFAULT_EVENTS
7-
7+
import pickle
8+
import os
89

910
def target_func(**kwargs):
1011
# arbitrary target func
@@ -37,35 +38,35 @@ def test_probe_lazy():
3738

3839
optimizer.probe(params={"p1": 1, "p2": 2}, lazy=True)
3940
assert len(optimizer.space) == 0
40-
assert optimizer._queue.qsize() == 1
41+
assert len(optimizer._queue) == 1
4142

4243
optimizer.probe(params={"p1": 6, "p2": 2}, lazy=True)
4344
assert len(optimizer.space) == 0
44-
assert optimizer._queue.qsize() == 2
45+
assert len(optimizer._queue) == 2
4546

4647
optimizer.probe(params={"p1": 6, "p2": 2}, lazy=True)
4748
assert len(optimizer.space) == 0
48-
assert optimizer._queue.qsize() == 3
49+
assert len(optimizer._queue) == 3
4950

5051

5152
def test_probe_eager():
5253
optimizer = BayesianOptimization(target_func, PBOUNDS, random_state=1)
5354

5455
optimizer.probe(params={"p1": 1, "p2": 2}, lazy=False)
5556
assert len(optimizer.space) == 1
56-
assert optimizer._queue.empty()
57+
assert len(optimizer._queue) == 0
5758
assert optimizer.max["target"] == 3
5859
assert optimizer.max["params"] == {"p1": 1, "p2": 2}
5960

6061
optimizer.probe(params={"p1": 3, "p2": 3}, lazy=False)
6162
assert len(optimizer.space) == 2
62-
assert optimizer._queue.empty()
63+
assert len(optimizer._queue) == 0
6364
assert optimizer.max["target"] == 6
6465
assert optimizer.max["params"] == {"p1": 3, "p2": 3}
6566

6667
optimizer.probe(params={"p1": 3, "p2": 3}, lazy=False)
6768
assert len(optimizer.space) == 2
68-
assert optimizer._queue.empty()
69+
assert len(optimizer._queue) == 0
6970
assert optimizer.max["target"] == 6
7071
assert optimizer.max["params"] == {"p1": 3, "p2": 3}
7172

@@ -101,43 +102,43 @@ def test_suggest_with_one_observation():
101102

102103
def test_prime_queue_all_empty():
103104
optimizer = BayesianOptimization(target_func, PBOUNDS, random_state=1)
104-
assert optimizer._queue.empty()
105+
assert len(optimizer._queue) == 0
105106
assert len(optimizer.space) == 0
106107

107108
optimizer._prime_queue(init_points=0)
108-
assert optimizer._queue.qsize() == 1
109+
assert len(optimizer._queue) == 1
109110
assert len(optimizer.space) == 0
110111

111112

112113
def test_prime_queue_empty_with_init():
113114
optimizer = BayesianOptimization(target_func, PBOUNDS, random_state=1)
114-
assert optimizer._queue.empty()
115+
assert len(optimizer._queue) == 0
115116
assert len(optimizer.space) == 0
116117

117118
optimizer._prime_queue(init_points=5)
118-
assert optimizer._queue.qsize() == 5
119+
assert len(optimizer._queue) == 5
119120
assert len(optimizer.space) == 0
120121

121122

122123
def test_prime_queue_with_register():
123124
optimizer = BayesianOptimization(target_func, PBOUNDS, random_state=1)
124-
assert optimizer._queue.empty()
125+
assert len(optimizer._queue) == 0
125126
assert len(optimizer.space) == 0
126127

127128
optimizer.register(params={"p1": 1, "p2": 2}, target=3)
128129
optimizer._prime_queue(init_points=0)
129-
assert optimizer._queue.empty()
130+
assert len(optimizer._queue) == 0
130131
assert len(optimizer.space) == 1
131132

132133

133134
def test_prime_queue_with_register_and_init():
134135
optimizer = BayesianOptimization(target_func, PBOUNDS, random_state=1)
135-
assert optimizer._queue.empty()
136+
assert len(optimizer._queue) == 0
136137
assert len(optimizer.space) == 0
137138

138139
optimizer.register(params={"p1": 1, "p2": 2}, target=3)
139140
optimizer._prime_queue(init_points=3)
140-
assert optimizer._queue.qsize() == 3
141+
assert len(optimizer._queue) == 3
141142
assert len(optimizer.space) == 1
142143

143144

@@ -270,22 +271,22 @@ def reset(self):
270271
)
271272

272273
optimizer.maximize(init_points=0, n_iter=0)
273-
assert optimizer._queue.empty()
274+
assert optimizer._queue.empty
274275
assert len(optimizer.space) == 1
275276
assert tracker.start_count == 1
276277
assert tracker.step_count == 1
277278
assert tracker.end_count == 1
278279

279280
optimizer.maximize(init_points=2, n_iter=0, alpha=1e-2)
280-
assert optimizer._queue.empty()
281+
assert optimizer._queue.empty
281282
assert len(optimizer.space) == 3
282283
assert optimizer._gp.alpha == 1e-2
283284
assert tracker.start_count == 2
284285
assert tracker.step_count == 3
285286
assert tracker.end_count == 2
286287

287288
optimizer.maximize(init_points=0, n_iter=2)
288-
assert optimizer._queue.empty()
289+
assert optimizer._queue.empty
289290
assert len(optimizer.space) == 5
290291
assert tracker.start_count == 3
291292
assert tracker.step_count == 5
@@ -320,6 +321,21 @@ def test_single_value_objective():
320321
)
321322

322323

324+
def test_pickle():
325+
"""
326+
several users have asked that the BO object be 'pickalable'
327+
This tests that this is the case
328+
"""
329+
optimizer = BayesianOptimization(
330+
f=None,
331+
pbounds={'x': (-10, 10)},
332+
verbose=2,
333+
random_state=1,
334+
)
335+
with open("test_dump.obj", "wb") as filehandler:
336+
pickle.dump(optimizer, filehandler)
337+
os.remove('test_dump.obj')
338+
323339
if __name__ == '__main__':
324340
r"""
325341
CommandLine:

tests/test_queue.py

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,43 @@
11
import pytest
2-
from queue import Queue, Empty
2+
from bayes_opt.bayesian_optimization import Queue
33

44

55
def test_add():
66
queue = Queue()
77

8-
assert queue.empty()
8+
assert len(queue) == 0
9+
assert queue.empty
910

10-
queue.put(1)
11-
assert queue.qsize() == 1
11+
queue.add(1)
12+
assert len(queue) == 1
1213

13-
queue.put(1)
14-
assert queue.qsize() == 2
14+
queue.add(1)
15+
assert len(queue) == 2
1516

16-
queue.put(2)
17-
assert queue.qsize() == 3
17+
queue.add(2)
18+
assert len(queue) == 3
1819

1920

2021
def test_queue():
2122

2223
queue = Queue()
2324

24-
with pytest.raises(Empty):
25-
queue.get(block=False)
25+
with pytest.raises(StopIteration):
26+
next(queue)
2627

27-
queue.put(1)
28-
queue.put(2)
29-
queue.put(3)
28+
queue.add(1)
29+
queue.add(2)
30+
queue.add(3)
3031

31-
assert queue.qsize() == 3
32-
assert not queue.empty()
32+
assert len(queue) == 3
33+
assert not queue.empty
3334

34-
assert queue.get() == 1
35-
assert queue.qsize() == 2
35+
assert next(queue) == 1
36+
assert len(queue) == 2
3637

37-
assert queue.get() == 2
38-
assert queue.get() == 3
39-
assert queue.empty()
38+
assert next(queue) == 2
39+
assert next(queue) == 3
40+
assert len(queue) == 0
4041

4142

4243

0 commit comments

Comments
 (0)