o
    IÆ&i  ã                   @   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
   úGC:\wamp64\www\opt\env\Lib\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   Z
invalidate)r	   ÚnameÚtmpÚrefZ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©Z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_dynamicC   s   z$GenerationTracker.mark_class_dynamicc                 C   s   || j vrdS | j | S )Néÿÿÿÿ)r,   r-   r
   r
   r   Úget_generation_valueH   s   

z&GenerationTracker.get_generation_valuec                 C   s   || j v o| j | | jkS r   )r,   r+   r-   r
   r
   r   ÚcheckN   s   
þzGenerationTracker.checkN)r   r   r   r+   r   r2   r,   Úclassmethodr.   Ústaticmethodr3   r5   r6   r
   r
   r
   r   r*   :   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)Ú
isinstancer0   r1   r   Ú__dict__Úhasattrr:   r   r*   r2   Úgetr   r6   )r   Zdynr
   r
   r   Úis_dynamic_nn_moduleV   s   
ÿr?   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*   r.   )r	   ÚargsÚkwargs)Úinitr
   r   Úpatched_initn   s   z5install_generation_tagging_init.<locals>.patched_initc                    s   ˆ | |ƒ t  | ¡ d S r   rA   )r	   Ústate)Úsetstater
   r   Úpatched_setstatev   s   
z9install_generation_tagging_init.<locals>.patched_setstateFr   N)r%   r   r   Ú__setstate__r@   r*   r+   )rE   rH   r
   )rD   rG   r   Úinstall_generation_tagging_inite   s   rJ   )r'   r   Ztorch.nnr0   r   Úutilsr   r   r   r   r   r*   r?   rJ   r
   r
   r
   r   Ú<module>   s   
