Source code for gigl.experimental.knowledge_graph_embedding.lib.config.hydra_utils

from enum import Enum
from typing import Any, Type, Union


[docs] def get_fully_qualified_name(cls_or_obj: Union[Type, Any]) -> str: """ Returns the fully qualified name (module.ClassName) for a class or object. Handles both classes and instances by getting the type of the instance. This is useful for generating Hydra _target_ paths for dynamic instantiation. Args: cls_or_obj: Either a class type or an instance of a class. Returns: str: The fully qualified name in the format "module.ClassName". """ cls = cls_or_obj if isinstance(cls_or_obj, type) else type(cls_or_obj) return f"{cls.__module__}.{cls.__qualname__}"
[docs] def build_hydra_dict_from_object(obj: Any) -> Any: """ Builds a Hydra-compatible dictionary from a dataclass or namedtuple. Recursively processes object attributes and adds '_target_' fields for Hydra instantiation. Handles nested structures, lists, and various Python types. Autonomously converts NewType instances to their base string representation. Args: obj: The object to convert. Can be a dataclass, namedtuple, list, enum, or primitive type (str, int, float, bool, None). Returns: Any: A dictionary (for complex objects) or the original value (for primitives) that can be used in Hydra configuration files. Complex objects include a '_target_' field pointing to their fully qualified class name. """ # 1. Handle NamedTuples if isinstance(obj, tuple) and hasattr(obj, "_asdict"): data_dict = {} obj_type = type(obj) target_path = get_fully_qualified_name(obj_type) if target_path: data_dict["_target_"] = target_path for field_name, field_value in obj._asdict().items(): data_dict[field_name] = build_hydra_dict_from_object(field_value) return data_dict # 2. Handle Dataclasses elif hasattr(obj, "__dataclass_fields__"): data_dict = {} obj_type = type(obj) target_path = get_fully_qualified_name(obj_type) if target_path: data_dict["_target_"] = target_path for field in obj.__dataclass_fields__.values(): field_value = getattr(obj, field.name) data_dict[field.name] = build_hydra_dict_from_object(field_value) return data_dict # 3. Handle Lists (recursive) elif isinstance(obj, list): return [build_hydra_dict_from_object(item) for item in obj] # 4. Handle Enum instances generically elif isinstance(obj, Enum): # Convert Enum to its value. This is generic for all Enums. return obj.value # 5. Handle all other primitive types (str, int, float, bool, None) else: return obj