o
    wi7                     @   s   d dl Z d dlZd dlmZmZmZmZ d dlmZ	 d dl
mZ d dlmZ G dd dZded	ed
dfddZe  e dd  ddgZdS )    N)AnyCallableListOptional)Callback)BaseCallback)OneLoggerNeMoCallbackc                   @   s   e Zd ZU dZdZed  ed< edddZdddZ	d	e
ddfd
dZdededdfddZeded fddZdedefddZdddZdS )CallbackGroupa  A singleton registry to host and fan-out lifecycle callbacks.

    Other code should call methods on this group (e.g., `on_model_init_start`).
    The group will iterate all registered callbacks and, if a callback implements
    the method, invoke it with the provided arguments.
    N	_instancereturnc                 C   s   | j du r	t | _ | j S )zzGet the singleton instance of CallbackGroup.

        Returns:
            CallbackGroup: The singleton instance.
        N)r
   r	   )cls r   Z/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/nemo/lightning/callback_group.pyget_instance"   s   
zCallbackGroup.get_instancec                 C   s   t  g| _d| _d S )NF)r   
_callbacks_app_end_emittedselfr   r   r   __init__-   s   

zCallbackGroup.__init__callbackc                 C   s   | j | dS )zrRegister a callback to the callback group.

        Args:
            callback: The callback to register.
        N)r   append)r   r   r   r   r   register2   s   zCallbackGroup.registernemo_versiontrainerc              	   K   s   g }| j D ]%}t|tsqt|dr%t|d}t|r%|d
||d| || qtt|dg }dd |D }|| }	|	D ].}z#t|dd}
t|
tsd|j	j
 dt|j	d	|j	j }t|d| W q@ tyn   Y q@w |	|_dS )am  Update configuration across all registered callbacks and attach them to trainer.

        Args:
            nemo_version: Version key (e.g., 'v1' or 'v2') for downstream config builders.
            trainer: Lightning Trainer to which callbacks should be attached if missing.
            **kwargs: Forwarded to each callback's update_config implementation.
        update_config)r   r   	callbacksc                 S   s   g | ]	}t |tr|qS r   )
isinstancePTLCallback).0cbr   r   r   
<listcomp>P   s    z/CallbackGroup.update_config.<locals>.<listcomp>	state_keyN.__qualname__r   )r   r   r   hasattrgetattrcallabler   liststr	__class__
__module____name__setattr	Exceptionr   )r   r   r   kwargssanitized_group_callbacksr   methodexistingsanitized_trainer_callbacksr   keysafe_keyr   r   r   r   :   s0   	





zCallbackGroup.update_configr   c                 C   s   | j S )z~Get the list of registered callbacks.

        Returns:
            List[BaseCallback]: List of registered callbacks.
        )r   r   r   r   r   r   b   s   zCallbackGroup.callbacksmethod_namec                    s    fdd}|S )zDynamically create a dispatcher for unknown attributes.

        Any attribute access is treated as a lifecycle method name.
        When invoked, the dispatcher will call that method on each registered
        callback if it exists.
        c                     s:   j D ]}t| rt| }t|r|| i | qd S N)r   r$   r%   r&   )argsr.   r   r0   r5   r   r   r   
dispatchers   s   


z-CallbackGroup.__getattr__.<locals>.dispatcherr   )r   r5   r9   r   r8   r   __getattr__k   s   zCallbackGroup.__getattr__c                 O   sJ   | j rdS d| _ | jD ]}t|dr"t|d}t|r"||i | qdS )zEmit application-end callbacks exactly once per process.

        Invokes `on_app_end` on each registered callback, if present. Subsequent
        calls are no-ops. All positional and keyword arguments are forwarded.
        NT
on_app_end)r   r   r$   r%   r&   )r   r7   r.   r   r0   r   r   r   r;   }   s   


zCallbackGroup.on_app_end)r   r	   )r   N)r+   r*   r#   __doc__r
   r   __annotations__classmethodr   r   r   r   r(   r   r   propertyr   r   r   r:   r;   r   r   r   r   r	      s   
 

(r	   start_callbackend_callbackr   c                    sN   t | dsdS | jtddrdS t fdd}d|_|| _dS )a  Hook a class's __init__ to emit CallbackGroup start/end hooks.

    Args:
        cls (type): Class whose __init__ should be wrapped.
        start_callback (str): CallbackGroup method to call before __init__.
        end_callback (str): CallbackGroup method to call after __init__.
    r   N_init_wrapped_for_callbacksFc                    s|   t | ddr| g|R i |S t| dd t }t|r&t |  | g|R i |}t| r<t |   |S )N_in_wrapped_initFT)r%   r,   r	   r   r$   )r   r7   r.   groupresultrA   original_initr@   r   r   wrapped_init   s   

z4hook_class_init_with_callbacks.<locals>.wrapped_initT)r$   r   r%   	functoolswrapsrB   )r   r@   rA   rH   r   rF   r   hook_class_init_with_callbacks   s   

rK   c                   C   s   t   S r6   )r	   r   r;   r   r   r   r   <lambda>   s    rL   )atexitrI   typingr   r   r   r   lightning.pytorch.callbacksr   r   nemo.lightning.base_callbackr   "nemo.lightning.one_logger_callbackr   r	   r(   rK   r   r   __all__r   r   r   r   <module>   s   u&