Source code for autooed.mobo.acquisition.ucb

'''
Upper Confidence Bound acquisition function.
'''

import numpy as np

from autooed.utils.operand import expand
from autooed.mobo.acquisition.base import Acquisition


[docs]class UpperConfidenceBound(Acquisition): ''' Upper Confidence Bound. '''
[docs] def __init__(self, surrogate_model, **kwargs): super().__init__(surrogate_model) self.n_sample = None
[docs] def _fit(self, X, Y): self.n_sample = X.shape[0]
[docs] def _evaluate(self, X, gradient, hessian): val = self.surrogate_model.evaluate(X, dtype='continuous', std=True, gradient=gradient, hessian=hessian) lamda = np.sqrt(np.log(self.n_sample) / self.n_sample) y_mean, y_std = val['F'], val['S'] F = y_mean - lamda * y_std dF, hF = None, None dy_mean, hy_mean, dy_std, hy_std = val['dF'], val['hF'], val['dS'], val['hS'] if gradient or hessian: dF_y_mean = np.ones_like(y_mean) dF_y_std = -lamda * np.ones_like(y_std) dF_y_mean, dF_y_std = expand(dF_y_mean), expand(dF_y_std) if gradient: dF = dF_y_mean * dy_mean + dF_y_std * dy_std if hessian: hF_y_mean = 0 hF_y_std = 0 dy_mean, dy_std = expand(dy_mean), expand(dy_std) dy_mean_T, dy_std_T = dy_mean.transpose(0, 1, 3, 2), dy_std.transpose(0, 1, 3, 2) dF_y_mean, dF_y_std = expand(dF_y_mean), expand(dF_y_std) hF = dF_y_mean * hy_mean + dF_y_std * hy_std + \ hF_y_mean * dy_mean * dy_mean_T + hF_y_std * dy_std * dy_std_T return F, dF, hF