o
    "’×iJ  ã                   @   s„   d dl Z d dlZd dlZd dlmZ ddlmZ ddlmZ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é   )Úconfig)ÚExactWeakKeyDictionaryÚis_lazy_moduleÚnn_module_has_global_hooksc                   @   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   úZ/home/ubuntu/SoloSpeech/.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_setattr1   s   ÿz&ensure_patched.<locals>.custom_setattr)Úgetattrr$   Ú__setattr__Ú	functoolsÚwraps)Úclsr*   r   r(   r   r   ,   s   
ôr   c                   @   sX   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ed
d„ ƒZdS )ÚGenerationTrackerr   c                 C   s   | j | j|< d S r   )Ú
generationÚgeneration_values©r/   r!   r   r   r   ÚtagA   s   zGenerationTracker.tagc                 C   s    t | tjjƒs	J ‚dtj| < d S )NT)Ú
issubclassÚtorchÚnnr   r0   Údynamic_classes©r/   r   r   r   Úmark_class_dynamicE   s   z$GenerationTracker.mark_class_dynamicc                 C   s   || j vrdS | j | S )Néÿÿÿÿ)r2   r3   r   r   r   Úget_generation_valueJ   s   

z&GenerationTracker.get_generation_valuec                 C   s   || j v o| j | | jkS r   )r2   r1   r3   r   r   r   ÚcheckP   s   
þzGenerationTracker.checkc                 C   s   d| _ tƒ | _tƒ | _d S r	   )r1   r   r8   r2   r9   r   r   r   ÚclearW   s   zGenerationTracker.clearN)r   r   r   r1   r   r8   r2   Úclassmethodr4   Ústaticmethodr:   r<   r=   r>   r   r   r   r   r0   <   s    



r0   c                 C   sŠ   t | tjjƒrd| jv rdS t| dƒr| jS t| ƒrdS t | tjjƒr*tj	r*|s*dS t | tjjƒr6t
ƒ r6dS tj t| ƒ¡pBt | ¡}|S )z5Check for nn.Modules() created dynamically or mutatedÚforwardTÚtorchdynamo_force_dynamicF)Ú
isinstancer6   r7   r   Ú__dict__ÚhasattrrB   r   r   Úinline_inbuilt_nn_modulesr   r0   r8   Úgetr    r=   )r!   Ú	is_exportÚdynr   r   r   Úis_dynamic_nn_module^   s&   
ÿþýÿrJ   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   ©r0   r4   )r   ÚargsÚkwargs)Úinitr   r   Úpatched_initƒ   s   z5install_generation_tagging_init.<locals>.patched_initc                    s   ˆ | |ƒ t  | ¡ d S r   rL   )r   Ústate)Úsetstater   r   Úpatched_setstate‹   s   
z9install_generation_tagging_init.<locals>.patched_setstateFr   N)r+   r   r   Ú__setstate__rK   r0   r1   )rP   rS   r   )rO   rR   r   Úinstall_generation_tagging_initz   s   rU   )r-   r   Útorch.nnr6   r   Ú r   Úutilsr   r   r   r   r#   r   r0   rJ   rU   r   r   r   r   Ú<module>   s   
"