a
    €þdn  ã                   @   sp   d dl Z d dlZd dlZd dlmZ ddl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é   )ÚExactWeakKeyDictionaryc                   @   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	   úe/var/www/html/stable-diffusion-webui/venv/lib/python3.9/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                    s8   t | ddƒr4d| _| j‰ t ˆ ¡‡ fdd„ƒ}|| _d S )NÚ___needs_mutation_patchTFc                    s4   zt j|   |¡ W n ty&   Y n0 ˆ | ||ƒ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_dynamicA   s    z$GenerationTracker.mark_class_dynamicc                 C   s   || j vrdS | j | S )Néÿÿÿÿ)r+   r,   r	   r	   r
   Úget_generation_valueF   s    
z&GenerationTracker.get_generation_valuec                 C   s   || j v o| j | | jkS r   )r+   r*   r,   r	   r	   r
   ÚcheckL   s    
þzGenerationTracker.checkN)r   r   r   r*   r   r1   r+   Úclassmethodr-   Ústaticmethodr2   r4   r5   r	   r	   r	   r
   r)   8   s   


r)   c                 C   s.   t | dƒr| jS tj t| ƒ¡p(t | ¡}|S )z5Check for nn.Modules() created dynamically or mutatedÚtorchdynamo_force_dynamic)Úhasattrr8   r)   r1   Úgetr   r5   )r   Zdynr	   r	   r
   Úis_dynamic_nn_moduleT   s    
ÿr;   c                     sT   t tddƒrBt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_initg   s    z5install_generation_tagging_init.<locals>.patched_initc                    s   ˆ | |ƒ t  | ¡ d S r   r=   )r   Ústate)Úsetstater	   r
   Úpatched_setstateo   s    
z9install_generation_tagging_init.<locals>.patched_setstateFr   N)r$   r   r   Ú__setstate__r<   r)   r*   )rA   rD   r	   )r@   rC   r
   Úinstall_generation_tagging_init^   s    rF   )r&   r   Ztorch.nnr/   r   Úutilsr   r   r   r   r)   r;   rF   r	   r	   r	   r
   Ú<module>   s   

