U
    d                     @   s  d dl Z d dlZd dlZd dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZmZ d dlm  mZ d dlm  m  mZ dd Zdd	 Zd
d Zdd Zdd Zdd Zdd Zdd Zdd Ze  ej!j" dG dd dej#Z$e%dkrd dl Z e &  dS )    N)given)ModelHelper)resnet)	workspacebrewc                 C   s^   t | } t|  jD ]\}}|d |j_q|  jsZ|  j	|  jd j
d g | S )N   r   )copydeepcopy	enumerate	InitProtoopZdevice_optionZrandom_seedProtoexternal_outputextendoutput)modelir    r   H/tmp/pip-unpacked-wheel-ua33x9lu/caffe2/python/mkl/rewrite_graph_test.pydeterministic_io   s    

"r   c                  C   s&   t dd} t| dddd | dgfS )Nrnamedatafc
   r   r   )r   r   r   r   r   r   r   	simple_fc   s    
r   c                  C   sV   t dd} t| dddd}t| |ddd}t|t|g|  jd d < | dgfS )Nr   r   r   fc0r   fc1r   )r   r   r   strr   r   )r   r    r!   r   r   r   double_matmul    s
    
r#   c                  C   s"   t dd} t| dd | dgfS )Nr   r   r   r   r   )r   r   relur   r   r   r   simple_relu'   s    
r%   c                  C   sH   t dd} t| t| t| t| ddddddddd | d	gfS )
Nr   r   r   r!   r   Zrl1Zfc2Zrl2r   )r   r   r$   r   r   r   r   r   
simple_mlp-   s.    
	r&   c               	   C   sV   t ddddd} tj| dddd	dd
d tj| ddd	dd t| dd | dgfS )Nr   NCHWTorderis_testr   Z	arg_scoper   conv1      r   kernelstrideZconv1_spatbngMbP?)epsilonrelu1)r   r-       r4   )r   r   convZ
spatial_bnr$   r   r   r   r   
simple_cnnC   s&              r6   c                  C   s4  t ddddd} tj| dddd	d
di fdi fddd
}t| |d}tj| |dddddd}tj| |dddddd}tj| |dd	dddi fdi fdd	}t| |d}tj| |dddd}tj| |dddddd}tj| |ddd ddi fdi fd!d	}	t| |	d}
tj| |
d"d d#ddi fdi fd!d	}t| |d"}tj| |d$d#d#ddi fdi fd!d	}t| |d$}tj| |d%ddd}t| |d&d'd(di fdi f}t| |d&}t| |d)d(d(di fdi f}t| |d)}tj| |d*d!d+d,}t| |d-d(d.di fdi f}t| |d-}tj| |d/d!d+d, | d0gfS )1Nr   r'   Tr(   r+   r   r,   r-   @      Z
XavierFillZConstantFill      )r1   padpool1r   )r0   r1   r;   Z
legacy_padZ	pool1_lrn   -C6?g      ?g      ?)sizealphabetaZbiasconv2   )r;   pool2r/   Z	pool2_lrnconv3i  r   conv4   conv5pool5fc6i $  i   fc7Zfc7_dropoutg      ?)r*   Zratiofc8i  Zfc8_dropout)r   r-      rM   )r   r   r5   r$   Zmax_poolZlrnr   Zdropout)r   r,   r3   r<   Zlrn1rB   Zrelu2rD   Zlrn2rE   Zrelu3rF   Zrelu4rH   Zrelu5rI   rJ   Zrelu6rK   Zrelu7Zdrop7rL   Zrelu8r   r   r   alexnetO   s      
                            rN   c                  C   s2   t ddddd} tj| dddddd	 | d
gfS )Nr   r'   Tr(   r+   r   r   r=   )num_input_channelsZ
num_groups
num_labelsr*   )r   r   r4   r4   )r   r   Zcreate_resnet_32x32r   r   r   r   simple_resnet   s        rQ   c                  C   s2   t ddddd} tj| dddddd	 | d
gfS )Nr   r'   Tr(   r+   r   r   r=   )rO   rP   r*   Zno_loss)r   r   rM   rM   )r   r   Zcreate_resnet50r   r   r   r   complex_resnet   s        rR   zNo MKLDNN support.c                   @   sD   e Zd Zeeeeee	gddd Z
dd Zdd Zdd	 Zd
S )MKLRewriteTest)genc                    s`   | \}\}t |}t|}tjj| tj  fdd}tjj	||||ddd d S )Nc                    sV   j |   j |  jd   j |   j j|  jd  	 S Nr   
wsrunr   create_blobr   external_inputfeedblobsr   fetchr   Xselfr   r   rX      s    z3MKLRewriteTest.test_mkl_simple_rewrite.<locals>.runr>   ZatolZrtol)
r   rewrite_graphrewrite_model_helper_simplenprandomrandnastypefloat32testingassert_allclose)r`   rT   	cpu_modelshape	mkl_modelrX   r   r^   r   test_mkl_simple_rewrite   s    
 z&MKLRewriteTest.test_mkl_simple_rewritec                    sl   t  \}\}t|}t|}tjd tjj| tj	  fdd}tj
j||||ddd d S )N  c                    sV   j |   j |  jd   j |   j j|  jd  	 S rU   rV   r   r^   r   r   rX      s    z3MKLRewriteTest.test_mkl_resnet_rewrite.<locals>.runr>   ra   )rR   r   rb   rc   rd   re   seedrf   rg   rh   ri   rj   r`   rk   rl   rm   rX   r   r^   r   test_mkl_resnet_rewrite   s    
 z&MKLRewriteTest.test_mkl_resnet_rewritec                    sl   t  \}}t|}t|}tjd dd |D   fdd}|| tjj||||ddd d S )Nro   c                 S   s    g | ]}t jj| t jqS r   )rd   re   rf   rg   rh   ).0rl   r   r   r   
<listcomp>   s     z@MKLRewriteTest.test_mkl_multi_output_rewrite.<locals>.<listcomp>c                    sp   j |   t|  j D ]\}}j || q t|   j |   fdd|  j	D S )Nc                    s   g | ]} j j|  qS r   )rW   r\   r]   )rs   r   )r`   r   r   rt      s   zMMKLRewriteTest.test_mkl_multi_output_rewrite.<locals>.run.<locals>.<listcomp>)
rW   rX   r   zipr   rZ   rY   r[   printr   )r   r   r_   ZXsr`   r   r   rX      s    
z9MKLRewriteTest.test_mkl_multi_output_rewrite.<locals>.runr>   ra   )	r#   r   rb   rc   rd   re   rp   ri   rj   )r`   rk   Zshapesrm   rX   r   rw   r   test_mkl_multi_output_rewrite   s    

	 z,MKLRewriteTest.test_mkl_multi_output_rewritec                    sl   t  \}\}t|}t|}tjd tjj| tj	  fdd}tj
j||||ddd d S )Nro   c                    sV   j |   j |  jd   j |   j j|  jd  	 S rU   rV   r   r^   r   r   rX      s    z4MKLRewriteTest.test_mkl_alexnet_rewrite.<locals>.runr>   ra   )rN   r   rb   rc   rd   re   rp   rf   rg   rh   ri   rj   rq   r   r^   r   test_mkl_alexnet_rewrite   s    
 z'MKLRewriteTest.test_mkl_alexnet_rewriteN)__name__
__module____qualname__r   stZsampled_fromr%   r   r&   r6   rn   rr   rx   ry   r   r   r   r   rS      s   
 
rS   __main__)'ZunittestZnumpyrd   r	   Z
hypothesisr   Zhypothesis.strategiesZ
strategiesr}   Zcaffe2.python.model_helperr   Zcaffe2.python.modelsr   Zcaffe2.pythonr   r   Z"caffe2.python.hypothesis_test_utilpythonZhypothesis_test_utilhuZcaffe2.python.mkl.rewrite_graphZmklrb   r   r   r#   r%   r&   r6   rN   rQ   rR   ZskipIfCZ
use_mkldnnZHypothesisTestCaserS   rz   mainr   r   r   r   <module>   s.   XE
