Ë
    S²jR  ã                   óò   — U d dl 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j                   dz     dz  ed<   dej$                  fd„Zy)é    N)Úchain)Ú_get_device_index)ÚFunction)Úcommc                   ó,   — e Zd Zed„ «       Zed„ «       Zy)Ú	Broadcastc                 óâ  ‡— t        d„ |D «       «      st        d«      ‚|D �cg c]  }t        |d«      ‘Œ }}|| _        t	        |«      dk(  ryt	        |«      | _        |d   j                  «       | _        |D �cg c]  }|j                  «       ‘Œ c}| _	        t        j                  || j                  «      }|D ]=  }t        | j                  «      D ]#  \  }}|sŒ	t        j                  ||   «      ||<   Œ% Œ? g }	t        | j                  dd  «      D ]"  \  Š}
|
rŒ	|	j!                  ˆfd„|D «       «       Œ$  | j"                  |	Ž  t%        t'        j(                  |«      «      S c c}w c c}w )Nc              3   óN   K  — | ]  }|j                   j                  d k7  –— Œ y­w©ÚcpuN©ÚdeviceÚtype©Ú.0Úis     ú[/var/www/html/ia-enhanced/venv/lib/python3.12/site-packages/torch/nn/parallel/_functions.pyú	<genexpr>z$Broadcast.forward.<locals>.<genexpr>   ó   è ø€ Ò:¨a�1—8‘8—=‘= EÕ)Ñ:ùó   ‚#%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   ƒ)ÚallÚAssertionErrorr   Útarget_gpusÚlenÚ
num_inputsÚ
get_deviceÚinput_deviceÚ
is_complexÚcomplex_maskr   Úbroadcast_coalescedÚ	enumerateÚtorchÚview_as_complexÚneeds_input_gradÚextendÚmark_non_differentiableÚtupler   Úfrom_iterable)Úctxr   ÚinputsÚxÚinpÚoutputsÚdevice_outputsr   r$   Únon_differentiablesÚinput_requires_gradr   s              @r   ÚforwardzBroadcast.forward   si  ø€ äÑ:°6Ô:Ô:Ü Ð!UÓVÐVØ;FÖG°aÔ(¨¨DÕ1ÐGˆÐGØ%ˆŒÜˆv‹;˜!ÒØÜ˜V›ˆŒØ! !™9×/Ñ/Ó1ˆÔà8>Ö?°˜CŸN™NÕ,Ò?ˆÔä×*Ñ*¨6°3·?±?ÓCˆà%ò 	QˆNÜ!*¨3×+;Ñ+;Ó!<ò Q‘��:ÚÜ(-×(=Ñ(=¸nÈQÑ>OÓ(P�N 1Ò%ñQð	Qð
 !ÐÜ(1°#×2FÑ2FÀqÀrÐ2JÓ(Kò 	NÑ$ˆCÐ$Ú&Ø#×*Ñ*Ó*MÀWÔ*MÕMð	Nð 	$ˆ×#Ñ#Ð%8Ñ9Ü”U×(Ñ(¨Ó1Ó2Ð2ùò+ Hùò @s   £E'Á:E,c                 ób   — t        j                  | j                  | j                  g|¢­Ž }d|z   S )Nr   )ÚReduceAddCoalescedÚapplyr#   r!   )r/   Úgrad_outputsÚgradss      r   ÚbackwardzBroadcast.backward&   s5   € ä"×(Ñ(Ø×Ñ˜cŸn™nð
Ø/;ò
ˆð ˜‰Ðó    N©Ú__name__Ú
__module__Ú__qualname__Ústaticmethodr7   r=   r   r>   r   r   r   
   s(   „ Øñ3ó ð3ð4 ñó ñr>   r   c                   ó,   — e Zd Zed„ «       Zed„ «       Zy)r9   c                 óÒ  — t        dt        |«      |«      D �cg c]  }||   j                  «       ‘Œ c}| _        t        |«      D �cg c]  }||   j	                  «       ‘Œ }}|| _        t        d„ |D «       «      }t        dt        |«      |«      D �cg c]
  }||||z    ‘Œ }}t        j                  ||«      }t        d„ t        ||«      D «       «      }|S c c}w c c}w c c}w )Nr   c              3   ój   K  — | ]+  }|j                  «       rt        j                  |«      n|–— Œ- y ­wr   )r$   r(   Úview_as_real©r   Úgs     r   r   z-ReduceAddCoalesced.forward.<locals>.<genexpr>9   s-   è ø€ ò  
Ø?@ Q§\¡\¤^ŒE×Ñ˜qÔ!¸Ó:ñ 
ùs   ‚13c              3   óT   K  — | ]   \  }}|rt        j                  |«      n|–— Œ" y ­wr   ©r(   r)   )r   Úrr$   s      r   r   z-ReduceAddCoalesced.forward.<locals>.<genexpr>C   s.   è ø€ ò 
á��:ñ )3ŒE×!Ñ! !Ô$¸Ó9ñ
ùs   ‚&()
Úranger    r"   r   r$   r%   r-   r   Úreduce_add_coalescedÚzip)	r/   Údestinationr!   r<   r   r%   Úgrads_convertedÚgrads_Úresultss	            r   r7   zReduceAddCoalesced.forward0   sü   € ô ,1°´C¸³JÀ
Ó+Kö
Ø&'ˆE�!‰H×ÑÕ!ò
ˆŒô 8=¸ZÓ7HÖI°!˜˜a™×+Ñ+Õ-ÐIˆÐIØ'ˆÔäñ  
ØDIô 
ó 
ˆô ˜1œc /Ó2°JÓ?ö
àð ˜A  J¡Ò/ð
ˆð 
ô ×+Ñ+¨F°KÓ@ˆäñ 
ä!$ W¨lÓ!;ô
ó 
ˆð
 ˆùò-
ùò Jùò
s   ™CÁCÂC$c                 óH   — dt        j                  | j                  g|¢­Ž z   S )N©NN)r   r:   r   )r/   r;   s     r   r=   zReduceAddCoalesced.backwardJ   s(   € ð
ô �O‰O˜CŸO™OÐ;¨lÒ;ñ<ð 	<r>   Nr?   r   r>   r   r9   r9   /   s(   „ Øñó ðð2 ñ<ó ñ<r>   r9   c                   ó,   — e Zd Zed„ «       Zed„ «       Zy)ÚGatherc                 óX  ‡ — t        d„ |D «       «      st        d«      ‚|dk(  rd‰ _        nt        |d«      }|‰ _        |‰ _        t        d„ |D «       «      ‰ _        t        d„ |D «       «      r6|dk(  r1t        d„ |D «       «      }t        j                  d	d
¬«       d‰ _	        nd‰ _	        t        ˆ fd„|D «       «      ‰ _
        t        |«      dkD  xr |d   j                  «       }t        j                  |‰ j                  ‰ j                  «      }|rt        j                   |«      }|S )Nc              3   óN   K  — | ]  }|j                   j                  d k7  –— Œ y­wr   r   r   s     r   r   z!Gather.forward.<locals>.<genexpr>U   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>]   s   è ø€ Ò>°!˜qŸ|™|Ÿ~Ñ>ùs   ‚c              3   óB   K  — | ]  }|j                  «       d k(  –— Œ y­w©r   N)Údim©r   Úts     r   r   z!Gather.forward.<locals>.<genexpr>^   s   è ø€ Ò, ˆq�u‰u‹w˜!�|Ñ,ùs   ‚r   c              3   ó>   K  — | ]  }|j                  d «      –— Œ y­w)r   N)Úviewr^   s     r   r   z!Gather.forward.<locals>.<genexpr>_   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.é   )Ú
stacklevelFc              3   óT   •K  — | ]  }|j                  ‰j                  «      –— Œ! y ­wr   )Úsizer]   )r   r   r/   s     €r   r   z!Gather.forward.<locals>.<genexpr>i   s   øè ø€ Ò@°A §¡ s§w¡w§Ñ@ùs   ƒ%()r   r   Útarget_devicer   r]   r-   Ú
input_gpusÚwarningsÚwarnÚunsqueezed_scalarÚinput_sizesr    r$   r   Úgatherr(   r)   )r/   rf   r]   r0   r$   r   s   `     r   r7   zGather.forwardS   s  ø€ äÑ:°6Ô:Ô:Ü Ð!RÓSÐSØ˜EÒ!Ø %ˆCÕä-¨m¸TÓBˆMØ -ˆCÔØˆŒÜÑ>°vÔ>Ó>ˆŒÜÑ, VÔ,Ô,°¸²ÜÑ5¨fÔ5Ó5ˆFÜ�M‰Mð'ð õ	ð %)ˆCÕ!à$)ˆCÔ!ÜÓ@¸Ô@Ó@ˆŒä˜“[ 1‘_Ò?¨°©×)=Ñ)=Ó)?ˆ
ä—‘˜V S§W¡W¨c×.?Ñ.?Ó@ˆáÜ×*Ñ*¨6Ó2ˆFàˆr>   c                 ó´   — t         j                  | j                  | j                  | j                  |«      }| j
                  rt        d„ |D «       «      }d|z   S )Nc              3   ó&   K  — | ]	  }|d    –— Œ y­wr\   r   rH   s     r   r   z"Gather.backward.<locals>.<genexpr>z   s   è ø€ Ò#B¨Q A a¥DÑ#Bùs   ‚rU   )ÚScatterr:   rg   rk   r]   rj   r-   )r/   Úgrad_outputÚscattered_gradss      r   r=   zGather.backwardt   sK   € ä!Ÿ-™-Ø�N‰N˜CŸO™O¨S¯W©W°kó
ˆð × Ò Ü#Ñ#B°/Ô#BÓBˆOØ˜oÑ-Ð-r>   Nr?   r   r>   r   rW   rW   R   s)   „ Øñó ðð@ ñ.ó ñ.r>   rW   c                   ó,   — e Zd Zed„ «       Zed„ «       Zy)ro   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                  |«      «      ‘Œ" }}|j                  «       }t        j                  |||| j                  |«      }	|rt        d„ |	D «       «      }	|��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   éÿÿÿÿc              3   óF   K  — | ]  }t        j                  |«      –— Œ y ­wr   rK   )r   Úos     r   r   z"Scatter.forward.<locals>.<genexpr>Ž   s   è ø€ ÒF¸œE×1Ñ1°!×4ÑFùs   ‚!)r   r]   r   r   r"   r#   r(   ÚacceleratorÚis_availableÚ_get_streamr$   r   Úscatterr-   r'   Údevice_indexÚcurrent_streamÚwait_streamÚrecord_stream)r/   r   Úchunk_sizesr]   Úinputr1   Ústreamsr   r$   r3   r   r   Úmain_streams                r   r7   zScatter.forward   sb  € à;FÖG°aÔ(¨¨DÕ1ÐGˆÐGØˆŒØ16·±×1BÑ1BÀeÒ1K˜5×+Ñ+Ô-ÐQSˆÔØˆÜ×Ñ×)Ñ)Ô+°×0@Ñ0@ÀBÒ0FàGRÖS¸V”{¤5§<¡<°Ó#7Õ8ÐSˆGÐSà×%Ñ%Ó'ˆ
ä—,‘,˜u k°;ÀÇÁÈÓQˆáÜÑF¸gÔFÓFˆGð ÐÜ& wÓ/ò 6‘	��6Ü×&Ñ&×3Ñ3°KÀ±NÓCñ 6Ü"'×"3Ñ"3×"BÑ"BÓ"D�KØ×+Ñ+¨G°A©JÔ7Ø×(Ñ(¨Ô5÷6ð 6ð6ð
 ˆùò- Hùò T÷6ð 6ús   …E7Â%E<Ä'AFÆF
	c                 ó`   — d d d t        j                  | j                  | j                  g|¢­Ž fS r   )rW   r:   r#   r]   )r/   rp   s     r   r=   zScatter.backward™   s+   € à�T˜4¤§¡¨c×.>Ñ.>ÀÇÁÐ!VÈ+Ò!VÐVÐVr>   Nr?   r   r>   r   ro   ro   ~   s*   „ Øñó ðð2 ñWó ñWr>   ro   Ú_streamsr   c                 óF  — | j                   dk(  st        j                  j                  «       syt        j                  j	                  «       j                   | j                   k7  rAt        dt        j                  j	                  «       j                   › d| j                   › �«      ‚t        €"dgt        j                  j                  «       z  at        | j                     €0t        j                  | j                  «      t        | j                  <   t        | j                     S )zBGet a background stream for copying between CPU and target device.r   Nz"Expected current accelerator type z to match device type )
r   r(   rw   rx   Úcurrent_acceleratorr   r„   Údevice_countÚindexÚStream)r   s    r   ry   ry   ¢   sß   € ð ‡{�{�eÒ¤5×#4Ñ#4×#AÑ#AÔ#CØÜ×Ñ×,Ñ,Ó.×3Ñ3°v·{±{ÒBÜØ0´×1BÑ1B×1VÑ1VÓ1X×1]Ñ1]Ð0^ð _$Ø$*§K¡K =ð2ó
ð 	
ô ÐØ�6œE×-Ñ-×:Ñ:Ó<Ñ<ˆÜ�—‘ÑÐ%Ü!&§¡¨f¯l©lÓ!;Œ�—‘ÑÜ�F—L‘LÑ!Ð!r>   )rh   Ú	itertoolsr   r(   Útorch._utilsr   Útorch.autogradr   Útorch.nn.parallelr   r   r9   rW   ro   r„   Úlistr‰   Ú__annotations__r   ry   r   r>   r   ú<module>r�      s|   ðÜ Ý ã Ý *Ý #Ý "ô"�ô "ôJ <˜ô  <ôF).ˆXô ).ôXWˆhô WðB .2€ˆ$ˆu�|‰|˜dÑ"Ñ
# dÑ
*Ó 1ð"˜Ÿ™ô "r>   