o
    }oi                     @   s8   d dl Z d dlmZmZ d dlmZ G dd deZdS )    N)CallableOptional)LambdaCallbackc                L       s  e Zd ZdZddhZh dZ																																					d4dee dee dee d	ee d
ee dee dee dee dee dee dee dee dee dee dee dee dee dee dee dee dee dee dee dee dee dee d ee d!ee d"ee d#ee d$ee d%ee d&ee d'ee d(ee d)ee d*ee fJ fd+d,Zd-e	d.ee	 fd/d0Z
d1ed.efd2d3Z  ZS )5ModelCallbacka  
    A callback that extends LambdaCallback to intelligently handle function parameters.
    Functions can take either (trainer, pl_module), just (pl_module), or just (trainer).

    Supported parameter names:
    - trainer, pl_trainer
    - model, pl_model, pl_module, module

    Example:
        >>> # Using with torch.compile
        >>> callback = ModelCallback(on_train_start=torch.compile)
        >>>
        >>> # Using with thunder_compile
        >>> callback = ModelCallback(on_train_start=thunder_compile)
        >>>
        >>> # Mix different callbacks
        >>> callback = ModelCallback(
        ...     on_train_start=lambda model: torch.compile(model),
        ...     on_fit_start=lambda trainer, model: print(f"Starting fit with {model}")
        ... )
    trainer
pl_trainer>   modelmodulepl_model	pl_moduleNsetupteardownon_fit_start
on_fit_endon_sanity_check_starton_sanity_check_endon_train_batch_starton_train_batch_endon_train_epoch_starton_train_epoch_endon_validation_epoch_starton_validation_epoch_endon_test_epoch_starton_test_epoch_endon_validation_batch_starton_validation_batch_endon_test_batch_starton_test_batch_endon_train_starton_train_endon_validation_starton_validation_endon_test_starton_test_endon_exceptionon_save_checkpointon_load_checkpointon_before_backwardon_after_backwardon_before_optimizer_stepon_before_zero_gradon_predict_starton_predict_endon_predict_batch_starton_predict_batch_endon_predict_epoch_starton_predict_epoch_endc&           '         s.    fddt   D }&t jdi |& d S )Nc                    s4   i | ]\}}|d kr|dkr|dur|  |qS )self	__class__N)
_wrap_func).0namefuncr1    c/home/ubuntu/.local/lib/python3.10/site-packages/nemo/lightning/pytorch/callbacks/model_callback.py
<dictcomp>X   s
    
z*ModelCallback.__init__.<locals>.<dictcomp>r8   )localsitemssuper__init__)'r1   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   	callbacksr2   r7   r9   r>   /   s   
)zModelCallback.__init__
param_namereturnc                 C   s(   |  }|| jv rdS || jv rdS dS )z9Determine if a parameter name refers to trainer or model.r   r   N)lowerTRAINER_PARAMSMODEL_PARAMS)r1   rA   r8   r8   r9   _get_param_type`   s   

zModelCallback._get_param_typer6   c                    s$   t  }|j fdd}|S )z<Wraps a function to handle parameter inspection and passing.c           	         s   i }  D ]C\}}|}|dkr| ||< q|dkr!|||< qtdkr,|||< qtdkrBt|dkr=| ||< q|||< qtd| dz di |W S  tyx } ztdt d	rd jn  d
|  dt| |d }~ww )Nr   r         r   z+Unable to determine parameter mapping for 'zt'. Please use recognized parameter names: trainer/pl_trainer for trainer, model/pl_model/pl_module/module for model.z!Failed to call callback function __name__z. Attempted to pass arguments: z	. Error: r8   )	r<   rF   len
ValueError	TypeErrorhasattrrI   keysstr)	r   r   argskwargs	call_argsrA   param
param_typeer6   paramsr1   r8   r9   wrappedn   s<   






z)ModelCallback._wrap_func.<locals>.wrapped)inspect	signature
parameters)r1   r6   sigrX   r8   rV   r9   r3   i   s   
#zModelCallback._wrap_func)%NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN)rI   
__module____qualname____doc__rD   rE   r   r   r>   rO   rF   r3   __classcell__r8   r8   r@   r9   r      s    	
 !"#$%&1	r   )rY   typingr   r   lightning.pytorch.callbacksr   r   r8   r8   r8   r9   <module>   s   