o
    
۾i                     @   s   d Z ddlZddlmZ ddlmZ ddlmZ ddlm	Z	 er,ddl
mZ ddlmZ e	eZG d	d
 d
Zeddd dS )z6Factory for weight transfer engines with lazy loading.    N)Callable)TYPE_CHECKING)WeightTransferEngine)init_logger)ParallelConfig)WeightTransferConfigc                
   @   sz   e Zd ZU dZi Zeeeg ee	 f f e
d< e	ddedeee	 B dedB ddfdd	Zed
dddde	fddZdS )WeightTransferEngineFactorya[  Factory for creating weight transfer engines with lazy loading.

    This factory implements a registry pattern that supports:
    - Lazy loading: Engine modules are only imported when actually needed
    - Extensibility: Custom engines can be registered at runtime
    - Centralized registration: All built-in engines registered in one place
    	_registryNnamemodule_path_or_cls
class_namereturnc                    sx   || j v rtd| dt|tr/| du rtddtt f fdd}|| j |< dS |fdd	| j |< dS )
a{  Register an engine with lazy-loading or direct class reference.

        Supports two calling conventions:
        1. Lazy loading: register_engine(name, module_path, class_name)
        2. Direct class: register_engine(name, engine_cls)

        Args:
            name: The name to register the engine under (e.g., "nccl")
            module_path_or_cls: Either a module path string for lazy loading,
                or the engine class directly
            class_name: Name of the engine class (required if module_path is string)

        Raises:
            ValueError: If an engine with the same name is already registered
        zWeight transfer engine 'z' is already registered.Nz8class_name is required when registering with module pathr   c                     s   t } t|  S N)	importlibimport_modulegetattr)module)r   module_path \/home/ubuntu/.local/lib/python3.10/site-packages/vllm/distributed/weight_transfer/factory.pyloader?   s   

z;WeightTransferEngineFactory.register_engine.<locals>.loaderc                      s    S r   r   r   )
engine_clsr   r   <lambda>G   s    z=WeightTransferEngineFactory.register_engine.<locals>.<lambda>)r	   
ValueError
isinstancestrtyper   )clsr
   r   r   r   r   )r   r   r   r   register_engine   s   

z+WeightTransferEngineFactory.register_engineconfigr   parallel_configr   c                 C   sV   |j }|| jvrt| j }td| d| | j|  }td|j |||S )ai  Create a weight transfer engine instance.

        Args:
            config: Weight transfer configuration containing the backend name
            parallel_config: Parallel configuration for the engine

        Returns:
            An initialized weight transfer engine instance

        Raises:
            ValueError: If the backend is not registered
        z!Invalid weight transfer backend: z. Available engines: z#Creating weight transfer engine: %s)backendr	   listkeysr   loggerinfo__name__)r   r   r    r!   	availabler   r   r   r   create_engineI   s   

z)WeightTransferEngineFactory.create_enginer   )r&   
__module____qualname____doc__r	   dictr   r   r   r   __annotations__classmethodr   r(   r   r   r   r   r      s,   
  
*r   ncclz,vllm.distributed.weight_transfer.nccl_engineNCCLWeightTransferEngine)r+   r   collections.abcr   typingr   %vllm.distributed.weight_transfer.baser   vllm.loggerr   vllm.config.parallelr   vllm.config.weight_transferr   r&   r$   r   r   r   r   r   r   <module>   s    ]