
    Vh                        d Z ddlZddlZddlmZ ddlmZ ddlZddlm	Z	 ddl
mZ ddlmZmZ ej                  j                  j                   Z G d	 d
      ZdededdfdZdeddfdZ G d d      ZdededefdZddZy)aX  Mutation tracking and dynamic module detection system for Dynamo.

This module provides mechanisms to track and respond to mutations in PyTorch modules
and detect dynamically created or modified modules.

Key components:
- MutationTracker: Tracks mutations to objects and invalidates associated cached code
- GenerationTracker: Tracks module creation timing to identify dynamic instances
- Patching system for nn.Module to detect mutations and dynamic creation

The system ensures that Dynamo's optimizations remain valid by detecting and responding
to runtime changes in module state and structure.
    N)MutableMapping)Any)Module   )config)ExactWeakKeyDictionarynn_module_has_global_hooksc                   N    e Zd ZU  e       Zeed<   d	dZdeddfdZde	ddfdZ
y)
MutationTrackerdbreturnNc                      d| _         g | _        y Nr   )mutation_countwatchers)selfs    L/home/dcms/DCMS/lib/python3.12/site-packages/torch/_dynamo/mutation_guard.py__init__zMutationTracker.__init__!   s    #$:<    namec                     | xj                   dz  c_         | j                  }g | _        |D ]  } |       }||j                  |        y )Nr   )r   r   
invalidate)r   r   tmprefguardeds        r   on_mutationzMutationTracker.on_mutation%   sM    q mm 	(CeG"""3'	(r   guarded_codec                 `    | j                   j                  t        j                  |             y N)r   appendweakrefr   )r   r   s     r   trackzMutationTracker.track.   s    W[[67r   r   N)__name__
__module____qualname__r   r   __annotations__r   strr   r   r"    r   r   r   r      s;    !7!9B9=( ( (8# 8$ 8r   r   objr   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"   )r*   r   trackers      r   watchr/   2   sK    49
/$$$"1"33  %GMM,r   clsc           	          t        | dd      rMd| _        | j                  t        j                        dt
        dt        dt
        dd ffd       }|| _        y y )	N___needs_mutation_patchTFr   keyvaluer   c                 |    	 t         j                  |    j                  |        | ||      S # t        $ r Y w xY wr   )r   r   r   KeyError)r   r3   r4   original_setattrs      r   custom_setattrz&ensure_patched.<locals>.custom_setattrA   sF    ""4(44S9 $D#u55  s   "/ 	;;)getattrr2   __setattr__	functoolswrapsr   r(   )r0   r8   r7   s     @r   r,   r,   <   sh    s-t4&+#??	)	*	6 	63 	6s 	6t 	6 
+	6 ) 5r   c                       e Zd ZU dZeed<    e       Zeed<    e       Zeed<   e	de
ddfd       Zed	eej                  j                      ddfd
       Ze	de
defd       Ze	de
defd       Ze	dd       Zy)GenerationTrackerr   
generationdynamic_classesgeneration_valuesr*   r   Nc                 6    | j                   | j                  |<   y r   )r?   rA   r0   r*   s     r   tagzGenerationTracker.tagQ   s    %(^^c"r   r0   c                 v    t        | t        j                  j                        sJ dt        j
                  | <   y )NT)
issubclasstorchnnr   r>   r@   r0   s    r   mark_class_dynamicz$GenerationTracker.mark_class_dynamicU   s+    #uxx///15))#.r   c                 >    || j                   vry| j                   |   S )N)rA   rC   s     r   get_generation_valuez&GenerationTracker.get_generation_valueZ   s$    c+++$$S))r   c                 Z    || j                   v xr | j                   |   | j                  k(  S r   )rA   r?   rC   s     r   checkzGenerationTracker.check`   s3     3((( =%%c*cnn<	
r   c                 N    d| _         t               | _        t               | _        y r   )r?   r   r@   rA   rI   s    r   clearzGenerationTracker.clearg   s    46 6 8r   r#   )r$   r%   r&   r?   intr'   r   r@   rA   classmethodr   rD   staticmethodr-   rG   rH   r   rJ   rM   boolrO   rQ   r)   r   r   r>   r>   L   s    J.D.FO+F0F0H-H4c 4d 4 4 6UXX__ 5 6$ 6 6 *s *s * *
 
 
 
 
 9 9r   r>   	is_exportc                    t        | t        j                  j                        r%d| j                  v st        | t
        t        f      ryt        | d      r| j                  S 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_dynamic)
isinstancerG   rH   r   __dict__dictr   hasattrrY   r   inline_inbuilt_nn_modulesr	   r>   r@   getr-   rO   )r*   rV   dyns      r   is_dynamic_nn_modulera   n   s    #uxx'S\\!ZdN5K%L s/0,,, 	3(,,#uxx',F,H

+
+
/
/S	
: >O>U>U?C Jr   c                  :   t        t        dd      rot        j                  dt        dt        dt        ddffd} | t        _        t        j                  dt        d	t        ddf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_patchTr   argskwargsr   Nc                 H     | g|i | t         j                  |        y r   r>   rD   )r   rd   re   inits      r   patched_initz5install_generation_tagging_init.<locals>.patched_init   s#    '''!!$'r   statec                 B     | |       t         j                  |        y r   rg   )r   rj   setstates     r   patched_setstatez9install_generation_tagging_init.<locals>.patched_setstate   s    T5!!!$'r   Fr   )r9   r   r   r   __setstate__rc   r>   r?   )ri   rm   rh   rl   s     @@r   install_generation_tagging_initro      s     v6=	(v 	(c 	(S 	(T 	( '&&	(6 	(# 	($ 	( //4,  A% r   r#   )__doc__r;   r!   collections.abcr   typingr   torch.nnrG   r    r   utilsr   r	   rH   r   unpatched_nn_module_initr   r/   r,   r>   rU   ra   ro   r)   r   r   <module>rw      s      *     E !88??33 8 8( s  #  $  ) ) ) 9 9Dc d t :&r   