§
    ŠŠtjL  ã                   óø   — 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dS )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                   óV   — 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
dS )
ÚMutationTrackerÚdbÚreturnNc                 ó"   — d| _         g | _        d S ©Nr   )Úmutation_countÚwatchers)Úselfs    úZ/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/torch/_dynamo/mutation_guard.pyÚ__init__zMutationTracker.__init__!   s   € Ø#$ˆÔØ:<ˆŒˆˆó    Únamec                 óŽ   — | xj         dz  c_         | j        }g | _        |D ]#} |¦   «         }|�|                     |¦  «         Œ$d S )Nr   )r   r   Ú
invalidate)r   r   ÚtmpÚrefÚguardeds        r   Úon_mutationzMutationTracker.on_mutation%   sc   € ØÐÔ˜qÑ ÐÔØŒmˆØˆŒØð 	(ð 	(ˆCØ�c‘e”eˆGØÐ"Ø×"Ò" 3Ñ'Ô'Ð'øð	(ð 	(r   Úguarded_codec                 ó^   — | j                              t          j        |¦  «        ¦  «         d S ©N)r   ÚappendÚweakrefr   )r   r   s     r   ÚtrackzMutationTracker.track.   s(   € ØŒ×Ò�Wœ[¨Ñ6Ô6Ñ7Ô7Ð7Ð7Ð7r   ©r   N)Ú__name__Ú
__module__Ú__qualname__r   r   Ú__annotations__r   Ústrr   r   r"   © r   r   r   r      sˆ   € € € € € € Ø!7Ð!7Ñ!9Ô!9€BÐÐ9Ð9Ñ9ð=ð =ð =ð =ð( ð (¨ð (ð (ð (ð (ð8 #ð 8¨$ð 8ð 8ð 8ð 8ð 8ð 8r   r   Úobjr   r   c                 óÞ   — 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"   )r*   r   Útrackers      r   Úwatchr/   2   s\   € å•4˜‘9”9ÑÔÐà
•/Ô$Ð$Ð$Ý"1Ñ"3Ô"3�Ô˜3ÑÝÔ  Ô%€GØ‡M‚M�,ÑÔÐÐÐr   Úclsc           	      óÆ   ‡— t          | dd¦  «        rNd| _        | j        Št          j        ‰¦  «        dt
          dt          dt
          dd fˆfd„¦   «         }|| _        d S d S )	NÚ___needs_mutation_patchTFr   ÚkeyÚvaluer   c                 óŒ   •— 	 t           j        |                               |¦  «         n# t          $ r Y nw xY w ‰| ||¦  «        S r   )r   r   r   ÚKeyError)r   r3   r4   Úoriginal_setattrs      €r   Úcustom_setattrz&ensure_patched.<locals>.custom_setattrA   s\   ø€ ðÝÔ" 4Ô(×4Ò4°SÑ9Ô9Ð9Ð9øÝð ð ð Ø�ðøøøà#Ð# D¨#¨uÑ5Ô5Ð5s   ƒ%) ©
6µ6)Úgetattrr2   Ú__setattr__Ú	functoolsÚwrapsr   r(   )r0   r8   r7   s     @r   r,   r,   <   s�   ø€ ÝˆsÐ-¨tÑ4Ô4ð )Ø&+ˆÔ#Øœ?Ðå	ŒÐ)Ñ	*Ô	*ð	6¥ð 	6­3ð 	6µsð 	6¸tð 	6ð 	6ð 	6ð 	6ð 	6ñ 
+Ô	*ð	6ð )ˆŒˆˆð)ð )r   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dS )ÚGenerationTrackerr   Ú
generationÚdynamic_classesÚgeneration_valuesr*   r   Nc                 ó$   — | j         | j        |<   d S r   )r?   rA   ©r0   r*   s     r   ÚtagzGenerationTracker.tagQ   s   € à%(¤^ˆÔ˜cÑ"Ð"Ð"r   r0   c                 ó†   — t          | t          j        j        ¦  «        st	          d| › �¦  «        ‚dt
          j        | <   d S )Nz)Expected a torch.nn.Module subclass, got T)Ú
issubclassÚtorchÚnnr   ÚAssertionErrorr>   r@   ©r0   s    r   Úmark_class_dynamicz$GenerationTracker.mark_class_dynamicU   sD   € å˜#�uœxœÑ/Ô/ð 	TÝ Ð!RÈSÐ!RÐ!RÑSÔSÐSØ15ÕÔ)¨#Ñ.Ð.Ð.r   c                 ó2   — || j         vrdS | j         |         S )Néÿÿÿÿ)rA   rC   s     r   Úget_generation_valuez&GenerationTracker.get_generation_value[   s#   € à�cÔ+Ð+Ð+Ø�2ØÔ$ SÔ)Ð)r   c                 ó@   — || j         v o| j         |         | j        k    S r   )rA   r?   rC   s     r   ÚcheckzGenerationTracker.checka   s+   € ð �3Ô(Ð(ð =ØÔ% cÔ*¨c¬nÒ<ð	
r   c                 ó`   — d| _         t          ¦   «         | _        t          ¦   «         | _        d S r   )r?   r   r@   rA   rJ   s    r   ÚclearzGenerationTracker.clearh   s+   € àˆŒÝ4Ñ6Ô6ˆÔÝ 6Ñ 8Ô 8ˆÔÐÐr   r#   )r$   r%   r&   r?   Úintr'   r   r@   rA   Úclassmethodr   rD   Ústaticmethodr-   rG   rH   r   rK   rN   ÚboolrP   rR   r)   r   r   r>   r>   L   s:  € € € € € € Ø€J�ÐÐÑØ.DÐ.DÑ.FÔ.F€OÐ+ÐFÐFÑFØ0FÐ0FÑ0HÔ0HÐÐ-ÐHÐHÑHàð4�cð 4˜dð 4ð 4ð 4ñ „[ð4ð ð6  U¤X¤_Ô 5ð 6¸$ð 6ð 6ð 6ñ „\ð6ð
 ð* sð *¨sð *ð *ð *ñ „[ð*ð
 ð
˜ð 
 ð 
ð 
ð 
ñ „[ð
ð ð9ð 9ð 9ñ „[ð9ð 9ð 9r   r>   Ú	is_exportc                 ó  — t          | t          j        j        ¦  «        r'd| j        v st          | t
          t          f¦  «        rdS t          | d¦  «        r| j        S t          | t          j        j        ¦  «        r|rt          j
        rdS t          | t          j        j        ¦  «        rt          ¦   «         rdS t          j                             t          | ¦  «        ¦  «        pt                               | ¦  «        }|S )z5Check for nn.Modules() created dynamically or mutatedÚforwardTÚtorchdynamo_force_dynamic)Ú
isinstancerG   rH   r   Ú__dict__Údictr   ÚhasattrrZ   r   Úinstall_free_tensorsr	   r>   r@   Úgetr-   rP   )r*   rW   Údyns      r   Úis_dynamic_nn_modulerb   o   só   € å�#•u”x”Ñ'Ô'ð Ø�S”\Ð!Ð!¥Z°µd½NÐ5KÑ%LÔ%LÐ!ð ˆtÝˆsÐ/Ñ0Ô0ð -ØÔ,Ð,Ý�#•u”x”Ñ'Ô'ð ØðÝÔ4ðð ˆtå�#•u”x”Ñ'Ô'ð Õ,FÑ,HÔ,Hð ØˆtÝ
Ô
+×
/Ò
/µ°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_        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_patchTr   ÚargsÚkwargsr   Nc                 óT   •—  ‰| g|¢R i |¤Ž t                                | ¦  «         d S r   ©r>   rD   )r   re   rf   Úinits      €r   Úpatched_initz5install_generation_tagging_init.<locals>.patched_init�   s=   ø€ ØˆD�Ð'˜Ð'Ð'Ð' Ð'Ð'Ð'Ý×!Ò! $Ñ'Ô'Ð'Ð'Ð'r   Ústatec                 óT   •—  ‰| |¦  «         t                                | ¦  «         d S r   rh   )r   rk   Úsetstates     €r   Úpatched_setstatez9install_generation_tagging_init.<locals>.patched_setstate—   s/   ø€ ØˆH�T˜5Ñ!Ô!Ð!Ý×!Ò! $Ñ'Ô'Ð'Ð'Ð'r   Fr   )r9   r   r   r   Ú__setstate__rd   r>   r?   )rj   rn   ri   rm   s     @@r   Úinstall_generation_tagging_initrp   †   sÌ   øø€ õ �vÐ6¸Ñ=Ô=ð 5ÝŒˆð	(�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>   rV   rb   rp   r)   r   r   ú<module>rx      s�  ððð ð Ð Ð Ð Ø €€€Ø *Ð *Ð *Ð *Ð *Ð *Ø Ð Ð Ð Ð Ð à €€€Ø Ð Ð Ð Ð Ð à Ð Ð Ð Ð Ð Ø EÐ EÐ EÐ EÐ EÐ EÐ EÐ Eð !œ8œ?Ô3Ð ð8ð 8ð 8ð 8ð 8ñ 8ô 8ð 8ð( ˆsð   #ð  ¨$ð  ð  ð  ð  ð)˜ð ) ð )ð )ð )ð )ð  9ð  9ð  9ð  9ð  9ñ  9ô  9ð  9ðF˜cð ¨dð °tð ð ð ð ð.&ð &ð &ð &ð &ð &r   