U
    ‰dÛ-  ã                   @   s„   d dl mZmZmZmZ d dlmZ d dlmZ d dl	m
Z
 d dlZd dlZG dd„ dejƒZe ej d¡G d	d
„ d
ejƒƒZdS )é    )ÚbrewÚcoreÚscopeÚ	workspace)ÚParameterTags)ÚModelHelper)ÚCNNModelHelperNc                   @   s”   e Z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
d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d#S )$ÚBrewTestc                 C   sX   ddd„}t  |¡st  |¡ || _d	dd„}t  |¡sBt  |¡ || _tdd| _d S )
Néÿÿÿÿc                 S   s   |S ©N© ©ÚmodelÚvalr   r   ú;/tmp/pip-unpacked-wheel-ua33x9lu/caffe2/python/brew_test.pyÚmyhelper   s    z BrewTest.setUp.<locals>.myhelperc                 S   s   |S r   r   r   r   r   r   Ú	myhelper2   s    z!BrewTest.setUp.<locals>.myhelper2Ú
test_model©Úname)r
   )r
   )r   Ú
has_helperÚRegisterr   r   r   r   )Úselfr   r   r   r   r   ÚsetUp   s    





zBrewTest.setUpc                 C   s„   d}t  d¡ t j¡| }t d|¡ tdd}tj|dddd t 	|j
¡ t 	|j¡ t d¡}|  t| ¡ d	|  ƒd
¡ d S )Ngš™™™™™É?)éd   r   Úxr   r   ÚoutF)Zis_testé   gš™™™™™©?)ÚnpÚonesÚastypeÚfloat32r   ÚFeedBlobr   r   ZdropoutÚ
RunNetOnceÚparam_init_netÚnetÚ	FetchBlobZ
assertLessÚabsÚmean)r   ÚpÚXr   r   r   r   r   Útest_dropout!   s    

zBrewTest.test_dropoutc                 C   sp   d\}}}t j ||¡ t j¡d }t d|¡ tdd}t 	|dd||¡ | 
¡  t |j¡ t |j¡ d S )N)é   r,   r,   ç      à?r   r   r   Zout_1)r   ÚrandomÚrandr    r!   r   r"   r   r   ÚfcÚValidater#   r$   r%   )r   ÚmÚnÚkr*   r   r   r   r   Útest_fc,   s    

zBrewTest.test_fcc                 C   sÂ   t  d¡ t j¡d }t  d¡ t j¡d }t d|¡ t d|¡ tdd}t |dd¡ t |dd	¡ | 	¡  t 
|j¡ t 
|j¡ t d¡}|  | ¡ d¡ t d	¡}|  | ¡ d
¡ d S )N©é   r7   r-   ç      ø?ÚxposÚxnegr   r   Úout_xposÚout_xnegr   ©r   r   r    r!   r   r"   r   r   Zrelur1   r#   r$   r%   r&   ÚassertAlmostEqualr(   ©r   ZXposZXnegr   ÚposÚnegr   r   r   Ú	test_relu7   s    


zBrewTest.test_reluc                 C   s‚   t  d¡ t j¡d }t d|¡ tdd}t |dd¡ | 	¡  t 
|j¡ t 
|j¡ t d¡}| j| ¡ t  d¡dd d S )	Nr6   r-   r   r   r   Úout_tanhr7   ©Zplaces©r   r   r    r!   r   r"   r   r   Útanhr1   r#   r$   r%   r&   r>   r(   ©r   r*   r   r   r   r   r   Ú	test_tanhI   s    

zBrewTest.test_tanhc                 C   s`   t dd}|j d¡ |j d¡ |  | ¡ g ¡ |j d¡ |j d¡ |  | ¡ dg¡ d S )Nr   r   ZaaaÚbbbZxxx)r   ÚparamsÚappendÚassertEqualZ	_Validate)r   r   r   r   r   Útest_validateV   s    
zBrewTest.test_validatec              	   C   s’   | j }| j}d}tj|g|d t  | j¡}W 5 Q R X |  ||¡ tj||g|d t  | j¡}t | j¡}W 5 Q R X |  ||g||g¡ d S )Nr,   ©r   )r   r   r   Ú	arg_scoper   rL   )r   r   r   r3   ÚresZres1Zres2r   r   r   Útest_arg_scope`   s    zBrewTest.test_arg_scopec              	   C   s°   t j dddd¡ t j¡d }t d|¡ tdd}tj	tj
ddd	i fd
i fd tj
|dddddd W 5 Q R X | ¡  t |j¡ t |j¡ t d¡}|  |jd¡ d S )Né@   é   é    r-   r   r   r   é   Ú
XavierFillÚConstantFill©ZstrideÚpadZweight_initZ	bias_initr   ©r   Zblob_inZblob_outZdim_inZdim_outÚkernel)rR   rR   é   r\   ©r   r.   r/   r    r!   r   r"   r   r   rO   Úconvr1   r#   r$   r%   r&   rL   ÚshaperG   r   r   r   Útest_arg_scope_singlem   s.    
ûú
zBrewTest.test_arg_scope_singlec                 C   s¸   | j }d}tj|gddn tj|gddR tj|g|d t  | j¡}|  ||¡ W 5 Q R X t  | j¡}|  |d¡ W 5 Q R X W 5 Q R X tj | jdd}| j ¡  |  |d¡ d S )Né   éýÿÿÿrN   éþÿÿÿr,   )r   r   rO   r   rL   r1   )r   r   r3   rP   r   r   r   Útest_arg_scope_nested‡   s    ÿ 
zBrewTest.test_arg_scope_nestedc              	   C   s*   | j }|  t¡ t |¡ W 5 Q R X d S r   )r   ÚassertRaisesÚAttributeErrorr   r   )r   r   r   r   r   Útest_double_register–   s    zBrewTest.test_double_registerc                 C   s>   |   t tj¡¡ |   t d¡¡ dd„ }|  t |¡¡ d S )Nr^   c                   S   s   d S r   r   r   r   r   r   Ú	myhelper3Ÿ   s    z+BrewTest.test_has_helper.<locals>.myhelper3)Ú
assertTruer   r   r^   ZassertFalse)r   rh   r   r   r   Útest_has_helper›   s    zBrewTest.test_has_helperc              	   C   s¾   t j dddd¡ t j¡d }t d|¡ ddi}td|d	}tj	tj
d
d
di fdi fd  tj
|ddddddgd W 5 Q R X | ¡  t |j¡ t |j¡ t d¡}|  |jd¡ d S )NrR   rT   rS   r-   r   ÚorderÚNHWCr   )r   rO   rU   rV   rW   rX   r   é   rZ   )rR   r,   r\   rR   r]   )r   r*   Zmy_arg_scoper   r   r   r   r   Útest_model_helper¤   s0    ûú
zBrewTest.test_model_helperc                 C   sL   t j dddd¡ t j¡d }t d|¡ tddd}|  |j	d	 d¡ d S )
NrR   rT   rS   r-   r   r   rl   )r   rk   rk   )
r   r.   r/   r    r!   r   r"   r   rL   rO   )r   r*   r   r   r   r   Ú test_cnn_model_helper_deprecated¿   s    z)BrewTest.test_cnn_model_helper_deprecatedc              	   C   sx  dd„ }dd„ }t dd}| |dƒ¡ |j|dƒtjd	 t d
¡Š | |dƒ¡ |j|dƒtjd	 |  || ¡ ƒdg¡ |  || ¡ ƒdg¡ |  || 	¡ ƒddg¡ |  || 	d¡ƒddddg¡ W 5 Q R X |  || ¡ ƒddg¡ |  || ¡ ƒddg¡ |  || 	¡ ƒddddg¡ |  || 	d¡ƒddddg¡ |  || 	d
¡ƒddg¡ |  || 	d¡ƒddg¡ d S )Nc                 S   s
   t  | ¡S r   )r   ZScopedBlobReference©r   r   r   r   ÚparamÉ   s    z'BrewTest.test_get_params.<locals>.paramc                 S   s   t dd„ | D ƒƒS )Nc                 S   s   g | ]}t |ƒ‘qS r   )Ústr)Ú.0r)   r   r   r   Ú
<listcomp>Í   s     zABrewTest.test_get_params.<locals>.to_str_list.<locals>.<listcomp>)Úsortedrp   r   r   r   Úto_str_listÌ   s    z-BrewTest.test_get_params.<locals>.to_str_listr   r   ÚaÚb)ÚtagsÚcÚdzc/azc/dÚ zc/)
r   ZAddParameterr   ZCOMPUTED_PARAMr   Z	NameScoperL   Z	GetParamsZGetComputedParamsZGetAllParams)r   rq   rv   r   r   r   r   Útest_get_paramsÈ   s6    
   ÿ
ÿ
ÿzBrewTest.test_get_paramsc                 C   sb   t dd}t |ddddd¡}t d|d}t ||d	d
d¡}t ||ddd¡ |  |j|j¡ d S )NZ	test_moder   ÚdataÚcnvrT   é   Ú
step_model)r   Zparam_modelrw   r   éÈ   rx   r7   )r   r   r^   r0   rL   Z_parameters_info)r   r   r   r   rw   r   r   r   Útest_param_consistenceå   s    
zBrewTest.test_param_consistencec                 C   sü   t  dt d¡¡ t  dt d¡¡ t  dt d¡¡ tdd}|j dd	¡ td
d}|j dd	¡ tdd}tj|dddd	g||d t  	|j
¡ t  	|j¡ t  d	¡}|  |d¡ t  dt d¡¡ t  	|j
¡ t  	|j¡ t  d	¡}|  |d¡ d S )NÚcondTZ
then_valuer   Z
else_valuerU   Zthen_test_modelr   Úoutput_blobZelse_test_modelr   )r   Ú	cond_blobÚexternal_blobsÚ
then_modelÚ
else_modelF)r   r"   r   Úarrayr   r%   ÚCopyr   r„   r#   r$   r&   rL   )r   rˆ   r‰   r   Úoutput_valuer   r   r   Ú	test_condî   s0    


û

zBrewTest.test_condc              	   C   s  t  dt d¡¡ t  dt d¡¡ t  dt d¡¡ t  dt d¡¡ t  d	t d
¡¡ t  dt d
¡¡ tdd}|j ddgd¡ tdd}|j d	dgd	¡ |j d	dg¡}|j |d¡ tdd}t	j
|dddddd	dg||d t  |j¡ t  |j¡ t  d¡}|  |d¡ d S )Nr„   TZONEr   ZTWOrU   ZTENé
   Úcounterr   r…   Zloop_test_modelr   Zcond_test_modelr   )r   r†   r‡   Ú
loop_modelÚ
cond_modelé   )r   r"   r   rŠ   r   r%   ZAddÚLTr‹   r   Zloopr#   r$   r&   rL   )r   r   r‘   Zcomp_resr   rŒ   r   r   r   Ú	test_loop  s0    


û
zBrewTest.test_loopN)Ú__name__Ú
__module__Ú__qualname__r   r+   r5   rB   rH   rM   rQ   r`   rd   rg   rj   rn   ro   r}   rƒ   r   r”   r   r   r   r   r	      s"   
			r	   zNo gpu support.c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚBrewGPUTestc                 C   sÊ   t  d¡ t j¡d }t  d¡ t j¡d }t d|¡ t d|¡ tdd}tj|ddd	d
 tj|ddd	d
 | 	¡  t 
|j¡ t 
|j¡ t d¡}|  | ¡ d¡ t d¡}|  | ¡ d¡ d S )Nr6   r-   r8   r9   r:   r   r   r;   T©Z	use_cudnnr<   r   r=   r?   r   r   r   rB   +  s    


zBrewGPUTest.test_reluc                 C   s†   t  d¡ t j¡d }t d|¡ tdd}tj|dddd | 	¡  t 
|j¡ t 
|j¡ t d¡}| j| ¡ t  d¡d	d
 d S )Nr6   r-   r   r   r   rC   Tr™   r7   rD   rE   rG   r   r   r   rH   =  s    

zBrewGPUTest.test_tanhN)r•   r–   r—   rB   rH   r   r   r   r   r˜   )  s   r˜   )Zcaffe2.pythonr   r   r   r   Z%caffe2.python.modeling.parameter_infor   Zcaffe2.python.model_helperr   Zcaffe2.python.cnnr   ZunittestZnumpyr   ZTestCaser	   ZskipIfZhas_gpu_supportr˜   r   r   r   r   Ú<module>   s     