U
    ‰d7;  ã                   @   sÔ   d dl Z d dl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
 d dlmZ d dlmZ d dlZd dlmZmZmZ d dlmZ d dlmZmZ d dlm  m  mZ d d	lmZ G d
d„ deƒZ dS )é    N)Ú
caffe2_pb2)ÚbrewÚcore)ÚModelHelper)Ú	CliRunner)ÚhelperÚ
ModelProtoÚTensorProto)Úc2_native_run_net)Úcaffe2_to_onnxÚonnx_to_caffe2)ÚTestCasec                   @   sz   e Zd Zdd„ Zdd„ Zdd„ Ze d¡dd	„ ƒZd
d„ Z	dd„ Z
dd„ Zdd„ Ze d¡dd„ ƒZe d¡dd„ ƒZdS )ÚTestConversionc                 O   sH   t ƒ }|j|f|ž|Ž}|  |jdt d |j|jt	j
|jŽ ¡¡¡ |S )Nr   zw
        Command exited with non-zero exit code:
        output: {}
        exception: {}
        exc_info: {}
        )r   ZinvokeÚassertEqualZ	exit_codeÚtextwrapÚdedentÚformatÚoutputÚ	exceptionÚ	tracebackÚformat_exceptionÚexc_info)ÚselfÚcmdÚargsÚkwargsÚrunnerÚresult© r   úL/tmp/pip-unpacked-wheel-ua33x9lu/caffe2/python/onnx/tests/conversion_test.pyÚ_run_command   s    
ùzTestConversion._run_commandc                 C   s2  t  ¡ }t  ¡ }t  ¡ }tdd}t |dgd¡ | |j ¡  ¡ ¡ | 	¡  tdd}|jj
g dddgt d¡ ¡  t¡d | |j ¡  ¡ ¡ | 	¡  | jt|jd	|jd
|jgdd tƒ }| | ¡ ¡ |  t|jjƒd¡ |  |jjd jd¡ |  t|jjƒd¡ |  |jjd j|jjd j¡ d S )Núcaffe2-to-onnx-test©ÚnameÚXÚYzcaffe2-to-onnx-init-testé   ©r&   r&   )ÚshapeÚvaluesú--caffe2-init-netú--outputF©Zcatch_exceptionsé   r   ÚRelu)ÚtempfileÚNamedTemporaryFiler   r   ÚreluÚwriteÚnetÚProtoÚSerializeToStringÚflushÚGivenTensorFillÚnpÚzerosÚflattenÚastypeÚfloatr    r   r#   r   ÚParseFromStringÚreadr   ÚlenÚgraphÚnodeÚop_typeÚinitializerÚinput)r   Ú
caffe2_netÚcaffe2_init_netr   ÚmodelZ
init_modelÚ
onnx_modelr   r   r   Útest_caffe2_to_onnx*   s:    

ÿ  ýú	z"TestConversion.test_caffe2_to_onnxc                 C   sè   t  ¡ }t  ¡ }tdd}t |dgd¡ | |j ¡  ¡ ¡ | 	¡  |j
d|j
g}|  td| jt|¡ | dt dtjdfi¡g¡ |  t|¡ tƒ }| | ¡ ¡ |  t|jjƒd	¡ |  |jjd
 jd¡ |  t|jjƒd
¡ d S )Nr!   r"   r$   r%   r+   z
value infoú--value-infor'   r-   r   r.   )r/   r0   r   r   r1   r2   r3   r4   r5   r6   r#   ÚassertRaisesRegexÚ	Exceptionr    r   ÚextendÚjsonÚdumpsr	   ÚFLOATr   r=   r>   r   r?   r@   rA   rB   rC   )r   rE   r   rG   r   rH   r   r   r   Útest_caffe2_to_onnx_value_infoJ   s4    
  þ ÿþz-TestConversion.test_caffe2_to_onnx_value_infoz*Disabled due to onnx optimizer deprecationc           	      C   s\  t  ¡ }t  ¡ }t  ¡ }t dddgdg¡}tj|gdt dtjd¡t dtjd¡gt dtjd¡gt dtjdd	gt	 
d¡ ¡  t¡¡gd
}tj|dd}| | ¡ ¡ | ¡  |  t|jd|jd|jg¡ t ¡ }| | ¡ ¡ |  t|jƒd¡ |  |jd jd¡ t ¡ }| | ¡ ¡ |  t|jƒd¡ |  ttdd„ |jD ƒg ƒƒdh¡ d S )NZMulr$   ÚWr%   Útest©r&   é   )r-   rU   r-   rU   ©rC   úonnx-to-caffe2-test©Úproducer_namer+   ú--init-net-outputr   c                 S   s   g | ]}t |jƒ‘qS r   )Úlistr   )Ú.0Zinit_opr   r   r   Ú
<listcomp>Š   s   ÿz6TestConversion.test_onnx_to_caffe2.<locals>.<listcomp>)r/   r0   r   Ú	make_nodeÚ
make_graphÚmake_tensor_value_infor	   rP   Úmake_tensorr8   r9   r:   r;   r<   Ú
make_modelr2   r5   r6   r    r   r#   r   ÚNetDefr=   r>   r   r?   ÚopÚtypeÚsetÚsum)	r   rH   r   Zinit_net_outputÚnode_defÚ	graph_defÚ	model_defrE   rF   r   r   r   Útest_onnx_to_caffe2e   s^      ÿÿýú
  ýÿÿÿþz"TestConversion.test_onnx_to_caffe2c                 C   s(  t  ¡ }t |d¡}t dddgdg¡}tj dd¡ 	tj
¡}tj dd¡ ¡  	tj
¡}tj|gdt dtjd	¡t dtjd
¡gt dtjd¡gtjdtjddg| ¡ ddgd}tj|dd}| d| ¡ ¡ | d| ¡ ¡ | ¡  | d
¡}t ||¡}t |¡}	|	 |¡j}
tj |
|¡ d S )NÚwÚMatMulr$   rR   r%   r&   rU   rS   rT   ©rU   r&   r'   T)ÚrawrV   rW   rX   Z__MODEL_PROTO)r/   r0   ÚzipfileÚZipFiler   r^   r8   ÚrandomÚrandr;   Úfloat32r:   r_   r`   r	   rP   ra   Útobytesrb   Úwritestrr5   ÚcloseÚreshapeÚmatmulÚc2Zprepare_zip_archiveÚrunr%   ÚtestingÚassert_allclose)r   ÚbufrH   rh   r$   rR   ri   rj   ZY_expectZc2_modelr%   r   r   r   Útest_onnx_to_caffe2_zipfileŽ   s@      ÿÿüú

z*TestConversion.test_onnx_to_caffe2_zipfilec           
   
   C   s   t  dtjddg¡}t  |dg t  dtjd¡g¡}t  |dg t  dtjd¡g¡}dg}dd	„ |D ƒ}t jd
g dg|dt jd||||dg}	|	S )NÚ	conditionr   TÚ
true_graphr%   r'   Úfalse_graphc                 S   s   g | ]\}}}|‘qS r   r   ©r\   Ú_r#   r   r   r   r]   ¶   s     z3TestConversion._make_fake_if_op.<locals>.<listcomp>ÚConstant©ÚvalueZIf)Zthen_branchZelse_branch)r   ra   r	   ÚBOOLr_   r`   rP   r^   )
r   Ú
true_nodesÚfalse_nodesÚoutput_typesÚtruer   r‚   Z	if_inputsZ
if_outputsÚretval_nodesr   r   r   Ú_make_fake_if_op­   s    
ÿ
ÿÿþzTestConversion._make_fake_if_opc                 C   s6  t  dddgdg¡g}t jddgdgddgddgddgd	g}|  ||tjd
dfg¡}tj dd¡ tj	¡}tj dd¡ 
¡  tj	¡}t j|dt  dtjd¡t  dtjd¡gt  dtjd
¡gt  dtjddg| ¡ ¡gd}t  dd¡}t j|d|gd}t |¡}	t || dd¡¡}
|	 |¡}tj |j|
¡ d S )Nrm   r$   rR   r%   ZSlicer   r-   r&   )ZaxesZstartsZendsr'   rU   rS   rT   rn   rV   Ú é	   rW   )rY   Zopset_imports)r   r^   rŽ   r	   rP   r8   rr   rs   r;   rt   r:   r_   r`   ra   ÚtolistZmake_opsetidrb   rz   Úpreparery   rx   r{   r|   r}   r%   )r   r‰   rŠ   Únodesr$   rR   ri   Zonnx_idrj   Úpr%   Úoutr   r   r   Útest_onnx_to_caffe2_if¾   sB      ÿ ÿÿýúÿ

z%TestConversion.test_onnx_to_caffe2_ifc                 C   s   t  dtjddg¡}t  dtjddg¡}t  dtjd¡t  dtjd¡g}|D ]"\}}}	| t  d|	 ||¡¡ qLt  dtjd¡g}
|D ]"\}}}	|
 t  d|	 ||¡¡ q†t  |d	||
¡}d
dg}| dd„ |D ƒ¡ dd„ |D ƒ}t j	dg d
g|dt j	dg dg|dt j	d|||dg}|S )NZtrip_count_value)r-   é
   r€   TÚiZcondr„   Ú
body_graphZ
trip_countc                 S   s   g | ]\}}}|‘qS r   r   rƒ   r   r   r   r]   ë   s     z5TestConversion._make_fake_loop_op.<locals>.<listcomp>c                 S   s   g | ]\}}}|‘qS r   r   rƒ   r   r   r   r]   ì   s     r…   r†   ZLoop)Úbody)
r   ra   r	   ZINT64rˆ   r`   Úappendr_   rM   r^   )r   Ú
body_nodesZinput_typesr‹   ZtenrŒ   Zgraph_inputsre   r(   r#   Zgraph_outputsr™   Zloop_inputsZloop_outputsr   r   r   r   Ú_make_fake_loop_opÛ   s*    ÿ
ÿýz!TestConversion._make_fake_loop_opc                 C   s  t  dddgdg¡g}|  |tjddfgtjddfg¡}tj dd¡ tj	¡}tj dd¡ 
¡  tj	¡}t j|d	t  dtjd¡t  dtjd¡gt  dtjd¡gt  dtjddg| ¡ ¡gd
}t j|dd}|}tdƒD ]}t || dd¡¡}qØt |¡}	|	 |¡}
tj |
j|¡ d S )Nrm   Z_XrR   Z_Yr'   r$   r%   r&   rS   rV   rW   rX   r—   )r   r^   r   r	   rP   r8   rr   rs   r;   rt   r:   r_   r`   ra   r‘   rb   Úrangery   rx   rz   r’   r{   r|   r}   r%   )r   rœ   r“   r$   rR   ri   rj   r%   r„   r”   r•   r   r   r   Útest_onnx_to_caffe2_loopô   s>      ÿþÿýú

z'TestConversion.test_onnx_to_caffe2_loopz%Start failing after Reshape op changec                 C   sn  t  ¡ }t  ¡ }t  ¡ }d}d}d}d}t ¡ }d|_|||g|jd d …< |g|jd d …< |j t	j
d|||g|gddg¡ | | ¡ ¡ | ¡  t ¡ }	d	|	_||g|	jd d …< tj d
dd¡ tj¡}
tj dd¡ tj¡}tj d¡ tj¡}|	j t	j
dg |g||jdt	j
dg |g||jdg¡ | |	 ¡ ¡ | ¡  t |
| ¡ ¡| }tdƒD ]}| jt|jd|jd|jdt |tjdfi¡gdd | d¡ tƒ }| |  ¡ ¡ tj! "t# $||j%j&d j|
i¡|g¡ |  t'|jd|jd|jg¡ | d¡ t ¡ }| |  ¡ ¡ | d¡ t ¡ }	|	 |  ¡ ¡ |jd }tj! "t(|	|||
idd
 |g¡ q`d S )Nr$   rR   Úbr%   ztest-convert-end2endZFCr&   )ÚinputsÚoutputsZaxisztest-convert-end2end-initr-   rU   é   r7   )r)   r(   é   r*   r+   rJ   )r-   rU   r&   Fr,   r   rZ   )Úinit_netÚpredict_netr¡   ))r/   r0   r   rc   r#   Zexternal_inputZexternal_outputrd   rM   r   ZCreateOperatorr2   r5   r6   r8   rr   Zrandnr;   rt   r(   ry   Z	transposerž   r    r   rN   rO   r	   rP   Úseekr   r=   r>   r|   Zassert_almost_equalrz   Z	run_modelr@   rD   r   r
   )r   Zpredict_net_fZ
init_net_fZonnx_model_fÚxrl   r    Úyr¦   r¥   Zx_valZw_valZb_valZy_valr„   rH   r   r   r   Útest_convert_end2end  sÀ    üÿûûø   ÿû	ö
 ÿý  ýÿ



þþýz#TestConversion.test_convert_end2endN)Ú__name__Ú
__module__Ú__qualname__r    rI   rQ   ÚunittestÚskiprk   r   rŽ   r–   r   rŸ   rª   r   r   r   r   r      s    
(
r   )!rN   r/   r   r   r®   rp   Zcaffe2.protor   Zcaffe2.pythonr   r   Zcaffe2.python.model_helperr   Zclick.testingr   Znumpyr8   Zonnxr   r   r	   Zcaffe2.python.onnx.helperr
   Z!caffe2.python.onnx.bin.conversionr   r   Zcaffe2.python.onnx.backendÚpythonÚbackendrz   Z#caffe2.python.onnx.tests.test_utilsr   r   r   r   r   r   Ú<module>   s    