U
    9%ee                     @   sF  d dl Z ddlmZ ddlmZ d dlmZmZ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 er|d dlZ d dlZ d	gZeed
ddZee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 )$    N   )Module   )comm)
TYPE_CHECKINGDictIteratorListOptionalSequenceSetTypeVarUnioncast_get_device_index)OrderedDict	replicatemodulereturnc                 C   s   dd l }t| |jjS Nr   )	torch.jit
isinstancejitScriptModuler   torch r   Z/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/torch/nn/parallel/replicate.py_is_script_module   s    r    c                 C   s   dd l }t| |jjS r   )r   r   Z_CZScriptMethodr   r   r   r   _is_script_method   s    r!   ztorch.jit.ScriptModule)r   c                  C   s   dd l } | j S r   )r   r   r   r   r   r   r   _init_script_module   s    r#   ztorch.jit._state.EnabledProxyc                  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 kr,t }||  t| rb|||  tdd || D S |  D ]}||krxqjt	||sj dS qjdS )Nr   c                 S   s   |   }t| |S N)modulesnext)r   genr   r   r   descendant_modules-   s    z0_replicatable_module.<locals>.descendant_modulesTc                 s   s   | ]}t |V  qd S r(   )r    ).0Z
descendantr   r   r   	<genexpr>;   s   z'_replicatable_module.<locals>.<genexpr>F)
r   r   r&   setaddr    updateallchildren_replicatable_module)r   r'   r,   childr   r   r   r4   *   s"    

r4   F)tensorsdevicesdetachr   c                    sd   ddl m} |rt|S tdkr\|j|f   fddtdt tD S g S d S )Nr   )	Broadcastr   c                    s    g | ]} ||t   qS r   )len)r-   iZtensor_copiesr6   r   r   
<listcomp>T   s   z0_broadcast_coalesced_reshape.<locals>.<listcomp>)Z
_functionsr9   r   Zbroadcast_coalescedr:   applyrange)r6   r7   r8   r9   r   r<   r   _broadcast_coalesced_reshapeH   s    r@   T)bound)networkr7   r8   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 krt|D ]} | | }d |j|< qrn8|| }t|D ]&} | | }t|| | |  qqX|j D ]\}}|d krt|D ]} | | }d |j|< qnF|| }t|D ]4} | | }|| | }t||| ||j|< q"q|j D ]\}}
|
d k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=   i   s     zreplicate.<locals>.<listcomp>c                 S   s   i | ]\}}||qS r   r   )r-   idxparamr   r   r   
<dictcomp>m   s      zreplicate.<locals>.<dictcomp>c                 S   s   i | ]\}}||qS r   r   r-   rE   bufr   r   r   rG   y   s      c                 S   s   i | ]\}}||qS r   r   rH   r   r   r   rG   z   s      )r8   Tc                 S   s   g | ]}g qS r   r   )r-   _r   r   r   r=      s     c                    s   g | ]}t t | d  qS )r   )r   rA   )r-   jZmodule_copiesr   r   r=      s     )r4   RuntimeErrorr:   list
parameters	enumerater@   buffersZrequires_gradappendr)   r?   Z_replicate_for_data_parallelr   Z_former_parametersZ_modulesitemssetattr_parameters_buffers)rC   r7   r8   Znum_replicasparamsZparam_indicesZparam_copiesrQ   Z
buffers_rgZbuffers_not_rgrI   Zbuffer_indices_rgZbuffer_indices_not_rgZbuffer_copies_rgZbuffer_copies_not_rgr)   Zmodule_indicesr;   r   rK   Zreplicakeyr5   Z
module_idxrF   Z	param_idxZ
param_copyZbuffer_copiesZ
buffer_idxr   rL   r   r   ]   s    




 )N)F)F)#r   r)   r    r   typingr   r   r   r	   r
   r   r   r   r   r   Ztorch._utilsr   collectionsr   r   r$   __all__boolr    r!   r#   r&   r4   ZTensorintZdevicer@   rA   r   r   r   r   r   <module>   s:   0!  