U
    ‰d¯|  ã                   @   s´   d dl Z d dlmZ d dlm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  mZ d dlm  mZ e  ejj d¡G dd„ dejƒƒZed	kr°e  ¡  dS )
é    N)Úgiven)Ú
caffe2_pb2)ÚcoreÚ	workspace)ÚoptimizeForMKLDNNzNo MKLDNN support.c                   @   sÜ  e Zd Zef e dd¡e dd¡e dd¡e dd¡e dd¡e dd¡e dd¡e ¡ e dd¡dœ	ej—Žd	d
„ ƒZ	ef e dd¡e dd¡e dd¡e dd¡e dd¡e dd¡e dd¡e ¡ e dd¡e 
ddg¡dœ
ej—Ždd„ ƒZef e dd¡e dd¡e dd¡e dd¡e dd¡e dd¡e dd¡e ¡ e dd¡e 
ddg¡dœ
ej—Ždd„ ƒZef e dd¡e dd¡e dd¡e dd¡e dd¡e dd¡e dd¡e ¡ e dd¡dœ	ej—Ždd„ ƒZef e dd¡e dd¡e dd¡e dd¡e dd¡e dd¡e dd¡e ¡ e dd¡e 
ddg¡dœ
ej—Ždd„ ƒZef e dd¡e dd¡e dd¡e dd¡e dd¡e dd¡e dd¡e ¡ e dd¡e 
ddg¡dœ
ej—Ždd„ ƒZdS ) ÚConvFusionTesté   é   r   é   é   é   é   )	ÚstrideÚpadÚkernelÚsizeÚinput_channelsÚoutput_channelsÚ
batch_sizeÚuse_biasÚgroupc                 C   sN  t jd|rdddgnddgdg||||	|d d}t jddgdg|d d	}t jd
|r`dddgnddgdg||||	d|d d	}tj |||	 ||¡ tj¡d }tj ||	 |||¡ tj¡d }tj ||	 ¡ tj¡d }t ¡ }t 	dd¡ t 
d||d ¡ t 
d||d ¡ t 
d||d ¡ t |¡ t |¡ t d¡}t ¡  t 
d||d ¡ t 
d||d ¡ t 
d||d ¡ t |¡ t d¡}tj||dddsèt| ¡ ƒ t| ¡ ƒ tt t || ¡¡ƒ |  d¡ t ¡  t ¡ }t ¡ }| |¡ |j |d ¡ t ¡ }| |¡ |j |d ¡ |j ||g¡ t 
d||d ¡ t 
d||d ¡ t 
d||d ¡ t  d¡}| ¡  |¡ t|ƒ |  t| ¡ jƒdk¡ |  | ¡ jd jd
k¡ t | ¡ jd ¡ t d¡}tj||ddds@t| ¡ ƒ t| ¡ ƒ tt t || ¡¡ƒ |  d¡ t 	|¡ d S )NÚConvÚX0Úw0Úb0ÚY0r   ©r   r   r   r   Údevice_optionÚRelu©r   Ú
ConvFusionÚX1Úw1Úb1ÚY1r   ©r   r   r   r   Zfusion_typer   ç      à?Ú_device_check_Tç{®Gáz„?©ZatolZrtolFÚnet) r   ÚCreateOperatorÚnpÚrandomÚrandÚastypeÚfloat32r   ÚCurrentWorkspaceÚSwitchWorkspaceÚFeedBlobÚRunOperatorOnceÚ	FetchBlobÚResetWorkspaceÚallcloseÚprintÚflattenÚmaxÚabsÚ
assertTruer   ÚNetDefÚOperatorDefÚCopyFromr   ÚopÚextendÚNetÚProtor   ÚlenÚtype)Úselfr   r   r   r   r   r   r   r   r   ÚgcÚdcÚconvÚreluÚconv_fusionÚXÚwÚbÚold_ws_namer   r$   Úold_netÚconv_oldÚrelu_oldr*   ZY2© rS   úJ/tmp/pip-unpacked-wheel-ua33x9lu/caffe2/python/ideep/convfusion_op_test.pyÚtest_convolution_relu_fusion   s¸    ø
ü÷   ÿÿÿ   ÿþþ










z+ConvFusionTest.test_convolution_relu_fusionÚSumZAdd)
r   r   r   r   r   r   r   r   r   Úsum_addc           (      C   sN  t jddgdgddd|d d}t jd|r4dd	d
gndd	gdg||||	|d d}t j|
ddgdg|d d}t jddgdgddd|	|d d}t jd|r¦ddddgndddgdg||||	d|d d	}tt t|d|  | d ƒ| ¡ƒd }tj |||	 ||¡ 	tj
¡d }tj |||	 ||¡ 	tj
¡d }tj ||	 |||¡ 	tj
¡d }tj ||	 ¡ 	tj
¡d }t ¡ }t dd¡ t d||d ¡ t d||d ¡ t d	||d ¡ t d
||d ¡ t |¡ t |¡ t |¡ t d¡}t ¡  t d||d ¡ t d||d ¡ t d||d ¡ t d||d ¡ t |¡ t |¡ t d¡}tj||ddds´t| ¡ ƒ t| ¡ ƒ tt t || ¡¡ƒ |  d¡ t ¡  t ¡ }t ¡ }| |¡ |j |d ¡ t ¡ }| |¡ |j |d ¡ t ¡ }| |¡ |j |d ¡ |j |||g¡ t d||d ¡ t d||d ¡ t d	||d ¡ t d
||d ¡ t  d¡}|  ¡  |¡ t!|ƒ |  t"|  ¡ jƒdk¡ |  |  ¡ jd j#dk¡ t $|  ¡ ¡ t |  ¡ jd j%d ¡}tj||dddsLt| ¡ ƒ t| ¡ ƒ tt t || ¡¡ƒ |  d¡ t ¡  t ¡ }t d||d ¡ t d||d ¡ t d	||d ¡ t d
||d ¡ |j |||g¡ t  d¡}|  ¡  |¡ t!|ƒ |  t"|  ¡ jƒdk¡ |  |  ¡ jd j#dk¡ t $|  ¡ ¡ t |  ¡ jd j%d ¡}tj||ddds~t| ¡ ƒ t| ¡ ƒ tt t || ¡¡ƒ |  d¡ t jddgdgdd|d d } t ¡  t d||d ¡ t d||d ¡ t d	||d ¡ t d
||d ¡ t ¡ }|j || ||g¡ t  d¡}|  ¡  |¡ t!|ƒ |  t"|  ¡ jƒd!k¡ t $|  ¡ ¡ t |  ¡ jd j%d ¡}tj||ddds¶t| ¡ ƒ t| ¡ ƒ tt t || ¡¡ƒ |  d¡ t j|
ddgd"g|d d}!t jddgdgdd|d d } t ¡  t d||d ¡ t d||d ¡ t d	||d ¡ t d
||d ¡ t ¡ }|j |||!| g¡ t  d¡}|  ¡  |¡ t!|ƒ td# &|  ¡ ¡ƒ |  t"|  ¡ jƒd!k¡ t $|  ¡ ¡ t |  ¡ jd$ j%d ¡}tj||dddst| ¡ ƒ t| ¡ ƒ tt t || ¡¡ƒ |  d¡ t jd%dgdg|d d}"t jd|rLdd	d
gndd	gdgddd|d d}t jd%dgdg|d d}#t jddgdgddd|d d}$t jd&ddgdg|d d}tj ||||¡ 	tj
¡d }tj ||dd¡ 	tj
¡d }tj |¡ 	tj
¡d }t |¡ t ¡  t d||d ¡ t d	||d ¡ t d
||d ¡ t |"¡ t |¡ t |#¡ t |$¡ t |¡ t d¡}t ¡  t d||d ¡ t d	||d ¡ t d
||d ¡ t ¡ }%|% |"¡ |%j |d ¡ t ¡ }| |¡ |j |d ¡ t ¡ }&|& |#¡ |&j |d ¡ t ¡ }'|' |$¡ |'j |d ¡ t ¡ }| |¡ |j |d ¡ t ¡ }|j |%||&|'|g¡ t  d¡}|  ¡  |¡ t!|ƒ |  t"|  ¡ jƒd'k¡ t $|  ¡ ¡ t |  ¡ jd j%d ¡}tj||dddsJt| ¡ ƒ t| ¡ ƒ tt t || ¡¡ƒ |  d¡ d S )(NZMaxPoolÚSX0ÚS0é   r   )r   r   r   r   r   r   r   r   r   r   r   ÚSX1ÚS1r   r    r!   r"   r#   r%   r&   r'   Tr(   r)   Fr*   éÿÿÿÿZDropoutZ	Y_dropout)ZratioÚis_testr   é   ZS3znet={}
éþÿÿÿr   rV   r
   )'r   r+   ÚintÚmathÚceilÚfloatr,   r-   r.   r/   r0   r   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r   r=   r>   r?   r   r@   rA   rB   rC   r   rD   rE   Ú
RunNetOnceÚoutputÚformat)(rF   r   r   r   r   r   r   r   r   r   rW   rG   rH   Zpool_S0rI   ÚsumZpool_S1rK   Zpool_input_sizeÚSXrL   rM   rN   rO   rY   r\   rP   Zpool_S0_oldrQ   Úsum_oldr*   ÚS2ZdropoutZsum1Zrelu_0Zrelu_1ÚpoolZ
relu_0_oldZ
relu_1_oldZpool_oldrS   rS   rT   Útest_convolution_sum_fusionw   sf   ù	ø
üø
÷*   ÿÿÿ   ÿÿÿ   ÿþþ














ú	

üú	

üù	üù	ü   ÿÿÿ   ÿÿÿ












z*ConvFusionTest.test_convolution_sum_fusionc           #      C   sD  t jd|rdddgnddgdg||||	|d d}t jd|rFdd	d
gndd	gdg||||	|d d}t j|
ddgdg|d d}t jddgdg|d d}t jd|r®dddgnddgdg||||	|d d}t jd|râddddgndddgdg||||	d|d d	}tj |||	 ||¡ tj¡d }tj ||	 |||¡ tj¡d }tj ||	 ¡ tj¡d }tj |||	 ||¡ tj¡d }tj ||	 |||¡ tj¡d }tj ||	 ¡ tj¡d }t ¡ }t 	dd¡ t 
d||d ¡ t 
d||d ¡ t 
d||d ¡ t 
d||d ¡ t 
d	||d ¡ t 
d
||d ¡ t |¡ t |¡ t |¡ t |¡ t d¡}t ¡  t 
d||d ¡ t 
d||d ¡ t 
d||d ¡ t 
d||d ¡ t 
d||d ¡ t 
d||d ¡ t |¡ t |¡ t d¡}tj||dddsVt| ¡ ƒ t| ¡ ƒ tt t || ¡¡ƒ |  d¡ t ¡  t ¡ }t ¡ }| |¡ |j |d ¡ t ¡ }| |¡ |j |d ¡ t ¡ }| |¡ |j |d ¡ t ¡ } |  |¡ | j |d ¡ |j |||| g¡ t 
d||d ¡ t 
d||d ¡ t 
d||d ¡ t 
d||d ¡ t 
d	||d ¡ t 
d
||d ¡ t  d¡}!|! ¡  |¡ t|!ƒ |  t|! ¡ jƒd k¡ |  |! ¡ jd jdk¡ t  |! ¡ ¡ t |! ¡ jd! j!d ¡}"tj||"ddds6t|" ¡ ƒ t| ¡ ƒ tt t |"| ¡¡ƒ |  d¡ t 	|¡ d S )"Nr   rX   ÚSw0ÚSb0rY   r   r   r   r   r   r   r   r   r[   ZSw1ZSb1r\   r   r    r!   r"   r#   r	   r%   r&   r'   Tr(   r)   Fr*   rZ   r]   )"r   r+   r,   r-   r.   r/   r0   r   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r   r=   r>   r?   r   r@   rA   rB   rC   r   rD   rE   re   rf   )#rF   r   r   r   r   r   r   r   r   r   rW   rG   rH   Úconv_S0rI   rh   rJ   Zconv_S1rK   ri   ÚSwÚSbrL   rM   rN   rO   rY   r\   rP   Úconv_S0_oldrQ   rj   rR   r*   rk   rS   rS   rT   Ú test_convolution_sum_relu_fusion®  s:   ø
ø
üüø
÷   ÿÿÿ   ÿþþ   ÿÿÿ   ÿþþ














z/ConvFusionTest.test_convolution_sum_relu_fusioné   é   é   rZ   c              
   C   sÈ  t jd|rdddgnddgdg||||	|d d}t jd|rFdd	d
gndd	gdg||||	|d d}t jdddgdg|d d}t jddgdg|d d}tj |||	 ||¡ tj¡d }tj ||	 |||¡ tj¡d }tj ||	 ¡ tj¡d }tj |||	 ||¡ tj¡d }tj ||	 |||¡ tj¡d }tj ||	 ¡ tj¡d }t ¡ }t 	dd¡ t 
d||d ¡ t 
d||d ¡ t 
d||d ¡ t 
d||d ¡ t 
d	||d ¡ t 
d
||d ¡ t |¡ t |¡ t |¡ t |¡ t d¡}t ¡  t ¡ }t ¡ }| |¡ |j |d ¡ t ¡ }| |¡ |j |d ¡ t ¡ }| |¡ |j |d ¡ t ¡ }| |¡ |j |d ¡ |j ||||g¡ t 
d||d ¡ t 
d||d ¡ t 
d||d ¡ t 
d||d ¡ t 
d	||d ¡ t 
d
||d ¡ t  d¡}| ¡  |¡ t|ƒ t | ¡ ¡ t | ¡ jd jd ¡}tj||dddsºt| ¡ ƒ t| ¡ ƒ tt t || ¡¡ƒ |  d¡ t 	|¡ d S )Nr   rX   rn   ro   rY   r   r   r   r   r   r   rV   r   r   r&   r'   Tr   r*   r]   r(   r)   F) r   r+   r,   r-   r.   r/   r0   r   r1   r2   r3   r4   r5   r6   r   r=   r>   r?   r   r@   rA   rB   rC   r   re   rf   r7   r8   r9   r:   r;   r<   )rF   r   r   r   r   r   r   r   r   r   rG   rH   rp   rI   rh   rJ   ri   rq   rr   rL   rM   rN   rO   rY   rP   rs   rQ   rj   rR   r*   rk   rS   rS   rT   Ú(test_convolution_grouped_sum_relu_fusionF  sî    ø
ø
üü   ÿÿÿ   ÿþþ   ÿÿÿ   ÿþþ










z7ConvFusionTest.test_convolution_grouped_sum_relu_fusionTF)
r   r   r   r   r   r   r   r   r   Úinplacec              
   C   s’  t jd|rdddgnddgdg||||	|d d}t jddd	d
ddg|
rLdndgd|d d}tj |||	 ||¡ tj¡d }tj ||	 |||¡ tj¡d }tj ||	 ¡ tj¡d }tj |¡ tj¡d }tj |¡ tj¡d }tj |¡ tj¡}t tj |¡ tj¡¡d }t	 
¡ }t	 dd¡ t	 d||d ¡ t	 d||d ¡ t	 d||d ¡ t	 d	||d ¡ t	 d
||d ¡ t	 d||d ¡ t	 d||d ¡ t	 |¡ t	 |¡ t	 |
rÔdnd¡}t	 ¡  t ¡ }t ¡ }| |¡ |j |d ¡ t ¡ }| |¡ |j |d ¡ |j ||g¡ t	 d||d ¡ t	 d||d ¡ t	 d||d ¡ t	 d	||d ¡ t	 d
||d ¡ t	 d||d ¡ t	 d||d ¡ t  d¡}| ¡  |¡ t|ƒ |  t| ¡ jƒdk¡ |  | ¡ jd jdk¡ t	 | ¡ jd ¡ t	 |
r0dnd¡}tj||ddds„t| ¡ ƒ t| ¡ ƒ tt  t !|| ¡¡ƒ |  d¡ t	 |¡ d S )Nr   r   r   r   r!   r   r   Z	SpatialBNÚscaleÚbiasÚmeanÚvarÚYT)r^   r   r&   r'   r*   r   r(   r)   F)"r   r+   r,   r-   r.   r/   r0   ZrandnÚabsoluter   r1   r2   r3   r4   r5   r6   r   r=   r>   r?   r   r@   rA   rB   rC   r   r<   rD   rE   r7   r8   r9   r:   r;   )rF   r   r   r   r   r   r   r   r   r   ry   rG   rH   rI   ZbnrL   rM   rN   rz   r{   r|   r}   rO   r~   rP   rQ   Zbn_oldr*   r$   rS   rS   rT   Útest_convolution_bn_folding³  s¦    ø
û   ÿÿÿ   ÿþþ





z*ConvFusionTest.test_convolution_bn_foldingc              
   C   s  t jd|rdddgnddgdg||||	|d d}t jddd	d
g|
rHdndg|d d}tj |||	 ||¡ tj¡d }tj ||	 |||¡ tj¡d }tj ||	 ¡ tj¡d }tj |¡ tj¡d }tj |¡ tj¡d }t ¡ }t 	dd¡ t 
d||d ¡ t 
d||d ¡ t 
d||d ¡ t 
d	||d ¡ t 
d
||d ¡ t |¡ t |¡ t |
rxdnd¡}t ¡  t ¡ }t ¡ }| |¡ |j |d ¡ t ¡ }| |¡ |j |d ¡ |j ||g¡ t 
d||d ¡ t 
d||d ¡ t 
d||d ¡ t 
d	||d ¡ t 
d
||d ¡ t  d¡}| ¡  |¡ t|ƒ |  t| ¡ jƒdk¡ |  | ¡ jd jdk¡ t | ¡ jd ¡ t |
r°dnd¡}tj||dddst| ¡ ƒ t| ¡ ƒ tt t || ¡¡ƒ |  d¡ t 	|¡ d S )Nr   r   r   r   r!   r   r   ZAffineChannelrz   r{   r~   r   r&   r'   Tr*   r   r(   r)   F) r   r+   r,   r-   r.   r/   r0   r   r1   r2   r3   r4   r5   r6   r   r=   r>   r?   r   r@   rA   rB   rC   r   r<   rD   rE   r7   r8   r9   r:   r;   )rF   r   r   r   r   r   r   r   r   r   ry   rG   rH   rI   ZaffchrL   rM   rN   rz   r{   rO   r~   rP   rQ   Z	affch_oldr*   r$   rS   rS   rT   Útest_convolution_affch_folding  s˜    ø
ü   ÿÿÿ   ÿþþ





z-ConvFusionTest.test_convolution_affch_foldingN)Ú__name__Ú
__module__Ú__qualname__r   ÚstZintegersZbooleansÚmuZgcsrU   Zsampled_fromrm   rt   rx   r€   r   rS   rS   rS   rT   r      sª   






ø	÷

Y






÷
ö
  .






÷
ö
 






ø	÷

c






÷
ö
M






÷
ör   Ú__main__)ZunittestZhypothesis.strategiesZ
strategiesr…   Z
hypothesisr   Znumpyr,   rb   Zcaffe2.protor   Zcaffe2.pythonr   r   Zcaffe2.python.transformationsr   Z"caffe2.python.hypothesis_test_utilÚpythonZhypothesis_test_utilÚhuZcaffe2.python.ideep_test_utilZideep_test_utilr†   ZskipIfÚCZ
use_mkldnnZHypothesisTestCaser   r‚   ÚmainrS   rS   rS   rT   Ú<module>   s&         O