
    JThM                         % S SK r S SKJr  S SKJr  S SKrS SKJr  S SKJ	r	  S SK
Jr   " S S\	5      r " S	 S
\	5      r " S S\	5      r " S S\	5      rSq\\\\R$                           \S'   S\R(                  4S jrg)    N)chain)Optional)_get_device_index)Function)commc                   4    \ rS rSr\S 5       r\S 5       rSrg)	Broadcast   c                 *  ^ [        S U 5       5      (       d   S5       eU Vs/ s H  n[        US5      PM     nnXl        [        U5      S:X  a  g[        U5      U l        US   R                  5       U l        [        R                  " X R                  5      n/ n[        U R                  SS  5       H*  u  mnU(       a  M  UR                  U4S jU 5       5        M,     U R                  " U6   [        [        R                  " U5      5      $ s  snf )Nc              3   R   #    U  H  oR                   R                  S :g  v   M     g7fcpuNdevicetype.0is     T/var/www/auris/envauris/lib/python3.13/site-packages/torch/nn/parallel/_functions.py	<genexpr>$Broadcast.forward.<locals>.<genexpr>         
,2qHHMMU"F   %'z2Broadcast function not implemented for CPU tensorsTr       c              3   ,   >#    U  H	  oT   v   M     g 7fNr   )r   outputidxs     r   r   r      s     *MW6#;Ws   )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   forwardBroadcast.forward   s    
,2
 
 
 	@?	@ 
 <GG;a(D1;G%v;!V!!9//1**6??C (1#2F2Fqr2J(K$C$&&#***MW*MM )L 	##%89U((122 Hs   Dc                 `    S[         R                  " U R                  U R                  /UQ76 -   $ )Nr   )ReduceAddCoalescedapplyr%   r#   r-   grad_outputss     r   backwardBroadcast.backward   s4    +11cnn
/;
 
 	
    r   N__name__
__module____qualname____firstlineno__staticmethodr3   r:   __static_attributes__r   r<   r   r	   r	      s(    3 3$ 
 
r<   r	   c                   4    \ rS rSr\S 5       r\S 5       rSrg)r6   &   c                    [        S[        U5      U5       Vs/ s H  oCU   R                  5       PM     snU l        [        S[        U5      U5       Vs/ s H	  oCXDU-    PM     nn[        R
                  " XQ5      $ s  snf s  snf )Nr   )ranger"   r$   r!   r   reduce_add_coalesced)r-   destinationr#   gradsr   grads_s         r   r3   ReduceAddCoalesced.forward'   s     ,1CJ
+K
+Ka!H!+K
 6;1c%j*5UV5U
N+5UV((==
 Ws   A=Bc                 J    S[         R                  " U R                  /UQ76 -   $ )NNN)r	   r7   r!   r8   s     r   r:   ReduceAddCoalesced.backward0   s(    
 OOCOO;l;< 	<r<   r   Nr=   r   r<   r   r6   r6   &   s(    > > < <r<   r6   c                   4    \ rS rSr\S 5       r\S 5       rSrg)Gather8   c                   ^  [        S U 5       5      (       d   S5       eUS:X  a  ST l        O[        US5      nUT l        UT l        [	        S U 5       5      T l        [        S U 5       5      (       a6  US:X  a0  [	        S U 5       5      n[        R                  " S	5        ST l        OS
T l        [	        U 4S jU 5       5      T l	        [        R                  " UT R                  T R                  5      $ )Nc              3   R   #    U  H  oR                   R                  S :g  v   M     g7fr   r   r   s     r   r   !Gather.forward.<locals>.<genexpr>;   r   r   z/Gather function not implemented for CPU tensorsr   Tc              3   @   #    U  H  oR                  5       v   M     g 7fr   )r$   r   s     r   r   rU   D   s     >v!||~~vs   c              3   F   #    U  H  oR                  5       S :H  v   M     g7fr   N)dimr   ts     r   r   rU   E   s     ,Vuuw!|Vs   !r   c              3   B   #    U  H  oR                  S 5      v   M     g7f)r   N)viewrZ   s     r   r   rU   F   s     5f66!99fs   zvWas asked to gather along dimension 0, but all input tensors were scalars; will instead unsqueeze and return a vector.Fc              3   X   >#    U  H  oR                  TR                  5      v   M!     g 7fr   )sizerY   )r   r   r-   s     r   r   rU   O   s     @Aswws   '*)r    target_devicer   rY   r+   
input_gpuswarningswarnunsqueezed_scalarinput_sizesr   gather)r-   r`   rY   r.   s   `   r   r3   Gather.forward9   s     
,2
 
 
 	=<	= 
 E! %C-mTBM -C>v>>,V,,,5f55FMM'
 %)C!$)C!@@@{{6377C,=,=>>r<   c                     [         R                  U R                  U R                  U R                  U5      nU R
                  (       a  [        S U 5       5      nSU-   $ )Nc              3   *   #    U  H	  oS    v   M     g7frX   r   )r   gs     r   r   "Gather.backward.<locals>.<genexpr>X   s     #B/QaD/s   rN   )Scatterr7   ra   re   rY   rd   r+   )r-   grad_outputscattered_gradss      r   r:   Gather.backwardR   sK    !--NNCOOSWWk
   ##B/#BBOo--r<   r   Nr=   r   r<   r   rQ   rQ   8   s(    ? ?0 . .r<   rQ   c                   4    \ rS rSr\S 5       r\S 5       rSrg)rl   \   c           	         U Vs/ s H  n[        US5      PM     nnX0l        UR                  R                  S:w  a  UR	                  5       OSU l        S n[        R                  R                  5       (       a@  U R
                  S:X  a0  U Vs/ s H#  n[        [        R                  " SU5      5      PM%     nn[        R                  " XAX R                  U5      nUb  [        U5       Hq  u  p[        R                  R                  X   5         [        R                  R                  5       nUR                  Xi   5        U
R                  U5        S S S 5        Ms     U$ s  snf s  snf ! , (       d  f       M  = f)NTr   cuda)r   rY   r   r   r$   r%   torchrt   is_available_get_streamr   scatterr'   current_streamwait_streamrecord_stream)r-   r!   chunk_sizesrY   inputr/   streamsr   r0   r   r   main_streams               r   r3   Scatter.forward]   s3   ;FG;a(D1;G161B1Be1K5++-QS::""$$)9)9R)? ITHSfELL89   ,,u;Q&w/	ZZ&&{~6"'**";";"=K++GJ7((5 76 0
 # H 76s   E *E%AE**
E9	c                 b    S S S [         R                  " U R                  U R                  /UQ76 4$ r   )rQ   r7   r%   rY   )r-   rm   s     r   r:   Scatter.backwardr   s+    T4c.>.>!V+!VVVr<   r   Nr=   r   r<   r   rl   rl   \   s*     ( W Wr<   rl   _streamsr   c                 >   U R                   S:X  a  g[        [        U R                   S5      nUc  g[        c  S/UR	                  5       -  q[        U R
                     c,  UR                  U R
                  5      [        U R
                  '   [        U R
                     $ )zBGet a background stream for copying between CPU and target device.r   N)r   getattrru   r   device_countindexStream)r   
device_mods     r   rw   rw   {   s     {{eT2J6J3355%!+!2!26<<!@FLL!!r<   )rb   	itertoolsr   typingr   ru   torch._utilsr   torch.autogradr   torch.nn.parallelr   r	   r6   rQ   rl   r   listr   __annotations__r   rw   r   r<   r   <module>r      s|        * # "
 
6< <$!.X !.HWh W8 48(4./
0 7" "r<   