@@ -1744,3 +1744,75 @@ def get_metric_sklearn(metric_name) -> object:
17441744 """
17451745 metric_sklearn = getattr (sklearn .metrics , metric_name )
17461746 return metric_sklearn
1747+
1748+
1749+ def set_hyperparameter (fun_control , key , values ):
1750+ """
1751+ Set hyperparameter values in the fun_control dictionary based on the type of the values argument.
1752+
1753+ Args:
1754+ fun_control (dict):
1755+ The fun_control dictionary.
1756+ key (str):
1757+ The key of the hyperparameter.
1758+ values (Union[int, float, bool, list]):
1759+ The values of the hyperparameter. This can be:
1760+ - For int and float: a list containing lower and upper bounds.
1761+ - For bool: a list containing two boolean values.
1762+ - For factor: a list of strings representing levels.
1763+
1764+ Examples:
1765+ >>> from spotPython.hyperparameters.values import set_hyperparameter
1766+ >>> fun_control = {
1767+ "core_model_hyper_dict": {
1768+ "n_estimators": {"type": "int", "default": 10, "lower": 2, "upper": 1000},
1769+ "step": {"type": "float", "default": 1.0, "lower": 0.1, "upper": 10.0},
1770+ "use_aggregation": {"type": "factor", "default": 1, "lower": 0, "upper": 1, "levels": [0, 1]},
1771+ "leaf_model": {"type": "factor", "default": "LinearRegression", "upper": 2}
1772+ }
1773+ }
1774+ >>> set_hyperparameter(fun_control, "n_estimators", [2, 5])
1775+ >>> set_hyperparameter(fun_control, "step", [0.2, 5.0])
1776+ >>> set_hyperparameter(fun_control, "use_aggregation", [False, True])
1777+ >>> set_hyperparameter(fun_control, "leaf_model", ["LinearRegression", "Perceptron"])
1778+ """
1779+ if isinstance (values , list ):
1780+ if all (isinstance (v , int ) for v in values ):
1781+ _set_int_hyperparameter_values (fun_control , key , values [0 ], values [1 ])
1782+ elif all (isinstance (v , float ) for v in values ):
1783+ _set_float_hyperparameter_values (fun_control , key , values [0 ], values [1 ])
1784+ elif all (isinstance (v , bool ) for v in values ):
1785+ _set_boolean_hyperparameter_values (fun_control , key , values [0 ], values [1 ])
1786+ elif all (isinstance (v , str ) for v in values ):
1787+ _set_factor_hyperparameter_values (fun_control , key , values )
1788+ else :
1789+ raise ValueError ("Invalid type in values list." )
1790+ else :
1791+ raise TypeError ("values should be a list." )
1792+
1793+
1794+ def _set_int_hyperparameter_values (fun_control , key , lower , upper ) -> None :
1795+ # Set integer hyperparameter values in fun_control dictionary
1796+ fun_control ["core_model_hyper_dict" ][key ].update ({"lower" : lower , "upper" : upper })
1797+
1798+
1799+ def _set_float_hyperparameter_values (fun_control , key , lower , upper ) -> None :
1800+ # Set float hyperparameter values in fun_control dictionary
1801+ fun_control ["core_model_hyper_dict" ][key ].update ({"lower" : lower , "upper" : upper })
1802+
1803+
1804+ def _set_boolean_hyperparameter_values (fun_control , key , lower , upper ):
1805+ # Set boolean hyperparameter values in fun_control dictionary
1806+ fun_control ["core_model_hyper_dict" ][key ].update ({"lower" : lower , "upper" : upper })
1807+
1808+
1809+ def _set_factor_hyperparameter_values (fun_control , key , levels ):
1810+ # Set factor hyperparameter values in fun_control dictionary
1811+ if "core_model_hyper_dict" not in fun_control .keys ():
1812+ return
1813+ if not isinstance (levels , list ):
1814+ levels = [levels ]
1815+ if not all (isinstance (level , str ) for level in levels ):
1816+ print ("!!! Warning: levels should be a list of strings." )
1817+ return
1818+ fun_control ["core_model_hyper_dict" ][key ].update ({"levels" : levels , "upper" : len (levels ) - 1 })
0 commit comments