Source code for protomotions.utils.hydra_replacement
# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
"""
Simple replacement for hydra.utils functions to avoid the heavy hydra-core dependency.
Provides get_class and instantiate functions with compatible APIs.
"""
import importlib
from typing import Any
[docs]
def get_class(path: str) -> type:
"""
Import and return a class from a string path.
Args:
path: Fully qualified class path, e.g., "torch.optim.Adam"
Returns:
The class object
Example:
>>> Adam = get_class("torch.optim.Adam")
>>> optimizer = Adam(params, lr=0.001)
"""
module_path, class_name = path.rsplit(".", 1)
module = importlib.import_module(module_path)
return getattr(module, class_name)
[docs]
def instantiate(config, **kwargs) -> Any:
"""
Instantiate a class from a config object.
Args:
config: Config object with _target_ attribute specifying the class path,
or a dict with '_target_' key
**kwargs: Additional keyword arguments to pass to the constructor,
overriding config values
Returns:
Instance of the specified class
Example:
>>> class Config:
... _target_ = "torch.optim.Adam"
... lr = 0.001
>>> optimizer = instantiate(config, params=model.parameters())
"""
# Handle both dict and object configs
if isinstance(config, dict):
target = config.get("_target_")
config_dict = {k: v for k, v in config.items() if k != "_target_"}
else:
target = getattr(config, "_target_", None)
config_dict = {
k: v
for k, v in vars(config).items()
if k != "_target_" and not k.startswith("_")
}
if target is None:
raise ValueError(
"Config must have a '_target_' attribute or key specifying the class path"
)
# Get the class
cls = get_class(target)
# Merge config and kwargs (kwargs take precedence)
merged_kwargs = {**config_dict, **kwargs}
# Instantiate and return
return cls(**merged_kwargs)