Source code for jammy.utils.hyd

import inspect
import os
import os.path as osp
from collections.abc import Mapping
from functools import partial, update_wrapper

import hydra
from omegaconf import DictConfig, OmegaConf

from jammy import io
from jammy.logging import get_logger
from jammy.utils import imp

logger = get_logger()

__all__ = ["hydpath", "instantiate", "hyd_instantiate", "link_hyd_run", "update_cfg"]


def path(input_path=None):
    if input_path is None or len(input_path) == 0:
        return hydra.utils.to_absolute_path(".")
    if input_path[0] == "/":
        return input_path
    if input_path[0] == "~":
        return osp.expanduser(input_path)
    return hydra.utils.to_absolute_path(input_path)


[docs]def hydpath(input_path=None): return path(input_path)
[docs]def hyd_instantiate(_cfg, *args, **kwargs): """ A helper func helps initialize from omegaconf(hydra) _cfg Args: _cfg: omegaconf.DictConfig, must contain `_target_` key word if `param` or `params` present in the _cfg, they are high priority to initialize instance otherwise, use _cfg Note: when use the method pay attention to the parameters order args and kwargs: other parameters needed to initialize network """ if _cfg is None: stack = inspect.stack()[1] logger.info( f"File {stack.filename} {stack.lineno}: {stack.function} creating None object" ) return None module = imp.load_class(_cfg["_target_"]) if "params" in _cfg: _params = OmegaConf.to_container(_cfg.params, resolve=True) elif "param" in _cfg: _params = OmegaConf.to_container(_cfg.param, resolve=True) else: _params = OmegaConf.to_container(_cfg, resolve=True) del _params["_target_"] if inspect.isclass(module): return module(*args, **kwargs, **_params) if inspect.isfunction(module): partial_fn = partial(module, *args, **kwargs, **_params) update_wrapper(partial_fn, module) return partial_fn raise RuntimeError(" only support function and class")
[docs]def instantiate(_cfg, *args, **kwargs): """ A helper func helps instantiate from omegaconf(hydra) _cfg Args: _cfg: omegaconf.DictConfig, must contain `_target_` key word if `param` or `params` present in the _cfg, they are high priority to initialize instance otherwise, use _cfg Note: when use the method pay attention to the parameters order args and kwargs: other parameters needed to initialize network """ instance_ = hyd_instantiate(_cfg, *args, **kwargs) if inspect.isfunction(instance_): return instance_() if isinstance(instance_, partial): return instance_() return instance_
def flatten_dict(cfg): rtn = {} for k, v in cfg.items(): if isinstance(v, Mapping): sub = {f"{k}.{sub_k}": sub_v for sub_k, sub_v in flatten_dict(v).items()} rtn.update(sub) else: rtn[k] = v return rtn
[docs]def update_cfg(cfg: DictConfig, dotlist): new_conf = OmegaConf.from_dotlist(dotlist) return OmegaConf.merge(cfg, new_conf)