o
    ki[                     @   sj  d dl mZ d dlmZmZ d dl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rHd d	lmZ d d
lmZ d dlmZ dgZdede
d fddZdede
d fddZd'ddZd(ddZd)dedee dB defddZ 	d*deej! dee"ej#B  d ede$e$ej!  fd!d"Z%ed#ed$Z&	d*d%e&dee"ej#B  d ede$e& fd&dZ'dS )+    )OrderedDict)IteratorSequence)castTYPE_CHECKINGTypeVar)TypeIsN_get_device_index)Module)comm)ScriptMethod)ScriptModule)EnabledProxy	replicatemodulereturnr   c                 C      dd l }t| |jjS Nr   )	torch.jit
isinstancejitr   r   torch r   e/var/www/addictedbytheproject.nl/epg/venv/lib/python3.10/site-packages/torch/nn/parallel/replicate.py_is_script_module      r   r   c                 C   r   r   )r   r   _Cr   r   r   r   r   _is_script_method   r   r   c                  C   s   dd l } | j S r   )r   r   r   r   r   r   r   _init_script_module!      
r!   r   c                  C   s   dd l } | jjjS r   )torch.jit._stater   _state_enabledr    r   r   r   _is_jit_enabled'   r"   r&   memoc                 C   s   dt dtt  fdd}t sdS |d u rt }||  t| r2|||  tdd || D S |  D ]}||v r=q6t	||sE dS q6dS )	Nr   r   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   ).0
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   r5   4   s$   

r5   Ftensorsdevicesdetachc           	         s   ddl m} tdkrg S |r8dd D }t|}|D ]}t|D ]\}}|r4t|| ||< q%q|S |j|gR    fddt	dt tD S )Nr   )	Broadcastc                 S   s$   g | ]}t |tjj o| qS r   )r   r   nnUninitializedParameter
is_complex)r-   tr   r   r   
<listcomp>^       z0_broadcast_coalesced_reshape.<locals>.<listcomp>c                    s$   g | ]}t  ||t  qS r   )listlen)r-   itensor_copiesr7   r   r   r?   m   r@   )
torch.nn.parallel._functionsr:   rB   r   broadcast_coalesced	enumerater   view_as_complexapplyrange)	r7   r8   r9   r:   complex_maskoutputsdevice_outputsrC   r=   r   rD   r   _broadcast_coalesced_reshapeS   s&   rO   T)boundnetworkc                    s  t | std|sg S dd |D }t|}t|  }dd t|D }t|||}t|  }g }g }	|D ]}
|
jrE|sE|	|
 q8|		|
 q8dd t|D }dd t|	D }t|||d}t|	|d	d}t| 
 }d
d |D  i }t|D ]\}}|||< t|D ]}| }t |_ | 	| qq~t|D ]\}}|j D ]6\}}|d u rt|D ]} | | }d |j|< qq|| }t|D ]} | | }t|| | |  qq|j D ]?\}}|d u rt|D ]} | | }d |j|< qq|| }t|D ]} | | }|| | }t||| ||j|< q
q|j D ]K\}}
|
d u rIt|D ]} | | }d |j|< q8q+|
jrW|sW|}||
 }n|}||
 }t|D ]} | | }t|||| |  qaq+q fddt|D S )NzJCannot replicate network where python modules are children of ScriptModulec                 S   s   g | ]}t |d qS )Tr	   )r-   xr   r   r   r?          zreplicate.<locals>.<listcomp>c                 S      i | ]\}}||qS r   r   )r-   idxparamr   r   r   
<dictcomp>   rT   zreplicate.<locals>.<dictcomp>c                 S   rU   r   r   r-   rV   bufr   r   r   rX      rT   c                 S   rU   r   r   rY   r   r   r   rX      rT   )r9   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   rP   )r-   jmodule_copiesr   r   r?      s    )r5   RuntimeErrorrB   rA   
parametersrH   rO   buffersrequires_gradappendr)   rK   _replicate_for_data_parallelr   _former_parameters_modulesitemssetattr_parameters_buffers)rR   r8   r9   num_replicasparamsparam_indicesparam_copiesra   
buffers_rgbuffers_not_rgrZ   buffer_indices_rgbuffer_indices_not_rgbuffer_copies_rgbuffer_copies_not_rgr)   module_indicesrC   r   r\   replicakeyr6   
module_idxrW   	param_idx
param_copybuffer_copies
buffer_idxr   r]   r   r   v   s   



)r   r   )r   r   r(   )F)(collectionsr   collections.abcr   r   typingr   r   r   typing_extensionsr   r   torch._utilsr
   torch.nn.modulesr   torch.nn.parallelr   torch._Cr   r   r   r#   r   __all__r   objectr   r!   r&   r0   boolr5   TensorintdevicerA   rO   rP   r   r   r   r   r   <module>   sN    

 "
 