
    Ph[                         U d dl Z d dlZddlmZ d dlmZ d dlmZ d dlm	Z	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   )comm)Function)_get_device_index)ListOptionalc                   ,    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
t	               S t        |      | _        |d   j                         | _        t        j                  || j                        }g }t        | j                  dd        D ]#  \  }}|r	|D ]  }|j                  ||           %  | j                  |  t	        |D 	
cg c]  }	|	D ]  }
|
  c}
}	      S c c}w c c}
}	w )Nc              3   N   K   | ]  }|j                   j                  d k7    ywcpuNdevicetype.0is     gC:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\site-packages\torch/nn/parallel/_functions.py	<genexpr>z$Broadcast.forward.<locals>.<genexpr>        :6a188==E)6   #%z2Broadcast function not implemented for CPU tensorsTr   r   )allr   target_gpuslentuple
num_inputs
get_deviceinput_devicer   broadcast_coalesced	enumerateneeds_input_gradappendmark_non_differentiable)ctxr   inputsxoutputsnon_differentiablesidxinput_requires_gradoutputtensorsts              r   forwardzBroadcast.forward   s   :6:: 	
@	
: <GG;a(D1;G%v;!7NV!!9//1**63??C (1#2F2Fqr2J(K$C$&%F'..vc{; & )L 	$##%89w@wG1aaw@AA H As   D3D
c                 ^    dt        j                  | j                  | j                  g| z   S )NN)ReduceAddCoalescedapplyr   r   r%   grad_outputss     r   backwardzBroadcast.backward    s+    +11#2B2BCNNbUabbb    N__name__
__module____qualname__staticmethodr/   r6    r7   r   r
   r
   
   s,    B B& c cr7   r
   c                   ,    e Zd Zed        Zed        Zy)r2   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   r/   zReduceAddCoalesced.forward'   s    :?3u:z:Z[:ZQ58..0:Z[ !CJ
;=;a !j.); 	 =((==	 \=s   A:A?c                 H    dt        j                  | j                  g| z   S )NNN)r
   r3   r   r4   s     r   r6   zReduceAddCoalesced.backward/   s    ysNNNNr7   Nr8   r=   r7   r   r2   r2   %   s*    > > O Or7   r2   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>8   r   r   z/Gather function not implemented for CPU tensorsr   Tc              3   <   K   | ]  }|j                           y wr1   )r   r   s     r   r   z!Gather.forward.<locals>.<genexpr>A   s     >v!q||~vs   c              3   B   K   | ]  }|j                         d k(    ywr   N)dimr   r.   s     r   r   z!Gather.forward.<locals>.<genexpr>B   s     ,Vquuw!|Vs   r   c              3   >   K   | ]  }|j                  d         yw)r   N)viewrO   s     r   r   z!Gather.forward.<locals>.<genexpr>C   s     5f166!9fs   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r1   )sizerN   )r   r   r%   s     r   r   z!Gather.forward.<locals>.<genexpr>J   s     @Aswws   %()r   target_devicer   rN   r   
input_gpuswarningswarnunsqueezed_scalarinput_sizesr   gather)r%   rT   rN   r&   s   `   r   r/   zGather.forward6   s    :6:: 	
=	
: U" %C-mTBM -C>v>>,V,,5f55FMM 1 2 %)C!$)C!@@@{{6377C,=,=>>r7   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>Q   s     #B/QAaD/s   rF   )Scatterr3   rU   rY   rN   rX   r   )r%   grad_outputscattered_gradss      r   r6   zGather.backwardM   sG    !--R]^  ##B/#BBOo--r7   Nr8   r=   r7   r   rH   rH   4   s(    ? ?, . .r7   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   torchrd   is_available_get_streamr   scatterr!   current_streamwait_streamrecord_stream)r%   r   chunk_sizesrN   inputr'   streamsr   r(   r   r,   main_streams               r   r/   zScatter.forwardW   s/   ;FG;a(D1;G161B1Be1K5++-QS::""$)9)9R)?OZ[{V{5<<#?@{G[,,uk;Q&w/	6ZZ&&{1~6"'**";";"=K++GAJ7((5 76 0
  H \
 76s   E&EAEE'	c                 `    d d d t        j                  | j                  | j                  g| fS r1   )rH   r3   r   rN   )r%   r_   s     r   r6   zScatter.backwardj   s+    T4c.>.>!V+!VVVr7   Nr8   r=   r7   r   r^   r^   U   s*     $ W Wr7   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   getattrre   rq   device_countindexStream)r   
device_mods     r   rg   rg   r   s     {{eT2J6J3355%!+!2!26<<!@FLL!!r7   )rV   re    r   torch.autogradr   torch._utilsr   typingr   r   r
   r2   rH   r^   rq   rv   __annotations__r   rg   r=   r7   r   <module>r}      s}       # * !c c6O O.X .BWh W6 48(4./
0 7" "r7   