2929
3030logger = logging .getLogger (__name__ )
3131# configure the handler and formatter as needed
32- py_handler = logging .FileHandler (f"{ __name__ } .log" , mode = 'w' )
32+ py_handler = logging .FileHandler (f"{ __name__ } .log" , mode = "w" )
3333py_formatter = logging .Formatter ("%(name)s %(asctime)s %(levelname)s %(message)s" )
3434# add formatter to the handler
3535py_handler .setFormatter (py_formatter )
@@ -118,30 +118,30 @@ def __str__(self):
118118 return self .__class__ .__name__
119119
120120 def __init__ (
121- self ,
122- fun ,
123- lower ,
124- upper ,
125- fun_evals = 15 ,
126- fun_repeats = 1 ,
127- fun_control = {},
128- max_time = inf ,
129- noise = False ,
130- tolerance_x = 0 ,
131- var_type = ["num" ],
132- infill_criterion = "y" ,
133- n_points = 1 ,
134- ocba_delta = 0 ,
135- seed = 123 ,
136- log_level = 50 ,
137- show_models = False ,
138- show_progress = False ,
139- design = None ,
140- design_control = {},
141- surrogate = None ,
142- surrogate_control = {},
143- optimizer = None ,
144- optimizer_control = {},
121+ self ,
122+ fun ,
123+ lower ,
124+ upper ,
125+ fun_evals = 15 ,
126+ fun_repeats = 1 ,
127+ fun_control = {},
128+ max_time = inf ,
129+ noise = False ,
130+ tolerance_x = 0 ,
131+ var_type = ["num" ],
132+ infill_criterion = "y" ,
133+ n_points = 1 ,
134+ ocba_delta = 0 ,
135+ seed = 123 ,
136+ log_level = 50 ,
137+ show_models = False ,
138+ show_progress = False ,
139+ design = None ,
140+ design_control = {},
141+ surrogate = None ,
142+ surrogate_control = {},
143+ optimizer = None ,
144+ optimizer_control = {},
145145 ):
146146 # small value:
147147 self .eps = sqrt (spacing (1 ))
@@ -180,31 +180,29 @@ def __init__(
180180 # Infill points:
181181 self .n_points = n_points
182182 # Objective function related information:
183- self .fun_control = {"sigma" : 0 ,
184- "seed" : None }
183+ self .fun_control = {"sigma" : 0 , "seed" : None }
185184 self .fun_control .update (fun_control )
186185 # Design related information:
187186 self .design = design
188187 if design is None :
189188 self .design = spacefilling (k = self .k , seed = self .seed )
190- self .design_control = {"init_size" : 10 ,
191- "repeats" : 1 }
189+ self .design_control = {"init_size" : 10 , "repeats" : 1 }
192190 self .design_control .update (design_control )
193191 # Surrogate related information:
194192 self .surrogate = surrogate
195193 self .surrogate_control = {
196194 "noise" : self .noise ,
197195 "model_optimizer" : differential_evolution ,
198196 "model_fun_evals" : None ,
199- "min_theta" : - 3. ,
200- "max_theta" : 3. ,
197+ "min_theta" : - 3.0 ,
198+ "max_theta" : 3.0 ,
201199 "n_theta" : 1 ,
202200 "n_p" : 1 ,
203201 "optim_p" : False ,
204202 "cod_type" : "norm" ,
205203 "var_type" : self .var_type ,
206204 "seed" : 124 ,
207- "use_cod_y" : False
205+ "use_cod_y" : False ,
208206 }
209207 self .surrogate_control .update (surrogate_control )
210208 # If no surrogate model is specified, use the internal
@@ -225,12 +223,11 @@ def __init__(
225223 optim_p = self .surrogate_control ["optim_p" ],
226224 cod_type = self .surrogate_control ["cod_type" ],
227225 var_type = self .surrogate_control ["var_type" ],
228- use_cod_y = self .surrogate_control ["use_cod_y" ]
226+ use_cod_y = self .surrogate_control ["use_cod_y" ],
229227 )
230228 # Optimizer related information:
231229 self .optimizer = optimizer
232- self .optimizer_control = {"max_iter" : 1000 ,
233- "seed" : 125 }
230+ self .optimizer_control = {"max_iter" : 1000 , "seed" : 125 }
234231 self .optimizer_control .update (optimizer_control )
235232 if self .optimizer is None :
236233 self .optimizer = optimize .differential_evolution
@@ -249,7 +246,7 @@ def __init__(
249246 def to_red_dim (self ):
250247 self .all_lower = self .lower
251248 self .all_upper = self .upper
252- self .ident = (self .upper - self .lower ) == 0
249+ self .ident = (self .upper - self .lower ) == 0
253250 self .lower = self .lower [~ self .ident ]
254251 self .upper = self .upper [~ self .ident ]
255252 self .red_dim = self .ident .any ()
@@ -277,9 +274,12 @@ def run(self):
277274 (object): spot
278275 """
279276 # (S-2) Initial Design:
280- X0 = self .generate_design (size = self .design_control ["init_size" ],
281- repeats = self .design_control ["repeats" ],
282- lower = self .lower , upper = self .upper )
277+ X0 = self .generate_design (
278+ size = self .design_control ["init_size" ],
279+ repeats = self .design_control ["repeats" ],
280+ lower = self .lower ,
281+ upper = self .upper ,
282+ )
283283 X0 = repair_non_numeric (X0 , self .var_type )
284284 self .X = X0
285285 # (S-3): Eval initial design:
@@ -300,7 +300,7 @@ def run(self):
300300 # (S-9) Termination Criteria, Conditions:
301301
302302 timeout_start = time .time ()
303- while (self .counter < self .fun_evals ) and (time .time () < timeout_start + self .max_time * 60 ):
303+ while (self .counter < self .fun_evals ) and (time .time () < timeout_start + self .max_time * 60 ):
304304 # OCBA (only if noise)
305305 if self .noise and self .ocba_delta > 0 : # and self.fun_repeats > 0 and self.design_control["repeats"] > 0:
306306 X_ocba = get_ocba_X (self .mean_X , self .mean_y , self .var_y , self .ocba_delta )
@@ -320,10 +320,10 @@ def run(self):
320320 X0 = repeat (X0 , self .fun_repeats , axis = 0 )
321321 # 2. No X0 found. Then generate self.n_points new solutions:
322322 else :
323- self .design = spacefilling (k = self .k , seed = self .seed + self .counter )
324- X0 = self .generate_design (size = self . n_points ,
325- repeats = self .design_control ["repeats" ],
326- lower = self . lower , upper = self . upper )
323+ self .design = spacefilling (k = self .k , seed = self .seed + self .counter )
324+ X0 = self .generate_design (
325+ size = self . n_points , repeats = self .design_control ["repeats" ], lower = self . lower , upper = self . upper
326+ )
327327 X0 = repair_non_numeric (X0 , self .var_type )
328328 logger .warning ("No new XO found on surrogate. Generate new solution %s" , X0 )
329329 # (S-18): Evaluating New Solutions:
@@ -353,9 +353,9 @@ def run(self):
353353 # progress bar:
354354 if self .show_progress :
355355 if isfinite (self .fun_evals ):
356- progress_bar (self .counter / self .fun_evals )
356+ progress_bar (self .counter / self .fun_evals )
357357 else :
358- progress_bar ((time .time ()- timeout_start )/ (self .max_time * 60 ))
358+ progress_bar ((time .time () - timeout_start ) / (self .max_time * 60 ))
359359 return self
360360
361361 def generate_design (self , size , repeats , lower , upper ):
@@ -396,21 +396,22 @@ def suggest_new_X(self):
396396 new_X = np .zeros ([self .n_points , self .k ], dtype = float )
397397
398398 for i in range (self .n_points ):
399- if self .optimizer .__name__ == ' dual_annealing' :
399+ if self .optimizer .__name__ == " dual_annealing" :
400400 result = self .optimizer (func = self .infill , bounds = self .de_bounds )
401- elif self .optimizer .__name__ == 'differential_evolution' :
402- result = self .optimizer (func = self .infill ,
403- bounds = self .de_bounds ,
404- maxiter = self .optimizer_control ["max_iter" ],
405- seed = self .optimizer_control ["seed" ],
406- # popsize=10,
407- # updating="deferred"
408- )
409- elif self .optimizer .__name__ == 'direct' :
401+ elif self .optimizer .__name__ == "differential_evolution" :
402+ result = self .optimizer (
403+ func = self .infill ,
404+ bounds = self .de_bounds ,
405+ maxiter = self .optimizer_control ["max_iter" ],
406+ seed = self .optimizer_control ["seed" ],
407+ # popsize=10,
408+ # updating="deferred"
409+ )
410+ elif self .optimizer .__name__ == "direct" :
410411 result = self .optimizer (func = self .infill , bounds = self .de_bounds , eps = 1e-2 )
411- elif self .optimizer .__name__ == ' shgo' :
412+ elif self .optimizer .__name__ == " shgo" :
412413 result = self .optimizer (func = self .infill , bounds = self .de_bounds )
413- elif self .optimizer .__name__ == ' basinhopping' :
414+ elif self .optimizer .__name__ == " basinhopping" :
414415 result = self .optimizer (func = self .infill , x0 = self .min_X )
415416 else :
416417 result = self .optimizer (func = self .infill , bounds = self .de_bounds )
@@ -507,12 +508,15 @@ def plot_model(self, y_min=None, y_max=None):
507508 plt .legend (loc = "best" )
508509 # plt.title(self.surrogate.__class__.__name__ + ". " + str(self.counter) + ": " + str(self.min_y))
509510 if self .noise :
510- plt .title (str (self .counter ) + ". y (noise): "
511- + str (np .round (self .min_y , 6 )) + " y mean: "
512- + str (np .round (self .min_mean_y , 6 )))
511+ plt .title (
512+ str (self .counter )
513+ + ". y (noise): "
514+ + str (np .round (self .min_y , 6 ))
515+ + " y mean: "
516+ + str (np .round (self .min_mean_y , 6 ))
517+ )
513518 else :
514- plt .title (str (self .counter ) + ". y: "
515- + str (np .round (self .min_y , 6 )))
519+ plt .title (str (self .counter ) + ". y: " + str (np .round (self .min_y , 6 )))
516520 plt .show ()
517521
518522 def print_results (self ):
@@ -546,18 +550,12 @@ def plot_contour(self, i=0, j=1, min_z=None, max_z=None, show=True):
546550 fig = pylab .figure (figsize = (9 , 6 ))
547551 n_grid = 100
548552 # lower and upper
549- x = np .linspace (
550- self .lower [i ], self .upper [i ], num = n_grid
551- )
552- y = np .linspace (
553- self .lower [j ], self .upper [j ], num = n_grid
554- )
553+ x = np .linspace (self .lower [i ], self .upper [i ], num = n_grid )
554+ y = np .linspace (self .lower [j ], self .upper [j ], num = n_grid )
555555 X , Y = meshgrid (x , y )
556556 # Predict based on the optimized results
557557 z0 = np .mean (np .array ([self .lower , self .upper ]), axis = 0 )
558- zz = array (
559- [self .surrogate .predict (array ([self .chg (x , y , z0 , i , j )])) for x , y in zip (ravel (X ), ravel (Y ))]
560- )
558+ zz = array ([self .surrogate .predict (array ([self .chg (x , y , z0 , i , j )])) for x , y in zip (ravel (X ), ravel (Y ))])
561559 zs = zz [:, 0 ]
562560 Z = zs .reshape (X .shape )
563561 if min_z is None :
@@ -584,6 +582,6 @@ def plot_contour(self, i=0, j=1, min_z=None, max_z=None, show=True):
584582 def print_importance (self ):
585583 theta = np .power (10 , self .surrogate .theta )
586584 print ("Importance relative to the most important parameter:" )
587- imp = 100 * theta / np .max (theta )
585+ imp = 100 * theta / np .max (theta )
588586 for i in range (len (imp )):
589587 print ("Parameter" , i , ": " , imp [i ])
0 commit comments