23
23
def _initialize_optimizer (
24
24
optimizer_class ,
25
25
optimizer_kwargs : dict ,
26
- objective : Objective ,
27
- objectives : List [Objective ],
26
+ objective : Optional [ Objective ] = None ,
27
+ objectives : Optional [ List [Objective ]] = None ,
28
28
space : Optional [ps .ParameterSpace ] = None ,
29
29
seed : Optional [int ] = None ,
30
30
) -> Optimizer :
@@ -38,9 +38,13 @@ def _initialize_optimizer(
38
38
space .seed (seed )
39
39
40
40
if issubclass (optimizer_class , MultiObjectiveOptimizer ):
41
+ if objectives is None :
42
+ objectives = [Objective ("loss" , False ), Objective ("score" , True )]
41
43
return optimizer_class (space , objectives , seed = seed , ** optimizer_kwargs )
42
44
43
45
if issubclass (optimizer_class , SingleObjectiveOptimizer ):
46
+ if objective is None :
47
+ objective = Objective ("loss" , False )
44
48
return optimizer_class (space , objective , seed = seed , ** optimizer_kwargs )
45
49
46
50
return optimizer_class (space , seed = seed , ** optimizer_kwargs )
@@ -74,13 +78,7 @@ def quadratic_function(p1):
74
78
"blackboxopt.base.Optimizer"
75
79
)
76
80
77
- optimizer = _initialize_optimizer (
78
- optimizer_class ,
79
- optimizer_kwargs ,
80
- objective = Objective ("loss" , False ),
81
- objectives = [Objective ("loss" , False ), Objective ("score" , True )],
82
- seed = seed ,
83
- )
81
+ optimizer = _initialize_optimizer (optimizer_class , optimizer_kwargs , seed = seed )
84
82
85
83
eval_spec = optimizer .generate_evaluation_specification ()
86
84
@@ -139,26 +137,28 @@ def is_deterministic_with_fixed_seed_and_larger_space(
139
137
Returns:
140
138
`True` if the test is passed.
141
139
"""
140
+ if seed is None :
141
+ seed = 42
142
+
142
143
n_evaluations = 5
143
144
losses = [0.1 , 0.2 , 0.3 , 0.4 , 0.5 ]
144
145
145
146
run_0_configs : List [Evaluation ] = []
146
147
run_1_configs : List [Evaluation ] = []
147
148
148
149
for run_configs in [run_0_configs , run_1_configs ]:
149
- opt = _initialize_optimizer (
150
- optimizer_class ,
151
- optimizer_kwargs ,
152
- objective = Objective ("loss" , False ),
153
- objectives = [Objective ("loss" , False )],
154
- seed = seed or 42 ,
155
- )
150
+ opt = _initialize_optimizer (optimizer_class , optimizer_kwargs , seed = seed )
156
151
157
152
for i in range (n_evaluations ):
158
153
es = opt .generate_evaluation_specification ()
154
+
155
+ objectives = {"loss" : losses [i ]}
156
+ if isinstance (opt , MultiObjectiveOptimizer ):
157
+ objectives ["score" ] = - 1.0 * losses [i ] ** 2
159
158
evaluation = es .create_evaluation (
160
- objectives = { "loss" : losses [ i ]} , constraints = {"constraint" : 10.0 }
159
+ objectives = objectives , constraints = {"constraint" : 10.0 }
161
160
)
161
+
162
162
opt .report (evaluation )
163
163
164
164
run_configs .append (evaluation .configuration )
@@ -193,6 +193,8 @@ def is_deterministic_when_reporting_shuffled_evaluations(
193
193
Returns:
194
194
`True` if the test is passed.
195
195
"""
196
+ if seed is None :
197
+ seed = 0
196
198
197
199
space = ps .ParameterSpace ()
198
200
space .add (ps .ContinuousParameter ("p1" , (0 , 1 )))
@@ -209,12 +211,7 @@ def _run_experiment_1d(es):
209
211
for run_idx , run in runs .items ():
210
212
run ["evaluations" ] = []
211
213
opt = _initialize_optimizer (
212
- optimizer_class ,
213
- optimizer_kwargs ,
214
- objective = Objective ("loss" , False ),
215
- objectives = [Objective ("loss" , False )],
216
- space = space ,
217
- seed = seed or 0 ,
214
+ optimizer_class , optimizer_kwargs , space = space , seed = seed
218
215
)
219
216
220
217
# Report initial data in different order
@@ -226,17 +223,25 @@ def _run_experiment_1d(es):
226
223
)
227
224
for es in eval_specs
228
225
]
226
+ if isinstance (opt , MultiObjectiveOptimizer ):
227
+ for e in run ["initial_evaluations" ]:
228
+ e .objectives ["score" ] = - 1.0 * e .objectives ["loss" ] ** 2
229
+
229
230
shuffle_rng = random .Random (run_idx )
230
231
shuffle_rng .shuffle (run ["initial_evaluations" ])
231
232
opt .report (run ["initial_evaluations" ])
232
233
233
234
# Start optimizing
234
235
for _ in range (5 ):
235
236
es = opt .generate_evaluation_specification ()
237
+
238
+ objectives = {"loss" : _run_experiment_1d (es )}
239
+ if isinstance (opt , MultiObjectiveOptimizer ):
240
+ objectives ["score" ] = - 1.0 * objectives ["loss" ] ** 2
236
241
evaluation = es .create_evaluation (
237
- objectives = {"loss" : _run_experiment_1d (es )},
238
- constraints = {"constraint" : 10.0 },
242
+ objectives = objectives , constraints = {"constraint" : 10.0 }
239
243
)
244
+
240
245
opt .report (evaluation )
241
246
run ["evaluations" ].append (evaluation )
242
247
@@ -276,18 +281,17 @@ def handles_reporting_evaluations_list(
276
281
Returns:
277
282
`True` if the test is passed.
278
283
"""
279
- opt = _initialize_optimizer (
280
- optimizer_class ,
281
- optimizer_kwargs ,
282
- objective = Objective ("loss" , False ),
283
- objectives = [Objective ("loss" , False )],
284
- seed = seed ,
285
- )
284
+ opt = _initialize_optimizer (optimizer_class , optimizer_kwargs , seed = seed )
286
285
evaluations = []
287
286
for i in range (3 ):
288
287
es = opt .generate_evaluation_specification ()
288
+
289
+ objectives = {"loss" : 0.42 * i }
290
+ if isinstance (opt , MultiObjectiveOptimizer ):
291
+ objectives ["score" ] = float (i )
292
+
289
293
evaluation = es .create_evaluation (
290
- objectives = { "loss" : 0.42 * i } , constraints = {"constraint" : 10.0 * i }
294
+ objectives = objectives , constraints = {"constraint" : 10.0 * i }
291
295
)
292
296
evaluations .append (evaluation )
293
297
@@ -316,13 +320,7 @@ def raises_evaluation_error_when_reporting_unknown_objective(
316
320
Returns:
317
321
`True` if the test is passed.
318
322
"""
319
- opt = _initialize_optimizer (
320
- optimizer_class ,
321
- optimizer_kwargs ,
322
- objective = Objective ("loss" , False ),
323
- objectives = [Objective ("loss" , False )],
324
- seed = seed ,
325
- )
323
+ opt = _initialize_optimizer (optimizer_class , optimizer_kwargs , seed = seed )
326
324
es_1 = opt .generate_evaluation_specification ()
327
325
es_2 = opt .generate_evaluation_specification ()
328
326
es_3 = opt .generate_evaluation_specification ()
@@ -339,7 +337,11 @@ def raises_evaluation_error_when_reporting_unknown_objective(
339
337
evaluation_3 = es_3 .create_evaluation (
340
338
objectives = {"loss" : 4 }, constraints = {"constraint" : 10.0 }
341
339
)
342
- opt .report ([evaluation_1 , evaluation_2 , evaluation_3 ])
340
+ evaluations = [evaluation_1 , evaluation_2 , evaluation_3 ]
341
+ if isinstance (opt , MultiObjectiveOptimizer ):
342
+ for e in evaluations :
343
+ e .objectives ["score" ] = 0.0
344
+ opt .report (evaluations )
343
345
344
346
raise AssertionError (
345
347
f"Optimizer { optimizer_class } did not raise an ObjectivesError when a "
@@ -380,19 +382,19 @@ def respects_fixed_parameter(
380
382
fixed_value = 1.0
381
383
space .fix (my_fixed_param = fixed_value )
382
384
opt = _initialize_optimizer (
383
- optimizer_class ,
384
- optimizer_kwargs ,
385
- objective = Objective ("loss" , False ),
386
- objectives = [Objective ("loss" , False )],
387
- space = space ,
388
- seed = seed ,
385
+ optimizer_class , optimizer_kwargs , space = space , seed = seed
389
386
)
390
387
for _ in range (5 ):
391
388
es = opt .generate_evaluation_specification ()
392
389
assert es .configuration ["my_fixed_param" ] == fixed_value
390
+
391
+ objectives = {"loss" : es .configuration ["x" ] ** 2 }
392
+ if isinstance (opt , MultiObjectiveOptimizer ):
393
+ objectives ["score" ] = - objectives ["loss" ]
394
+
393
395
opt .report (
394
396
es .create_evaluation (
395
- objectives = { "loss" : es . configuration [ "x" ] ** 2 } ,
397
+ objectives = objectives ,
396
398
constraints = {"constraint" : 10.0 },
397
399
)
398
400
)
@@ -427,20 +429,19 @@ def handles_conditional_space(
427
429
space .seed (seed )
428
430
429
431
opt = _initialize_optimizer (
430
- optimizer_class ,
431
- optimizer_kwargs ,
432
- objective = Objective ("loss" , False ),
433
- objectives = [Objective ("loss" , False )],
434
- space = space ,
435
- seed = seed ,
432
+ optimizer_class , optimizer_kwargs , space = space , seed = seed
436
433
)
437
434
438
435
for _ in range (10 ):
439
436
es = opt .generate_evaluation_specification ()
440
- dummy_loss = es .configuration .get ("momentum" , 1.0 ) * es .configuration ["lr" ] ** 2
437
+ objectives = {
438
+ "loss" : es .configuration .get ("momentum" , 1.0 ) * es .configuration ["lr" ] ** 2
439
+ }
440
+ if isinstance (opt , MultiObjectiveOptimizer ):
441
+ objectives ["score" ] = - 1.0 * es .configuration ["lr" ] ** 2
441
442
opt .report (
442
443
es .create_evaluation (
443
- objectives = { "loss" : dummy_loss } , constraints = {"constraint" : 10.0 }
444
+ objectives = objectives , constraints = {"constraint" : 10.0 }
444
445
)
445
446
)
446
447
0 commit comments