o
    ÜÜÓhV  ã                   @   st   d dl Z d dlZd dlZd dlmZ ddlmZmZ G dd„ dƒZdd„ Z	d	d
„ Z
G dd„ dƒZdd„ Zdd„ ZdS )é    N)ÚModuleé   )ÚExactWeakKeyDictionaryÚis_lazy_modulec                   @   s*   e Zd Zeƒ Zdd„ Zdd„ Zdd„ ZdS )ÚMutationTrackerc                 C   s   d| _ g | _d S )Nr   )Úmutation_countÚwatchers)Úself© r
   úR/var/www/html/ai/venv/lib/python3.10/site-packages/torch/_dynamo/mutation_guard.pyÚ__init__   s   
zMutationTracker.__init__c                 C   s@   |  j d7  _ | j}g | _|D ]}|ƒ }|d ur| |¡ qd S )Nr   )r   r   Ú
invalidate)r	   ÚnameÚtmpÚrefÚguardedr
   r
   r   Úon_mutation   s   
€ýzMutationTracker.on_mutationc                 C   s   | j  t |¡¡ d S ©N)r   ÚappendÚweakrefr   )r	   Úguarded_coder
   r
   r   Útrack   s   zMutationTracker.trackN)Ú__name__Ú
__module__Ú__qualname__r   Údbr   r   r   r
   r
   r
   r   r   
   s
    	r   c                 C   s:   t t| ƒƒ | tjvrtƒ tj| < tj|  }| |¡ dS )z+invalidate guarded_code when obj is mutatedN)Úensure_patchedÚtyper   r   r   )Úobjr   Útrackerr
   r
   r   Úwatch   s
   

r    c                    s<   t | ddƒrd| _| j‰ t ˆ ¡‡ fdd„ƒ}|| _d S d S )NÚ___needs_mutation_patchTFc                    s4   z
t j|   |¡ W n	 ty   Y nw ˆ | ||ƒS r   )r   r   r   ÚKeyError)r	   ÚkeyÚvalue©Úoriginal_setattrr
   r   Úcustom_setattr-   s   ÿz&ensure_patched.<locals>.custom_setattr)Úgetattrr!   Ú__setattr__Ú	functoolsÚwraps)Úclsr'   r
   r%   r   r   (   s   
ôr   c                   @   sL   e Zd ZdZeƒ Zeƒ Zedd„ ƒZe	dd„ ƒZ
edd„ ƒZedd	„ ƒZd
S )ÚGenerationTrackerr   c                 C   s   | j | j|< d S r   )Ú
generationÚgeneration_values©r,   r   r
   r
   r   Útag=   s   zGenerationTracker.tagc                 C   s    t | tjjƒs	J ‚dtj| < d S )NT)Ú
issubclassÚtorchÚnnr   r-   Údynamic_classes)r,   r
   r
   r   Úmark_class_dynamicA   s   z$GenerationTracker.mark_class_dynamicc                 C   s   || j vrdS | j | S )Néÿÿÿÿ)r/   r0   r
   r
   r   Úget_generation_valueF   s   

z&GenerationTracker.get_generation_valuec                 C   s   || j v o| j | | jkS r   )r/   r.   r0   r
   r
   r   ÚcheckL   s   
þzGenerationTracker.checkN)r   r   r   r.   r   r5   r/   Úclassmethodr1   Ústaticmethodr6   r8   r9   r
   r
   r
   r   r-   8   s    


r-   c                 C   sV   t | tjjƒrd| jv rdS t| dƒr| jS t| ƒrdS tj	 
t| ƒ¡p(t | ¡}|S )z5Check for nn.Modules() created dynamically or mutatedÚforwardTÚtorchdynamo_force_dynamicF)Ú
isinstancer3   r4   r   Ú__dict__Úhasattrr=   r   r-   r5   Úgetr   r9   )r   Údynr
   r
   r   Úis_dynamic_nn_moduleT   s   
ÿrC   c                     sT   t tddƒr!tj‰ ‡ fdd„} | t_tj‰‡fdd„}|t_dt_t jd7  _d	S )
z¥
    Monkey patch torch.nn.Module.__init__ and torch.nn.Module.__setstate__
    so we can detect nn.Module instances created dynamically inside forward methods.
    Ú___needs_generation_tag_patchTc                    s$   ˆ | g|¢R i |¤Ž t  | ¡ d S r   ©r-   r1   )r	   ÚargsÚkwargs)Úinitr
   r   Úpatched_initl   s   z5install_generation_tagging_init.<locals>.patched_initc                    s   ˆ | |ƒ t  | ¡ d S r   rE   )r	   Ústate)Úsetstater
   r   Úpatched_setstatet   s   
z9install_generation_tagging_init.<locals>.patched_setstateFr   N)r(   r   r   Ú__setstate__rD   r-   r.   )rI   rL   r
   )rH   rK   r   Úinstall_generation_tagging_initc   s   rN   )r*   r   Útorch.nnr3   r   Úutilsr   r   r   r    r   r-   rC   rN   r
   r
   r
   r   Ú<module>   s    
