Ë
    [^(hM  ã                   óþ   — U 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  G d„ de	«      Z G d	„ d
e	«      Z G d„ de	«      Z G d„ de	«      Zdaeeeej$                           ed<   dej(                  fd„Zy)é    N)Úchain)ÚOptional)Ú_get_device_index)ÚFunction)Úcommc                   ó,   — e Zd Zed„ «       Zed„ «       Zy)Ú	Broadcastc                 ó  ‡— t        d„ |D «       «      sJ d«       ‚|D �cg c]  }t        |d«      ‘Œ }}|| _        t        |«      dk(  ryt        |«      | _        |d   j                  «       | _        t        j                  || j                  «      }g }t        | j                  dd  «      D ]"  \  Š}|rŒ	|j                  ˆfd„|D «       «       Œ$  | j                  |Ž  t        t        j                  |«      «      S c c}w )Nc              3   óN   K  — | ]  }|j                   j                  d k7  –— Œ y­w©ÚcpuN©ÚdeviceÚtype©Ú.0Úis     úZ/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/torch/nn/parallel/_functions.pyú	<genexpr>z$Broadcast.forward.<locals>.<genexpr>   ó"   è ø€ ò 
Ø'(ˆA�H‰H�M‰M˜UÕ"ñ
ùó   ‚#%z2Broadcast function not implemented for CPU tensorsTr   © é   c              3   ó(   •K  — | ]	  }|‰   –— Œ y ­w©Nr   )r   ÚoutputÚidxs     €r   r   z$Broadcast.forward.<locals>.<genexpr>   s   øè ø€ Ò*M¸6¨6°#­;Ñ*Mùs   ƒ)Úallr   Útarget_gpusÚlenÚ
num_inputsÚ
get_deviceÚinput_devicer   Úbroadcast_coalescedÚ	enumerateÚneeds_input_gradÚextendÚmark_non_differentiableÚtupler   Úfrom_iterable)Úctxr   ÚinputsÚxÚoutputsÚnon_differentiablesÚinput_requires_gradr   s          @r   ÚforwardzBroadcast.forward   s  ø€ äñ 
Ø,2ô
ô 
ð 	@à?ó	@ð 
ð <GÖG°aÔ(¨¨DÕ1ÐGˆÐGØ%ˆŒÜˆv‹;˜!ÒØÜ˜V›ˆŒØ! !™9×/Ñ/Ó1ˆÔÜ×*Ñ*¨6°3·?±?ÓCˆØ ÐÜ(1°#×2FÑ2FÀqÀrÐ2JÓ(Kò 	NÑ$ˆCÐ$Ú&Ø#×*Ñ*Ó*MÀWÔ*MÕMð	Nð 	$ˆ×#Ñ#Ð%8Ñ9Ü”U×(Ñ(¨Ó1Ó2Ð2ùò Hs   ŸC>c                 ó^   — dt        j                  | j                  | j                  g|¢­Ž z   S )Nr   )ÚReduceAddCoalescedÚapplyr#   r!   ©r+   Úgrad_outputss     r   ÚbackwardzBroadcast.backward   s4   € àÔ+×1Ñ1Ø×Ñ˜cŸn™nð
Ø/;ò
ñ 
ð 	
ó    N©Ú__name__Ú
__module__Ú__qualname__Ústaticmethodr1   r7   r   r8   r   r	   r	      s(   „ Øñ3ó ð3ð$ ñ
ó ñ
r8   r	   c                   ó,   — e Zd Zed„ «       Zed„ «       Zy)r3   c                 ó  — t        dt        |«      |«      D �cg c]  }||   j                  «       ‘Œ c}| _        t        dt        |«      |«      D �cg c]
  }||||z    ‘Œ }}t	        j
                  ||«      S c c}w c c}w )Nr   )Úranger    r"   r   r   Úreduce_add_coalesced)r+   Údestinationr!   Úgradsr   Úgrads_s         r   r1   zReduceAddCoalesced.forward'   s€   € ô ,1°´C¸³JÀ
Ó+Kö
Ø&'ˆE�!‰H×ÑÕ!ò
ˆŒô 6;¸1¼cÀ%»jÈ*Ó5UÖV°�%˜˜A 
™NÒ+ÐVˆÐVÜ×(Ñ(¨°Ó=Ð=ùò
ùò Ws   ™A:ÁA?c                 óH   — dt        j                  | j                  g|¢­Ž z   S )N©NN)r	   r4   r   r5   s     r   r7   zReduceAddCoalesced.backward0   s(   € ð
ô �O‰O˜CŸO™OÐ;¨lÒ;ñ<ð 	<r8   Nr9   r   r8   r   r3   r3   &   s(   „ Øñ>ó ð>ð ñ<ó ñ<r8   r3   c                   ó,   — e Zd Zed„ «       Zed„ «       Zy)ÚGatherc                 óÔ  ‡ — t        d„ |D «       «      sJ d«       ‚|dk(  rd‰ _        nt        |d«      }|‰ _        |‰ _        t	        d„ |D «       «      ‰ _        t        d„ |D «       «      r4|dk(  r/t	        d„ |D «       «      }t        j                  d	«       d‰ _        nd
‰ _        t	        ˆ fd„|D «       «      ‰ _	        t        j                  |‰ j                  ‰ j                  «      S )Nc              3   óN   K  — | ]  }|j                   j                  d k7  –— Œ y­wr   r   r   s     r   r   z!Gather.forward.<locals>.<genexpr>;   r   r   z/Gather function not implemented for CPU tensorsr   Tc              3   ó<   K  — | ]  }|j                  «       –— Œ y ­wr   )r"   r   s     r   r   z!Gather.forward.<locals>.<genexpr>D   s   è ø€ Ò>°!˜qŸ|™|Ÿ~Ñ>ùs   ‚c              3   óB   K  — | ]  }|j                  «       d k(  –— Œ y­w©r   N)Údim©r   Úts     r   r   z!Gather.forward.<locals>.<genexpr>E   s   è ø€ Ò, ˆq�u‰u‹w˜!�|Ñ,ùs   ‚r   c              3   ó>   K  — | ]  }|j                  d «      –— Œ y­w)r   N)ÚviewrO   s     r   r   z!Gather.forward.<locals>.<genexpr>F   s   è ø€ Ò5¨˜1Ÿ6™6 !Ÿ9Ñ5ùs   ‚zvWas asked to gather along dimension 0, but all input tensors were scalars; will instead unsqueeze and return a vector.Fc              3   óT   •K  — | ]  }|j                  ‰j                  «      –— Œ! y ­wr   )ÚsizerN   )r   r   r+   s     €r   r   z!Gather.forward.<locals>.<genexpr>O   s   øè ø€ Ò@°A §¡ s§w¡w§Ñ@ùs   ƒ%()r   Útarget_devicer   rN   r)   Ú
input_gpusÚwarningsÚwarnÚunsqueezed_scalarÚinput_sizesr   Úgather)r+   rU   rN   r,   s   `   r   r1   zGather.forward9   sß   ø€ äñ 
Ø,2ô
ô 
ð 	=à<ó	=ð 
ð ˜EÒ!Ø %ˆCÕä-¨m¸TÓBˆMØ -ˆCÔØˆŒÜÑ>°vÔ>Ó>ˆŒÜÑ, VÔ,Ô,°¸²ÜÑ5¨fÔ5Ó5ˆFÜ�M‰Mð'ôð
 %)ˆCÕ!à$)ˆCÔ!ÜÓ@¸Ô@Ó@ˆŒÜ�{‰{˜6 3§7¡7¨C×,=Ñ,=Ó>Ð>r8   c                 ó´   — t         j                  | j                  | j                  | j                  |«      }| j
                  rt        d„ |D «       «      }d|z   S )Nc              3   ó&   K  — | ]	  }|d    –— Œ y­wrM   r   )r   Úgs     r   r   z"Gather.backward.<locals>.<genexpr>X   s   è ø€ Ò#B¨Q A a¥DÑ#Bùs   ‚rF   )ÚScatterr4   rV   rZ   rN   rY   r)   )r+   Úgrad_outputÚscattered_gradss      r   r7   zGather.backwardR   sK   € ä!Ÿ-™-Ø�N‰N˜CŸO™O¨S¯W©W°kó
ˆð × Ò Ü#Ñ#B°/Ô#BÓBˆOØ˜oÑ-Ð-r8   Nr9   r   r8   r   rH   rH   8   s(   „ Øñ?ó ð?ð0 ñ.ó ñ.r8   rH   c                   ó,   — e Zd Zed„ «       Zed„ «       Zy)r_   c           	      óÔ  — |D �cg c]  }t        |d«      ‘Œ }}|| _        |j                  j                  dk7  r|j	                  «       nd| _        d }t        j                  j                  «       r;| j
                  dk(  r,|D �cg c]!  }t        t        j                  d|«      «      ‘Œ# }}t        j                  |||| j                  |«      }|��t        |«      D ]s  \  }	}
t        j                  j                  ||	   «      5  t        j                  j                  «       }|j                  ||	   «       |
j                  |«       d d d «       Œu |S c c}w c c}w # 1 sw Y   Œ‹xY w)NTr   éÿÿÿÿÚcuda)r   rN   r   r   r"   r#   Útorchre   Úis_availableÚ_get_streamr   Úscatterr%   Úcurrent_streamÚwait_streamÚrecord_stream)r+   r   Úchunk_sizesrN   Úinputr-   Ústreamsr   r.   r   r   Úmain_streams               r   r1   zScatter.forward]   sG  € à;FÖG°aÔ(¨¨DÕ1ÐGˆÐGØˆŒØ16·±×1BÑ1BÀeÒ1K˜5×+Ñ+Ô-ÐQSˆÔØˆÜ�:‰:×"Ñ"Ô$¨×)9Ñ)9¸RÒ)?ð ITöØ>D”œEŸL™L¨°Ó8Õ9ðˆGð ô —,‘,˜u k°;ÀÇÁÈÓQˆàÐÜ& wÓ/ò 6‘	��6Ü—Z‘Z×&Ñ& {°1¡~Ó6ñ 6Ü"'§*¡*×";Ñ";Ó"=�KØ×+Ñ+¨G°A©JÔ7Ø×(Ñ(¨Ô5÷6ð 6ð6ð
 ˆùò# Hùò÷6ð 6ús   …EÂ&EÄAEÅE'	c                 ó`   — d d d t        j                  | j                  | j                  g|¢­Ž fS r   )rH   r4   r#   rN   )r+   r`   s     r   r7   zScatter.backwardr   s+   € à�T˜4¤§¡¨c×.>Ñ.>ÀÇÁÐ!VÈ+Ò!VÐVÐVr8   Nr9   r   r8   r   r_   r_   \   s*   „ Øñó ðð( ñWó ñWr8   r_   Ú_streamsr   c                 ó6  — | j                   dk(  ryt        t        | j                   d«      }|€yt        €dg|j	                  «       z  at        | j
                     €,|j                  | j
                  «      t        | j
                  <   t        | j
                     S )zBGet a background stream for copying between CPU and target device.r   N)r   Úgetattrrf   rr   Údevice_countÚindexÚStream)r   Ú
device_mods     r   rh   rh   {   s„   € ð ‡{�{�eÒØÜœ §¡¨TÓ2€JØÐØÜÐØ�6˜J×3Ñ3Ó5Ñ5ˆÜ�—‘ÑÐ%Ø!+×!2Ñ!2°6·<±<Ó!@Œ�—‘ÑÜ�F—L‘LÑ!Ð!r8   )rW   Ú	itertoolsr   Útypingr   rf   Útorch._utilsr   Útorch.autogradr   Útorch.nn.parallelr   r	   r3   rH   r_   rr   Úlistrw   Ú__annotations__r   rh   r   r8   r   ú<module>r€      s|   ðÜ Ý Ý ã Ý *Ý #Ý "ô
�ô 
ô6<˜ô <ô$!.ˆXô !.ôHWˆhô Wð8 48€ˆ(�4˜ §¡Ñ.Ñ/Ñ
0Ó 7ð"˜Ÿ™ô "r8   