o
    ß—¦i¼  ã                   @   sÆ   d dl Z d dlZd dlmZmZmZ d dlZd dlmZ ddl	m
Z
 ddlmZmZ ejjjZG dd„ dƒZd	ed
eddfdd„Zdeddfdd„ZG dd„ dƒZd	ededefdd„Zddd„ZdS )é    N)ÚAnyÚListÚType)ÚModuleé   )Úconfig)ÚExactWeakKeyDictionaryÚnn_module_has_global_hooksc                   @   sJ   e Zd ZU eƒ Zeed< ddd„Zdeddfdd„Zd	e	ddfd
d„Z
dS )ÚMutationTrackerÚdbÚreturnNc                 C   s   d| _ g | _d S ©Nr   )Úmutation_countÚwatchers)Úself© r   úZ/home/ubuntu/transcripts/venv/lib/python3.10/site-packages/torch/_dynamo/mutation_guard.pyÚ__init__   s   
zMutationTracker.__init__Únamec                 C   s@   |  j d7  _ | j}g | _|D ]}|ƒ }|d ur| |¡ qd S )Nr   )r   r   Ú
invalidate)r   r   ÚtmpÚrefÚguardedr   r   r   Úon_mutation   s   
€ýzMutationTracker.on_mutationÚguarded_codec                 C   s   | j  t |¡¡ d S ©N)r   ÚappendÚweakrefr   )r   r   r   r   r   Útrack   s   zMutationTracker.track©r   N)Ú__name__Ú
__module__Ú__qualname__r   r   Ú__annotations__r   Ústrr   r   r   r   r   r   r   r
      s
   
 
	r
   Úobjr   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   )r%   r   Útrackerr   r   r   Úwatch#   s
   

r)   Úclsc              	      sN   t | ddƒr%d| _| j‰ t ˆ ¡dtdtdtdd f‡ fdd	„ƒ}|| _d S d S )
NÚ___needs_mutation_patchTFr   ÚkeyÚvaluer   c                    s4   z
t j|   |¡ W n	 ty   Y nw ˆ | ||ƒS r   )r
   r   r   ÚKeyError)r   r,   r-   ©Úoriginal_setattrr   r   Úcustom_setattr2   s   ÿz&ensure_patched.<locals>.custom_setattr)Úgetattrr+   Ú__setattr__Ú	functoolsÚwrapsr   r$   )r*   r1   r   r/   r   r&   -   s    
ôr&   c                   @   s¤   e Zd ZU dZeed< eƒ Zeed< eƒ Zeed< e	de
ddfdd	„ƒZed
eejj ddfdd„ƒZe	de
defdd„ƒZe	de
defdd„ƒZe	ddd„ƒZdS )ÚGenerationTrackerr   Ú
generationÚdynamic_classesÚgeneration_valuesr%   r   Nc                 C   s   | j | j|< d S r   )r7   r9   ©r*   r%   r   r   r   ÚtagB   s   zGenerationTracker.tagr*   c                 C   s    t | tjjƒs	J ‚dtj| < d S )NT)Ú
issubclassÚtorchÚnnr   r6   r8   ©r*   r   r   r   Úmark_class_dynamicF   s   z$GenerationTracker.mark_class_dynamicc                 C   s   || j vrdS | j | S )Néÿÿÿÿ)r9   r:   r   r   r   Úget_generation_valueK   s   

z&GenerationTracker.get_generation_valuec                 C   s   || j v o| j | | jkS r   )r9   r7   r:   r   r   r   ÚcheckQ   s   
þzGenerationTracker.checkc                 C   s   d| _ tƒ | _tƒ | _d S r   )r7   r   r8   r9   r?   r   r   r   ÚclearX   s   zGenerationTracker.clearr   )r    r!   r"   r7   Úintr#   r   r8   r9   Úclassmethodr   r;   Ústaticmethodr   r=   r>   r   r@   rB   ÚboolrC   rD   r   r   r   r   r6   =   s   
 r6   Ú	is_exportc                 C   s~   t | tjjƒrd| jv rdS t| dƒr| jS t | tjjƒr$tjr$|s$dS t | tjjƒr0t	ƒ r0dS t
j t| ƒ¡p<t
 | ¡}|S )z5Check for nn.Modules() created dynamically or mutatedÚforwardTÚtorchdynamo_force_dynamic)Ú
isinstancer=   r>   r   Ú__dict__ÚhasattrrK   r   Úinline_inbuilt_nn_modulesr	   r6   r8   Úgetr'   rC   )r%   rI   Údynr   r   r   Úis_dynamic_nn_module_   s"   
ÿþýÿrR   c                     st   t tddƒr1tj‰ dtdtdtddf‡ fdd	„} | t_tj‰dtd
tddf‡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_patchTr   ÚargsÚkwargsr   Nc                    s$   ˆ | g|¢R i |¤Ž t  | ¡ d S r   ©r6   r;   )r   rT   rU   )Úinitr   r   Úpatched_init‚   s   z5install_generation_tagging_init.<locals>.patched_initÚstatec                    s   ˆ | |ƒ t  | ¡ d S r   rV   )r   rY   )Úsetstater   r   Úpatched_setstateŠ   s   
z9install_generation_tagging_init.<locals>.patched_setstateFr   )r2   r   r   r   Ú__setstate__rS   r6   r7   )rX   r[   r   )rW   rZ   r   Úinstall_generation_tagging_inity   s   r]   r   )r4   r   Útypingr   r   r   Útorch.nnr=   r   Ú r   Úutilsr   r	   r>   r   Úunpatched_nn_module_initr
   r)   r&   r6   rH   rR   r]   r   r   r   r   Ú<module>   s    

"