§
    ž²Åj€9  ã                   ó–  — d dl Z d dlZd dlmZmZmZ d dlZd dlmZ ddl	m
Z
mZ ddlmZ ddlmZ ddlmZ dd	lmZmZ dd
lmZ ddlmZ ddlmZ ddlmZmZ erd dlmZ  G d„ de¦  «        Z d„ Z!d„ Z" G d„ de ¦  «        Z# G d„ de ¦  «        Z$ G d„ de ¦  «        Z% G d„ de ¦  «        Z& G d„ de ¦  «        Z' G d„ de¦  «        Z(dS ) é    N)ÚDictÚListÚTYPE_CHECKING)ÚBackwardStateé   )Úcompiled_autogradÚ	variables)Útrace_wrapped)Úunimplemented)Ú%call_module_hooks_from_backward_state)ÚGuardBuilderÚinstall_guard)Ú
AttrSource)Úistypeé   )ÚVariableTracker)ÚConstantVariableÚEnumVariable)ÚInstructionTranslatorc                   ó@   ‡ — e Zd ZdZdˆ fd„Zd„ Zed„ ¦   «         Zˆ xZS )ÚDistributedVariablea{  
    The base distributed variable that encapsulates common methods
    for the distributed objects (i.e. ProcessGroup, DeviceMesh, etc.).
    Concrete distributed objects could inherit this class and add object
    specific logic.

    i.e. It provides the check on the distributed package existance
    and hold the tracking value for the corresponding distributed object.
    ÚreturnNc                 ó˜   •—  t          ¦   «         j        di |¤Ž t                               ¦   «         st	          d¦  «         || _        d S )Nz+torch.distributed package is not available!© )ÚsuperÚ__init__r   Úis_availabler   Úvalue)Úselfr   ÚkwargsÚ	__class__s      €úTC:\Projects\Historical\venv\Lib\site-packages\torch/_dynamo/variables/distributed.pyr   zDistributedVariable.__init__#   sO   ø€ Ø�‰ŒÔÐ"Ð"˜6Ð"Ð"Ð"Ý"×/Ò/Ñ1Ô1ð 	IÝÐGÑHÔHÐHØˆŒ
ˆ
ˆ
ó    c                 ó*   — t          | j        ¦  «        S ©N)Útyper   ©r   s    r"   Úpython_typezDistributedVariable.python_type)   s   € Ý�D”JÑÔÐr#   c                  ó>   — t           j                             ¦   «         S r%   )ÚtorchÚdistributedr   r   r#   r"   r   z DistributedVariable.is_available,   s   € õ Ô ×-Ò-Ñ/Ô/Ð/r#   )r   N)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r(   Ústaticmethodr   Ú__classcell__©r!   s   @r"   r   r      sq   ø€ € € € € ðð ðð ð ð ð ð ð ð  ð  ð ð0ð 0ñ „\ð0ð 0ð 0ð 0ð 0r#   r   c                 ó~   — t                                ¦   «         sdS ddlm} t	          j        | ¦  «        o| |j        u S )NFr   )ÚDTensor)r   r   Útorch.distributed.tensorr4   ÚinspectÚ
isfunctionÚ
from_local)r   r4   s     r"   Úis_from_localr9   2   sK   € Ý×+Ò+Ñ-Ô-ð ØˆuØ0Ð0Ð0Ð0Ð0Ð0åÔ˜eÑ$Ô$ÐD¨°'Ô2DÐ)DÐDr#   c                 ó’   — t                                ¦   «         sdS ddlm}m}m}m}m} |||||g}t          j	        | ¦  «        o| |v S )NFr   )Ú_get_group_size_by_nameÚ_get_group_tagÚ_rank_not_in_groupÚ$_resolve_group_name_by_ranks_and_tagÚget_process_group_ranks)
r   r   Ú"torch.distributed.distributed_c10dr;   r<   r=   r>   r?   r6   r7   )r   r;   r<   r=   r>   r?   Úconstant_processgroup_functionss          r"   Úis_constant_pg_functionsrB   :   s˜   € Ý×+Ò+Ñ-Ô-ð Øˆuðð ð ð ð ð ð ð ð ð ð ð ð ð ð 	 ØØØØ,ð'Ð#õ Ô˜eÑ$Ô$ÐQ¨Ð2QÐ)QÐQr#   c                   óF   ‡ — e Zd ZdZed„ ¦   «         Zdddedefˆ fd„Zˆ xZ	S )ÚWorldMetaClassVariablez€
    Tracks torch.distributed.GroupMember and torch.distributed.group, which are
    instances of the metaclass _WorldMeta.
    c                 ó\   — |                       ¦   «         sdS ddlm} t          |¦  «        |u S )NFr   )Ú
_WorldMeta)r   r@   rF   r&   )Úclsr   rF   s      r"   Úis_group_member_typez+WorldMetaClassVariable.is_group_member_typeW   s>   € à×ÒÑ!Ô!ð 	Ø�5àAÐAÐAÐAÐAÐAå�E‰{Œ{˜jÐ(Ð(r#   Útxr   Únamer   c                 óÌ  •— |dk    r[t          | j        d¬¦  «        }t          |                     t          j        ¦  «        ¦  «         t          | j        j        ¦  «        S |dk    r[t          | j        d¬¦  «        }t          |                     t          j        ¦  «        ¦  «         t          | j        j
        ¦  «        S t          ¦   «                              ||¦  «        S )NÚWORLD)ÚbaseÚmemberÚNON_GROUP_MEMBER)r   Úsourcer   Ú
make_guardr   ÚID_MATCHÚProcessGroupVariabler   rL   r   rO   r   Úvar_getattr)r   rI   rJ   rP   r!   s       €r"   rT   z"WorldMetaClassVariable.var_getattr`   s¿   ø€ Ø�7Š?ˆ?Ý T¤[¸ÐAÑAÔAˆFÝ˜&×+Ò+­LÔ,AÑBÔBÑCÔCÐCÝ'¨¬
Ô(8Ñ9Ô9Ð9ØÐ'Ò'Ð'Ý T¤[Ð9KÐLÑLÔLˆFÝ˜&×+Ò+­LÔ,AÑBÔBÑCÔCÐCÝ ¤
Ô ;Ñ<Ô<Ð<Ý‰wŒw×"Ò" 2 tÑ,Ô,Ð,r#   )
r,   r-   r.   r/   ÚclassmethodrH   Ústrr   rT   r1   r2   s   @r"   rD   rD   Q   sx   ø€ € € € € ðð ð
 ð)ð )ñ „[ð)ð	-Ð5ð 	-¸Sð 	-À_ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-r#   rD   c                   óL   ‡ — e Zd Zed„ ¦   «         Zd„ Z	 	 	 	 	 	 	 	 dˆ fd„Zˆ xZS )ÚPlacementClassVariablec                 ó�   — t                                ¦   «         sdS ddlm} t	          | ¦  «        t          u ot          | |¦  «        S ©NFr   )Ú	Placement)r   r   Ú(torch.distributed.tensor.placement_typesr[   r&   Ú
issubclass©r   r[   s     r"   Úis_placement_typez(PlacementClassVariable.is_placement_typem   sO   € õ #×/Ò/Ñ1Ô1ð 	Ø�5àFÐFÐFÐFÐFÐFå�E‰{Œ{�dÐ"ÐC¥z°%¸Ñ'CÔ'CÐCr#   c                 ó   — | j         S r%   ©r   r'   s    r"   Úas_python_constantz)PlacementClassVariable.as_python_constantw   ó
   € ØŒzÐr#   rI   r   ÚargsúList[VariableTracker]r    úDict[str, VariableTracker]r   r   c                 ón  •— t          j        | j        dd ¦  «        t          j        fv rj| j        rct                               | j        ¦  «        }t          |¦  «        }t          j        | j        dd ¦  «        r|                     |d||¦  «         |S t          ¦   «          	                    |||¦  «        S )NÚ__new__r   )
r6   Úgetattr_staticr   Úobjectrh   rP   ÚPlacementVariableÚcall_methodr   Úcall_function)r   rI   rd   r    Únew_objÚvarr!   s         €r"   rm   z$PlacementClassVariable.call_functionz   s¥   ø€ õ Ô" 4¤:¨y¸$Ñ?Ô?ÅFÄNÐCTÐTÐTØ”ð Uõ
 —n’n T¤ZÑ0Ô0ˆGÝ# GÑ,Ô,ˆCÝÔ% d¤j°*¸dÑCÔCð Ø—’  J°°fÑ=Ô=Ð=Ø�
å‰wŒw×$Ò$ R¨¨vÑ6Ô6Ð6r#   )rI   r   rd   re   r    rf   r   r   )r,   r-   r.   r0   r_   rb   rm   r1   r2   s   @r"   rX   rX   l   sŽ   ø€ € € € € ØðDð Dñ „\ðDðð ð ð7à#ð7ð &ð7ð -ð	7ð
 
ð7ð 7ð 7ð 7ð 7ð 7ð 7ð 7ð 7ð 7r#   rX   c                   ó`   ‡ — e Zd Zed„ ¦   «         Zd„ Zdddedefˆ fd„Z	 	 	 	 	 	 dˆ fd„Z	ˆ xZ
S )rk   c                 ód   — t                                ¦   «         sdS ddlm} t	          | |¦  «        S rZ   )r   r   r\   r[   Ú
isinstancer^   s     r"   Úis_placementzPlacementVariable.is_placement�   s?   € õ #×/Ò/Ñ1Ô1ð 	Ø�5àFÐFÐFÐFÐFÐFå˜% Ñ+Ô+Ð+r#   c                 ó   — | j         S r%   ra   r'   s    r"   rb   z$PlacementVariable.as_python_constantš   rc   r#   rI   r   rJ   r   c                 ó�   •— |dk    rt          j        | j        j        ¦  «        S t	          ¦   «                              ||¦  «        S )NÚdim)r   Úcreater   rv   r   rT   ©r   rI   rJ   r!   s      €r"   rT   zPlacementVariable.var_getattr�   s;   ø€ Ø�5Š=ˆ=Ý#Ô*¨4¬:¬>Ñ:Ô:Ð:Ý‰wŒw×"Ò" 2 tÑ,Ô,Ð,r#   rd   re   r    rf   r   c                 ó&  •— ddl m} g d¢}||v rß	 t          | j        ¦  «        }t	          j        |dd ¦  «        �
J d¦   «         ‚t	          j        ||¦  «        }n# t          $ r d }Y nw xY w|t          j        u r |j	        d ¦  «        S d„ |D ¦   «         }d„ | 
                    ¦   «         D ¦   «         }|dk    r || j        g|¢R i |¤Ž | S  || j        g|¢R i |¤Ž}	 |j	        |	¦  «        S t          ¦   «                              ||||¦  «        S )	Nr   )r   )r   Ú__setattr__Úis_shardÚ
is_partialÚis_replicateÚ__getattr__zno custom getattr allowed!c                 ó6   — g | ]}|                      ¦   «         ‘ŒS r   ©rb   ©Ú.0Úxs     r"   ú
<listcomp>z1PlacementVariable.call_method.<locals>.<listcomp>Ä   s$   € Ð9Ð9Ð9¨q�A×(Ò(Ñ*Ô*Ð9Ð9Ð9r#   c                 ó>   — i | ]\  }}||                      ¦   «         “ŒS r   r€   ©r‚   ÚkÚvs      r"   ú
<dictcomp>z1PlacementVariable.call_method.<locals>.<dictcomp>Å   s*   € ÐKÐKÐK±D°A°q�a˜×-Ò-Ñ/Ô/ÐKÐKÐKr#   rz   )Ú r   r&   r   r6   ri   ÚAttributeErrorrj   r   rw   Úitemsr   rl   )r   rI   rJ   rd   r    r   Úconstant_fold_functionsÚ
value_typeÚmethodÚconstant_valr!   s             €r"   rl   zPlacementVariable.call_method¢   s~  ø€ ð 	'Ð&Ð&Ð&Ð&Ð&ð#
ð #
ð #
Ðð Ð*Ð*Ð*ðÝ! $¤*Ñ-Ô-�
åÔ*¨:°}ÀdÑKÔKÐSÐSØ/ñ TÔSÐSå Ô/°
¸DÑAÔA��øÝ!ð ð ð Ø���ðøøøà�œÐ(Ð(Ø.Ð'Ô.¨tÑ4Ô4Ð4à9Ð9°DÐ9Ñ9Ô9ˆDØKÐK¸F¿LºL¹N¼NÐKÑKÔKˆFØ�}Ò$Ð$Ø��t”zÐ3 DÐ3Ð3Ð3¨FÐ3Ð3Ð3Ø�Ø!˜6 $¤*Ð>¨tÐ>Ð>Ð>°vÐ>Ð>ˆLØ*Ð#Ô*¨<Ñ8Ô8Ð8å‰wŒw×"Ò" 2 t¨T°6Ñ:Ô:Ð:s   ‘A	A ÁA*Á)A*©rd   re   r    rf   r   r   )r,   r-   r.   r0   rs   rb   rV   r   rT   rl   r1   r2   s   @r"   rk   rk   �   s·   ø€ € € € € Øð,ð ,ñ „\ð,ðð ð ð-Ð5ð -¸Sð -À_ð -ð -ð -ð -ð -ð -ð
*;ð &ð	*;ð
 -ð*;ð 
ð*;ð *;ð *;ð *;ð *;ð *;ð *;ð *;ð *;ð *;r#   rk   c                   ó`   ‡ — e Zd Zed„ ¦   «         Zd„ Zdddedefˆ fd„Z	 	 	 	 	 	 dˆ fd„Z	ˆ xZ
S )ÚDeviceMeshVariablec                 ód   — t                                ¦   «         sdS ddlm} t	          | |¦  «        S )NFr   )Ú
DeviceMesh)r   r   Útorch.distributed.device_meshr•   r   )r   r•   s     r"   Úis_device_meshz!DeviceMeshVariable.is_device_meshÐ   s?   € õ #×/Ò/Ñ1Ô1ð 	Ø�5à<Ð<Ð<Ð<Ð<Ð<å�e˜ZÑ(Ô(Ð(r#   c                 ó   — | j         S r%   ra   r'   s    r"   rb   z%DeviceMeshVariable.as_python_constantÚ   rc   r#   rI   r   rJ   r   c                 óØ   •— |dk    rt          j        | j        j        ¦  «        S |dk    rt          j        | j        j        ¦  «        S t          ¦   «                              ||¦  «        S )NÚndimÚdevice_type)r   rw   r   rš   r›   r   rT   rx   s      €r"   rT   zDeviceMeshVariable.var_getattrÝ   s\   ø€ Ø�6Š>ˆ>Ý#Ô*¨4¬:¬?Ñ;Ô;Ð;Ø�=Ò Ð Ý#Ô*¨4¬:Ô+AÑBÔBÐBÝ‰wŒw×"Ò" 2 tÑ,Ô,Ð,r#   rd   re   r    rf   r   c                 ó  •— |dk    rNd„ |D ¦   «         }d„ |                      ¦   «         D ¦   «         }t          j         | j        j        |i |¤Ž¦  «        S |dk    r+t          j        | j                             ¦   «         ¦  «        S |dk    r&t          | j                             ¦   «         ¦  «        S |dk    r&t          | j                             ¦   «         ¦  «        S t          ¦   «          
                    ||||¦  «        S )NÚsizec                 ó6   — g | ]}|                      ¦   «         ‘ŒS r   r€   r�   s     r"   r„   z2DeviceMeshVariable.call_method.<locals>.<listcomp>ì   s$   € Ð?Ð?Ð?°Q˜!×.Ò.Ñ0Ô0Ð?Ð?Ð?r#   c                 ó>   — i | ]\  }}||                      ¦   «         “ŒS r   r€   r†   s      r"   r‰   z2DeviceMeshVariable.call_method.<locals>.<dictcomp>í   s*   € ÐQÐQÐQ¹$¸!¸Q˜A˜q×3Ò3Ñ5Ô5ÐQÐQÐQr#   Úget_coordinateÚ	get_groupÚ_get_or_create_default_group)rŒ   r   rw   r   r�   r    rS   r¡   r¢   r   rl   )r   rI   rJ   rd   r    Ú
const_argsÚconst_kwargsr!   s          €r"   rl   zDeviceMeshVariable.call_methodä   sø   ø€ ð �6Š>ˆ>Ø?Ð?¸$Ð?Ñ?Ô?ˆJØQÐQÀ&Ç,Â,Á.Ä.ÐQÑQÔQˆLÝ#Ô*¨?¨4¬:¬?¸JÐ+WÈ,Ð+WÐ+WÑXÔXÐXØÐ#Ò#Ð#Ý#Ô*¨4¬:×+DÒ+DÑ+FÔ+FÑGÔGÐGØ�;ÒÐÝ'¨¬
×(<Ò(<Ñ(>Ô(>Ñ?Ô?Ð?ØÐ1Ò1Ð1Ý'¨¬
×(OÒ(OÑ(QÔ(QÑRÔRÐRÝ‰wŒw×"Ò" 2 t¨T°6Ñ:Ô:Ð:r#   r‘   )r,   r-   r.   r0   r—   rb   rV   r   rT   rl   r1   r2   s   @r"   r“   r“   Ï   s·   ø€ € € € € Øð)ð )ñ „\ð)ðð ð ð-Ð5ð -¸Sð -À_ð -ð -ð -ð -ð -ð -ð;ð &ð	;ð
 -ð;ð 
ð;ð ;ð ;ð ;ð ;ð ;ð ;ð ;ð ;ð ;r#   r“   c                   óX   ‡ — e Zd ZdZd„ Z	 	 	 	 	 	 dˆ fd	„Zdˆ fd„Zed„ ¦   «         Zˆ xZ	S )rS   a£  
    We don't want a ProcessGroup object to end up in our output graph.

    But it's common for dynamo to intercept a PG that is then used to get info like
    rank() or world_size(), as well as passed to utility functions in distributed_c10d
    which desugar it into plain types like a ranklist and tag.

    For convenience and proper guarding, we construct a variable type.

    TODO: make it possible to use ProcessGroupVariable as input to simple functions
          like _expand_group without dynamo complaining about making a proxy for it.
          It is not a tensor-like type, and we don't want a proxy- but dynamo assumes
          torch library functions are dealing with tensor-like types and would have proxies
          for their args.
    TODO: should we make this inherit VT instead of UDOV? Do we want any of the default behaviors
          or just graph-break whenever one of our special cases is not hit?
    c                 ó   — | j         S r%   ra   r'   s    r"   rb   z'ProcessGroupVariable.as_python_constant  rc   r#   rd   re   r    rf   r   r   c                 ó´  •— |dk    r6t           j                             | j                             ¦   «         ¦  «        S |dk    r6t           j                             | j                             ¦   «         ¦  «        S |dk    r6t           j                             | j                             ¦   «         ¦  «        S t          ¦   «                              ||||¦  «        S )NÚrankr�   Ú_get_backend_name)	r	   r   rw   r   r¨   r�   r©   r   rl   ©r   rI   rJ   rd   r    r!   s        €r"   rl   z ProcessGroupVariable.call_method  s¬   ø€ ð �6Š>ˆ>ÝÔ-×4Ò4°T´Z·_²_Ñ5FÔ5FÑGÔGÐGØ�6Š>ˆ>ÝÔ-×4Ò4°T´Z·_²_Ñ5FÔ5FÑGÔGÐGØÐ&Ò&Ð&ÝÔ-×4Ò4°T´Z×5QÒ5QÑ5SÔ5SÑTÔTÐTå‰wŒw×"Ò" 2 t¨T°6Ñ:Ô:Ð:r#   rI   r   c                 óæ   •‡ ‡‡— ‰dk    r)t           j                             ‰ j        j        ¦  «        S ‰dv rt          j        ˆˆ ˆfd„¦  «        S t          ¦   «                              ‰‰¦  «        S )NÚ
group_name)r¨   r�   c                  ó4   •— ‰                      ‰‰| |¦  «        S r%   )rl   )rd   r    rJ   r   rI   s     €€€r"   ú<lambda>z2ProcessGroupVariable.var_getattr.<locals>.<lambda>#  s   ø€ ¨×(8Ò(8¸¸TÀ4ÈÑ(PÔ(P€ r#   )r	   r   rw   r   r¬   ÚLambdaVariabler   rT   rx   s   ```€r"   rT   z ProcessGroupVariable.var_getattr  s|   øøøø€ Ø�<ÒÐÝÔ-×4Ò4°T´ZÔ5JÑKÔKÐKØÐ#Ð#Ð#ÝÔ+ØPÐPÐPÐPÐPÐPñô ð õ ‰wŒw×"Ò" 2 tÑ,Ô,Ð,r#   c                 ót   — t                                ¦   «         sdS ddlm} ddlm} t          | ||f¦  «        S )NFr   )ÚProcessGroup)ÚFakeProcessGroup)r   r   Útorch._C._distributed_c10dr±   Ú+torch.testing._internal.distributed.fake_pgr²   r   )r   r±   r²   s      r"   Úis_process_groupz%ProcessGroupVariable.is_process_group(  sW   € õ #×/Ò/Ñ1Ô1ð 	Ø�5Ø;Ð;Ð;Ð;Ð;Ð;ØPÐPÐPÐPÐPÐPå�e˜lÐ,<Ð=Ñ>Ô>Ð>r#   r‘   ©rI   r   )
r,   r-   r.   r/   rb   rl   rT   r0   rµ   r1   r2   s   @r"   rS   rS   ø   s­   ø€ € € € € ðð ð$ð ð ð;ð &ð	;ð
 -ð;ð 
ð;ð ;ð ;ð ;ð ;ð ;ð -ð -ð -ð -ð -ð -ð ð?ð ?ñ „\ð?ð ?ð ?ð ?ð ?r#   rS   c            
       ó²   ‡ — e Zd ZdZedededefd„¦   «         Zdej        j	        dedededdf
ˆ fd	„Z
d
„ Zdee         deeef         defˆ fd„Zdd„Zˆ xZS )ÚBackwardHookVariablezU
    Handles torch.utils.hooks.BackwardHook for module-level backward
    hooks.
    ÚmoduleÚ
user_hooksÚuser_pre_hooksc                 óÒ  ‡‡	‡
— t           j        st          d¦  «         dt          fˆˆ	ˆ
fd„}| j                             |d¦  «        \  Š}| j                             |¦  «        \  Š
}| j                             |¦  «        \  Š	}| j                             d||fi ¦  «        }t          j        j	         
                    d dd¦  «        |j        j        d<   t          ||||¦  «        S )Nz6module-level backwards hooks require compiled autogradÚbw_statec                 óØ   •— t           j        j                             dt	          j        t          t          | ‰‰¬¦  «        ft	          j        t          t          | ‰‰¬¦  «        f¦  «        S )a  
            Rather than installing the user hooks in the graph (which
            don't survive AotAutograd), we install hooks that will call
            trace_wrapped in the backward pass that CompiledAutograd
            can turn into actual hook calls.
            N)Úfnr½   Ú
hooks_nameÚmodule_name)r*   ÚutilsÚhooksÚBackwardHookÚ	functoolsÚpartialr
   r   )r½   rÁ   Úuser_hooks_nameÚuser_pre_hooks_names    €€€r"   Ú_in_graph_bw_hooksz7BackwardHookVariable.create.<locals>._in_graph_bw_hooksC  sy   ø€ õ ”;Ô$×1Ò1ØåÔ%Ý%Ý@Ø!)Ø#2Ø$/ðñ ô ðõ Ô%Ý%Ý@Ø!)Ø#6Ø$/ðñ ô ðñô ð r#   Úmodrm   r   Úexample_value)r   Úcompiled_autograd_enabledr   r   ÚoutputÚadd_backward_state_hookÚcreate_proxyr*   rÂ   rÃ   rÄ   ÚnodeÚmetar¸   )rI   r¹   rº   r»   rÉ   Úbw_state_proxyÚ_ÚproxyrÁ   rÇ   rÈ   s           @@@r"   rw   zBackwardHookVariable.create9  s  øøø€ õ !Ô:ð 	TÝÐRÑSÔSÐSð	­ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð: ')¤i×&GÒ&GÈÐPUÑ&VÔ&VÑ#ˆ�^Ø!#¤×!BÒ!BÀ>Ñ!RÔ!RÑÐ˜QØœY×>Ò>¸zÑJÔJÑˆ˜Ø”	×&Ò&ØØØÐØñ	
ô 
ˆõ ,1¬;Ô+<×+IÒ+IÈ$ÐPRÐTVÑ+WÔ+WˆŒ
Œ˜Ñ(Ý# E¨6°:¸~ÑNÔNÐNr#   rÔ   r   Nc                 ór   •—  t          ¦   «         j        di |¤Ž || _        || _        || _        || _        d S )Nr   )r   r   rÔ   r¹   rº   r»   )r   rÔ   r¹   rº   r»   Úoptionsr!   s         €r"   r   zBackwardHookVariable.__init__l  sE   ø€ ð 	�‰ŒÔÐ#Ð#˜7Ð#Ð#Ð#ØˆŒ
ØˆŒØ$ˆŒØ,ˆÔÐÐr#   c                 ó   — | j         S r%   )rÔ   r'   s    r"   Úas_proxyzBackwardHookVariable.as_proxyz  rc   r#   rd   r    c                 óx   •— |dv r | j         ||g|¢R i |¤ŽS t          ¦   «                              ||||¦  «        S )N)Úsetup_input_hookÚsetup_output_hook)Ú_setup_hookr   rl   rª   s        €r"   rl   z BackwardHookVariable.call_method}  sT   ø€ ð Ð<Ð<Ð<Ø#�4Ô# B¨Ð>¨tÐ>Ð>Ð>°vÐ>Ð>Ð>Ý‰wŒw×"Ò" 2 t¨T°6Ñ:Ô:Ð:r#   rI   r   c           
      ó¨   — ddl m}  |||j                             d||                      ¦   «         |                     ¦   «         fi ¦  «        ¦  «        S )Nr   )Úwrap_fx_proxyrl   )ÚbuilderrÞ   rÍ   rÏ   rØ   )r   rI   Úhook_method_namerd   rÞ   s        r"   rÜ   z BackwardHookVariable._setup_hookˆ  sa   € Ø*Ð*Ð*Ð*Ð*Ð*àˆ}ØØŒI×"Ò"ØØ Ø—’‘” $§-¢-¡/¤/Ð2Øñ	ô ñ
ô 
ð 	
r#   r¶   )r,   r-   r.   r/   r0   r   rw   r*   ÚfxÚProxyr   rØ   r   r   rV   rl   rÜ   r1   r2   s   @r"   r¸   r¸   3  s-  ø€ € € € € ðð ð
 ð0Oàð0Oð $ð0Oð (ð	0Oð 0Oð 0Oñ „\ð0Oðd-àŒxŒ~ð-ð  ð-ð $ð	-ð
 (ð-ð 
ð-ð -ð -ð -ð -ð -ðð ð ð	;ð �?Ô#ð		;ð
 �S˜/Ð)Ô*ð	;ð 
ð	;ð 	;ð 	;ð 	;ð 	;ð 	;ð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
r#   r¸   ))rÅ   r6   Útypingr   r   r   r*   Ú%torch.fx.experimental._backward_stater   rŠ   r   r	   Ú_trace_wrapped_higher_order_opr
   Úexcr   Úexternal_utilsr   Úguardsr   r   rP   r   rÂ   r   rM   r   Úconstantr   r   Útorch._dynamo.symbolic_convertr   r   r9   rB   rD   rX   rk   r“   rS   r¸   r   r#   r"   ú<module>rë      s‹  ðà Ð Ð Ð Ø €€€Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,à €€€Ø ?Ð ?Ð ?Ð ?Ð ?Ð ?à +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ø :Ð :Ð :Ð :Ð :Ð :Ø Ð Ð Ð Ð Ð Ø BÐ BÐ BÐ BÐ BÐ BØ 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4ð ð EØDÐDÐDÐDÐDÐDð0ð 0ð 0ð 0ð 0˜/ñ 0ô 0ð 0ð4Eð Eð EðRð Rð Rð.-ð -ð -ð -ð -Ð0ñ -ô -ð -ð6 7ð  7ð  7ð  7ð  7Ð0ñ  7ô  7ð  7ðF=;ð =;ð =;ð =;ð =;Ð+ñ =;ô =;ð =;ð@&;ð &;ð &;ð &;ð &;Ð,ñ &;ô &;ð &;ðR8?ð 8?ð 8?ð 8?ð 8?Ð.ñ 8?ô 8?ð 8?ðv`
ð `
ð `
ð `
ð `
˜?ñ `
ô `
ð `
ð `
ð `
r#   