U
    ‰d¸.  ã                   @   sd   d dl mZ d dlmZ d dlZd dlmZ d dl	m
Z
mZ d dl	mZ eƒ ZG dd„ dejƒZdS )é    )ÚgivenN)ÚTransformer)ÚcoreÚ	workspace)Ú	test_utilc                   @   s   e Zd Zdd„ Zdd„ Zd3d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 dd¡e dd¡e dd¡e ddg¡ejdd d!d"d#d$„ ƒZee dd¡e dd¡e dd¡e ddg¡ejdd d!d"d%d&„ ƒZee dd¡e dd¡e dd¡e ddg¡ejdd d!d"d'd(„ ƒZee dd¡e dd¡e d)d*¡e d)d*¡e d)d*¡e dd¡ejdd d!d+d,d-„ ƒZd.d/„ Zd0d1„ Zd2S )4ÚTestTransformationsc                 C   s,   t  d¡}|jdddgdgdddd	d
 |S )NÚnetÚXÚwÚbÚYé   r   é   ÚNCHW©ZstrideÚpadÚkernelÚorder)r   ÚNetÚConv©Úselfr   © r   úF/tmp/pip-unpacked-wheel-ua33x9lu/caffe2/python/transformations_test.pyÚ_base_test_net!   s    
z"TestTransformations._base_test_netc                 C   s*   t  |¡ t | ¡ jd jd¡s&t‚d S )Nr   ZNNPACK)ÚtransformerÚ	AddNNPACKÚtuÚstr_compareÚProtoÚopZengineÚAssertionErrorr   r   r   r   Ú_add_nnpack&   s    
zTestTransformations._add_nnpackTc                 C   s~   |   |¡ t |¡ |  t |¡|¡ d}| ¡ jd jD ](}t 	|j
d¡r:t 	|jd¡s^t‚d}q:|rr|szt‚n|rzt‚d S )NFr   Z
activationÚReluT)r"   r   ZFuseNNPACKConvReluZassertEqualsr   ÚnumOpsr   r    Úargr   ÚnameÚsr!   )r   r   Zexpected_result_num_opsÚexpected_activation_argZhas_activation_argr%   r   r   r   Ú_fuse_nnpack_convrelu*   s    


z)TestTransformations._fuse_nnpack_convreluc                 C   s&   |   ¡ }| dgdg¡ |  |¡ d S )Nr   ÚY2)r   r#   r"   r   r   r   r   Útest_transformer_AddNNPACK9   s    z.TestTransformations.test_transformer_AddNNPACKc                 C   s(   |   ¡ }| dgdg¡ |  |d¡ d S )Nr   r*   r   ©r   r#   r)   r   r   r   r   Ú#test_transformer_FuseNNPACKConvRelu>   s    z7TestTransformations.test_transformer_FuseNNPACKConvReluc                 C   s<   |   ¡ }| dgdg¡ | dgdg¡ | j|ddd d S )Nr   r*   ZY3r   F)r(   r,   r   r   r   r   Útest_noFuseNNPACKConvReluC   s    z-TestTransformations.test_noFuseNNPACKConvReluc                 C   sT   |   ¡ }| dgdg¡ |  |d¡ | ¡ jd jd | ¡ jd jd ksPt‚d S )Nr   r	   r   r   ©r   r#   r)   r   r    ÚoutputÚinputr!   r   r   r   r   Ú,test_transformer_FuseNNPACKConvReluNoInplaceI   s    z@TestTransformations.test_transformer_FuseNNPACKConvReluNoInplacec                 C   sT   |   ¡ }| dgdg¡ |  |d¡ | ¡ jd jd | ¡ jd jd ksPt‚d S )Nr   r   r   r/   r   r   r   r   Ú.test_transformer_FuseNNPACKConvReluInplaceReluO   s    zBTestTransformations.test_transformer_FuseNNPACKConvReluInplaceReluc                 C   sž   |   ¡ }| dgdg¡ |jdddgdgddddd	 |  |d
¡ | ¡ jd jd | ¡ jd jd ksnt‚| ¡ jd jd | ¡ jd jd ksšt‚d S )Nr   r	   r
   r   r   r   r   r   r   é   ©	r   r#   r   r)   r   r    r0   r1   r!   r   r   r   r   Ú1test_transformer_FuseNNPACKConvReluPingPongNamingU   s    ,zETestTransformations.test_transformer_FuseNNPACKConvReluPingPongNamingc                 C   s®   |   ¡ }| dgdg¡ |jdddgdgddddd	 | dgdg¡ |  |d
¡ | ¡ jd jd | ¡ jd jd ks~t‚| ¡ jd jd | ¡ jd jd ksªt‚d S )Nr   r*   r
   r   r   r   r   r   r   r4   r5   r   r   r   r   Ú<test_transformer_FuseNNPACKConvReluFollowedByMultipleInputOp]   s    ,zPTestTransformations.test_transformer_FuseNNPACKConvReluFollowedByMultipleInputOpc                 C   s®   |   ¡ }| dgdg¡ |jdddgdgddddd	 | dgdg¡ |  |d
¡ | ¡ jd jd | ¡ jd jd ks~t‚| ¡ jd jd | ¡ jd jd ksªt‚d S )Nr   r
   r   r*   r   r   r   r   r   r4   r5   r   r   r   r   ÚCtest_transformer_FuseNNPACKConvReluInplaceFollowedByMultipleInputOpf   s    ,zWTestTransformations.test_transformer_FuseNNPACKConvReluInplaceFollowedByMultipleInputOpé   é
   r   r   iÿÿ  r   ZNHWCgñhãˆµøä>ç{®Gáz„?)Z	min_valueZ	max_value)ÚsizeÚinput_channelsÚseedr   Úepsilonc                 C   s^  t  ¡  t d¡}|}|}|}	d}
|jdddgdgdd|
|d	 |jdd
dddgdgd||d tj |¡ |dkršt	 
dd|||	¡ t	 
d|||
|
¡ n$t	 
dd||	|¡ t	 
d||
|
|¡ t	 dd
ddg|¡ t	j
d|dd t  |¡ t  d¡ ¡ }t  dt d¡¡ t |¡ t	 |¡dks*t‚t  |¡ t  d¡ ¡ }tj||dddsZt‚d S )Nr   r   r	   r
   r   r   r   r   r   ÚscaleÚbiasÚmeanÚvarr*   T©Úis_testr   r?   r   ç      à?©Úoffset©r   r   çš™™™™™©?çü©ñÒMbP?©ZrtolZatol©r   ÚResetWorkspacer   r   r   Ú	SpatialBNÚnpÚrandomr>   r   ÚrandBlobFloat32ÚrandBlobsFloat32Ú
RunNetOnceÚ	FetchBlobÚflattenÚFeedBlobÚzerosr   Ú
FuseConvBNr$   r!   Úallclose©r   r<   r=   r>   r   r?   r   ÚcÚhr
   ÚkÚpreTransformOutputÚpostTransformOutputr   r   r   Útest_transformer_FuseConvBNo   sF    
û


üz/TestTransformations.test_transformer_FuseConvBNc                 C   sZ  t  ¡  t d¡}|}|}|}	d}
|jddgdgdd|
|d |jdd	d
ddgdgd||d tj |¡ |dkr˜t	 
dd|||	¡ t	 
d|||
|
¡ n$t	 
dd||	|¡ t	 
d||
|
|¡ t	 d	d
dg|¡ t	j
d|dd t  |¡ t  d¡ ¡ }t  dt d¡¡ t |¡ t	 |¡dks&t‚t  |¡ t  d¡ ¡ }tj||dddsVt‚d S )Nr   r   r	   r
   r   r   r   r   r@   rA   rB   rC   r*   TrD   r   rF   rG   rI   rJ   rK   rL   rM   r[   r   r   r   Ú%test_transformer_FuseConvBNNoConvBias£   sF    
û


üz9TestTransformations.test_transformer_FuseConvBNNoConvBiasc                 C   sz  t  ¡  t d¡}|}|}|}	d}
|jddgdgdd|
|d |jdd	d
ddgdgd||d tj |¡ |dkr˜t	 
dd|||	¡ t	 
d|||
|
¡ n$t	 
dd||	|¡ t	 
d||
|
|¡ t	 d	d
dg|¡ t	j
d|dd t  |¡ t  d¡ ¡ }t  dt d¡¡ t |¡ t	 |¡dks&t‚t  |¡ t  d¡ ¡ }tdƒ t|ƒ tdƒ t|ƒ tj||dddsvt‚d S )Nr   r   r	   r
   r   r   r   r   r@   Z_bias0rB   rC   r*   TrD   r   rF   rG   rI   ÚpreÚafterrJ   rK   rL   )r   rN   r   r   r   rO   rP   rQ   r>   r   rR   rS   rT   rU   rV   rW   rX   r   rY   r$   r!   ÚprintrZ   r[   r   r   r   Ú3test_transformer_FuseConvBNNoConvBiasDuplicatedNameÖ   sN    
û


üzGTestTransformations.test_transformer_FuseConvBNNoConvBiasDuplicatedNamer   é   )r<   r=   ÚktÚkhÚkwr>   r?   c                 C   s0  t  ¡  t d¡}|}	|}
|}|}|jdddgdg|||gd |jdddd	d
gdgd|d tj |¡ t	 
dd|	|
||¡ t	 
d|	|	|||¡ t	 dddd	g|	¡ t	j
d
|	dd t  |¡ t  d¡ ¡ }t  dt d¡¡ t |¡ t	 |¡dksüt‚t  |¡ t  d¡ ¡ }tj||ddds,t‚d S )Nr   r	   r
   r   r   )Zkernelsr@   rA   rB   rC   r*   T)rE   r?   r   rF   rG   rI   r;   g-Cëâ6?rL   rM   )r   r<   r=   rh   ri   rj   r>   r?   r   r\   Útr]   r
   r_   r`   r   r   r   Útest_transformer_FuseConv3DBN  sF    
ýü


üz1TestTransformations.test_transformer_FuseConv3DBNc                 C   s:   t  d¡}| dgdg¡ | ¡ j dg¡ t |¡ d S ©Nr   r	   r   Zfake)r   r   r#   r   Zexternal_inputÚextendr   r   r   r   r   r   Ú%test_converterDontEnforceUnusedInputsC  s    
z9TestTransformations.test_converterDontEnforceUnusedInputsc                 C   s:   t  d¡}| dgdg¡ | ¡ j dg¡ t |¡ d S rm   )r   r   r#   r   Zexternal_outputrn   r   r   r   r   r   r   Ú&test_converterDontEnforceUnusedOutputsJ  s    
z:TestTransformations.test_converterDontEnforceUnusedOutputsN)T)Ú__name__Ú
__module__Ú__qualname__r   r"   r)   r+   r-   r.   r2   r3   r6   r7   r8   r   ÚstZintegersZsampled_fromZfloatsra   rb   rf   rl   ro   rp   r   r   r   r   r       s`    ÿ
		


û
-


û
,


û
0





ù	
-r   )Z
hypothesisr   Zhypothesis.strategiesZ
strategiesrt   ZnumpyrP   Zcaffe2.python.transformationsr   Zcaffe2.pythonr   r   r   r   r   ZTestCaser   r   r   r   r   Ú<module>   s   