o
    }oi[                     @   s   d dl mZ d dlmZmZ d dlmZ d dlmZ	 d dl
mZ d dl
mZ edZedZededefd	d
Zeejdejde	jfddZeejdejde	jfddZeejdejdejfddZeejdejdejfddZdS )    )singledispatch)AnyTypeVar)plugins)
strategiesTFabricTobjreturnc              
   C   s>   t dt| j dt| j dt| j  dt| j d	)aF  
    Convert a PyTorch Lightning object to its Fabric equivalent.

    Args:
        obj: The object to convert.

    Returns:
        The Fabric equivalent of the input object.

    Raises:
        NotImplementedError: If no converter is registered for the object's type.

    Example:
        >>> from lightning.pytorch.strategies import Strategy as PLStrategy
        >>> from lightning.fabric.strategies import Strategy as FabricStrategy
        >>> from nemo.lightning.fabric.conversion import to_fabric
        >>>
        >>> # Define a custom PyTorch Lightning strategy
        >>> class CustomPLStrategy(PLStrategy):
        ...     def __init__(self, custom_param: str):
        ...         super().__init__()
        ...         self.custom_param = custom_param
        >>>
        >>> # Define a custom Fabric strategy
        >>> class CustomFabricStrategy(FabricStrategy):
        ...     def __init__(self, custom_param: str):
        ...         super().__init__()
        ...         self.custom_param = custom_param
        >>>
        >>> # Register a custom conversion
        >>> @to_fabric.register(CustomPLStrategy)
        ... def _custom_converter(strategy: CustomPLStrategy) -> CustomFabricStrategy:
        ...     return CustomFabricStrategy(custom_param=strategy.custom_param)
        >>>
        >>> # Use the custom conversion
        >>> pl_strategy = CustomPLStrategy(custom_param="test")
        >>> fabric_strategy = to_fabric(pl_strategy)
        >>> assert isinstance(fabric_strategy, CustomFabricStrategy)
        >>> assert fabric_strategy.custom_param == "test"
    z#No Fabric converter registered for z. To register a new conversion, use the @to_fabric.register decorator:

from nemo.lightning.fabric.conversion import to_fabric
from lightning.fabric import strategies as fl_strategies

@to_fabric.register(z)
def _z_converter(obj: a:  ) -> fl_strategies.Strategy:
    return fl_strategies.SomeStrategy(
        # Map relevant attributes from 'obj' to Fabric equivalent
        param1=obj.param1,
        param2=obj.param2,
        # ... other parameters ...
    )

Add this code to the appropriate module (e.g., nemo/lightning/fabric/conversion.py).)NotImplementedErrortype__name__lower)r	    r   T/home/ubuntu/.local/lib/python3.10/site-packages/nemo/lightning/fabric/conversion.py	to_fabric   s   *r   strategyc              	   C   s,   t jd| j| j| j| j| j| jd| jS )N)acceleratorparallel_devicescluster_environmentprocess_group_backendtimeoutstart_methodr   )	fl_strategiesDDPStrategyr   r   r   r   _timeout_start_method_ddp_kwargsr   r   r   r   _ddp_converterV   s   r   c                 C   s(   t jd| j| j| j| j| jd| jS )N)cpu_offloadr   r   r   r   r   )r   FSDPStrategyr    r   r   r   r   kwargsr   r   r   r   _fsdp_converterc   s   r#   pluginc                 C   s   t j| j| j| jdS )N)	precisiondevicescaler)
fl_pluginsMixedPrecisionr%   r&   r'   r$   r   r   r   _mixed_precision_convertero   s
   r+   c                 C   s   t j| jdS )N)r%   )r(   FSDPPrecisionr%   r*   r   r   r   _fsdp_precision_converterx   s   r-   N)	functoolsr   typingr   r   lightning.fabricr   r(   r   r   lightning.pytorch
pl_pluginspl_strategiesr   r   r   registerr   r   r!   r#   r)   r+   r,   r-   r   r   r   r   <module>   s$   
:


