def __init__(self, goal: str, parameters: Dict[str, Any], num_samples=10, **kwargs) -> None: HyperoptSampler.__init__(self, goal, parameters) params_for_join_space = copy.deepcopy(parameters) cat_params_values_types = {} for param_name, param_values in params_for_join_space.items(): if param_values[TYPE] == CATEGORY: param_values[TYPE] = 'cat' values_str = [] values_types = {} for value in param_values['values']: value_str = str(value) values_str.append(value_str) value_type = type(value) if value_type == bool: value_type = str2bool values_types[value_str] = value_type param_values['values'] = values_str cat_params_values_types[param_name] = values_types if param_values[TYPE] == FLOAT: param_values[TYPE] = 'real' if param_values[TYPE] == INT or param_values[TYPE] == 'real': if SPACE not in param_values: param_values[SPACE] = 'linear' param_values['range'] = (param_values['low'], param_values['high']) del param_values['low'] del param_values['high'] self.cat_params_values_types = cat_params_values_types self.pysot_optimizer = PySOTOptimizer(params_for_join_space) self.sampled_so_far = 0 self.num_samples = num_samples
class PySOTSampler(HyperoptSampler): """pySOT: Surrogate optimization in Python. This is a wrapper around the pySOT package (https://github.com/dme65/pySOT): David Eriksson, David Bindel, Christine Shoemaker pySOT and POAP: An event-driven asynchronous framework for surrogate optimization """ def __init__(self, goal: str, parameters: Dict[str, Any], num_samples=10, **kwargs) -> None: HyperoptSampler.__init__(self, goal, parameters) params_for_join_space = copy.deepcopy(parameters) for param_values in params_for_join_space.values(): if param_values[TYPE] == CATEGORY: param_values[TYPE] = 'cat' if param_values[TYPE] == FLOAT: param_values[TYPE] = 'real' if param_values[TYPE] == INT or param_values[TYPE] == 'real': if SPACE not in param_values: param_values[SPACE] = 'linear' param_values['range'] = (param_values['low'], param_values['high']) del param_values['low'] del param_values['high'] self.pysot_optimizer = PySOTOptimizer(params_for_join_space) self.sampled_so_far = 0 self.num_samples = num_samples def sample(self) -> Dict[str, Any]: """Suggest one new point to be evaluated.""" if self.sampled_so_far >= self.num_samples: raise IndexError() sample = self.pysot_optimizer.suggest(n_suggestions=1)[0] self.sampled_so_far += 1 return sample def update(self, sampled_parameters: Dict[str, Any], metric_score: float): self.pysot_optimizer.observe([sampled_parameters], [metric_score]) def finished(self) -> bool: return self.sampled_so_far >= self.num_samples
def __init__(self, goal: str, parameters: Dict[str, Any], num_samples=10, **kwargs) -> None: HyperoptSampler.__init__(self, goal, parameters) params_for_join_space = copy.deepcopy(parameters) cat_params_values_types = {} for param_name, param_values in params_for_join_space.items(): if param_values[TYPE] == CATEGORY: param_values[TYPE] = "cat" values_str = [] values_types = {} for value in param_values["values"]: value_type = type(value) if value_type == bool: value_str = str(value) value_type = str2bool elif value_type == str or value_type == int or value_type == float: value_str = str(value) else: value_str = json.dumps(value) value_type = json.loads values_str.append(value_str) values_types[value_str] = value_type param_values["values"] = values_str cat_params_values_types[param_name] = values_types if param_values[TYPE] == FLOAT: param_values[TYPE] = "real" if param_values[TYPE] == INT or param_values[TYPE] == "real": if SPACE not in param_values: param_values[SPACE] = "linear" param_values["range"] = (param_values["low"], param_values["high"]) del param_values["low"] del param_values["high"] self.cat_params_values_types = cat_params_values_types self.pysot_optimizer = PySOTOptimizer(params_for_join_space) self.sampled_so_far = 0 self.num_samples = num_samples
def __init__(self, goal: str, parameters: Dict[str, Any], num_samples=10, **kwargs) -> None: HyperoptSampler.__init__(self, goal, parameters) params_for_join_space = copy.deepcopy(parameters) for param_values in params_for_join_space.values(): if param_values[TYPE] == CATEGORY: param_values[TYPE] = 'cat' if param_values[TYPE] == FLOAT: param_values[TYPE] = 'real' if param_values[TYPE] == INT or param_values[TYPE] == 'real': if SPACE not in param_values: param_values[SPACE] = 'linear' param_values['range'] = (param_values['low'], param_values['high']) del param_values['low'] del param_values['high'] self.pysot_optimizer = PySOTOptimizer(params_for_join_space) self.sampled_so_far = 0 self.num_samples = num_samples
class PySOTSampler(HyperoptSampler): """pySOT: Surrogate optimization in Python. This is a wrapper around the pySOT package (https://github.com/dme65/pySOT): David Eriksson, David Bindel, Christine Shoemaker pySOT and POAP: An event-driven asynchronous framework for surrogate optimization """ def __init__(self, goal: str, parameters: Dict[str, Any], num_samples=10, **kwargs) -> None: HyperoptSampler.__init__(self, goal, parameters) params_for_join_space = copy.deepcopy(parameters) cat_params_values_types = {} for param_name, param_values in params_for_join_space.items(): if param_values[TYPE] == CATEGORY: param_values[TYPE] = 'cat' values_str = [] values_types = {} for value in param_values['values']: value_type = type(value) if value_type == bool: value_str = str(value) value_type = str2bool elif value_type == str or value_type == int or \ value_type == float: value_str = str(value) else: value_str = json.dumps(value) value_type = json.loads values_str.append(value_str) values_types[value_str] = value_type param_values['values'] = values_str cat_params_values_types[param_name] = values_types if param_values[TYPE] == FLOAT: param_values[TYPE] = 'real' if param_values[TYPE] == INT or param_values[TYPE] == 'real': if SPACE not in param_values: param_values[SPACE] = 'linear' param_values['range'] = (param_values['low'], param_values['high']) del param_values['low'] del param_values['high'] self.cat_params_values_types = cat_params_values_types self.pysot_optimizer = PySOTOptimizer(params_for_join_space) self.sampled_so_far = 0 self.num_samples = num_samples def sample(self) -> Dict[str, Any]: """Suggest one new point to be evaluated.""" if self.sampled_so_far >= self.num_samples: raise IndexError() sample = self.pysot_optimizer.suggest(n_suggestions=1)[0] for key in sample: if key in self.cat_params_values_types: values_types = self.cat_params_values_types[key] sample[key] = values_types[sample[key]](sample[key]) self.sampled_so_far += 1 return sample def update(self, sampled_parameters: Dict[str, Any], metric_score: float): for key in sampled_parameters: if key in self.cat_params_values_types: if type(sampled_parameters[key]) not in { bool, int, float, str }: sampled_parameters[key] = json.dumps( sampled_parameters[key]) else: sampled_parameters[key] = str(sampled_parameters[key]) self.pysot_optimizer.observe([sampled_parameters], [metric_score]) def finished(self) -> bool: return self.sampled_so_far >= self.num_samples