U
    r±Ëhœ  ã                   @  s\   d dl mZ d dlZd dlZd dlmZ d dlmZ ddd„Z	dd	d
„Z
G dd„ deƒZdS )é    )ÚannotationsN)ÚBase)Úexpectçñhãˆµøä>c                 C  sl   t | jƒ}d|d  }|jd|žŽ }|jd|žŽ }|jd|žŽ }|jd|žŽ }|| |  t || ¡ | S )N)é   é   éÿÿÿÿ)r   )r   )r   )r   )ÚlenÚshapeZreshapeÚnpÚsqrt)ÚxÚsÚbiasÚmeanÚvarÚepsilonZdims_xZdim_ones© r   úI/tmp/pip-unpacked-wheel-xnis5xre/onnx/backend/test/case/node/batchnorm.pyÚ_batchnorm_test_mode   s    
r   çÍÌÌÌÌÌì?c                 C  s‚   t t t t| jƒ¡d¡ƒ}| j|d}| j|d}	|| |d|   }
|| |	d|   }t| ||||	|d}| 	tj
¡|
|fS )Nr   )Úaxis)r   )Útupler   ÚdeleteZaranger	   r
   r   r   r   ÚastypeÚfloat32)r   r   r   r   r   Úmomentumr   r   Z
saved_meanZ	saved_varÚoutput_meanÚ
output_varÚyr   r   r   Ú_batchnorm_training_mode   s    r    c                   @  s0   e Zd Zeddœdd„ƒZeddœdd„ƒZdS )ÚBatchNormalizationÚNone)Úreturnc                  C  s„  t j d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| ||||ƒ t j¡}tjj	ddddd	d
gdgd}t
|| ||||g|gdd t j d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¡}d}t| |||||ƒ t j¡}tjj	ddddd	d
gdg|d}t
|| ||||g|gdd d S )Nr   é   é   é   r!   r   r   r   r   r   r   )ÚinputsÚoutputsZtest_batchnorm_example©r'   r(   Únameç{®Gáz„?)r'   r(   r   Ztest_batchnorm_epsilon)r   ÚrandomÚrandnr   r   Úrandr   ÚonnxÚhelperÚ	make_noder   )r   r   r   r   r   r   Únoder   r   r   r   Úexport"   sH    ýüüüzBatchNormalization.exportc                  C  s¢  t j d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¡}d}t| ||||ƒ\}}}tjj	dddd	d
dgdddg|d}	t
|	| ||||g|||gdd t j d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¡}d}d}
d}t| |||||
|ƒ\}}}tjj	dddd	d
dgdddg||d}	t
|	| ||||g|||gdd d S )Nr   r$   r%   r&   r   r!   r   r   r   r   r   r   r   r   )r'   r(   Útraining_modeZ$test_batchnorm_example_training_moder)   r   r+   )r'   r(   r   r4   Z$test_batchnorm_epsilon_training_mode)r   r,   r-   r   r   r.   r    r/   r0   r1   r   )r   r   r   r   r   r4   r   r   r   r2   r   r   r   r   r   Úexport_trainR   sb    üü      ÿ
û	üzBatchNormalization.export_trainN)Ú__name__Ú
__module__Ú__qualname__Ústaticmethodr3   r5   r   r   r   r   r!   !   s   /r!   )r   )r   r   )Ú
__future__r   Znumpyr   r/   Zonnx.backend.test.case.baser   Zonnx.backend.test.case.noder   r   r    r!   r   r   r   r   Ú<module>   s   



