def hp_save(path: str, hp_mgr: hpman.HyperParameterManager, serial_format: str): """Save(serialize) hyperparamters. :param path: Where to save :param hp_mgr: The HyperParameterManager to be saved. :param serial_format: The saving format. :see: :func:`.bind` for more detail. """ values = hp_mgr.get_values() if serial_format == "auto": serial_format = _infer_file_format(path) if serial_format == "yaml": with open(path, "w") as f: yaml.dump(values, f) else: assert serial_format == "pickle", serial_format with open(path, "wb") as f: dill.dump(values, f)
def inject_args( parser: argparse.ArgumentParser, hp_mgr: hpman.HyperParameterManager, *, inject_actions: List[str], action_prefix: str, serial_format: str, show_defaults: bool, ) -> argparse.ArgumentParser: """Inject hpman parsed hyperparameter settings into argparse arguments. Only a limited set of format are supported. See code for details. :param parser: Use given parser object of `class`:`argparse.ArgumentParser`. :param hp_mgr: A `class`:`hpman.HyperParameterManager` object. :param inject_actions: A list of actions names to inject :param action_prefix: Prefix for hpargparse related options :param serial_format: One of 'yaml' and 'pickle' :param show_defaults: Show default values :return: The injected parser. """ help = "" if show_defaults: parser.formatter_class = argparse.ArgumentDefaultsHelpFormatter # Default value will be shown when using argparse.ArgumentDefaultsHelpFormatter # only if a help message is present. This is the behavior of argparse. help = " " # add options for collected hyper-parameters for k, v in hp_mgr.get_values().items(): # this is just a simple hack option_name = "--{}".format(k.replace("_", "-")) if _get_argument_type_by_value(v) == bool: # argparse does not directly support bool types. parser.add_argument( option_name, type=str2bool, default=v, help=help # EmptyValue(), ) else: parser.add_argument( option_name, type=_get_argument_type_by_value(v), default=v, # EmptyValue() help=help, ) make_option = lambda name: "--{}-{}".format(action_prefix, name) for action in inject_actions: if action == "list": parser.add_argument( make_option("list"), action="store", default=False, const="yaml", nargs="?", choices=["detail", "yaml"], help=( "List all available hyperparameters. If `{} detail` is" " specified, a verbose table will be print" ).format(make_option("list")), ) elif action == "save": parser.add_argument( make_option("save"), help=( "Save hyperparameters to a file. The hyperparameters" " are saved after processing of all other options" ), ) elif action == "load": parser.add_argument( make_option("load"), help=( "Load hyperparameters from a file. The hyperparameters" " are loaded before any other options are processed" ), ) if "load" in inject_actions or "save" in inject_actions: parser.add_argument( make_option("serial-format"), default=serial_format, choices=config.HP_SERIAL_FORMAT_CHOICES, help=( "Format of the saved config file. Defaults to {}." " It can be set to override auto file type deduction." ).format(serial_format), ) if inject_actions: parser.add_argument( make_option("exit"), action="store_true", help="process all hpargparse actions and quit", ) return parser
from hpman import HyperParameterManager _ = HyperParameterManager("_") def func(): pass hpx = _("1", 123) xxx = _("2", {"a": 1, "b": 2}) bbb = _("3", ["a", 1, 4]) ccc = _("4", ["a", 1, 4]) xxa = _("5", 1.24) fff = _("6", 1e-5) ggg = _("7", 1 // 2) hhh = _("8", print) hpp = _("9", func()) _.parse_file(["tests/test_files/1/", "tests/test_files/1/1.py"])
def inject_args( parser: argparse.ArgumentParser, hp_mgr: hpman.HyperParameterManager, *, inject_actions: List[str], action_prefix: str, serial_format: str, show_defaults: bool, ) -> argparse.ArgumentParser: """Inject hpman parsed hyperparameter settings into argparse arguments. Only a limited set of format are supported. See code for details. :param parser: Use given parser object of `class`:`argparse.ArgumentParser`. :param hp_mgr: A `class`:`hpman.HyperParameterManager` object. :param inject_actions: A list of actions names to inject :param action_prefix: Prefix for hpargparse related options :param serial_format: One of 'yaml' and 'pickle' :param show_defaults: Show default values :return: The injected parser. """ help = "" if show_defaults: parser.formatter_class = argparse.ArgumentDefaultsHelpFormatter # Default value will be shown when using argparse.ArgumentDefaultsHelpFormatter # only if a help message is present. This is the behavior of argparse. help = " " value_names_been_set = set() def _make_value_names_been_set_injection(name, func): @functools.wraps(func) def wrapper(string): # when isinstance(default, string), # the `parser.parse_args()` will run type(default) automaticly. # value_names_been_set should ignore these names. if not isinstance(string, StringAsDefault): value_names_been_set.add(name) return func(string) return wrapper # add options for collected hyper-parameters for k, v in hp_mgr.get_values().items(): # this is just a simple hack option_name = "--{}".format(k.replace("_", "-")) if _get_argument_type_by_value(v) == bool: # argparse does not directly support bool types. parser.add_argument( option_name, type=_make_value_names_been_set_injection(k, str2bool), default=v, help=help, ) else: if isinstance(v, str): # if isinstance(v, str), mark as StringAsDefault v = StringAsDefault(v) parser.add_argument( option_name, type=_make_value_names_been_set_injection( k, _get_argument_type_by_value(v)), default=v, help=help, ) make_option = lambda name: "--{}-{}".format(action_prefix, name) for action in inject_actions: if action == "list": parser.add_argument( make_option("list"), action="store", default=None, const="yaml", nargs="?", choices=["detail", "yaml", "json"], help=("List all available hyperparameters. If `{} detail` is" " specified, a verbose table will be print").format( make_option("list")), ) elif action == "detail": parser.add_argument( make_option("detail"), action="store_true", help="Shorthand for --hp-list detail", ) elif action == "save": parser.add_argument( make_option("save"), help=("Save hyperparameters to a file. The hyperparameters" " are saved after processing of all other options"), ) elif action == "load": parser.add_argument( make_option("load"), help=("Load hyperparameters from a file. The hyperparameters" " are loaded before any other options are processed"), ) if "load" in inject_actions or "save" in inject_actions: parser.add_argument( make_option("serial-format"), default=serial_format, choices=config.HP_SERIAL_FORMAT_CHOICES, help=("Format of the saved config file. Defaults to {}." " It can be set to override auto file type deduction." ).format(serial_format), ) if inject_actions: parser.add_argument( make_option("exit"), action="store_true", help="process all hpargparse actions and quit", ) def __hpargparse_value_names_been_set(self): return value_names_been_set parser.__hpargparse_value_names_been_set = MethodType( __hpargparse_value_names_been_set, parser) return parser
from hpman import HyperParameterManager _ = HyperParameterManager("_") def func(): pass hpx = _("10", 123) xxx = _("20", {"a": 1, "b": 2}) bbb = _("30", ["a", 1, 4]) ccc = _("40", ["a", 1, 4]) xxa = _("50", 1.24) fff = _("60", 1e-5) ggg = _("70", 1 // 2) hhh = _("80", print) hpp = _("90", func())