Source code for baybe.recommenders.pure.bayesian.base
"""Base class for all Bayesian recommenders."""fromabcimportABCimportpandasaspdfromattrsimportdefine,fieldfrombaybe.acquisition.acqfsimportqLogExpectedImprovementfrombaybe.acquisition.baseimportAcquisitionFunctionfrombaybe.acquisition.utilsimportconvert_acqffrombaybe.exceptionsimportDeprecationErrorfrombaybe.objectives.baseimportObjectivefrombaybe.recommenders.pure.baseimportPureRecommenderfrombaybe.searchspaceimportSearchSpacefrombaybe.surrogatesimportCustomONNXSurrogate,GaussianProcessSurrogatefrombaybe.surrogates.baseimportSurrogatefrombaybe.utils.dataframeimportto_tensor
[docs]@defineclassBayesianRecommender(PureRecommender,ABC):"""An abstract class for Bayesian Recommenders."""surrogate_model:Surrogate=field(factory=GaussianProcessSurrogate)"""The used surrogate model."""acquisition_function:AcquisitionFunction=field(converter=convert_acqf,factory=qLogExpectedImprovement)"""The used acquisition function class."""_botorch_acqf=field(default=None,init=False)"""The current acquisition function."""acquisition_function_cls:str|None=field(default=None,kw_only=True)"Deprecated! Raises an error when used."@acquisition_function_cls.validatordef_validate_deprecated_argument(self,_,value)->None:"""Raise DeprecationError if old acquisition_function_cls parameter is used."""ifvalueisnotNone:raiseDeprecationError("Passing 'acquisition_function_cls' to the constructor is deprecated. ""The parameter has been renamed to 'acquisition_function'.")def_setup_botorch_acqf(self,searchspace:SearchSpace,objective:Objective,measurements:pd.DataFrame,)->None:"""Create the acquisition function for the current training data."""# noqa: E501# TODO: Transition point from dataframe to tensor needs to be refactored.# Currently, surrogate models operate with tensors, while acquisition# functions with dataframes.train_x=searchspace.transform(measurements,allow_extra=True)train_y=objective.transform(measurements)self.surrogate_model._fit(searchspace,*to_tensor(train_x,train_y))self._botorch_acqf=self.acquisition_function.to_botorch(self.surrogate_model,searchspace,train_x,train_y)
[docs]defrecommend(# noqa: D102self,batch_size:int,searchspace:SearchSpace,objective:Objective|None=None,measurements:pd.DataFrame|None=None,)->pd.DataFrame:# See base class.ifobjectiveisNone:raiseNotImplementedError(f"Recommenders of type '{BayesianRecommender.__name__}' require "f"that an objective is specified.")if(measurementsisNone)or(len(measurements)==0):raiseNotImplementedError(f"Recommenders of type '{BayesianRecommender.__name__}' do not support "f"empty training data.")ifisinstance(self.surrogate_model,CustomONNXSurrogate):CustomONNXSurrogate.validate_compatibility(searchspace)self._setup_botorch_acqf(searchspace,objective,measurements)returnsuper().recommend(batch_size=batch_size,searchspace=searchspace,objective=objective,measurements=measurements,)