
    Ph3                        d dl Z d dlmZmZmZmZmZmZmZm	Z	m
Z
 ddlmZmZ d dlZg dZdedefdZdedefd	Z ed
eee      Ze
	 dde j.                  dee	ee j2                  f      dedee j.                  df   fd       Ze
ddedee	ee j2                  f      dedee   fd       ZddZ	 ddeedf   deeeef      dee	ee j2                  f      dedeeedf   eeeef   df   f   f
dZddede	ee j2                  f   dedefdZy)    N)	AnyDictListOptionalSequenceTupleTypeVarUnionoverload   )ScatterGather)scatterscatter_kwargsgatherobjreturnc                 B    t        j                  d       t        |       S )NzAis_namedtuple is deprecated, please use the python checks instead)warningswarn_is_namedtupler   s    kC:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\site-packages\torch/nn/parallel/scatter_gather.pyis_namedtupler      s    MMUV#    c                 Z    t        | t              xr t        | d      xr t        | d      S )N_asdict_fields)
isinstancetuplehasattrr   s    r   r   r      s+     	3V73	#:VwsI?Vr   T.inputstarget_gpusdimc                      y N r#   r$   r%   s      r   r   r      s     r   c                      y r'   r(   r)   s      r   r   r      s    r   c                 >    fd	  |       }d|S # dw xY w)zSlice tensors into approximately equal chunks and distributes them across given GPUs.

    Duplicates references to objects that are not tensors.
    c                    t        | t        j                        rt        j                  d |       S t        |       r,t        t        |        D cg c]  } t        |       |  c}S t        | t              r)t        |       dkD  rt        t        t        |              S t        | t              r7t        |       dkD  r)t        t        |        D cg c]  }t        |       c}S t        | t              rKt        |       dkD  r=t        t        | j                                D cg c]  } t        |       |       c}S D cg c]  }|  c}S c c}w c c}w c c}w c c}w )Nr   )r   torchTensorr   applyr   zipmaptyper    lenlistdictitems)r   argsi_r%   scatter_mapr$   s       r   r:   zscatter.<locals>.scatter_map(   s0   c5<<(==dC==#14c+s6K1LM1LIDIt$1LMMc5!c#hlSc2344c4 SX\%(#k3*?%@A%@DG%@AAc4 SX\*-s;		/L*MN*MQIDIaL*MNN()[[)) N BN)s   EE+E 
	E%Nr(   )r#   r$   r%   resr:   s    `` @r   r   r   #   s*    
*$&!J     kwargsc           	         | rt        | ||      ng }|rt        |||      ng }t        |      t        |      k  r7|j                  d t        t        |      t        |      z
        D               nMt        |      t        |       k  r6|j                  d t        t        |      t        |      z
        D               t	        |      t	        |      fS )z+Scatter with support for kwargs dictionary.c              3       K   | ]  }d   yw)r(   Nr(   .0r9   s     r   	<genexpr>z!scatter_kwargs.<locals>.<genexpr>K        a,`q,`   c              3       K   | ]  }i   y wr'   r(   r@   s     r   rB   z!scatter_kwargs.<locals>.<genexpr>M   rC   rD   )r   r3   extendranger    )r#   r=   r$   r%   scattered_inputsscattered_kwargss         r   r   r   A   s     =Cwv{C8<Bwv{C8
s#344aE#6F2G#N^J_2_,`aa		V	,aE#6F2G#N^J_2_,`aa!"E*:$;;;r   outputstarget_devicec                 >    fd	  |       }d|S # dw xY w)zuGather tensors from different GPUs on a specified device.

    Use 'cpu' for CPU to avoid a deprecation warning.
    c                      d   t        t        j                        rt        j                  g  S y t        t
              r:t        fd D              st        d       t               fdD              S t              r*t              j                  t        t                      S  t              t        t                      S )Nr   c              3   L   K   | ]  }t              t        |      k(    y wr'   )r3   )rA   douts     r   rB   z-gather.<locals>.gather_map.<locals>.<genexpr>]   s     ;7as3x3q6)7s   !$z+All dicts must have the same number of keysc           	   3   ^   K   | ]  }| D cg c]  }||   	 c}      f ! y c c}w wr'   r(   )rA   krO   
gather_maprJ   s      r   rB   z-gather.<locals>.gather_map.<locals>.<genexpr>_   s<      +&)  7,C7aQqT7,C!DE&) -Ds   -(-)r   r-   r.   r   r/   r5   all
ValueErrorr2   r   _maker1   r0   )rJ   rP   r%   rS   rK   s   `@r   rS   zgather.<locals>.gather_mapV   s    ajc5<<(<<s=W==;c4 ;7;; !NOO49 +&)+ + +#9??3z3=#ABBtCyZg788r   Nr(   )rJ   rK   r%   r;   rS   s    `` @r   r   r   Q   s*    
9"!
J 
r<   ).)r   )r-   typingr   r   r   r   r   r   r	   r
   r   
_functionsr   r   r   __all__boolr   r   r5   r4   r    r"   r.   intdevicer   strr   r   r(   r   r   <module>r^      s    W W W ' 
1s t 
   CtU# 
 LL%U\\ 123 
 5<<	 
 
A HU33D-E$F S [_`a[b  
D 	<#s(O<T#s(^$< %U\\ 123< 
	<
 5c?E$sCx.#"5667< C c5<<.?(@ s SV r   