| | |
| | import datetime |
| | import logging |
| | import os.path as osp |
| | from typing import Optional |
| |
|
| | from mmengine.fileio import dump |
| | from mmengine.logging import print_log |
| | from . import root |
| | from .default_scope import DefaultScope |
| | from .registry import Registry |
| |
|
| |
|
| | def traverse_registry_tree(registry: Registry, verbose: bool = True) -> list: |
| | """Traverse the whole registry tree from any given node, and collect |
| | information of all registered modules in this registry tree. |
| | |
| | Args: |
| | registry (Registry): a registry node in the registry tree. |
| | verbose (bool): Whether to print log. Defaults to True |
| | |
| | Returns: |
| | list: Statistic results of all modules in each node of the registry |
| | tree. |
| | """ |
| | root_registry = registry.root |
| | modules_info = [] |
| |
|
| | def _dfs_registry(_registry): |
| | if isinstance(_registry, Registry): |
| | num_modules = len(_registry.module_dict) |
| | scope = _registry.scope |
| | registry_info = dict(num_modules=num_modules, scope=scope) |
| | for name, registered_class in _registry.module_dict.items(): |
| | folder = '/'.join(registered_class.__module__.split('.')[:-1]) |
| | if folder in registry_info: |
| | registry_info[folder].append(name) |
| | else: |
| | registry_info[folder] = [name] |
| | if verbose: |
| | print_log( |
| | f"Find {num_modules} modules in {scope}'s " |
| | f"'{_registry.name}' registry ", |
| | logger='current') |
| | modules_info.append(registry_info) |
| | else: |
| | return |
| | for _, child in _registry.children.items(): |
| | _dfs_registry(child) |
| |
|
| | _dfs_registry(root_registry) |
| | return modules_info |
| |
|
| |
|
| | def count_registered_modules(save_path: Optional[str] = None, |
| | verbose: bool = True) -> dict: |
| | """Scan all modules in MMEngine's root and child registries and dump to |
| | json. |
| | |
| | Args: |
| | save_path (str, optional): Path to save the json file. |
| | verbose (bool): Whether to print log. Defaults to True. |
| | |
| | Returns: |
| | dict: Statistic results of all registered modules. |
| | """ |
| | |
| | import mmengine.dataset |
| | import mmengine.evaluator |
| | import mmengine.hooks |
| | import mmengine.model |
| | import mmengine.optim |
| | import mmengine.runner |
| | import mmengine.visualization |
| |
|
| | registries_info = {} |
| | |
| | for item in dir(root): |
| | if not item.startswith('__'): |
| | registry = getattr(root, item) |
| | if isinstance(registry, Registry): |
| | registries_info[item] = traverse_registry_tree( |
| | registry, verbose) |
| | scan_data = dict( |
| | scan_date=datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), |
| | registries=registries_info) |
| | if verbose: |
| | print_log( |
| | f'Finish registry analysis, got: {scan_data}', logger='current') |
| | if save_path is not None: |
| | json_path = osp.join(save_path, 'modules_statistic_results.json') |
| | dump(scan_data, json_path, indent=2) |
| | print_log(f'Result has been saved to {json_path}', logger='current') |
| | return scan_data |
| |
|
| |
|
| | def init_default_scope(scope: str) -> None: |
| | """Initialize the given default scope. |
| | |
| | Args: |
| | scope (str): The name of the default scope. |
| | """ |
| | never_created = DefaultScope.get_current_instance( |
| | ) is None or not DefaultScope.check_instance_created(scope) |
| | if never_created: |
| | DefaultScope.get_instance(scope, scope_name=scope) |
| | return |
| | current_scope = DefaultScope.get_current_instance() |
| | if current_scope.scope_name != scope: |
| | print_log( |
| | 'The current default scope ' |
| | f'"{current_scope.scope_name}" is not "{scope}", ' |
| | '`init_default_scope` will force set the current' |
| | f'default scope to "{scope}".', |
| | logger='current', |
| | level=logging.WARNING) |
| | |
| | new_instance_name = f'{scope}-{datetime.datetime.now()}' |
| | DefaultScope.get_instance(new_instance_name, scope_name=scope) |
| |
|