U
    zhJ                     @   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   N/var/www/html/venv/lib/python3.8/site-packages/torch/_dynamo/mutation_guard.py__init__   s    zMutationTracker.__init__c                 C   s@   |  j d7  _ | j}g | _|D ]}| }|d k	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k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                    s6   zt j|  | W n tk
r(   Y nX  | ||S r   )r   r   r   KeyError)r   keyvalueZ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tdtj| < d S )NT)
issubclasstorchnnr   AssertionErrorr-   dynamic_classesr,   r   r   r   mark_class_dynamicE   s    z$GenerationTracker.mark_class_dynamicc                 C   s   || j krdS | j | S )N)r/   r0   r   r   r   get_generation_valueJ   s    
z&GenerationTracker.get_generation_valuec                 C   s   || j ko| j | | jkS r   )r/   r.   r0   r   r   r   checkP   s    
zGenerationTracker.checkc                 C   s   d| _ t | _t | _d S r	   )r.   r   r6   r/   r7   r   r   r   clearW   s    zGenerationTracker.clearN)r   r   r   r.   r   r6   r/   classmethodr1   staticmethodr8   r:   r;   r<   r   r   r   r   r-   <   s   



r-   c                 C   s   t | tjjrd| jkrdS t| dr,| jS t| r8dS t | tjjrTtj	rT|sTdS t | tjjrlt
 rldS tjt| pt| }|S )z5Check for nn.Modules() created dynamically or mutatedforwardTtorchdynamo_force_dynamicF)
isinstancer3   r4   r   __dict__hasattrr@   r   r   Zinline_inbuilt_nn_modulesr   r-   r6   getr   r;   )r   Z	is_exportZdynr   r   r   is_dynamic_nn_module^   s&    
rE   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    | f|| t |  d S r   r-   r1   )r   argskwargs)initr   r   patched_init   s    z5install_generation_tagging_init.<locals>.patched_initc                    s    | | t |  d S r   rG   )r   state)setstater   r   patched_setstate   s    
z9install_generation_tagging_init.<locals>.patched_setstateFr   N)r(   r   r   __setstate__rF   r-   r.   )rK   rN   r   )rJ   rM   r   install_generation_tagging_initz   s    rP   )r*   r   Ztorch.nnr3   r    r   utilsr   r   r   r   r!   r   r-   rE   rP   r   r   r   r   <module>   s   
"