
    ɯwg                         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
 ej                  j                  j                  Z G d d      Zd Zd	 Z G d
 d      Zd Zd Zy)    N)Module   )config)ExactWeakKeyDictionaryis_lazy_modulenn_module_has_global_hooksc                   ,    e Zd Z e       Zd Zd Zd Zy)MutationTrackerc                      d| _         g | _        y Nr   )mutation_countwatchers)selfs    a/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/torch/_dynamo/mutation_guard.py__init__zMutationTracker.__init__   s        c                     | xj                   dz  c_         | j                  }g | _        |D ]  } |       }||j                  |        y )Nr   )r   r   
invalidate)r   nametmprefguardeds        r   on_mutationzMutationTracker.on_mutation   sM    q mm 	(CeG"""3'	(r   c                 `    | j                   j                  t        j                  |             y N)r   appendweakrefr   )r   guarded_codes     r   trackzMutationTracker.track!   s    W[[67r   N)__name__
__module____qualname__r   dbr   r   r    r   r   r
   r
      s    		!B(8r   r
   c                     t        t        |              | t        j                  vrt               t        j                  | <   t        j                  |    }|j	                  |       y)z+invalidate guarded_code when obj is mutatedN)ensure_patchedtyper
   r#   r   )objr   trackers      r   watchr*   %   sK    49
/$$$"1"33  %GMM,r   c                     t        | dd      r8d| _        | j                  t        j                        fd       }|| _        y y )N___needs_mutation_patchTFc                 |    	 t         j                  |    j                  |        | ||      S # t        $ r Y w xY wr   )r
   r#   r   KeyError)r   keyvalueoriginal_setattrs      r   custom_setattrz&ensure_patched.<locals>.custom_setattr4   sF    ""4(44S9 $D#u55  s   "/ 	;;)getattrr,   __setattr__	functoolswraps)clsr2   r1   s     @r   r&   r&   /   sL    s-t4&+#??	)	*	6 
+	6 ) 5r   c                   |    e Zd ZdZ e       Z e       Zed        Ze	d        Z
ed        Zed        Zed        Zy)GenerationTrackerr   c                 6    | j                   | j                  |<   y r   )
generationgeneration_valuesr7   r(   s     r   tagzGenerationTracker.tagD   s    %(^^c"r   c                 v    t        | t        j                  j                        sJ dt        j
                  | <   y )NT)
issubclasstorchnnr   r9   dynamic_classesr7   s    r   mark_class_dynamicz$GenerationTracker.mark_class_dynamicH   s+    #uxx///15))#.r   c                 >    || j                   vry| j                   |   S )N)r<   r=   s     r   get_generation_valuez&GenerationTracker.get_generation_valueM   s$    c+++$$S))r   c                 Z    || j                   v xr | j                   |   | j                  k(  S r   )r<   r;   r=   s     r   checkzGenerationTracker.checkS   s3     3((( =%%c*cnn<	
r   c                 N    d| _         t               | _        t               | _        y r   )r;   r   rC   r<   rD   s    r   clearzGenerationTracker.clearZ   s    46 6 8r   N)r    r!   r"   r;   r   rC   r<   classmethodr>   staticmethodrE   rH   rJ   rL   r$   r   r   r9   r9   ?   sz    J,.O.04 4 6 6 * *
 
 
 9 9r   r9   c                    t        | t        j                  j                        rd| j                  v ryt        | d      r| j                  S t        |       ryt        | t        j                  j                        rt        j                  r|syt        | t        j                  j                        rt               ryt        j                  j                  t        |             xs t        j                  |       }|S )z5Check for nn.Modules() created dynamically or mutatedforwardTtorchdynamo_force_dynamicF)
isinstancerA   rB   r   __dict__hasattrrQ   r   r   inline_inbuilt_nn_modulesr   r9   rC   getr'   rJ   )r(   	is_exportdyns      r   is_dynamic_nn_modulerY   a   s    #uxx'I,Es/0,,,c 	3(,,#uxx',F,H

+
+
/
/S	
: >O>U>U?C Jr   c                      t        t        dd      rKt        j                  fd} | t        _        t        j                  fd}|t        _        dt        _        t
        xj                  dz  c_        y)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                 H     | g|i | t         j                  |        y r   r9   r>   )r   argskwargsinits      r   patched_initz5install_generation_tagging_init.<locals>.patched_init   s#    '''!!$'r   c                 B     | |       t         j                  |        y r   r]   )r   statesetstates     r   patched_setstatez9install_generation_tagging_init.<locals>.patched_setstate   s    T5!!!$'r   Fr   N)r3   r   r   __setstate__r[   r9   r;   )ra   re   r`   rd   s     @@r   install_generation_tagging_initrg   }   s\     v6=	( '&&	( //4,  A% r   )r5   r   torch.nnrA   r    r   utilsr   r   r   rB   r   unpatched_nn_module_initr
   r*   r&   r9   rY   rg   r$   r   r   <module>rl      s[         U U !88??33 8 8( ) 9 9D8&r   