§
    ŠŠtj¡5  ã                   ó  — d dl Z d dlZd dlmZ d dlmZmZ d dlmZm	Z	m
Z
mZ d dlZd dlmZ d dlmZ d dlmZ g Zdeded	eeed
f         eed
f         f         fd„Zdej        dz  deded	eeef         fd„Zdeed
f         deed
f         d	eeed
f         eeef         f         fd„Z edeee¦  «        Z edej        e¦  «        Ze
dedej        de d	ee         fd„¦   «         Z!e
dedej        de d	ee         fd„¦   «         Z!d„ Z!d>dedede d	dfd„Z"dej        dej#        d	dfd „Z$dej        fd!„Z% ed"¦  «        Z& ed#eeee'eee¦  «        Z(e
d$eej        ge&f         d%ej        d	e&fd&„¦   «         Z)e
d$eej        gef         d%e(d	e(fd'„¦   «         Z)d(„ Z)deed
f         deeef         dz  dej        de d	eeed
f         eeeef         d
f         f         f
d)„Z*	 d?d*ej+        d+eej                 d,e	d-         fd.„Z,	 d>d/ej-        d*ej+        d0e.d1e.d2ee         d3e d	dfd4„Z/d*ej+        d5eej                 d0e.d1e.d	df
d6„Z0d7eeef         d8ed9ed	dfd:„Z1dej        d	e fd;„Z2d<eej-                 d	eej-                 fd=„Z3dS )@é    N)ÚOrderedDict)ÚCallableÚ	Container)ÚAnyÚOptionalÚoverloadÚTypeVar)Únn)ÚPackedSequenceÚargsÚkwargsÚreturn.c                  óè   — g }t          | ¦  «        }|                     ¦   «         D ]/\  }}|                     |¦  «         |                     |¦  «         Œ0t          |¦  «        t          |¦  «        fS )aŠ  
    Turn argument list into separate key list and value list (unpack_kwargs does the opposite).

    Inspiration: https://github.com/facebookresearch/fairscale/blob/eeb6684/fairscale/internal/containers.py#L70
    Usage::

        kwarg_keys, flat_args = pack_kwargs(1, 2, a=3, b=4)
        assert kwarg_keys == ("a", "b")
        assert flat_args == (1, 2, 3, 4)
        args, kwargs = unpack_kwargs(kwarg_keys, flat_args)
        assert args == (1, 2)
        assert kwargs == {"a": 3, "b": 4}
    Returns:
        Tuple[Tuple[Any, ...], Tuple[str, ...]]: The first tuple element gives
        gives both positional args and kwarg values, where the positional args
        proceed kwarg values and kwarg values are ordered consistently with the
        kwarg keys. The second tuple element gives the kwarg keys.
        The second tuple element's length is at most the first tuple element's length.
    )ÚlistÚitemsÚappendÚtuple)r   r   Ú
kwarg_keysÚ	flat_argsÚkÚvs         úU/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/torch/distributed/utils.pyÚ_pack_kwargsr      su   € ð( €JÝ ™:œ:€IØ—’‘”ð ð ‰ˆˆ1Ø×Ò˜!ÑÔÐØ×Ò˜ÑÔÐÐå�ÑÔ�U :Ñ.Ô.Ð.Ð.ó    Údtypec                 óŒ   ‡ — ‰ €||fS dt           j        dt           j        fˆ fd„}t          ||¦  «        t          ||¦  «        fS )z–
    Cast floating point tensors in ``args`` and ``kwargs`` to ``input_dtype``.

    This respects the existing ``requires_grad`` on the tensors.
    NÚxr   c                 óp   •— t          j        | ¦  «        r| j        ‰k    r| S |                      ‰¦  «        S ©N)ÚtorchÚis_floating_pointr   Úto)r   r   s    €r   Úcast_fnz%_cast_forward_inputs.<locals>.cast_fn;   s7   ø€ ÝÔ& qÑ)Ô)ð 	¨Q¬W¸Ò-=Ð-=ØˆHà�tŠt�E‰{Œ{Ðr   )r    ÚTensorÚ_apply_to_tensors)r   r   r   r#   s   `   r   Ú_cast_forward_inputsr&   .   sf   ø€ ð €}Ø�Vˆ|Ðð•5”<ð ¥E¤Lð ð ð ð ð ð õ ˜g tÑ,Ô,Õ.?ÀÈÑ.PÔ.PÐQÐQr   r   r   c           	      ól  — t          |¦  «        t          | ¦  «        k    r/t          dt          |¦  «        › dt          | ¦  «        › �¦  «        ‚t          |¦  «        dk    r| i fS | dt          |¦  «         …         }t          t          || t          |¦  «         d…         ¦  «        ¦  «        }||fS )zSee _pack_kwargs.ztoo many keys z vs. r   N)ÚlenÚAssertionErrorÚdictÚzip)r   r   r   r   s       r   Ú_unpack_kwargsr,   D   s¯   € õ ˆ:�„�˜Y™œÒ'Ð'ÝÐT­c°*©o¬oÐTÐTÅCÈ	ÁNÄNÐTÐTÑUÔUÐUÝ
ˆ:�„˜!ÒÐØ˜"ˆ}ÐØÐ'�˜J™œÐ'Ð'Ô(€DÝ•#�j )­S°©_¬_Ð,<Ð,>Ð,>Ô"?Ñ@Ô@ÑAÔA€FØ�ˆ<Ðr   ÚSÚTÚinputsÚtarget_deviceÚ!use_side_stream_for_tensor_copiesc                 ó   — d S r   © ©r/   r0   r1   s      r   Ú_recursive_tor5   U   s	   € ð ˆcr   c                 ó   — d S r   r3   r4   s      r   r5   r5   [   s	   € ð ˆsr   c                 óF   ‡‡‡— ˆˆˆfd„Š	  ‰| ¦  «        }dŠn# dŠw xY w|S )z-Recursively moves input to the target_device.c                 ó°  •‡ — t          ‰ t          j        t          f¦  «        �rŠt          ‰ t          ¦  «        r‰ j        j        n‰ j        }|‰k    r‰ fS ‰	s‰                      ‰¦  «        fS |j        dk    r‰                      ‰¦  «        fS ddlm	}  |‰¦  «        }|5  ‰                      ‰¦  «        }d d d ¦  «         n# 1 swxY w Y   t          j
                             ‰j        ¦  «        5  t          j
                             ¦   «         }|                     |¦  «         t          ‰ t          ¦  «        r|j                             |¦  «         n>t          |t          j        ¦  «        st!          d¦  «        ‚|                     |¦  «         d d d ¦  «         n# 1 swxY w Y   |fS ddlm}  |‰ ¦  «        r#ˆ fd„t'          t)          ‰‰ ¦  «        Ž D ¦   «         S t          ‰ t*          ¦  «        r7t-          ‰ ¦  «        dk    r$t/          t'          t)          ‰‰ ¦  «        Ž ¦  «        S t          ‰ t.          ¦  «        r4t-          ‰ ¦  «        dk    r!d„ t'          t)          ‰‰ ¦  «        Ž D ¦   «         S t          ‰ t0          ¦  «        rHt-          ‰ ¦  «        dk    r5ˆ fd„t'          t)          ‰‰                      ¦   «         ¦  «        Ž D ¦   «         S ‰ gS )	NÚcpur   )Ú_get_streamzoutput must be a torch.Tensor©Ú_is_namedtuplec                 ó4   •— g | ]} t          ‰¦  «        |Ž ‘ŒS r3   ©Útype)Ú.0r   Úobjs     €r   ú
<listcomp>z1_recursive_to.<locals>.to_map.<locals>.<listcomp>Š   s&   ø€ ÐHÐHÐH¨�I•D˜‘I”I˜tÐ$ÐHÐHÐHr   c                 ó,   — g | ]}t          |¦  «        ‘ŒS r3   )r   )r@   Úis     r   rB   z1_recursive_to.<locals>.to_map.<locals>.<listcomp>�   s   € Ð<Ð<Ð< •D˜‘G”GÐ<Ð<Ð<r   c                 ó@   •— g | ]} t          ‰¦  «        |¦  «        ‘ŒS r3   r>   )r@   rD   rA   s     €r   rB   z1_recursive_to.<locals>.to_map.<locals>.<listcomp>“   s'   ø€ ÐIÐIÐI Q�I•D˜‘I”I˜a‘L”LÐIÐIÐIr   )Ú
isinstancer    r$   r   ÚdataÚdevicer"   r?   Útorch.nn.parallel._functionsr:   ÚacceleratorÚdevice_indexÚindexÚcurrent_streamÚwait_streamÚrecord_streamr)   Ú torch.nn.parallel.scatter_gatherr<   r+   Úmapr   r(   r   r*   r   )
rA   rH   r:   ÚstreamÚoutputrM   r<   r0   Úto_mapr1   s
   `      €€€r   rT   z_recursive_to.<locals>.to_mapd   sL  øø€ Ý�c�EœL­.Ð9Ñ:Ô:ñ 	!Ý(2°3½Ñ(GÔ(GÐW�S”X”_�_ÈSÌZˆFØ˜Ò&Ð&Ø�v�Ø4ð !ØŸš˜}Ñ-Ô-Ð/Ð/ð ”; %Ò'Ð'ØŸFšF =Ñ1Ô1Ð3Ð3àDÐDÐDÐDÐDÐDð %˜ ]Ñ3Ô3�Øð 3ð 3Ø ŸVšV MÑ2Ô2�Fð3ð 3ð 3ñ 3ô 3ð 3ð 3ð 3ð 3ð 3ð 3øøøð 3ð 3ð 3ð 3õ Ô&×3Ò3°MÔ4GÑHÔHð =ð =Ý%*Ô%6×%EÒ%EÑ%GÔ%G�Nà"×.Ò.¨vÑ6Ô6Ð6õ " #¥~Ñ6Ô6ð =Øœ×1Ò1°.ÑAÔAÐAÐAå)¨&µ%´,Ñ?Ô?ð RÝ"0Ð1PÑ"QÔ"QÐQØ×,Ò,¨^Ñ<Ô<Ð<ð=ð =ð =ñ =ô =ð =ð =ð =ð =ð =ð =øøøð =ð =ð =ð =ð �yÐ àCÐCÐCÐCÐCÐCàˆ>˜#ÑÔð 	IàHÐHÐHÐHµµc¸&À#Ñ6FÔ6FÐ1GÐHÑHÔHÐHÝ�c�5Ñ!Ô!ð 	0¥c¨#¡h¤h°¢l lå��S ¨Ñ-Ô-Ð.Ñ/Ô/Ð/Ý�c�4Ñ Ô ð 	=¥S¨¡X¤X°¢\ \à<Ð<¥S­#¨f°cÑ*:Ô*:Ð%;Ð<Ñ<Ô<Ð<Ý�c�4Ñ Ô ð 	J¥S¨¡X¤X°¢\ \àIÐIÐIÐI­#­s°6¸3¿9º9¹;¼;Ñ/GÔ/GÐ*HÐIÑIÔIÐIØˆuˆs%   Â"CÃCÃCÃ3B"F!Æ!F%Æ(F%Nr3   )r/   r0   r1   ÚresrT   s    `` @r   r5   r5   a   sT   øøø€ ð0ð 0ð 0ð 0ð 0ð 0ð 0ðfØˆf�V‰nŒnˆàˆˆø�ˆˆˆˆˆØ€Js   Œ šTÚcondÚsÚraise_assertion_errorc                 ót   — | s3t          |¦  «         t          j        ¦   «          |rt          |¦  «        ‚dS dS )zwAlternate to ``assert`` when in the backward context to print the error message ``s`` since otherwise, it is swallowed.N)ÚprintÚ	tracebackÚprint_stackr)   )rV   rW   rX   s      r   Ú	_p_assertr]   ž   sN   € àð $Ýˆa‰ŒˆÝÔÑÔÐØ ð 	$Ý  Ñ#Ô#Ð#ð	$ð $ð	$ð 	$r   ÚtensorÚsizec                 ó  — t          j        ¦   «         5  t           j        j                             ¦   «         s±|                      ¦   «                              ¦   «         |                     ¦   «         k    }|ss|                      ¦   «                              ¦   «         }t          |dk    d¦  «         |                      ¦   «          	                    |                     ¦   «         ¦  «         ddd¦  «         dS # 1 swxY w Y   dS )zÀ
    Allocate storage for ``tensor`` with the given size.

    Returns:
        bool: ``True`` if this method allocated storage and ``False`` if the
        storage was already allocated.
    r   zCTensor storage should have been resized to be 0 but got PLACEHOLDERN)
r    Úno_gradÚdistributedÚ_functional_collectivesÚis_torchdynamo_compilingÚ_typed_storageÚ_sizeÚnumelr]   Ú_resize_)r^   r_   Úalready_allocatedÚtensor_storage_sizes       r   Ú_alloc_storagerk   §   s&  € õ 
Œ‰Œð 	?ð 	?ÝÔ Ô8×QÒQÑSÔSð 	?Ø &× 5Ò 5Ñ 7Ô 7× =Ò =Ñ ?Ô ?À4Ç:Â:Á<Ä<Ò OÐØ$ð ?Ø&,×&;Ò&;Ñ&=Ô&=×&CÒ&CÑ&EÔ&EÐ#ÝØ'¨1Ò,ØYñô ð ð ×%Ò%Ñ'Ô'×0Ò0°·²±´Ñ>Ô>Ð>ð	?ð 	?ð 	?ñ 	?ô 	?ð 	?ð 	?ð 	?ð 	?ð 	?ð 	?ð 	?øøøð 	?ð 	?ð 	?ð 	?ð 	?ð 	?s   ”CC6Ã6C:Ã=C:c           
      ó  — t          j        ¦   «         5  t           j        j                             ¦   «         s½|                      ¦   «                              ¦   «         dk    }|s‘t          |                      ¦   «         dk    d|                      ¦   «         › d|                      ¦   «                              ¦   «         › d| j	        › �¦  «         |                      ¦   «          
                    d¦  «         ddd¦  «         dS # 1 swxY w Y   dS )z²
    Frees the underlying storage of ``tensor``.

    Returns:
        bool: ``True`` if the method freed the storage and ``False`` if the
        storage was already freed.
    r   zVFreeing a tensor's storage is unsafe when it is not the sole occupant
storage offset: z
storage size: z
tensor shape: N)r    ra   rb   rc   rd   re   rf   r]   Ústorage_offsetÚshaperh   )r^   Úalready_freeds     r   Ú_free_storagerp   »   sT  € õ 
Œ‰Œð 4ð 4ÝÔ Ô8×QÒQÑSÔSð 
	4Ø"×1Ò1Ñ3Ô3×9Ò9Ñ;Ô;¸qÒ@ˆMØ ð 4ÝØ×)Ò)Ñ+Ô+¨qÒ0ð4Ø'-×'<Ò'<Ñ'>Ô'>ð4ð 4à%+×%:Ò%:Ñ%<Ô%<×%BÒ%BÑ%DÔ%Dð4ð 4ð &,¤\ð4ð 4ñô ð ð ×%Ò%Ñ'Ô'×0Ò0°Ñ3Ô3Ð3ð4ð 4ð 4ñ 4ô 4ð 4ð 4ð 4ð 4ð 4ð 4ð 4øøøð 4ð 4ð 4ð 4ð 4ð 4s   ”C!DÄDÄ	DÚQÚRÚfnÚ	containerc                 ó   — d S r   r3   ©rs   rt   s     r   r%   r%   Õ   s	   € ð 	ˆr   c                 ó   — d S r   r3   rv   s     r   r%   r%   Û   s   € ØMPÈSr   c                 ó(   ‡ ‡— ˆˆ fd„Š ‰|¦  «        S )zFRecursively apply to all tensor in different kinds of container types.c                 óN  •‡— ddl m} t          | t          j        ¦  «        r ‰	| ¦  «        S t          | d¦  «        rGt          j        | ¦  «        Šˆˆfd„t          j        ‰¦  «        D ¦   «         }t          j        ‰fi |¤ŽS t          | t          ¦  «        r>|  
                    ¦   «         }|                      ¦   «         D ]\  }} ‰|¦  «        ||<   Œ|S t          | t          ¦  «        r ‰| j        ¦  «         | S t          | t          ¦  «        r ˆfd„|                      ¦   «         D ¦   «         S  || ¦  «        r ˆfd„| D ¦   «         } t          | ¦  «        |Ž S t          | t           t"          t$          f¦  «        r$ t          | ¦  «        ˆfd„| D ¦   «         ¦  «        S | S )Nr   r;   Ú__dataclass_fields__c           	      óX   •— i | ]&}|j          ‰t          ‰|j         ¦  «        ¦  «        “Œ'S r3   )ÚnameÚgetattr)r@   ÚfÚapplyÚdcs     €€r   ú
<dictcomp>z4_apply_to_tensors.<locals>.apply.<locals>.<dictcomp>é   s@   ø€ ð ð ð Ø78�”˜˜�g b¨!¬&Ñ1Ô1Ñ2Ô2ðð ð r   c                 ó.   •— i | ]\  }}| ‰|¦  «        “ŒS r3   r3   )r@   ÚkeyÚvaluer   s      €r   r�   z4_apply_to_tensors.<locals>.apply.<locals>.<dictcomp>ö   s'   ø€ ÐBÐBÐB©*¨#¨u�C˜˜˜u™œÐBÐBÐBr   c              3   ó.   •K  — | ]} ‰|¦  «        V — Œd S r   r3   ©r@   Úelr   s     €r   ú	<genexpr>z3_apply_to_tensors.<locals>.apply.<locals>.<genexpr>ø   s+   øè è € Ð)Ð) �5�5˜‘9”9Ð)Ð)Ð)Ð)Ð)Ð)r   c              3   ó.   •K  — | ]} ‰|¦  «        V — Œd S r   r3   r†   s     €r   rˆ   z3_apply_to_tensors.<locals>.apply.<locals>.<genexpr>û   s+   øè è € Ð1Ð1¨˜5˜5 ™9œ9Ð1Ð1Ð1Ð1Ð1Ð1r   )rP   r<   rF   r    r$   ÚhasattrÚdataclassesÚreplaceÚfieldsr   Ú	__class__r   r   rG   r*   r?   r   r   Úset)
r   r<   ÚchangesÚodrƒ   r„   rU   r€   r   rs   s
          @€€r   r   z _apply_to_tensors.<locals>.applyâ   sß  øø€ ØCÐCÐCÐCÐCÐCå�a�œÑ&Ô&ð 	Ø�2�a‘5”5ˆLÝ�QÐ.Ñ/Ô/ð 	ÝÔ$ QÑ'Ô'ˆBðð ð ð ð Ý<GÔ<NÈrÑ<RÔ<Rðñ ô ˆGõ Ô& rÐ5Ð5¨WÐ5Ð5Ð5Ý˜�;Ñ'Ô'ð 	Ø—’‘”ˆBØŸgšg™iœið 'ð '‘
��UØ˜% ™,œ,��3‘�ØˆIÝ˜�>Ñ*Ô*ð 	ØˆE�!”&‰MŒMˆMØˆHÝ˜�4Ñ Ô ð 	ØBÐBÐBÐB¸¿º¹	¼	ÐBÑBÔBÐBØˆ^˜AÑÔð 	Ø)Ð)Ð)Ð) qÐ)Ñ)Ô)ˆCØ•4˜‘7”7˜C�=Ð Ý˜�D¥%­Ð-Ñ.Ô.ð 	Ø•4˜‘7”7Ð1Ð1Ð1Ð1¨qÐ1Ñ1Ô1Ñ1Ô1Ð1àˆHr   r3   )rs   rt   r   s   ` @r   r%   r%   ß   s4   øø€ ðð ð ð ð ð ð: ˆ5�ÑÔÐr   c           	      ó8  — | rt          | ||¦  «        ng }|rt          |||¦  «        ng }t          |¦  «        t          |¦  «        k     rJ|                     d„ t          t          |¦  «        t          | ¦  «        z
  ¦  «        D ¦   «         ¦  «         nit          |¦  «        t          |¦  «        k     rI|                     d„ t          t          |¦  «        t          |¦  «        z
  ¦  «        D ¦   «         ¦  «         t	          |¦  «        t	          |¦  «        fS )Nc                 ó   — g | ]}d ‘ŒS )r3   r3   ©r@   Ú_s     r   rB   z_to_kwargs.<locals>.<listcomp>  s   € ÐPÐPÐP A˜RÐPÐPÐPr   c                 ó   — g | ]}i ‘ŒS r3   r3   r”   s     r   rB   z_to_kwargs.<locals>.<listcomp>  s   € ÐVÐVÐV A˜RÐVÐVÐVr   )r5   r(   ÚextendÚranger   )r/   r   r0   r1   Úmoved_inputsÚmoved_kwargss         r   Ú
_to_kwargsr›     s  € ð ð	��f˜mÐ-NÑOÔOÐOàð ð ð	��f˜mÐ-NÑOÔOÐOàð õ
 ˆ<ÑÔ�3˜|Ñ,Ô,Ò,Ð,Ø×ÒÐPÐP­­s°<Ñ/@Ô/@Å3ÀvÁ;Ä;Ñ/NÑ)OÔ)OÐPÑPÔPÑQÔQÐQÐQÝ	ˆ\Ñ	Ô	�S Ñ.Ô.Ò	.Ð	.Ø×ÒÐVÐV­­s°<Ñ/@Ô/@Å3À|ÑCTÔCTÑ/TÑ)UÔ)UÐVÑVÔVÑWÔWÐWÝ�ÑÔ¥ lÑ 3Ô 3Ð3Ð3r   Úprocess_groupÚtensorsÚloggerzdist.Loggerc                 ó.   — t          j        | ||¦  «        S r   )ÚdistÚ_verify_params_across_processes)rœ   r�   rž   s      r   Ú$_verify_param_shape_across_processesr¢     s   € õ
 Ô/°¸wÈÑOÔOÐOr   ÚmoduleÚbroadcast_bucket_sizeÚsrcÚparams_and_buffers_to_ignoreÚbroadcast_buffersc                 óF  — g }|                       ¦   «         D ]0\  }}||vr'|                     |                     ¦   «         ¦  «         Œ1|rE|                      ¦   «         D ]0\  }}	||vr'|                     |	                     ¦   «         ¦  «         Œ1t	          ||||¦  «         dS )ag  
    Sync ``module``'s parameters and buffers state.

    Syncs ``module``'s parameters and buffers state so that all ranks contain
    the same module state across all ranks. Note that this API assumes that all
    parameter shapes are consistent before running the synchronization. This can
    be checked with ``_verify_param_shape_across_processes``.
    N)Únamed_parametersr   ÚdetachÚnamed_buffersÚ_sync_params_and_buffers)
r£   rœ   r¤   r¥   r¦   r§   Úmodule_statesr|   ÚparamÚbuffers
             r   Ú_sync_module_statesr°   !  s½   € ð  )+€MØ×.Ò.Ñ0Ô0ð 1ð 1‰ˆˆeØÐ3Ð3Ð3Ø× Ò  §¢¡¤Ñ0Ô0Ð0øàð 6Ø"×0Ò0Ñ2Ô2ð 	6ð 	6‰LˆD�&ØÐ7Ð7Ð7Ø×$Ò$ V§]¢]¡_¤_Ñ5Ô5Ð5øå˜]¨MÐ;PÐRUÑVÔVÐVÐVÐVr   r­   c                 ó^   — t          |¦  «        dk    rt          j        | |||¦  «         dS dS )zfSynchronize ``module_states`` (list of tensors) across all processes by broadcasting them from rank 0.r   N)r(   r    Ú_broadcast_coalesced)rœ   r­   r¤   r¥   s       r   r¬   r¬   >  sH   € õ ˆ=ÑÔ˜AÒÐÝÔ!Ø˜=Ð*?Àñ	
ô 	
ð 	
ð 	
ð 	
ð Ðr   Ú
state_dictÚ
old_prefixÚ
new_prefixc                 óô   — ||k    rt          d¦  «        ‚t          |                      ¦   «         ¦  «        D ]@}|                     |¦  «        sŒ||t	          |¦  «        d…         z   }| |         | |<   | |= ŒAdS )a  
    Replace all keys that match a given old_prefix with a new_prefix (in-place).

    Usage::

        state_dict = {"layer.xyz": torch.tensor(1)}
        replace_by_prefix_(state_dict, "layer.", "module.layer.")
        assert state_dict == {"module.layer.xyz": torch.tensor(1)}
    z*old_prefix and new_prefix must be distinctN)Ú
ValueErrorr   ÚkeysÚ
startswithr(   )r³   r´   rµ   rƒ   Únew_keys        r   Ú_replace_by_prefixr»   K  s’   € ð �ZÒÐÝÐEÑFÔFÐFÝ�J—O’OÑ%Ô%Ñ&Ô&ð ð ˆØ�~Š~˜jÑ)Ô)ð 	ØØ˜s¥3 z¡?¤?Ð#4Ð#4Ô5Ñ5ˆØ(¨œoˆ
�7ÑØ�sˆOˆOðð r   c                 óV   — |                       ¦   «                              ¦   «         dk    S )Nr   )Úuntyped_storageÚdata_ptr)r^   s    r   Ú_data_ptr_allocatedr¿   c  s%   € Ø×!Ò!Ñ#Ô#×,Ò,Ñ.Ô.°Ò2Ð2r   Úmodulesc                 ó®   — g }d„ | D ¦   «         }| D ]C}d}|                      ¦   «         D ]\  }}||uo||v }|rd} nŒ|r|                     |¦  «         ŒD|S )zö
    Returns the modules in ``modules`` that are root modules (i.e.
    parent-less) with respect to the set ``modules``. In other words, these
    are the modules in ``modules`` that are the not child of any other
    module in ``modules``.
    c                 óR   — i | ]$}|t          |                     ¦   «         ¦  «        “Œ%S r3   )r�   rÀ   )r@   r£   s     r   r�   z%_get_root_modules.<locals>.<dictcomp>o  s9   € ð :ð :ð :Ø*0ˆ•�F—N’NÑ$Ô$Ñ%Ô%ð:ð :ð :r   TF)r   r   )rÀ   Úroot_modulesÚmodule_to_modulesÚcandidate_moduleÚis_root_moduler£   Ú_modulesÚis_child_modules           r   Ú_get_root_modulesrÉ   g  s¶   € ð %'€Lð:ð :Ø4;ð:ñ :ô :Ðð $ð 
2ð 
2ÐØˆØ 1× 7Ò 7Ñ 9Ô 9ð 	ð 	ÑˆF�Hà ¨Ð.ÐOÐ3CÀxÐ3Oð ð ð Ø!&�Ø�ðð ð 	2Ø×ÒÐ 0Ñ1Ô1Ð1øØÐr   )Tr   )4r‹   r[   Úcollectionsr   Úcollections.abcr   r   Útypingr   r   r   r	   r    Útorch.distributedrb   r    r
   Útorch.nn.utils.rnnr   Ú__all__r   Ústrr   r   r&   r*   r,   r   r-   r$   r.   rH   Úboolr5   r]   ÚSizerk   rp   rq   r�   rr   r%   r›   ÚProcessGroupr¢   ÚModuleÚintr°   r¬   r»   r¿   rÉ   r3   r   r   ú<module>rÖ      sÃ  ðà Ð Ð Ð Ø Ð Ð Ð Ø #Ð #Ð #Ð #Ð #Ð #Ø /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3à €€€Ø  Ð  Ð  Ð  Ð  Ð  Ø Ð Ð Ð Ð Ð Ø -Ð -Ð -Ð -Ð -Ð -ð €ð/˜ð / sð /¨u°U¸3À¸8´_ÀeÈCÐQTÈHÄoÐ5UÔ/Vð /ð /ð /ð /ð:RØŒ;˜ÑðRàðRð ðRð ˆ3�ˆ8„_ð	Rð Rð Rð Rð,
Ø�S˜#�XŒð
Ø,1°#°s°(¬Oð
à
ˆ5��c�Œ?˜D  c œNÐ*Ô+ð
ð 
ð 
ð 
ð €GˆC��t˜UÑ#Ô#€Ø€GˆC�”˜~Ñ.Ô.€ð 
ðØðØ#œlðØOSðà	ˆ!„Wðð ð ñ 
„ðð
 
ðØðØ#œlðØOSðà
ˆ1„Xðð ð ñ 
„ðð
:ð :ð :ðz$ð $�Cð $˜Cð $¸ð $Èð $ð $ð $ð $ð?˜5œ<ð ?¨u¬zð ?¸dð ?ð ?ð ?ð ?ð(4˜%œ,ð 4ð 4ð 4ð 4ð, €GˆC�L„L€Ø€GˆC��t˜U C¨°nÀcÑJÔJ€ð 
ðØ�%”,� Ð"Ô#ðØ05´ðàðð ð ñ 
„ðð
 
Ø P˜( E¤L >°3Ð#6Ô7Ð PÀAÐ PÈ!Ð PÐ PÐ Pñ 
„Ø Pð ð  ð  ðF4Ø�#�s�(ŒOð4à��c�ŒN˜TÑ!ð4ð ”<ð4ð (,ð	4ð
 ˆ5��c�Œ?˜E $ s¨C x¤.°#Ð"5Ô6Ð6Ô7ð4ð 4ð 4ð 4ð4 '+ðPð PØÔ$ðPà�%”,ÔðPð �]Ô#ðPð Pð Pð Pð #ðWð WØŒIðWàÔ$ðWð ðWð 
ð	Wð
 #,¨C¤.ðWð ðWð 
ðWð Wð Wð Wð:

ØÔ$ð

à˜œÔ%ð

ð ð

ð 
ð	

ð
 
ð

ð 

ð 

ð 

ðØ�S˜#�X”ðàðð ðð 
ð	ð ð ð ð03 ¤ð 3°ð 3ð 3ð 3ð 3ð˜t B¤Iœð °4¸¼	´?ð ð ð ð ð ð r   