a
    ==icù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   úr/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/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g d¢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ÚX2ZX3ZX4r   ÚY_dimsr!   ©r%   r&   r=   r   ©r   r   r(   r)   r*   r+   r,   r-   Úranger   r.   r/   r0   ©r   r1   Úd1Úd2Zd3Zd4r3   ZXsÚir4   r5   r6   r7   r   r   r   ÚtestConcatNHWCq   s>    ýÿÿÿÿÿÿù	

ÿ
zTestConcat.testConcatNHWCc              
   C   sì   | j D ]à\}}}}}tjdg d¢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   r   rE   ZNCHWrF   r&   r=   r   rG   rI   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   g d¢| _ 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   g d¢| _ d S ©N)rP   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   g d¢| _ d S ©N)rP   )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   g d¢| _ 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   g d¢| _ 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   g d¢| _ 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   g d¢| _ 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ÚSumrC   rD   r   r   r   rQ   r'   )
r   r1   Zin_placer3   rC   rD   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   g d¢| _ 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g d¢dd|d	 tjg d¢dd|d tjg d¢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  ó    zDTestNetGradientChecker.test_net_gradient_checker.<locals>.<listcomp>c                    s   g | ]}ˆ j  |¡‘qS r   )ro   ÚAveragedLoss)rq   Úd)ru   r   r   rv   t  rw   )rQ   r&   r   r-   ©Údtype)rQ   rQ   rQ   rQ   rQ   )r&   r&   r&   r&   )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   ry   za+bzc+dÚxÚnet2ÚacÚadÚbcÚbdÚyc                 S   s$   i | ]\}}|t j|gt jd “qS )rz   )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   ry   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 d   ƒ n1 sè0    Y  |
|||||||	g}t d|d~}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¡¡D t ||
|gd#¡}t 	||g|¡ t |||g|¡ W d   ƒ n1 sþ0    Y  t 
¡ D t |||gd#¡}t 	||g|¡ t |||	g|¡ W d   ƒ n1 s\0    Y  t ||gd$¡}| g d%g¡}W d   ƒ n1 sš0    Y  t| ¡ ƒd	ks¾J d&ƒ‚t| ¡ ƒd	ksØJ 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¡ qÈ||||d2œ} d3}!|  ¡ D ]–\}"}#t |"¡}$|$jd
kr<|   |$j!d d	¡ |$d d d … }$n|   |$jd	¡ |   |$j"t|#ƒ¡ tt|$ƒƒD ]$}%|  #t$|$|% |#|%  ƒ|!k ¡ qh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•   ÚmeanZstdr¤   ÚnoiseÚY_gtr   Úlossz#Expected a single init net producedz$Expected a single train net producedÚITER)r•   r™   r{   ÚLRgš™™™™™¹¿Ústepé   gÍÌÌÌÌÌì?)Zbase_lrÚpolicyZstepsizeÚgammaÚONEiè  )r”   r˜   rš   r›   r   )%r   r
   ZUniformFillZConstantFillZGivenTensorFillZGaussianFillÚIfNetÚLTÚFCÚAddÚElserp   rx   ÚlenÚgetÚAddGradientOperatorsr   ZDataTypeZINT64ZIterZLearningRateZWeightedSumr   r~   Z	CreateNetrH   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š    ÿÿ2ÿÿÿ2
2.ÿ
ÿ

ü
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   sf  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 d   ƒ n1 sÀ0    Y  tjd
d
d	d t 	t 
ddg¡¡  tjddd	d W d   ƒ n1 s0    Y  t ¡   tjdddd W d   ƒ n1 sP0    Y  W d   ƒ n1 sp0    Y  t d
dgd¡ t ddgd¡ W d   ƒ n1 s°0    Y  t| ¡ ƒdksÔJ 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   Úoner&   Ú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LEÚPowr±   r²   rµ   r¶   r·   r¸   r   r~   ZassertAlmostEqualrº   )r   Únbro   r   r   r   Ú	testWhile  s8    

,0
P0
zTestWhile.testWhileN)r9   r:   r;   ÚunittestÚskiprÐ   r   r   r   r   rÂ     s   rÂ   Ú__main__Úpython)5Ú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>	   sr   
$	ÿÿÿÿÿÿüÿÿÿ:+i)
