a
    ==ic&2                     @   s   d Z ddlZddlZddlZddl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 ddlmZmZ ddlZddlmZ ddlm  mZ ejejd eeZ G dd	 d	e!Z"e"j#Z#e"j$Z$e"j%Z%e"j&Z&dS )
z`Caffe2 Protobuf to ONNX converter

To run this, you will need to have Caffe2 installed as well.
    N)core)checkerhelpernumpy_helpermapping
GraphProto	NodeProtoTensorProtoOperatorSetIdProto)make_tensor_value_info
make_model)c2_native_run_net)levelc                   @   s  e Zd ZdZddddddddddddddZdhd	d
hd	d
hd	d
hdZddiZddiddidZi Ze	
 Zedd Zedd Zedd Zedd Zedd Zedd Zedd Zed-d!d"Zed#d$ Zed%d& Zed'd( Zed)d* Zed+d, Zd S ).Caffe2Frontend	   ZBatchNormalizationZConvZConvTransposeZMaxPoolZAveragePool)Z	SpatialBNZConv1DZConv2DZConv3DZConvTranspose1DZConvTranspose2DZConvTranspose3DZ	MaxPool1DZ	MaxPool2DZ	MaxPool3DZAveragePool1DZAveragePool2DZAveragePool3Ds   NCHWr      )orderZcudnn_exhaustive_searchZexhaustive_searchZ	use_cudnnZkernelsZkernel_shapedimsZaxesperm)ZSqueezeZ	Transposec                 C   s
   | j  S N)_dummy_nameZnew_dummy_namecls r   l/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/caffe2/python/onnx/frontend.py
dummy_nameM   s    zCaffe2Frontend.dummy_namec                 C   s   |j }| j|j|j}|| jv r6| j| |j|}|drH|j}n\|drZ|j}nJ|drl|j}n8|j	rz|j	}n*|j
r|j
}n|jr|j}ntd||| jv r|| j|j v sJ d S t||S )Nfisz$Could not find data field in arg: {})type_global_renamed_argsgetname_per_op_renamed_argsZHasFieldr   r   r   Zfloatsintsstrings
ValueErrorformat_blocklist_caffe2_argsr   Zmake_attribute)r   op_defargop_typer"   valuer   r   r   _common_caffe2_arg_to_onnx_attrQ   s*    




z.Caffe2Frontend._common_caffe2_arg_to_onnx_attrc                 C   s   |  ||S r   )r-   )r   r)   r*   r   r   r   caffe2_arg_to_onnx_attrp   s    z&Caffe2Frontend.caffe2_arg_to_onnx_attrc                    sj   t  }j|_ jjj|_|jj |jj t	d  fddj
D }|j| |S )Nc                    s   g | ]}  |qS r   )r.   ).0r*   r   r)   r   r   
<listcomp>~   s   zACaffe2Frontend._common_caffe2_op_to_onnx_node.<locals>.<listcomp>)r   r"   _renamed_operatorsr!   r   r+   inputextendoutputfilterr*   	attribute)r   r)   shapesZnode_defattrsr   r0   r   _common_caffe2_op_to_onnx_nodet   s    z-Caffe2Frontend._common_caffe2_op_to_onnx_nodec                 C   s   t |jr|t | j| |\}}g }|D ]}t }|| || q,g }|D ]}t	 }	|	| ||	 qT||fS |j| j
v rt| | j
|j }
n| j}
|
||}g }t|tr|\}}t|tjjs|g}||fS r   )CZsupport_onnx_exportr   Zexport_to_onnxr   ZSerializeToStringr   ZParseFromStringappendr	   _special_operatorsgetattrr:   
isinstancetuplecollectionsabcIterable)r   r)   r8   Z	node_strsZtensor_strsnodesr   nodeconst_tensorstensorZ
translatorr   r   r   caffe2_op_to_onnx_node   s.    



z%Caffe2Frontend.caffe2_op_to_onnx_nodec                 C   sT   | d u rt  S t  }|| j || j | jD ]}||j ||j q2|S r   )setupdateexternal_inputexternal_outputopr3   r5   )netnamesrM   r   r   r   _all_names_in_net   s    
z Caffe2Frontend._all_names_in_netc                 C   s   t | j| j| jdS )Nr"   	elem_typeshape)r   r"   	data_typer   )rG   r   r   r   _extract_value_info   s
    z"Caffe2Frontend._extract_value_infoNc                    s  d u ri t tstd| || |r\|}dd |D  ng }d}|jD ]*}t	|j
|jD ]}|vr~d} qjq~qjtt|jt  }|rtdd|d }	d }
|rRi }|jD ],}| \}}tjj| tj| ||< qt|||\}	}
|jD ],}|
| }tj|j }|j}||f|< q$t }|j|_|j !| |j
!fdd	|jD  j"#$|$|B  |jD ]}i }t	|j
|jD ]>}|	r|	%|}t&|d
r|j||< n| d ||< qj'||d\}}|j(!| |j !| |j
!fdd|D  qtt)dd	 |j(D dd |j D  tdd	 |jD   }|rt*+dd| |j! fdd	|jD  |S )Nz<Please pass value_info as a name -> (type, shape) dictionaryc                 S   s   i | ]}|j |j|jfqS r   )r"   rT   r   r/   initr   r   r   
<dictcomp>   s   z;Caffe2Frontend.caffe2_net_to_onnx_graph.<locals>.<dictcomp>FTz'Could not find value info of inputs: {}z, c                 3   s,   | ]$}t | | d   | d dV  qdS r   r   rQ   Nr   r/   r"   
value_infor   r   	<genexpr>   s   

z:Caffe2Frontend.caffe2_net_to_onnx_graph.<locals>.<genexpr>rS   r   )r8   c                    s   g | ]}  |qS r   )rU   )r/   rG   r   r   r   r1         z;Caffe2Frontend.caffe2_net_to_onnx_graph.<locals>.<listcomp>c                 s   s   | ]}t |jV  qd S r   )listr5   )r/   rE   r   r   r   r^     r_   c                 S   s   g | ]
}|j qS r   r"   rV   r   r   r   r1     r_   c                 s   s   | ]}|j V  qd S r   ra   )r/   vir   r   r   r^   	  r_   zSThere are graph output not produced by any node or initializer: {}! Will drop them.c                 3   s4   | ],}| v rt || d  | d dV  qdS rY   rZ   r[   )
all_outputr]   r   r   r^     s   

),r?   dictr&   _filter_fake_init_ssa_rewritecaffe2_init_net_to_initializerrJ   rM   	itertoolschainr3   r5   rI   r`   rK   keysRuntimeErrorr'   joinnprandomZrandnZastyper   ZTENSOR_TYPE_TO_NP_TYPEr   rL   ZNP_TYPE_TO_TENSOR_TYPEZdtyperS   r   r"   initializerr4   r   resetrP   	FetchBlobhasattrrH   rE   sumloggerwarning)r   predict_netinit_netr]   ro   Zrun_native_netrM   r"   missingwsoutputsinputsrR   rS   r5   Z	graph_defr8   ZblobrD   rF   Zredundant_outputr   )rc   r   r]   r   caffe2_net_to_onnx_graph   s    










z'Caffe2Frontend.caffe2_net_to_onnx_graphc                    sL   t d |g d\ }g }|jD ]}||j q fddtt|D }|S )N)rw   rv   r{   c                    s    g | ]}t j ||d qS )ra   )r   Z
from_arrayrq   r[   ry   r   r   r1     s   zACaffe2Frontend.caffe2_init_net_to_initializer.<locals>.<listcomp>)r   rM   r4   r5   sortedrI   )r   rw   _Zoutput_namesrM   ro   r   r}   r   rg     s    


z-Caffe2Frontend.caffe2_init_net_to_initializerc                    s>   |r: fdd|j D }|D ]}|j | q|d d = ~d S )Nc                    s:   g | ]2}t |jd kr|jd  v rtd|jr|qS )r   r   zGivenTensor.*Fill|ConstantFill)lenr5   rematchr   )r/   rM   r\   r   r   r1   %  s   z4Caffe2Frontend._filter_fake_init.<locals>.<listcomp>)rM   remove)r   rw   r]   Z
fake_initsZ	fake_initr   r\   r   re   "  s    
z Caffe2Frontend._filter_fake_initc                 C   s   |  |||S r   )rf   )r   rN   rw   r]   r   r   r   ssa_rewrite-  s    zCaffe2Frontend.ssa_rewritec                    sB  d
dd|rL|j D ]6}td|js8J d|j|t|jdksJ qt|\} i g }|D ]\}}||7 }||7 }qf|D ]*\}	}
|	vr|
h|	< q|	 	|
 qt|j t|ksJ t
|j |D ]H\}\}}fdd|D |jd d < fdd|D |jd d < q҇ fd	d|jD |jd d < d S )Nc                 S   s4   |dkr| S |r(t || i dkr(| S d| |S )Nr   r   z{}_{})r   r!   r'   )r"   versionversion_cntr   r   r   ssa_name3  s
    z-Caffe2Frontend._ssa_rewrite.<locals>.ssa_namezGivenTensor.*Fillztype is {}, 
{}r   c                    s   g | ]\}} ||qS r   r   r/   r"   r   r   r   r   r   r1   N  s   z/Caffe2Frontend._ssa_rewrite.<locals>.<listcomp>c                    s   g | ]\}} ||qS r   r   r   r   r   r   r1   P  s   c                    s   g | ]}| | qS r   r   r[   Zblob_versionsr   r   r   r   r1   R  s   )N)rM   r   r   r   r'   r   r5   caffe2_coreZget_ssaaddzipr3   rL   )r   rN   rw   r]   rM   ZssaZversioned_blobsZversioned_inputZversioned_outputr"   r   Zversioned_inputsZversioned_outputsr   r   r   rf   1  s4    

 
zCaffe2Frontend._ssa_rewritec                 O   s>   t  }d|_| j|_t| j|i ||gdd}t| |S )N zonnx-caffe2)Zopset_importsZproducer_name)r
   domaintarget_opset_versionr   r   r|   r   Zcheck_model)r   argskwargsZopset_idmodelr   r   r   caffe2_net_to_onnx_modelU  s    
z'Caffe2Frontend.caffe2_net_to_onnx_model)NN)__name__
__module____qualname__r   r2   r(   r    r#   r=   r;   Z	DummyNamer   classmethodr   r-   r.   r:   rH   staticmethodrP   rU   r|   rg   re   r   rf   r   r   r   r   r   r       sn   






  d
	



#r   )'__doc__rA   rh   loggingr   Zcaffe2.pythonr   r   Zonnxr   r   r   r   r   r   r	   r
   Zonnx.helperr   r   numpyrm   Zcaffe2.python.onnx.helperr   Z!caffe2.python._import_c_extensionpythonZ_import_c_extensionr;   basicConfigINFO	getLoggerr   rt   objectr   r|   r   rg   r   r   r   r   r   <module>   s&   	(
  D