def observed_hypervolume( modelbridge: modelbridge_module.array.ArrayModelBridge, objective_thresholds: Optional[TRefPoint] = None, optimization_config: Optional[MultiObjectiveOptimizationConfig] = None, ) -> float: """Calculate hypervolume of a pareto frontier based on observed data. Given observed data, return the hypervolume of the pareto frontier formed from those outcomes. Args: modelbridge: Modelbridge that holds previous training data. objective_thresholds: point defining the origin of hyperrectangles that can contribute to hypervolume. observation_features: observation features to predict. Model's training data used by default if unspecified. optimization_config: Optimization config Returns: (float) calculated hypervolume. """ # Get observation_data from current training data. observation_data = [obs.data for obs in modelbridge.get_training_data()] observation_features = [ obs.features for obs in modelbridge.get_training_data() ] return hypervolume( modelbridge=modelbridge, objective_thresholds=objective_thresholds, observation_features=observation_features, observation_data=observation_data, optimization_config=optimization_config, use_model_predictions=False, )
def observed_pareto_frontier( modelbridge: modelbridge_module.array.ArrayModelBridge, objective_thresholds: Optional[TRefPoint] = None, optimization_config: Optional[MultiObjectiveOptimizationConfig] = None, ) -> List[ObservationData]: """Generate a pareto frontier based on observed data. Given observed data, return those outcomes in the pareto frontier. Args: modelbridge: Modelbridge that holds previous training data. objective_thresholds: metric values bounding the region of interest in the objective outcome space. optimization_config: Optimization config Returns: Data representing points on the pareto frontier. """ # Get observation_data from current training data observation_data = [obs.data for obs in modelbridge.get_training_data()] return pareto_frontier( modelbridge=modelbridge, objective_thresholds=objective_thresholds, observation_data=observation_data, optimization_config=optimization_config, )
def _get_modelbridge_training_data( modelbridge: modelbridge_module.array.ArrayModelBridge, ) -> Tuple[List[ObservationFeatures], List[ObservationData], List[Optional[str]]]: obs = modelbridge.get_training_data() obs_feats, obs_data, arm_names = [], [], [] for ob in obs: obs_feats.append(ob.features) obs_data.append(ob.data) arm_names.append(ob.arm_name) return obs_feats, obs_data, arm_names
def predicted_pareto_frontier( modelbridge: modelbridge_module.array.ArrayModelBridge, objective_thresholds: Optional[TRefPoint] = None, observation_features: Optional[List[ObservationFeatures]] = None, optimization_config: Optional[MultiObjectiveOptimizationConfig] = None, ) -> List[Observation]: """Generate a pareto frontier based on the posterior means of given observation features. Given a model and features to evaluate use the model to predict which points lie on the pareto frontier. Args: modelbridge: Modelbridge used to predict metrics outcomes. objective_thresholds: metric values bounding the region of interest in the objective outcome space. observation_features: observation features to predict. Model's training data used by default if unspecified. optimization_config: Optimization config Returns: Observations representing points on the pareto frontier. """ if observation_features is None: observation_features = [] arm_names = [] for obs in modelbridge.get_training_data(): observation_features.append(obs.features) arm_names.append(obs.arm_name) else: arm_names = None if not observation_features: raise ValueError( "Must receive observation_features as input or the model must " "have training data." ) pareto_observations = pareto_frontier( modelbridge=modelbridge, objective_thresholds=objective_thresholds, observation_features=observation_features, optimization_config=optimization_config, arm_names=arm_names, ) return pareto_observations
def predicted_hypervolume( modelbridge: modelbridge_module.array.ArrayModelBridge, objective_thresholds: Optional[TRefPoint] = None, observation_features: Optional[List[ObservationFeatures]] = None, optimization_config: Optional[MultiObjectiveOptimizationConfig] = None, ) -> float: """Calculate hypervolume of a pareto frontier based on the posterior means of given observation features. Given a model and features to evaluate calculate the hypervolume of the pareto frontier formed from their predicted outcomes. Args: modelbridge: Modelbridge used to predict metrics outcomes. objective_thresholds: point defining the origin of hyperrectangles that can contribute to hypervolume. observation_features: observation features to predict. Model's training data used by default if unspecified. optimization_config: Optimization config Returns: calculated hypervolume. """ observation_features = ( observation_features if observation_features is not None else [obs.features for obs in modelbridge.get_training_data()] ) if not observation_features: raise ValueError( "Must receive observation_features as input or the model must " "have training data." ) return hypervolume( modelbridge=modelbridge, objective_thresholds=objective_thresholds, observation_features=observation_features, optimization_config=optimization_config, )
def _get_modelbridge_training_data( modelbridge: modelbridge_module.array.ArrayModelBridge, ) -> Tuple[List[ObservationFeatures], List[ObservationData], List[Optional[str]]]: obs = modelbridge.get_training_data() return _unpack_observations(obs=obs)