Source code for params_proto.v2.utils

import re

from typing import MutableMapping

ANSI_CLEANER = re.compile(r"(\x9B|\x1B\[)[0-?]*[ -/]*[@-~]")


def clean_ansi(string: str):
    return ANSI_CLEANER.sub("", string)


[docs] def dot_to_deps(dot_dict, *prefixes): # Note: regularize for prefixes that contain dots for p in prefixes: assert p, f"prefix {[p]} can not be empty." if prefixes == (".",): prefixes = [] else: full_prefix = ".".join(prefixes) assert ".." not in full_prefix prefixes: list = full_prefix.split('.') l = len(prefixes) child_deps = {} for k, v in dot_dict.items(): if k == ".": child_deps['.'] = v continue path: list = k.split('.') if path[:l] == prefixes: rest = path[l:] if len(rest) == 1: child_deps[rest[0]] = v elif rest[0] in child_deps: child_deps[rest[0]]['.'.join(rest[1:])] = v else: child_deps[rest[0]] = {'.'.join(rest[1:]): v} return child_deps
def read_deps(*path: str, should_flatten: bool = True) -> dict: """ Read YAML configuration file with additional functionality for Fast NeRF. Parameters ---------- path: path to the config file should_flatten: whether to flatten dicts within the config file Returns ------- Dict where the config is flattened and base configuration loaded, if applicable. """ import os import yaml path = os.path.join(*path) dirname = os.path.dirname(path) with open(path, "r") as f: deps: dict = yaml.load(f, yaml.SafeLoader) print(f"Loaded config file {path}") if should_flatten: deps = flatten(deps) if "_base" in deps: # Load base config template if required base = deps.pop("_base") base_deps = read_deps(dirname, base) deps = {**base_deps, **deps} print(f"Loaded and merged base config template {base}") return deps def flatten(nested_dict: dict, parent_key: str = "", sep: str = ".", generic_key: str = "_flatten", ) -> dict: """ Flatten configuration dict. Use the "_flatten: False" key and value to flatten the dict in the YAML configuration files. """ items = [] for k, v in nested_dict.items(): new_key = parent_key + sep + k if parent_key else k if isinstance(v, MutableMapping): if generic_key in v: assert v[generic_key] is False, "_flatten key needs to be False, currently True" items.append( (new_key, {key: value for key, value in v.items() if key != generic_key}) ) else: items.extend(flatten(v, new_key, sep, generic_key).items()) else: items.append((new_key, v)) return dict(items) if __name__ == "__main__": empty = {} _ = dot_to_deps(empty) assert _ == {}, "result should be empty" set_self = {".": 10} # should preserve _ = dot_to_deps(set_self) assert _ == {'.': 10}, "should contain dot" set_bunch = {"resources.teacher.replica_hint": 10, } _ = dot_to_deps(set_bunch, 'resources') assert _ == {'teacher': {'replica_hint': 10}}, "should contain nested dict" _ = dot_to_deps({'root.launch_type': 'local'}, "root") assert _ == {"launch_type": 'local'} _ = dot_to_deps({'resources.teacher.replicas_hint': 10}, "resources.teacher") assert _ == {"replicas_hint": 10}