22
33import numpy as np
44import pytest
5+ from scipy .optimize import NonlinearConstraint
6+ from sklearn .gaussian_process import GaussianProcessRegressor , kernels
57
68from bayes_opt import BayesianOptimization
7- from bayes_opt .parameter import CategoricalParameter , FloatParameter , IntParameter
9+ from bayes_opt .parameter import CategoricalParameter , FloatParameter , IntParameter , wrap_kernel
810from bayes_opt .target_space import TargetSpace
911
1012
@@ -168,6 +170,22 @@ def test_to_string():
168170 assert space ._params_config ["fruit" ].to_string ("strawberry" , 10 ) == "strawberry"
169171
170172
173+ def test_preconstructed_parameter ():
174+ pbounds = {"p1" : (0 , 1 ), "p2" : (1 , 2 ), "p3" : IntParameter ("p3" , (- 1 , 3 ))}
175+
176+ def target_func (p1 , p2 , p3 ):
177+ return p1 + p2 + p3
178+
179+ optimizer1 = BayesianOptimization (target_func , pbounds )
180+
181+ pbounds = {"p1" : (0 , 1 ), "p2" : (1 , 2 ), "p3" : (- 1 , 3 , int )}
182+ optimizer2 = BayesianOptimization (target_func , pbounds )
183+
184+ assert optimizer1 .space .keys == optimizer2 .space .keys
185+ assert (optimizer1 .space .bounds == optimizer2 .space .bounds ).all ()
186+ assert optimizer1 .space ._params_config ["p3" ].to_float (2 ) == 2.0
187+
188+
171189def test_integration_mixed_optimization ():
172190 fruit_ratings = {"apple" : 1.0 , "banana" : 2.0 , "mango" : 5.0 , "honeydew melon" : - 10.0 , "strawberry" : np .pi }
173191
@@ -183,3 +201,46 @@ def target_func(p1, p2, p3, fruit):
183201
184202 optimizer = BayesianOptimization (target_func , pbounds )
185203 optimizer .maximize (init_points = 2 , n_iter = 10 )
204+
205+
206+ def test_integration_mixed_optimization_with_constraints ():
207+ fruit_ratings = {"apple" : 1.0 , "banana" : 2.0 , "mango" : 5.0 , "honeydew melon" : - 10.0 , "strawberry" : np .pi }
208+
209+ pbounds = {
210+ "p1" : (0 , 1 ),
211+ "p2" : (1 , 2 ),
212+ "p3" : (- 1 , 3 , int ),
213+ "fruit" : ("apple" , "banana" , "mango" , "honeydew melon" , "strawberry" ),
214+ }
215+
216+ def target_func (p1 , p2 , p3 , fruit ):
217+ return p1 + p2 + p3 + fruit_ratings [fruit ]
218+
219+ def constraint_func (p1 , p2 , p3 , fruit ):
220+ return (p1 + p2 + p3 - fruit_ratings [fruit ]) ** 2
221+
222+ constraint = NonlinearConstraint (constraint_func , 0 , 4.0 )
223+
224+ optimizer = BayesianOptimization (target_func , pbounds , constraint = constraint )
225+ init_points = [
226+ {"p1" : 0.5 , "p2" : 1.5 , "p3" : 1 , "fruit" : "banana" },
227+ {"p1" : 0.5 , "p2" : 1.5 , "p3" : 2 , "fruit" : "mango" },
228+ ]
229+ for p in init_points :
230+ optimizer .register (p , target = target_func (** p ), constraint_value = constraint_func (** p ))
231+ optimizer .maximize (init_points = 0 , n_iter = 2 )
232+
233+
234+ def test_wrapped_kernel_fit ():
235+ pbounds = {"p1" : (0 , 1 ), "p2" : (1 , 10 , int )}
236+ space = TargetSpace (None , pbounds )
237+
238+ space .register (space .random_sample (0 ), 1.0 )
239+ space .register (space .random_sample (1 ), 5.0 )
240+
241+ kernel = wrap_kernel (kernels .Matern (nu = 2.5 , length_scale = 1e5 ), space .kernel_transform )
242+ gp = GaussianProcessRegressor (kernel = kernel , alpha = 1e-6 , n_restarts_optimizer = 5 )
243+
244+ gp .fit (space .params , space .target )
245+
246+ assert gp .kernel_ .length_scale != 1e5
0 commit comments