# -*- coding: utf-8 -*-
"""
serial BayesianOptimization, only for test and comparison
"""
from bayes_opt import BayesianOptimization
[docs]def optimierer_bo(self, opt_params, hyperparameter=None, exp_data_paths=None,known_params=None):
if self.calc_init_N:
self.calc_init_from_data(exp_data_paths, init_flag='mean')
if isinstance(exp_data_paths, list):
## When set to multi, the exp_data_paths entered here is a list
## containing one 2d data name and two 1d data names.
x_uni_exp = []
data_exp = []
for exp_data_paths_tem in exp_data_paths:
x_uni_exp_tem, data_exp_tem = self.p.get_all_data(exp_data_paths_tem)
x_uni_exp.append(x_uni_exp_tem)
data_exp.append(data_exp_tem)
else:
## When not set to multi or optimization of 1d-data, the exp_data_paths
## contain the name of that data.
x_uni_exp, data_exp = self.p.get_all_data(exp_data_paths)
pbounds = {}
transform = {}
# Prepare bounds and transformation based on parameters definition
for param, info in opt_params.items():
bounds = info['bounds']
log_scale = info.get('log_scale', False)
pbounds[param] = bounds
if log_scale:
transform[param] = lambda x: 10**x
else:
transform[param] = lambda x: x
def objective(scale, **kwargs):
transformed_params = {}
for param, func in transform.items():
transformed_params[param] = func(kwargs[param])
# Special handling for corr_agg based on dimension
if 'corr_agg_0' in transformed_params:
transformed_params = self.array_dict_transform(transformed_params)
if known_params is not None:
for key, value in known_params.items():
if key in transformed_params:
print(f"Warning: Known parameter '{key}' are set for optimization.")
transformed_params[key] = value
return self.calc_delta_agg(transformed_params, x_uni_exp, data_exp)*scale
scale = -1 ## BayesianOptimization find the maximum
bayesian_objective = lambda **kwargs: objective(scale, **kwargs)
opt = BayesianOptimization(f=bayesian_objective, pbounds=pbounds, random_state=1, allow_duplicate_points=True)
opt.maximize(init_points=5, n_iter=self.n_iter)
opt_values = {param: transform[param](opt.max['params'][param]) for param in opt_params}
delta_opt = -opt.max['target']
return delta_opt, opt_values