
    Ph2                     T   d dl Z d dlZd dlmZmZmZmZmZmZm	Z	m
Z
 ddlmZ d dlmZ d dlmZ d dlmZ dd	gZd
e	ej(                  ee   eedf   eeef   f   deej(                     fdZ	 	 ddee   dee   deeeeef         deeee	eej0                  f            dee   f
dZy)    N)AnyDictListOptionalSequenceTupleUnioncast   )Module)_get_device_index)autocast)ExceptionWrapper	get_a_varparallel_applyobj.returnc                 p   t        | t        j                        r| S t        | t        t        f      r3t        t        |       D ]   }t        |t        j                        s|c S  t        | t              rAt        t        | j                               D ]   }t        |t        j                        s|c S  y )N)	
isinstancetorchTensorlisttuplemapr   dictitems)r   results     kC:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\site-packages\torch/nn/parallel/parallel_apply.pyr   r      s    #u||$
#e}%)S)F&%,,/ * #t)SYY[1F&%,,/ 2     modulesinputs
kwargs_tupdevicesc                 r   t        |       t        |      k(  sJ dt        |        dt        |              |t        |       t        |      k(  s,J t        t        t        t        f   i       ft        |       z  }|t        |       t        |      k(  sJ dgt        |       z  }|D cg c]  }t        |d       }}|D cg c]!  }t        j                  j                  |      # }}t        j                         i t        j                         t        j                         c	 	 ddt        dt        dt        dt        t        t        f   d	t        t         t        t        j"                  f      d
t        t        j                  j$                     ddffd}t        |       dkD  rt'        t)        | ||||            D 	
cg c](  \  }\  }}	}
}}t        j*                  ||||	|
||f      * }}}
}	}}}|D ]  }|j-                           |D ]  }|j/                           n |d| d   |d   |d   |d   |d          g }t1        t        |            D ]8  }|   }t3        |t4              r|j7                          |j9                  |       : |S c c}w c c}w c c}}}
}	}}w )a  Apply each `module` in :attr:`modules` in parallel on each of :attr:`devices`.

    Args:
        modules (Module): modules to be parallelized
        inputs (tensor): inputs to the modules
        devices (list of int or torch.device): CUDA devices

    :attr:`modules`, :attr:`inputs`, :attr:`kwargs_tup` (if given), and
    :attr:`devices` (if given) should all have same length. Moreover, each
    element of :attr:`inputs` can either be a single object as the only argument
    to a module, or a collection of positional arguments.
    zThe number of modules z& is not equal to the number of inputs NTimoduleinputkwargsdevicestreamr   c                    t        j                  	       |<t        |      }|
5  t        d|  d      | <   d d d        y |j	                         }|t         j
                  j                  |      }	 t         j
                  j                  |      5  t         j
                  j                  |      5  t              5  t        |t        t        f      s|f} ||i |}d d d        d d d        d d d        
5  | <   d d d        y # 1 sw Y   y xY w# 1 sw Y   6xY w# 1 sw Y   :xY w# 1 sw Y   >xY w# 1 sw Y   y xY w# t        $ r0 
5  t        d|  d|       | <   d d d        Y y # 1 sw Y   Y y xY ww xY w)Nzin replica zQ, no device was provided and no tensor input was found; device cannot be resolved)where)enabledz on device )r   set_grad_enabledr   r   
get_devicecudacurrent_streamr)   r*   r   r   r   r   	Exception)r%   r&   r'   r(   r)   r*   toutputautocast_enabledgrad_enabledlockresultss           r   _workerzparallel_apply.<locals>._worker:   sV    	|,>% Ay!1 +A3 /4 4"5GAJ  \\^F>ZZ..v6F	@""6*EJJ,=,=f,ExXhGi!%$7"HE1&1	 Hj,E*
 #
   
 HjGi,E,E**
  	@-'s+fX>@
 	@s   D7E
  D26D&"D%D&-D25
E
 ?D>E
 DD#D&&D/	+D22D;7E
 >EE
 E
 
FE5+F5E?	:F?F   )targetargsr   NN)lenr
   r   strr   r   r   r0   r1   	threadingLockis_grad_enabledis_autocast_enabledintr   r   r	   r)   Stream	enumeratezipThreadstartjoinranger   r   reraiseappend)r    r!   r"   r#   xstreamsr9   r%   r&   r'   r(   r)   r*   threadsthreadoutputsr4   r5   r6   r7   r8   s                    @@@@r   r   r      s   $ w<3v;&  C*@WNtuxy  vA  uB  )C  C&7|s:...4S>2.03w<?
7|s7|+++&3w<'3:;7a D)7G;5<=Wuzz((+WG=>>DG%*%:%:%<e>W>W>Y"L" 6:.2@@@ @ S#X	@
 sELL012@ **+@ 
@ @B 7|a S&*gwOPR R Q BqA65&&& ##7*+VUFFF)SU Q 	 R
 FLLN FKKM  	71:vay*Q-WQZPG3v;f./NNv	  
 Nu <=NRs   .J%&J*-J/r=   )r@   r   typingr   r   r   r   r   r   r	   r
   r    r   torch.cuda._utilsr   torch.cuda.ampr   torch._utilsr   __all__r   r   r?   rD   r)   r    r   r   <module>rY      s      J J J  / # )(
)5tCy%S/4S>QR W_`e`l`lWm " 6:FJ	UfUSMU $sCx.12U hxc5<<.?(@ABC	U
 
#YUr   