U
    rh                     @  sZ   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
 Z
G dd deZdS )    )annotationsN)Base)expecth㈵>c                 C  s  | j }t|}|dk r|| }|| }|d| d|  }d}	d}
t|D ]&}||k rd|	|| 9 }	qJ|
|| 9 }
qJt| |	|
f}tj|ddd|
 }|| }|| }tj|ddd|
 }|| }t|}t|}|| }t||| | }t||}t||}|||fS )Nr   )   r   T)axisZkeepdims)shapelenrangenpZreshapesumsqrtZ
reciprocal)XWBr   epsilonX_shapeX_rankZunsqueezed_rankZreduction_shapeZ
row_numberZ
col_numberiZx_matZx_meanZx_diffZx_squared_diffZvarianceZvariance_epsZstd_devinv_std_devZy_matYZX_meanZX_inv_std_dev r   R/tmp/pip-unpacked-wheel-xnis5xre/onnx/backend/test/case/node/layernormalization.py_layer_normalization   s2    

r   c                 C  s$   t | }|dk r|| }| |d  S )Nr   )r
   )r   r   r   r   r   r   calculate_normalized_shape>   s    r   c                   @  sT   e Zd ZeddddZeddddZeddddZeddd	d
ZdS )LayerNormalizationNone)returnc                    s`   t jddddt j ddd fdd	} tt jD ]}| | | |t j  q<d S )
N            intr   r   r   c           	        s   t  j| }tjj| tj}tjj| tj}t ||| \}}}tj	j
ddddgdddg| d}| d	k r~d
|   }n
d|  }t| ||g|||g|d d S )Nr   r   r   r   r   Mean	InvStdDevinputsoutputsr   r   Z*test_layer_normalization_4d_axis_negative_Z test_layer_normalization_4d_axisr(   r)   namer   r	   r   randomrandnastypefloat32r   onnxhelper	make_noder   	r   normalized_shaper   r   r   meanr   noder+   r   r   r   caseJ   s    
z'LayerNormalization.export.<locals>.caser   r-   r.   r/   r0   r   r
   r	   r9   r   r   r8   r   exportF   s
    zLayerNormalization.exportc                  C  s   t jddddt j} t| jd}t jj| t j}t jj| t j}t| ||\}}}tj	j
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)   Z%test_layer_normalization_default_axisr*   )r   r-   r.   r/   r0   r   r	   r   r1   r2   r3   r   )r   r5   r   r   r   r6   r   r7   r   r   r   export_default_axisb   s     z&LayerNormalization.export_default_axisc                    s\   t jddt j ddd fdd} tt jD ]}| | | |t j  q8d S )Nr    r!   r#   r   r$   c           	        s   t  j| }tjj| tj}tjj| tj}t ||| d\}}}tj	j
ddddgdddg| d	}| d
k rd|   }n
d|  }t| ||g|||g|d d S )N)r   r   r   r   r   r   r%   r&   r'   r   Z*test_layer_normalization_2d_axis_negative_Z test_layer_normalization_2d_axisr*   r,   r4   r8   r   r   r9      s    
z)LayerNormalization.export2d.<locals>.caser:   r;   r   r8   r   export2d{   s
    zLayerNormalization.export2dc                    sd   dt jdddt j ddd fdd	} tt jD ]}| | | |t j  q@d S )
Ng?r   r    r"   r#   r   r$   c           	        s   t  j| }tjj| tj}tjj| tj}t ||| \}}}tj	j
ddddgdddg| d}| d	k rd
|   d}nd|  d}t| ||g|||g|d d S )Nr   r   r   r   r   r%   r&   )r(   r)   r   r   r   Z*test_layer_normalization_3d_axis_negative_Z_epsilonZ test_layer_normalization_3d_axisr*   r,   r4   r   r   r   r   r9      s    z1LayerNormalization.export3d_epsilon.<locals>.caser:   r;   r   r?   r   export3d_epsilon   s    z#LayerNormalization.export3d_epsilonN)__name__
__module____qualname__staticmethodr<   r=   r>   r@   r   r   r   r   r   E   s   r   )r   r   )
__future__r   Znumpyr   r1   Zonnx.backend.test.case.baser   Zonnx.backend.test.case.noder   r   r   r   r   r   r   r   <module>   s   
0