a
    hl                     @   sj  d dl mZ d dlmZmZ d dlmZmZmZm	Z	m
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 erd d	lmZ d d
lmZ d dlmZ dgZeed dddZeed dddZddddZddddZd%eee e  e!dddZ"d&eej# ee
e$ej%f  e!e&e&ej#  ddd Z'e	d!ed"Z(d'e(ee
e$ej%f  e!e&e( d#d$dZ)dS )(    )OrderedDict)IteratorSequence)castOptionalTYPE_CHECKINGTypeVarUnion)TypeIsN_get_device_index)Module)comm)ScriptMethod)ScriptModule)EnabledProxy	replicater   modulereturnc                 C   s   dd l }t| |jjS Nr   )	torch.jit
isinstancejitr   r   torch r   I/var/www/auris/lib/python3.9/site-packages/torch/nn/parallel/replicate.py_is_script_module   s    r   r   c                 C   s   dd l }t| |jjS r   )r   r   Z_Cr   r   r   r   r   _is_script_method   s    r   )r   c                  C   s   dd l } | j S r   )r   r   r   r   r   r   r   _init_script_module!   s    r!   r   c                  C   s   dd l } | jjjS r   )torch.jit._stater   _stateZ_enabledr    r   r   r   _is_jit_enabled'   s    r$   )r   memor   c                 C   s   t tt  ddd}t sdS |d u r,t }||  t| rb|||  tdd || D S |  D ]}||v rxqjt	||sj dS qjdS )Nr   c                 S   s   |   }t| |S N)modulesnext)r   genr   r   r   descendant_modules6   s    z0_replicatable_module.<locals>.descendant_modulesTc                 s   s   | ]}t |V  qd S r&   )r   ).0Z
descendantr   r   r   	<genexpr>D   s   z'_replicatable_module.<locals>.<genexpr>F)
r   r   r$   setaddr   updateallchildren_replicatable_module)r   r%   r*   childr   r   r   r2   4   s"    

r2   F)tensorsdevicesdetachr   c                    sf   ddl m} |rt|S tdkr^|j|gR    fddtdt tD S g S d S )Nr   )	Broadcastc                    s    g | ]} ||t   qS r   )len)r+   iZtensor_copiesr4   r   r   
<listcomp>`   s   z0_broadcast_coalesced_reshape.<locals>.<listcomp>)Ztorch.nn.parallel._functionsr7   r   Zbroadcast_coalescedr8   applyrange)r4   r5   r6   r7   r   r:   r   _broadcast_coalesced_reshapeS   s    r>   T)bound)networkr5   r6   r   c                    s  t | std|sg S dd |D }t|}t|  }dd t|D }t|||}t|  }g }g }	|D ]$}
|
jr|s|	|
 qp|		|
 qpdd t|D }dd t|	D }t|||d}t|	|d	d}t| 
 }d
d |D  i }t|D ]>\}}|||< t|D ]$}| }t |_ | 	| qqt|D ]\}}|j D ]t\}}|d u rt|D ]} | | }d |j|< qrn8|| }t|D ]&} | | }t|| | |  qqX|j D ]\}}|d u rt|D ]} | | }d |j|< qnF|| }t|D ]4} | | }|| | }t||| ||j|< q"q|j D ]\}}
|
d u rt|D ]} | | }d |j|< qnX|
jr|s|}||
 }n|}||
 }t|D ]&} | | }t|||| |  qАqfqD fddt|D S )NzKCannot replicate network where python modules are childrens of ScriptModulec                 S   s   g | ]}t |d qS )Tr   )r+   xr   r   r   r;   y       zreplicate.<locals>.<listcomp>c                 S   s   i | ]\}}||qS r   r   )r+   idxparamr   r   r   
<dictcomp>}   rC   zreplicate.<locals>.<dictcomp>c                 S   s   i | ]\}}||qS r   r   r+   rD   bufr   r   r   rF      rC   c                 S   s   i | ]\}}||qS r   r   rG   r   r   r   rF      rC   )r6   Tc                 S   s   g | ]}g qS r   r   )r+   _r   r   r   r;      rC   c                    s   g | ]}t t | d  qS )r   )r   r?   )r+   jZmodule_copiesr   r   r;      rC   )r2   RuntimeErrorr8   list
parameters	enumerater>   buffersZrequires_gradappendr'   r=   Z_replicate_for_data_parallelr   Z_former_parametersZ_modulesitemssetattr_parameters_buffers)rA   r5   r6   Znum_replicasparamsZparam_indicesZparam_copiesrP   Z
buffers_rgZbuffers_not_rgrH   Zbuffer_indices_rgZbuffer_indices_not_rgZbuffer_copies_rgZbuffer_copies_not_rgr'   Zmodule_indicesr9   r   rJ   Zreplicakeyr3   Z
module_idxrE   Z	param_idxZ
param_copyZbuffer_copiesZ
buffer_idxr   rK   r   r   k   s    




 )N)F)F)*collectionsr   collections.abcr   r   typingr   r   r   r   r	   Ztyping_extensionsr
   r   Ztorch._utilsr   Ztorch.nn.modulesr   Ztorch.nn.parallelr   Ztorch._Cr   r   r   r"   r   __all__r   objectr   r!   r$   r-   boolr2   ZTensorintZdevicerM   r>   r?   r   r   r   r   r   <module>   s@   "  