U
    ‰dá-  ã                   @   s°   d dl Z d dlmZ d dlmZ d dlmZmZ d dl	Z
d dlmZ d dlmZ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)Úreduce)ÚgivenÚsettings)Ú
caffe2_pb2)ÚcoreÚ	workspacezNo MKLDNN support.c                   @   sÀ  e Zd Zef e dd¡e dd¡e dd¡dœej—Žedddd„ ƒƒZ	ef e dd¡e dd¡e dd¡e dd¡e dd¡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¡dœej—Žedddd„ ƒƒZef e dd¡e dd¡e dd¡dœej—Žedddd„ ƒƒZef e dd¡e dd¡e dd¡dœej—Žedddd„ ƒƒZef e dd¡e dd¡e dd¡dœej—Ždd„ ƒZdS )ÚFcTesté   é   )ÚnÚmÚkiè  )Údeadlinec                 C   s¦   t j ||¡ t j¡d }t j ||¡ t j¡d }t j |¡ t j¡d }t ddddgdg¡}	|  ||	|||gdg¡ tdƒD ]}
|  	||	|||g|
dg¡ q‚d S ©	Nç      à?ÚFCÚXÚWÚbÚYr   é   ©
ÚnpÚrandomÚrandÚastypeÚfloat32r   ÚCreateOperatorZassertDeviceChecksÚrangeZassertGradientChecks©Úselfr   r   r   ÚgcÚdcr   r   r   ÚopÚi© r%   úB/tmp/pip-unpacked-wheel-ua33x9lu/caffe2/python/ideep/fc_op_test.pyÚtest_fc_2_dims   s    ýzFcTest.test_fc_2_dimsr   )r   r   ÚcÚhÚwÚaxisc	                 C   s<  t j ||||¡ t j¡d }	tdd„ ||||g|d d … ƒ}
tdd„ ||||gd |… ƒ}t j ||
¡ t j¡d }t j |¡ t j¡d }t j ||¡ t j¡d }tjdddd	gd
g||d d}tjddddgddg||d d}t 	¡  t 
d|	|d ¡ t 
d||d ¡ t 
d	||d ¡ t |¡ t d
¡}t 
d||d ¡ t |¡ t d¡}t d¡}tjdddd	gd
g||d d}tjddddgddg||d d}t dd¡ t 
d|	|d ¡ t 
d||d ¡ t 
d	||d ¡ t |¡ t d
¡}t 
d||d ¡ t |¡ t d¡}t d¡}| ¡ }| ¡ }t j||dddsŒt|ƒ t|ƒ tt  t  || ¡¡ƒ |  d¡ | ¡ }| ¡ }t j||dddsât|ƒ t|ƒ tt  t  || ¡¡ƒ |  d¡ | ¡ }| ¡ }t j||ddds8t|ƒ t|ƒ tt  t  || ¡¡ƒ |  d¡ d S )Nr   c                 S   s   | | S ©Nr%   ©ÚxÚyr%   r%   r&   Ú<lambda>/   ó    z*FcTest.test_fc_with_axis.<locals>.<lambda>é   c                 S   s   | | S r,   r%   r-   r%   r%   r&   r0   0   r1   r   r   r   r   r   r   )r+   Údevice_optionÚ
FCGradientÚdYÚdWÚdbr	   Ú_device_check_Tç{®Gáz„?©ZatolZrtolF©r   r   r   r   r   r   r   r   r   ÚResetWorkspaceÚFeedBlobÚRunOperatorOnceÚ	FetchBlobÚSwitchWorkspaceÚflattenZallcloseÚprintÚmaxÚabsÚ
assertTrue)r    r   r   r(   r)   r*   r+   r!   r"   r   r   Únnr   r   r5   Úop0Úop0_bwÚY0ÚdW0Údb0Úop1Úop1_bwÚY1ÚdW1Údb1r%   r%   r&   Útest_fc_with_axis&   s–    "ûû




ûû






zFcTest.test_fc_with_axis)r   Úor$   r)   r*   Úaxis_wc	                 C   s<  t j ||||¡ t j¡d }	tdd„ ||||g|d d … ƒ}
tdd„ ||||gd |… ƒ}t j ||
¡ t j¡d }t j |¡ t j¡d }t j ||¡ t j¡d }tjdddd	gd
g||d d}tjddddgddg||d d}t 	¡  t 
d||d ¡ t 
d|	|d ¡ t 
d	||d ¡ t |¡ t d
¡}t 
d||d ¡ t |¡ t d¡}t d¡}tjdddd	gd
g||d d}tjddddgddg||d d}t dd¡ t 
d||d ¡ t 
d|	|d ¡ t 
d	||d ¡ t |¡ t d
¡}t 
d||d ¡ t |¡ t d¡}t d¡}| ¡ }| ¡ }t j||dddsŒt|ƒ t|ƒ tt  t  || ¡¡ƒ |  d¡ | ¡ }| ¡ }t j||dddsât|ƒ t|ƒ tt  t  || ¡¡ƒ |  d¡ | ¡ }| ¡ }t j||ddds8t|ƒ t|ƒ tt  t  || ¡¡ƒ |  d¡ d S )Nr   c                 S   s   | | S r,   r%   r-   r%   r%   r&   r0      r1   z,FcTest.test_fc_with_axis_w.<locals>.<lambda>r2   c                 S   s   | | S r,   r%   r-   r%   r%   r&   r0      r1   r   r   r   r   r   r   )rS   r3   r4   r5   r6   r7   r	   r8   Tr9   r:   Fr;   )r    r   rR   r$   r)   r*   rS   r!   r"   r   r   r   r   r   r5   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   r%   r%   r&   Útest_fc_with_axis_w…   s–    	"ûû




ûû






zFcTest.test_fc_with_axis_wi'  c                 C   s²   t j ||||¡ t j¡d }t j ||| | ¡ t j¡d }t j |¡ t j¡d }t ddddgdg¡}	|  ||	|||gdg¡ tdƒD ]}
|  	||	|||g|
dg¡ qŽd S r   r   r   r%   r%   r&   Útest_fc_4_dims_srcå   s    "ýzFcTest.test_fc_4_dims_srcc                 C   s®   t j ||||¡ t j¡d }t j ||||¡ t j¡d }t j |¡ t j¡d }t ddddgdg¡}	|  ||	|||gdg¡ tdƒD ]}
|  	||	|||g|
dg¡ qŠd S r   r   r   r%   r%   r&   Útest_fc_4_dimsø   s    ýzFcTest.test_fc_4_dimsé   c              
      sz  t j ||||¡ t j¡d }t j ||||¡ t j¡d ‰t j |¡ t j¡d ‰ t ddddgdg¡}t ¡ }t 	dd¡ t 
d||d	 ¡ t 
dˆ|d	 ¡ t 
dˆ |d	 ¡ t |¡ t d¡}	t ¡  t  t  |	¡ ¡ g¡ t j¡}
|	 ¡ d	kr
|
d
 }d	}n|
d }d}t  t  |¡ ¡ g¡ t j¡}| ¡ d	krP|d
 }d	}n|d }d}t  ‡fdd„tˆjd	 ƒD ƒ¡ t j¡}|d ‰d}t  ˆd¡ t j¡‰t  ‡‡fdd„tˆjd	 ƒD ƒ¡ t j¡| }tjdg dgˆj| t j¡ ¡ |ˆ|d d}ˆ| ‰d	}t  ‡ ‡fdd„tˆ jd	 ƒD ƒ¡ t j¡}tjdg dgˆ j||ˆ|d d}tjddgdg|d d}tjddgdgd|d ||d	 d}tjd dddgd!gd|d ||d	 d}t ¡ }|j |||||g¡ t 
d||d ¡ t |¡ t d!¡}t  t   |	|¡¡ !¡ }|d"krlt"|	 #¡ ƒ t"| #¡ ƒ t"t  t  $||	 ¡¡ƒ t"d#|ƒ |  %d$¡ t 	|¡ d S )%Nr   r   r   r*   r   r   r8   Tr   éÿ   é   é€   c                    s"   g | ]}t  ˆ |d f ¡ ¡ ‘qS ©.)r   ÚabsoluterC   ©Ú.0r$   )r*   r%   r&   Ú
<listcomp>3  s     z.FcTest.test_int8_fc_4_dims.<locals>.<listcomp>)r   rW   r   r	   c                    s    g | ]}ˆ |d f ˆ|  ‘qS r[   r%   r]   )r*   Úw_scaler%   r&   r_   7  s     ZInt8GivenTensorFillZwir	   )ÚshapeÚvaluesÚY_zero_pointZY_scalesr3   c                    s   g | ]}ˆ | ˆ|  ‘qS r%   r%   r]   )r   Úb_scaler%   r&   r_   E  s     ZInt8GivenIntTensorFillZbiZ	NCHW2NHWCÚXiZXi_nhwc)r3   ZInt8QuantizeZXi_quantizedZDNNLOWP)Zenginer3   rc   ÚY_scaleZInt8FCÚY_outg{®Gázt?ÚMSEF)&r   r   r   r   r   r   r   r   ZCurrentWorkspacer@   r=   r>   r?   r<   Úarrayr\   rC   Úminr   ra   Z	transposeZrintZint8Zuint8ÚtobytesZint32r   ZNetDefr#   ÚextendZ
RunNetOnceZsquareÚsubtractZmeanrB   rA   rD   rE   )r    r   r   r   r!   r"   r   Zfc_fp32Zold_ws_namer   ZY_absmaxrf   rc   ZX_absmaxZX_scaleZX_zero_pointZw_absmaxZw_zero_pointZw_bytesZw_fillerZb_zero_pointZb_bytesZb_fillerZsw2nhwcZ
quantize_XZfcÚnetrg   rh   r%   )r   rd   r*   r`   r&   Útest_int8_fc_4_dims  sº    ý

*0 ù
, ù
üù
ù





zFcTest.test_int8_fc_4_dimsN)Ú__name__Ú
__module__Ú__qualname__r   ÚstZintegersÚmuZgcsr   r'   rQ   rT   rU   rV   Zgcs_cpu_ideepro   r%   r%   r%   r&   r      s`   
ÿÿ




ûú
X




ûúX
ÿÿ
ÿÿ
ÿÿr   Ú__main__)ZunittestÚ	functoolsr   Zhypothesis.strategiesZ
strategiesrs   Z
hypothesisr   r   Znumpyr   Zcaffe2.protor   Zcaffe2.pythonr   r   Z"caffe2.python.hypothesis_test_utilÚpythonZhypothesis_test_utilÚhuZcaffe2.python.ideep_test_utilZideep_test_utilrt   ZskipIfÚCZ
use_mkldnnZHypothesisTestCaser   rp   Úmainr%   r%   r%   r&   Ú<module>   s     l