o
    Ơi                     @   s>  U d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlm	Z	m
Z
 eeZedddZeejdejej f  ed< ejdejdejf d	Zd
Zeed< e	ddG dd deje Ze	ddG dd dZdd Ze	ddG dd dZG dd dZdejdefddZe jdde dedej!fddZ"dS )     N)
ContextVar)	dataclassfield
_CALLBACKS)defaultObserverTObserverCallback.)boundFRETHROW_CALLBACK_EXCEPTIONT)frozenc                   @   sh   e Zd ZU dZdZeed< edd dZe	ed< de
d	ejfd
dZdddZd	ejej fddZdS )r   z
    Usage:

    >>> some_observer: Observer = ...
    >>> with some_observer.add(callback_func):
    >>>     # do stuff, and when some_observer.observe() is called,
    >>>     # it will execute callback_func()
    >>>     ...

     namec                   C   s   t  S N)object r   r   R/home/ubuntu/.local/lib/python3.10/site-packages/torch_tensorrt/dynamo/observer.py<lambda>+   s    zObserver.<lambda>)default_factory	unique_idcallbackreturnc                    s(       tj fdd}| S )Nc                   3   s\    zd V  W z
    W d S  ty   Y d S w z	    W w  ty-   Y w w r   )_get_callbacksremove
ValueErrorr   r   selfr   r   _add3   s   zObserver.add.<locals>._add)r   append
contextlibcontextmanager)r   r   r   r   r   r   add-   s   zObserver.addNc              	   O   sL   |   D ]}tdtd ||i | W d    n1 sw   Y  qd S )NzError calling observer callback)rethrow)r   
_log_errorr
   )r   argskwargsr   r   r   r   observeB   s   zObserver.observec                 C   s6   t  }|du ri }t | | |vrg || < ||  S )z
        Gets the callbacks registered in current execution context. Any code
        that manipulates the returned list (add, remove, iterate) is
        concurrency safe.
        N)r   getset)r   callbacks_dictr   r   r   r   I   s   
zObserver._get_callbacks)r   N)__name__
__module____qualname____doc__r   str__annotations__r   r   r   r   tContextManagerr    r%   ListCallabler   r   r   r   r   r      s   
 
c                   @   sN   e Zd ZU dZejed< ejej ed< ej	e
ejf ed< dZejed< dS )ObserveContexta  
    Passed to the registered callables that observes any function decorated by
    `observable`. See `observable` for detail.

    Attributes:
        callable: the observed callable object
        args: the args passed to the callable
        kwargs: the kwargs passed to the callable
        return_value: the return value returned by the callable, only available
            when observing the callable after its invocation (via
            `CallableObservers.post`)
    callabler#   r$   Nreturn_value)r)   r*   r+   r,   r/   r2   r.   r1   AnyMappingr-   r5   r   r   r   r   r3   Z   s   
 
r3   c                  C   s   dt dtfdd} | S )a  
    A decorator to turn a function into observable

    Example:

    >>> @observable()
    >>> def func_to_observe(x, y) -> int:
    >>>     ...
    >>>
    >>> def log(ctx: ObserveContext):
    >>>     print(
    >>>         f"called {ctx.callable.__name__} with {ctx.args} {ctx.kwargs}"
    >>>     )
    >>>
    >>> # register:
    >>> with func_to_observe.observers.pre.add(log):
    >>>     func_to_observe(1, 2)
    >>>     # print out "called func_to_observe with (1,2)
    >>> # here it won't print
    observed_funcr   c                 S   s   t | d}t| |S )N)	orig_func)_make_observable	functoolswraps)r8   wrapped_funcr   r   r   	decorator   s   
zobservable.<locals>.decorator)r4   ObservedCallable)r>   r   r   r   
observableo   s   r@   c                   @   s>   e Zd ZU eejegdf  ed< eejegdf  ed< dS )CallableObserversNprepost)r)   r*   r+   r   r/   r2   r3   r.   r   r   r   r   rA      s   
 rA   c                   @   s2   e Zd ZU dZeed< eed< dejfddZ	dS )r?   z,
    Interface for an observed callable
    	observersr9   r   c                 O   s   t  r   )NotImplementedError)r   r#   r$   r   r   r   __call__   s   zObservedCallable.__call__N)
r)   r*   r+   r,   rA   r.   r4   r/   r6   rF   r   r   r   r   r?      s
   
 r?   r9   r   c                    s8   t t t d t fdd}|_ |_|S )z;
    A wrapper for a callable which is to be observed.
    )rB   rC   c                     s\    j t| | d }z| i |}|W  jt| || S  jt| || w r   )rB   r%   r3   rC   )r#   r$   r5   rD   r9   r   r   r8      s   z'_make_observable.<locals>.observed_func)rA   r   r;   r<   r9   rD   )r9   r8   r   rG   r   r:      s   r:   msgr!   c              
   c   sX    zd V  W d S  t y+ } z|}t|  dt   |r  W Y d }~d S d }~ww )Nz (This error is handled): )	Exception_LOGGERinfo	traceback
format_exc)rH   r!   e_er   r   r   r"      s   r"   )F)#r   r;   loggingrL   typingr/   contextvarsr   dataclassesr   r   	getLoggerr)   rJ   r   Dictr1   r2   r.   TypeVarr6   r   r
   boolGenericr   r3   r@   rA   r?   r:   r   r-   r0   r"   r   r   r   r   <module>   s0   
 
$> 