U
    ‰dùP  ã                   @   sd  U d dl Zd dlmZmZmZmZmZmZm	Z	 d dl
mZ d dlmZmZ d dlmZ d dlZd dlmZ e	jrøe	 ¡ d krøe ¡ Ze	je_e ¡ Ze deg¡Ze deeg¡Ze dd	ed
¡gZe dd	ed
¡e dd	ed¡gZeZ eej e!d< n<e ¡ ZdZ e dg ¡Ze deg¡Ze dd	ed¡gZg ZG dd„ dej"ƒZ#G dd„ dej"ƒZ$G dd„ dej"ƒZ%G dd„ dej"ƒZ&G dd„ dej"ƒZ'G dd„ dej"ƒZ(G dd„ dej"ƒZ)G dd„ dej"ƒZ*G dd„ dej"ƒZ+G dd „ d ej"ƒZ,G d!d"„ d"ej"ƒZ-G d#d$„ d$ej"ƒZ.G d%d&„ d&ej"ƒZ/G d'd(„ d(ej"ƒZ0G d)d*„ d*ej"ƒZ1e2d+kr`e	 3d,g¡ e 4¡  dS )-é    N)ÚbrewÚcoreÚdevice_checkerÚgradient_checkerÚmodel_helperÚ	test_utilÚ	workspace)ÚNetGradientChecker)ÚopsÚ
NetBuilder)Ú
caffe2_pb2)ÚOptionalç{®Gáz„?g{®Gázt?gš™™™™™©?Zgpu_checker_wsZcpu_checker_wsÚgpu_device_optionc                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestLRNc                 C   s   ddg| _ d S )N)é   é
   )é   é   ©Útest_configs©Úself© r   úE/tmp/pip-unpacked-wheel-ua33x9lu/caffe2/python/gradient_check_test.pyÚsetUpE   s    zTestLRN.setUpc           	      C   s˜   | j D ]Œ\}}tjddgddgddddd	d
}tj d|||¡ tj¡}t 	||gdg¡}|  
|¡ tD ](}| 	||gddg¡\}}}|  
|¡ qhqd S )NZLRNÚXÚYZY_scaleé   gü©ñÒMbP?ç      à?ç       @ÚNHWC)ÚsizeÚalphaÚbetaZbiasÚorderé   r   ©r   r   ÚCreateOperatorÚnpÚrandomÚrandÚastypeÚfloat32r   ÚCheckSimpleÚ
assertTrueÚgradient_checkers)	r   Ú
input_sizeÚdepthÚopr   ÚresÚcheckerÚgradÚgrad_estimatedr   r   r   ÚtestLRNH   s(    ù	ÿÿ
zTestLRN.testLRNN)Ú__name__Ú
__module__Ú__qualname__r   r8   r   r   r   r   r   C   s   r   c                   @   s   e Zd Zdd„ ZdS )ÚTestFlattenc                 C   sz   t  ddgdg¡}tj dddd¡ tj¡}t ||gdg¡}|  	|¡ t
D ](}| ||gddg¡\}}}|  	|¡ qLd S )	NZFlattenr   r   r&   r   é   é   r   )r   r(   r)   r*   r+   r,   r-   r   r.   r/   r0   )r   r3   r   r4   r5   r6   r7   r   r   r   ÚtestFlatten^   s    
zTestFlatten.testFlattenN)r9   r:   r;   r?   r   r   r   r   r<   \   s   r<   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )Ú
TestConcatc                 C   s   ddg| _ d S )N)r   r&   r   r=   r>   )r=   r>   r=   r   r&   r   r   r   r   r   r   j   s    ýzTestConcat.setUpc              
   C   sð   | j D ]ä\}}}}}tjdddddgddgdd	}tj d
|||¡ tj¡tj d
|||¡ tj¡tj d
|||¡ tj¡tj d
|||¡ tj¡g}tdƒD ]J}t	 
||dg¡}	|  |	¡ tD ]&}
|
 
|||dg¡\}	}}|  |	¡ qÀqžqd S )NÚConcatÚX1ÚX2ÚX3ÚX4r   ÚY_dimsr!   ©r%   r&   r=   r   ©r   r   r(   r)   r*   r+   r,   r-   Úranger   r.   r/   r0   ©r   r1   Úd1Zd2Zd3Zd4r3   ZXsÚir4   r5   r6   r7   r   r   r   ÚtestConcatNHWCq   s>    
ýÿÿÿÿÿÿù	

ÿ
zTestConcat.testConcatNHWCc              
   C   sð   | j D ]ä\}}}}}tjdddddgddgdd	}tj d
|||¡ tj¡tj d
|||¡ tj¡tj d
|||¡ tj¡tj d
|||¡ tj¡g}tdƒD ]J}t	 
||dg¡}	|  |	¡ tD ]&}
|
 
|||dg¡\}	}}|  |	¡ qÀqžqd S )NrA   rB   rC   rD   rE   r   rF   ZNCHWrG   r&   r=   r   rH   rJ   r   r   r   ÚtestConcatNCHW‰   s>    
ýÿÿÿÿÿÿù	

ÿ
zTestConcat.testConcatNCHWN)r9   r:   r;   r   rM   rN   r   r   r   r   r@   h   s   r@   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestReluc                 C   s   ddddddg| _ d S )N©é   rQ   ©r&   rQ   )rQ   r   r   rQ   )r&   r   r   rQ   )rQ   r>   r>   r   )r&   r>   r>   r   r   r   r   r   r   r   ¤   s    øzTestRelu.setUpc                 C   sž   | j D ]’}t ddgdg¡}tjj|Ž  tj¡}|dt |¡ 7 }d||dk< t	 
||gdg¡}|  |¡ tD ](}| 
||gddg¡\}}}|  |¡ qnqd S )NZRelur   r   r   r   ©r   r   r(   r)   r*   r+   r,   r-   Úsignr   r.   r/   r0   ©r   r1   r3   r   r4   r5   r6   r7   r   r   r   ÚtestRelu°   s    

zTestRelu.testReluN)r9   r:   r;   r   rV   r   r   r   r   rO   ¢   s   rO   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestTanhc                 C   s   dddg| _ d S ©NrP   rR   ©rQ   r&   r   r=   r   r   r   r   r   r   À   s    üzTestTanh.setUpc                 C   s„   | j D ]x}t ddgdg¡}tjj|Ž  tj¡d }t 	||gdg¡}|  
|¡ tD ](}| 	||gddg¡\}}}|  
|¡ qTqd S )NZTanhr   r   r   r   r'   rU   r   r   r   ÚtestTanhÈ   s    

zTestTanh.testTanhN)r9   r:   r;   r   rZ   r   r   r   r   rW   ¾   s   rW   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestAbsc                 C   s   ddddg| _ d S ©NrP   )r&   r   )r&   r   r=   )r&   r   r=   r>   r   r   r   r   r   r   Õ   s
    üzTestAbs.setUpc                 C   sž   | j D ]’}t ddgdg¡}tjj|Ž  tj¡}|dt |¡ 7 }d||dk< t	 
||gdg¡}|  |¡ tD ](}| 
||gddg¡\}}}|  |¡ qnqd S )NZAbsr   r   r   r   rS   rU   r   r   r   ÚtestAbsÝ   s    

zTestAbs.testAbsN)r9   r:   r;   r   r]   r   r   r   r   r[   Ó   s   r[   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestExpc                 C   s   dddg| _ d S rX   r   r   r   r   r   r   ì   s    üzTestExp.setUpc                 C   s„   | j D ]x}t ddgdg¡}tjj|Ž  tj¡d }t 	||gdg¡}|  
|¡ tD ](}| 	||gddg¡\}}}|  
|¡ qTqd S )NZExpr   r   r   r   r'   rU   r   r   r   ÚtestExpô   s    

zTestExp.testExpN)r9   r:   r;   r   r_   r   r   r   r   r^   ê   s   r^   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestCosc                 C   s   ddddg| _ d S r\   r   r   r   r   r   r      s
    üzTestCos.setUpc                 C   s„   | j D ]x}t ddgdg¡}tjj|Ž  tj¡d }t 	||gdg¡}|  
|¡ tD ](}| 	||gddg¡\}}}|  
|¡ qTqd S )NZCosr   r   r   r   r'   rU   r   r   r   ÚtestCos  s    

zTestCos.testCosN)r9   r:   r;   r   ra   r   r   r   r   r`   þ   s   r`   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestSinc                 C   s   ddddg| _ d S r\   r   r   r   r   r   r     s
    üzTestSin.setUpc                 C   s„   | j D ]x}t ddgdg¡}tjj|Ž  tj¡d }t 	||gdg¡}|  
|¡ tD ](}| 	||gddg¡\}}}|  
|¡ qTqd S )NZSinr   r   r   r   r'   rU   r   r   r   ÚtestSin  s    

zTestSin.testSinN)r9   r:   r;   r   rc   r   r   r   r   rb     s   rb   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestSigmoidc                 C   s   dddg| _ d S rX   r   r   r   r   r   r   (  s    üzTestSigmoid.setUpc                 C   s„   | j D ]x}t ddgdg¡}tjj|Ž  tj¡d }t 	||gdg¡}|  
|¡ tD ](}| 	||gddg¡\}}}|  
|¡ qTqd S )NZSigmoidr   r   r   r   r'   rU   r   r   r   ÚtestSigmoid0  s    

zTestSigmoid.testSigmoidN)r9   r:   r;   r   re   r   r   r   r   rd   &  s   rd   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestSumc                 C   s   ddg| _ d S )N)rY   T)rY   Fr   r   r   r   r   r   =  s    ýzTestSum.setUpc           
      C   sÔ   | j D ]È\}}t dddg|s"dndg¡}tjj|Ž  tj¡d }tjj|Ž  tj¡d }t 	|||gdg¡}|  
|¡ tD ]P}| 	|||gddg¡\}}}	|  
|¡ | 	|||gddg¡\}}}	|  
|¡ q|qd S )NÚSumrB   rC   r   r   r   rQ   r'   )
r   r1   Zin_placer3   rB   rC   r4   r5   r6   r7   r   r   r   ÚtestSumC  s.    ÿ
   ÿ

   ÿ
zTestSum.testSumN)r9   r:   r;   r   rh   r   r   r   r   rf   ;  s   rf   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestMakeTwoClassc                 C   s   ddddg| _ d S )N)rQ   )é   )rQ   r   )r&   r>   r   r   r   r   r   r   V  s
    úzTestMakeTwoClass.setUpc                 C   s¨   | j D ]œ}t ddgdg¡}tjj|Ž  tj¡}||dk   d7  < ||dk  d8  < t 	||gdg¡}|  
|¡ tD ](}| 	||gddg¡\}}}|  
|¡ qxqd S )NZMakeTwoClassr   r   r   g®Gáz®ï?r   r'   rU   r   r   r   ÚtestMakeTwoClass`  s    

z!TestMakeTwoClass.testMakeTwoClassN)r9   r:   r;   r   rk   r   r   r   r   ri   T  s   
ri   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestNetGradientCheckerc                    sÂ   t jdd‰ˆj dd¡}tjˆddddd	d
‰ ‡ ‡fdd„|D ƒ}‡fdd„|D ƒ}t ˆj¡ t	j
ˆj|dtjdddgdd|d	 tjddddgdd|d tjddddgddidd d S )NÚtest)ÚnameZconst1Zconst2r   r=   r   r   r   )Zdim_inZdim_outZblob_inZblob_outZaxisc                    s   g | ]}ˆj  ˆ |g¡‘qS r   )ÚnetÚSquaredL2Distance)Ú.0Úc©ÚfcÚmodelr   r   Ú
<listcomp>s  s     zDTestNetGradientChecker.test_net_gradient_checker.<locals>.<listcomp>c                    s   g | ]}ˆ j  |¡‘qS r   )ro   ÚAveragedLoss)rq   Úd)ru   r   r   rv   t  s     rQ   r&   r-   ©Údtype)Zoutputs_with_gradÚinput_valuesZinput_to_check)r   ZModelHelperro   ÚAddExternalInputsr   rt   r   Ú
RunNetOnceZparam_init_netr	   ZCheckr)   Úarray)r   ÚconstÚdistZlossesr   rs   r   Útest_net_gradient_checkero  s"      þúz0TestNetGradientChecker.test_net_gradient_checkerc                 C   sø   t  d¡}| dddd¡\}}}}| ||gd¡}| ||gd¡}| ||gd¡}t  d	¡}	|	 ||gd
¡}
|	 ||gd¡}|	 ||gd¡}|	 ||gd¡}|	 |
|||gd¡}dd„ t||||gƒD ƒ}tj||	g|g|ggdg||||g|d d S )NÚnet1ÚaÚbrr   rx   za+bzc+dÚxÚnet2ÚacÚadÚbcÚbdÚyc                 S   s$   i | ]\}}|t j|gt jd “qS )ry   )r)   r~   r-   )rq   rL   Zblobr   r   r   Ú
<dictcomp>  s   ÿ z>TestNetGradientChecker.test_net_comparison.<locals>.<dictcomp>r   )Zinputs_with_gradsr{   )r   ZNetr|   rg   ZMulÚ	enumerater	   ZCompareNets)r   r‚   rƒ   r„   rr   rx   Za_bÚc_dr…   r†   r‡   rˆ   r‰   rŠ   r‹   r{   r   r   r   Útest_net_comparison€  s*    

ÿ 
 
ýz*TestNetGradientChecker.test_net_comparisonN)r9   r:   r;   r   r   r   r   r   r   rl   n  s   rl   c                   @   s   e Zd Zdd„ ZdS )ÚTestIfc           &   
   C   s@  ddg}dg}ddg}dg}t dd²}tjg dd	d
gddd}tjg dd	gdd}tjg dd	d
gddd}tjg dd	gdd}	tjg dd	d
g|d}
tjg dd	g|d}tjg dd	d
g|d}tjg dd	g|d}W 5 Q R X |
|||||||	g}t d|dH}tjg dd	gdd}tjg dd	gdd}tjg dd	gdddd}tjg dd	gdd}tjg dd d
gdddd!}tjg d"d d	gdddd!}t t ||g¡¡: t ||
|gd#¡}t 	||g|¡ t |||g|¡ W 5 Q R X t 
¡ : t |||gd#¡}t 	||g|¡ t |||	g|¡ W 5 Q R X t ||gd$¡}| g d%g¡}W 5 Q R X t| ¡ ƒd	kshtd&ƒ‚t| ¡ ƒd	ks‚td'ƒ‚| ¡ d }| |g¡}| ¡ d }|jg d(d	gdtjjd)}| ||¡ |j|d*d+d,d-d.d/}|jg d0d	gdd}| |||| |g|¡ | |||| |g|¡ | |||| |g|¡ | |	|||	 |g|	¡ t |¡ t |¡ td1ƒD ]}t | ¡ j¡ qr||||d2œ} d3}!|  ¡ D ]–\}"}#t |"¡}$|$j d
kræ|  !|$j"d d	¡ |$d d d … }$n|  !|$j d	¡ |  !|$j#t|#ƒ¡ tt|$ƒƒD ]$}%|  $t%|$|% |#|%  ƒ|!k ¡ qq¤d S )4Nr    g      ø?r   g      @g      @T©Ú_use_control_opsÚW_arQ   r&   g      ð¿g      ð?)ÚshapeÚminÚmaxÚB_ag        )r”   ÚvalueÚW_bÚB_bÚW_gt_a)r”   ÚvaluesÚB_gt_aÚW_gt_bÚB_gt_b)r’   Zinitial_scopeÚY_predÚY_noiseÚswitchr   )r”   r•   r–   Úrun_onceÚzeror   i   )r”   ZmeanZstdr£   ÚnoiseÚY_gtr€   Úlossz#Expected a single init net producedz$Expected a single train net producedÚITER)r”   r˜   rz   ÚLRgš™™™™™¹¿Ústepé   gÍÌÌÌÌÌì?)Zbase_lrÚpolicyZstepsizeÚgammaÚONEiè  )r“   r—   r™   rš   r   )&r   r
   ZUniformFillZConstantFillZGivenTensorFillZGaussianFillÚIfNetÚLTZFCÚAddÚElserp   rw   ÚlenÚgetÚAssertionErrorÚAddGradientOperatorsr   ZDataTypeZINT64ZIterZLearningRateZWeightedSumr   r}   Z	CreateNetrI   ZRunNetZProtorn   ÚitemsÚ	FetchBlobÚndimÚassertEqualr”   r"   r/   Úabs)&r   Z
W_a_valuesZ
B_a_valuesZ
W_b_valuesZ
B_b_valuesZinit_nbr“   r—   r™   rš   r›   r   rž   rŸ   ÚparamsZtrain_nbr    r¡   r¢   r¤   r   r¥   r¦   r€   r§   Z	train_netZgradient_mapZinit_netr¨   r©   r®   Ú_epochZ
values_mapZ	train_epsZ	blob_namerœ   Ztrained_valuesÚidxr   r   r   ÚtestIfš  sÐ       ÿ   ÿ     ÿ     ÿ     ÿ
    ÿ
  ÿ

ü
zTestIf.testIfN)r9   r:   r;   r¿   r   r   r   r   r   ™  s   r   c                   @   s   e Zd Ze d¡dd„ ƒZdS )Ú	TestWhilezSkip flaky test.c                 C   sú  t dd<}t t d¡d¡ t t d¡d¡ t t d¡d¡ t t d	¡d
¡ t t d¡d¡ t t d	¡d¡ t ¡ œ t ¡ $ t ddgd¡ t ddg¡ W 5 Q R X tjd
d
d	d t 	t 
ddg¡¡ tjddd	d W 5 Q R X t ¡  tjdddd W 5 Q R X W 5 Q R X t d
dgd¡ t ddgd¡ W 5 Q R X t| ¡ ƒdkshtdƒ‚| ¡ d }| dg¡ t |¡ |  t d¡d¡ |  t d
¡d¡ |  t d¡d¡ |  t d¡d¡ |  t d¡d¡ |  t d¡d¡ d S )NTr‘   r   rL   rQ   Zoner&   Ztwor    r…   g      @r‹   Úz)ÚexponentZx_plus_yÚszExpected a single net producedZx_gradé    é   Zy_gradr   é	   Zz_gradé   é   )r   r
   ZCopyZConstZWhileNetÚ	Conditionr±   ZLEZPowr¯   r°   r²   r³   r´   rµ   r¶   r   r}   ZassertAlmostEqualr¸   )r   Únbro   r   r   r   Ú	testWhile  s8    


$
zTestWhile.testWhileN)r9   r:   r;   ÚunittestÚskiprË   r   r   r   r   rÀ     s   rÀ   Ú__main__Úpython)5Znumpyr)   Zcaffe2.pythonr   r   r   r   r   r   r   Zcaffe2.python.gradient_checkerr	   Zcaffe2.python.net_builderr
   r   Zcaffe2.protor   rÌ   Útypingr   Zhas_gpu_supportZNumGpuDevicesZDeviceOptionZ_gpu_dev_optionZGpuDeviceTypeZdevice_typeZcpu_device_optionZDeviceCheckerZgpu_device_checkerZGradientCheckerZgpu_gradient_checkersr0   r   Ú__annotations__ZTestCaser   r<   r@   rO   rW   r[   r^   r`   rb   rd   rf   ri   rl   r   rÀ   r9   Z
GlobalInitÚmainr   r   r   r   Ú<module>	   s’    $	 ÿ ÿ   ÿÿ   ÿ   ÿü ÿ   ÿÿ:+i)
