a
    ==icñ   ã                   @   sT   d dl Z d dlmZ d dlmZ dd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dS )é    N)Ú
caffe2_pb2)Úcorec                 C   s   | j D ]}tj|j_qd S ©N)Úopr   ÚIDEEPÚdevice_optionÚdevice_type)Únetr   © r
   úp/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/caffe2/python/mkl/rewrite_graph.pyÚrewrite_init_net_simple   s    
r   c                 C   s:   t tt| ƒƒƒD ]\}}||jv r|  S qtd|ƒ‚d S )Nz(Failed to find last producer of blob, %s)ÚreversedÚlistÚ	enumerateÚoutputÚ
ValueError)ÚopsÚblobÚir   r
   r
   r   Úlast_producer   s    

r   c                 C   s˜   t ƒ }| jD ]>}|jdkr| |jd ¡ | |jd ¡ | |jd ¡ q| jD ]@}|jdkrR|jd |v rRtd |jd ¡ƒ d|_tj	|j
_qRd S )NZBoxWithNMSLimitr   é   é   ÚCopyIDEEPToCPUz%Chaning CopyIDEEPToCPU to Copy for {}ZCopy)Úsetr   ÚtypeÚaddr   ÚinputÚprintÚformatr   ÚCPUr   r   )r	   Úoutputsr   r
   r
   r   Úfix_BoxWithNMSLimit   s    



r!   c                    sn  dd„ ‰ | j d }|| jd jd kr<td || jd ¡ƒ‚d}d‰t ||ˆ |ƒ¡}ˆ |ƒ| jd jd< ‡ ‡fdd„| jD ƒ}| jD ]|‰t| jˆƒ}‡ ‡fd	d„| j| j	D ƒ}|| j| j	d d …< | j|d
 d … D ](}‡ ‡fdd„|jD ƒ}||jd d …< qØq†|g| jd d …  | }	| jd d …= | j 
|	¡ tj}
| jD ] }|j tj|
d¡ d|_q@t| ƒ d S )Nc                 S   s
   d  | ¡S ©Nz	{}__MKL__©r   ©Únamer
   r
   r   Úmkl_tmp)   s    z'rewrite_run_net_simple.<locals>.mkl_tmpr   ú.Input blob: {} is not consumed by first op: {}ÚCopyCPUToIDEEPr   c                    s   g | ]}t  ˆˆ |ƒ|¡‘qS r
   ©r   ÚCreateOperator©Ú.0Úoutput_blob©r&   Úto_cpur
   r   Ú
<listcomp>8   s   ÿz*rewrite_run_net_simple.<locals>.<listcomp>c                    s    g | ]}|ˆkr|nˆ |ƒ‘qS r
   r
   ©r,   r   ©r&   r-   r
   r   r0   >   s   ÿr   c                    s    g | ]}|ˆkr|nˆ |ƒ‘qS r
   r
   r1   r2   r
   r   r0   C   s   ÿ©r   Ú )Úexternal_inputr   r   Ú	Exceptionr   r   r*   Úexternal_outputr   r   Úextendr   r   r   Ú	MergeFromÚDeviceOptionÚenginer!   )r	   Ú
input_blobÚfrom_cpuÚcopy_input_opÚcopy_output_opsÚlast_producer_idxÚrenamed_outputsr   Úrenamed_inputr   Údevicer
   )r&   r-   r/   r   Úrewrite_run_net_simple%   sL    

ÿÿ
ÿþ

ÿÿ

ÿ
rD   c              	      s"  dd„ ‰dd„ ‰ | j d }|| jd jd krDtd || jd ¡ƒ‚d}d‰t ||ˆ|ƒ¡}ˆ|ƒ| jd jd< | j D ]}| jD ]}||jvs‚J ‚q‚qxd }tƒ }d	}d
}t	| jƒD ]F\}	}|sÚ|j
dkrú|j}d}|	}q´|jD ]‰ˆ| j v rà| ˆ¡ qàq´|d us
J ‚g }
|D ]X‰|
 t ˆˆˆ ˆƒ¡¡ | j|d … D ]*}‡ ‡fdd„|jD ƒ}||jd d …< q<q‡‡fdd„|D ƒ}|D ]B‰t| jˆƒ}‡‡fdd„| j| jD ƒ}|| j| jd d …< q„|g| jd |…  | |
 | j|d …  }| jd d …= | j |¡ tj}| jD ]þ}|j
dkr,tj}|j tj|d¡ d|_|j
dkr|jD ]¸}|jdkrX|jjD ]\}|j tj|d¡ d|_g }|jD ]"}| ||vr®|nˆ |ƒ¡ q˜||jd d …< qpg }|jj D ]"}| ||vrð|nˆ |ƒ¡ qÚ||jj d d …< qXqt| ƒ d S )Nc                 S   s
   d  | ¡S r"   r#   r$   r
   r
   r   r&   _   s    z4rewrite_run_net_simple_xrayocr_lstm.<locals>.mkl_tmpc                 S   s
   d  | ¡S )Nz	{}__CPU__r#   r$   r
   r
   r   Úcpu_tmpb   s    z4rewrite_run_net_simple_xrayocr_lstm.<locals>.cpu_tmpr   r'   r(   r   FéÿÿÿÿZShapeTc                    s    g | ]}|ˆkr|nˆ ˆƒ‘qS r
   r
   r1   )rE   Úin_blobr
   r   r0   ”   s   ÿz7rewrite_run_net_simple_xrayocr_lstm.<locals>.<listcomp>c                    s   g | ]}t  ˆˆ |ƒ|¡‘qS r
   r)   r+   r.   r
   r   r0   ˜   s   ÿc                    s    g | ]}|ˆkr|nˆ |ƒ‘qS r
   r
   r1   r2   r
   r   r0   ž   s   ÿr3   r4   ZRecurrentNetworkZstep_net)r5   r   r   r6   r   r   r*   r   r   r   r   r   Úappendr   r8   r   r   r   r   r9   r:   r;   Úargr%   Únr!   )r	   r<   r=   r>   r   r7   Zexternal_inputs_to_cpuZfind_first_shape_opZcpu_op_start_idxZop_idxZcopy_extra_input_opsrB   r?   r@   rA   r   rC   rI   Z	nested_opr   Znew_external_inputr
   )rE   rG   r&   r-   r/   r   Ú#rewrite_run_net_simple_xrayocr_lstmV   sº    	

ÿÿ
ÿ




ÿÿþ
ÿÿÿÿ

ÿ

ÿ
ÿþÿþrK   c                 C   s*   t  | ¡} t| j ¡ ƒ t| j ¡ ƒ | S r   )ÚcopyÚdeepcopyr   Zparam_init_netZProtorD   r	   )Úmodelr
   r
   r   Úrewrite_model_helper_simpleÒ   s    
rO   )rL   Zcaffe2.protor   Zcaffe2.pythonr   r   r   r!   rD   rK   rO   r
   r
   r
   r   Ú<module>   s   1|