Skip to content

Commit 12353c2

Browse files
authored
Merge branch 'master' into constrained-optimization
2 parents 8bf1ef8 + 7cb736f commit 12353c2

File tree

7 files changed

+90
-53
lines changed

7 files changed

+90
-53
lines changed

README.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@
1111
Pure Python implementation of bayesian global optimization with gaussian
1212
processes.
1313

14-
> :warning: If you are using scipy>1.8.x, please install directly from this branch: e.g. ```pip install git+https://github.com/fmfn/BayesianOptimization```
15-
1614
* PyPI (pip):
1715

1816
```console

bayes_opt/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@
66

77
__all__ = [
88
"BayesianOptimization",
9-
"ConstraintModel"
9+
"ConstraintModel",
1010
"UtilityFunction",
1111
"Events",
1212
"ScreenLogger",
1313
"JSONLogger",
1414
"SequentialDomainReductionTransformer",
1515
]
16+

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

setup.cfg

Lines changed: 0 additions & 2 deletions
This file was deleted.

setup.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
from setuptools import setup, find_packages
22

3+
34
setup(
45
name='bayesian-optimization',
5-
version='1.2.0',
6+
version="1.3.1",
67
url='https://github.com/fmfn/BayesianOptimization',
78
packages=find_packages(),
89
author='Fernando Nogueira',
910
author_email="[email protected]",
1011
description='Bayesian Optimization package',
11-
long_description='A Python implementation of global optimization with gaussian processes.',
12-
download_url='https://github.com/fmfn/BayesianOptimization/tarball/0.6',
12+
long_description="A Python implementation of global optimization with gaussian processes.",
1313
install_requires=[
1414
"numpy >= 1.9.0",
15-
"scipy >= 0.14.0",
15+
"scipy >= 1.0.0",
1616
"scikit-learn >= 0.18.0",
1717
],
1818
classifiers=[

tests/test_bayesian_optimization.py

Lines changed: 34 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
from bayes_opt.logger import ScreenLogger
66
from bayes_opt.event import Events, DEFAULT_EVENTS
77
from bayes_opt.util import NotUniqueError
8+
import pickle
9+
import os
810

911

1012
def target_func(**kwargs):
@@ -38,35 +40,35 @@ def test_probe_lazy():
3840

3941
optimizer.probe(params={"p1": 1, "p2": 2}, lazy=True)
4042
assert len(optimizer.space) == 0
41-
assert optimizer._queue.qsize() == 1
43+
assert len(optimizer._queue) == 1
4244

4345
optimizer.probe(params={"p1": 6, "p2": 2}, lazy=True)
4446
assert len(optimizer.space) == 0
45-
assert optimizer._queue.qsize() == 2
47+
assert len(optimizer._queue) == 2
4648

4749
optimizer.probe(params={"p1": 6, "p2": 2}, lazy=True)
4850
assert len(optimizer.space) == 0
49-
assert optimizer._queue.qsize() == 3
51+
assert len(optimizer._queue) == 3
5052

5153

5254
def test_probe_eager():
5355
optimizer = BayesianOptimization(target_func, PBOUNDS, random_state=1)
5456

5557
optimizer.probe(params={"p1": 1, "p2": 2}, lazy=False)
5658
assert len(optimizer.space) == 1
57-
assert optimizer._queue.empty()
59+
assert len(optimizer._queue) == 0
5860
assert optimizer.max["target"] == 3
5961
assert optimizer.max["params"] == {"p1": 1, "p2": 2}
6062

6163
optimizer.probe(params={"p1": 3, "p2": 3}, lazy=False)
6264
assert len(optimizer.space) == 2
63-
assert optimizer._queue.empty()
65+
assert len(optimizer._queue) == 0
6466
assert optimizer.max["target"] == 6
6567
assert optimizer.max["params"] == {"p1": 3, "p2": 3}
6668

6769
optimizer.probe(params={"p1": 3, "p2": 3}, lazy=False)
6870
assert len(optimizer.space) == 2
69-
assert optimizer._queue.empty()
71+
assert len(optimizer._queue) == 0
7072
assert optimizer.max["target"] == 6
7173
assert optimizer.max["params"] == {"p1": 3, "p2": 3}
7274

@@ -102,43 +104,43 @@ def test_suggest_with_one_observation():
102104

103105
def test_prime_queue_all_empty():
104106
optimizer = BayesianOptimization(target_func, PBOUNDS, random_state=1)
105-
assert optimizer._queue.empty()
107+
assert len(optimizer._queue) == 0
106108
assert len(optimizer.space) == 0
107109

108110
optimizer._prime_queue(init_points=0)
109-
assert optimizer._queue.qsize() == 1
111+
assert len(optimizer._queue) == 1
110112
assert len(optimizer.space) == 0
111113

112114

113115
def test_prime_queue_empty_with_init():
114116
optimizer = BayesianOptimization(target_func, PBOUNDS, random_state=1)
115-
assert optimizer._queue.empty()
117+
assert len(optimizer._queue) == 0
116118
assert len(optimizer.space) == 0
117119

118120
optimizer._prime_queue(init_points=5)
119-
assert optimizer._queue.qsize() == 5
121+
assert len(optimizer._queue) == 5
120122
assert len(optimizer.space) == 0
121123

122124

123125
def test_prime_queue_with_register():
124126
optimizer = BayesianOptimization(target_func, PBOUNDS, random_state=1)
125-
assert optimizer._queue.empty()
127+
assert len(optimizer._queue) == 0
126128
assert len(optimizer.space) == 0
127129

128130
optimizer.register(params={"p1": 1, "p2": 2}, target=3)
129131
optimizer._prime_queue(init_points=0)
130-
assert optimizer._queue.empty()
132+
assert len(optimizer._queue) == 0
131133
assert len(optimizer.space) == 1
132134

133135

134136
def test_prime_queue_with_register_and_init():
135137
optimizer = BayesianOptimization(target_func, PBOUNDS, random_state=1)
136-
assert optimizer._queue.empty()
138+
assert len(optimizer._queue) == 0
137139
assert len(optimizer.space) == 0
138140

139141
optimizer.register(params={"p1": 1, "p2": 2}, target=3)
140142
optimizer._prime_queue(init_points=3)
141-
assert optimizer._queue.qsize() == 3
143+
assert len(optimizer._queue) == 3
142144
assert len(optimizer.space) == 1
143145

144146

@@ -271,22 +273,22 @@ def reset(self):
271273
)
272274

273275
optimizer.maximize(init_points=0, n_iter=0)
274-
assert optimizer._queue.empty()
276+
assert optimizer._queue.empty
275277
assert len(optimizer.space) == 1
276278
assert tracker.start_count == 1
277279
assert tracker.step_count == 1
278280
assert tracker.end_count == 1
279281

280282
optimizer.maximize(init_points=2, n_iter=0, alpha=1e-2)
281-
assert optimizer._queue.empty()
283+
assert optimizer._queue.empty
282284
assert len(optimizer.space) == 3
283285
assert optimizer._gp.alpha == 1e-2
284286
assert tracker.start_count == 2
285287
assert tracker.step_count == 3
286288
assert tracker.end_count == 2
287289

288290
optimizer.maximize(init_points=0, n_iter=2)
289-
assert optimizer._queue.empty()
291+
assert optimizer._queue.empty
290292
assert len(optimizer.space) == 5
291293
assert tracker.start_count == 3
292294
assert tracker.step_count == 5
@@ -321,6 +323,21 @@ def test_single_value_objective():
321323
)
322324

323325

326+
def test_pickle():
327+
"""
328+
several users have asked that the BO object be 'pickalable'
329+
This tests that this is the case
330+
"""
331+
optimizer = BayesianOptimization(
332+
f=None,
333+
pbounds={'x': (-10, 10)},
334+
verbose=2,
335+
random_state=1,
336+
)
337+
with open("test_dump.obj", "wb") as filehandler:
338+
pickle.dump(optimizer, filehandler)
339+
os.remove('test_dump.obj')
340+
324341
if __name__ == '__main__':
325342
r"""
326343
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)