ó
    Eñi.  ã                   ó  • S r SSKrSSKrSSKJr  SSKJr  SSKrSSKJ	r	  SSK
Jr  SSKJrJr  \R                  R                  R                   r " S	 S
5      rS\S\SS4S jrS\SS4S jr " S S5      rS\S\S\4S jrSS jrg)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                   ó\   • \ rS rSr% \" 5       r\\S'   SS jrS\SS4S jr	S\
SS4S	 jrS
rg)ÚMutationTrackeré   ÚdbÚreturnNc                 ó    • SU l         / U l        g ©Nr   ©Úmutation_countÚwatchers)Úselfs    ÚY/home/mande/repo/quber/.venv/lib/python3.13/site-packages/torch/_dynamo/mutation_guard.pyÚ__init__ÚMutationTracker.__init__!   s   € Ø#$ˆÔØ:<ˆ�ó    Únamec                 ó    • U =R                   S-  sl         U R                  n/ U l        U H   nU" 5       nUc  M  UR                  U5        M"     g )Nr   )r   r   Ú
invalidate)r   r   ÚtmpÚrefÚguardeds        r   Úon_mutationÚMutationTracker.on_mutation%   sH   € Ø×Ò˜qÑ ÕØ�m‰mˆØˆŒÛˆCÙ“eˆGØÓ"Ø×"Ñ" 3Ö'ò r   Úguarded_codec                 ób   • U R                   R                  [        R                  " U5      5        g ©N)r   ÚappendÚweakrefr   )r   r!   s     r   ÚtrackÚMutationTracker.track.   s   € Ø�‰×ÑœWŸ[š[¨Ó6Õ7r   r   ©r   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   r   Ú__annotations__r   Ústrr   r   r&   Ú__static_attributes__© r   r   r   r      s;   ‡ Ù!7Ó!9€BÐÓ9ô=ð( ð (¨ô (ð8 #ð 8¨$÷ 8r   r   Úobjr!   r   c                 óÒ   • [        [        U 5      5        U [        R                  ;  a  [        5       [        R                  U '   [        R                  U    nUR	                  U5        g)z+invalidate guarded_code when obj is mutatedN)Úensure_patchedÚtyper   r   r&   )r1   r!   Útrackers      r   Úwatchr6   2   sK   € ä”4˜“9Ôà
”/×$Ñ$Ó$Ü"1Ó"3Œ×Ñ˜3ÑÜ× Ñ  Ñ%€GØ‡M�M�,Õr   Úclsc           	      óÈ   ^• [        U SS5      (       aO  SU l        U R                  m[        R                  " T5      S[
        S[        S[
        SS 4U4S jj5       nXl        g g )	NÚ___needs_mutation_patchTFr   ÚkeyÚvaluer   c                 ó|   >•  [         R                  U    R                  U5        T" XU5      $ ! [         a     Nf = fr#   )r   r   r   ÚKeyError)r   r:   r;   Úoriginal_setattrs      €r   Úcustom_setattrÚ&ensure_patched.<locals>.custom_setattrA   sD   ø€ ðÜ×"Ñ" 4Ñ(×4Ñ4°SÔ9ñ $ D¨uÓ5Ð5øô ó Ùðús   ƒ". ®
;º;)Úgetattrr9   Ú__setattr__Ú	functoolsÚwrapsr   r.   )r7   r?   r>   s     @r   r3   r3   <   si   ø€ ÜˆsÐ-¨t×4Ñ4Ø&+ˆÔ#ØŸ?™?Ðä	�ŠÐ)Ó	*ð	6¤ð 	6¬3ð 	6´sð 	6¸tö 	6ó 
+ð	6ð )�ð 5r   c                   ó  • \ rS rSr% Sr\\S'   \" 5       r\\S'   \" 5       r	\\S'   \
S\SS4S	 j5       r\S
\\R                   R"                     SS4S j5       r\
S\S\4S j5       r\
S\S\4S j5       r\
SS j5       rSrg)ÚGenerationTrackeréL   r   Ú
generationÚdynamic_classesÚgeneration_valuesr1   r   Nc                 ó6   • U R                   U R                  U'   g r#   )rH   rJ   ©r7   r1   s     r   ÚtagÚGenerationTracker.tagQ   s   € à%(§^¡^ˆ×Ñ˜cÒ"r   r7   c                 ó€   • [        U [        R                  R                  5      (       d   eS[        R
                  U '   g )NT)Ú
issubclassÚtorchÚnnr   rF   rI   ©r7   s    r   Úmark_class_dynamicÚ$GenerationTracker.mark_class_dynamicU   s.   € ä˜#œuŸx™xŸ™×/Ñ/Ð/Ð/Ø15Ô×)Ñ)¨#Ò.r   c                 ó@   • XR                   ;  a  gU R                   U   $ )Néÿÿÿÿ)rJ   rL   s     r   Úget_generation_valueÚ&GenerationTracker.get_generation_valueZ   s"   € à×+Ñ+Ó+ØØ×$Ñ$ SÑ)Ð)r   c                 ód   • XR                   ;   =(       a    U R                   U   U R                  :H  $ r#   )rJ   rH   rL   s     r   ÚcheckÚGenerationTracker.check`   s1   € ð ×(Ñ(Ñ(÷ =Ø×%Ñ% cÑ*¨c¯n©nÑ<ð	
r   c                 óN   • SU l         [        5       U l        [        5       U l        g r   )rH   r   rI   rJ   rS   s    r   ÚclearÚGenerationTracker.clearg   s   € àˆŒÜ4Ó6ˆÔÜ 6Ó 8ˆÕr   r0   r(   )r)   r*   r+   r,   rH   Úintr-   r   rI   rJ   Úclassmethodr   rM   Ústaticmethodr4   rQ   rR   r   rT   rX   Úboolr[   r^   r/   r0   r   r   rF   rF   L   sÐ   ‡ Ø€J�ÓÙ.DÓ.F€OÐ+ÓFÙ0FÓ0HÐÐ-ÓHàð4�cð 4˜dó 4ó ð4ð ð6  U§X¡X§_¡_Ñ 5ð 6¸$ó 6ó ð6ð ð* sð *¨só *ó ð*ð
 ð
˜ð 
 ó 
ó ð
ð ó9ó ó9r   rF   Ú	is_exportc                 óš  • [        U [        R                  R                  5      (       a,  SU R                  ;   d  [        U [
        [        45      (       a  g[        U S5      (       a  U R                  $ [        U [        R                  R                  5      (       a2  [        R                  (       a  U(       a  [        R                  (       a  g[        U [        R                  R                  5      (       a  [        5       (       a  g[        R                  R                  [!        U 5      5      =(       d    [        R#                  U 5      nU$ )z5Check for nn.Modules() created dynamically or mutatedÚforwardTÚtorchdynamo_force_dynamic)Ú
isinstancerQ   rR   r   Ú__dict__Údictr   Úhasattrrg   r   Úinline_inbuilt_nn_modulesÚinstall_free_tensorsr	   rF   rI   Úgetr4   r[   )r1   rd   Údyns      r   Úis_dynamic_nn_modulerp   n   s×   € ä�#”u—x‘x—‘×'Ñ'Ø�S—\‘\Ó!¤Z°´d¼NÐ5K×%LÑ%Lð ÜˆsÐ/×0Ñ0Ø×,Ñ,Ð,ä�3œŸ™Ÿ™×(Ñ(Ü×,×,Þœf×9×9àä�#”u—x‘x—‘×'Ñ'Ô,F×,HÑ,HØÜ
×
+Ñ
+×
/Ñ
/´°S³	Ó
:÷ Ô>O×>UÑ>UØó?€Cð €Jr   c                  óL  ^^• [        [        SS5      (       as  [        R                  mS[        S[        S[        SS4U4S jjn U [        l        [        R                  mS[        S	[        SS4U4S
 jjnU[        l        S[        l        [        =R                  S-  sl        g)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   >• T" U /UQ70 UD6  [         R                  U 5        g r#   ©rF   rM   )r   rs   rt   Úinits      €r   Úpatched_initÚ5install_generation_tagging_init.<locals>.patched_init�   s#   ø€ Ù�Ð'˜Ò' Ò'Ü×!Ñ! $Õ'r   Ústatec                 ó@   >• T" X5        [         R                  U 5        g r#   rv   )r   rz   Úsetstates     €r   Úpatched_setstateÚ9install_generation_tagging_init.<locals>.patched_setstate˜   s   ø€ Ù�TÔ!Ü×!Ñ! $Õ'r   Fr   )rA   r   r   r   Ú__setstate__rr   rF   rH   )rx   r}   rw   r|   s     @@r   Úinstall_generation_tagging_initr€   ‡   s�   ù€ ô ŒvÐ6¸×=Ñ=Ü�‰ˆð	(œvð 	(¬cð 	(¼Sð 	(ÀT÷ 	(ð 'ŒŒä×&Ñ&ˆð	(¤6ð 	(´#ð 	(¸$÷ 	(ð /ŒÔà/4ŒÔ,ä× Ò  AÑ%Ö r   r(   )Ú__doc__rC   r%   Úcollections.abcr   Útypingr   Útorch.nnrQ   r   Ú r   Úutilsr   r	   rR   r   Úunpatched_nn_module_initr   r6   r3   rF   rc   rp   r€   r0   r   r   Ú<module>rˆ      s›   ðñó Û Ý *Ý ã Ý å ß Eð !Ÿ8™8Ÿ?™?×3Ñ3Ð ÷8ñ 8ð( ˆsð   #ð  ¨$ô  ð)˜ð ) ô )÷ 9ñ 9ðD˜cð ¨dð °tô õ2&r   