o
    soi                     @  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 r2|	|| 9 }	q%|
|| 9 }
q%t| |	|
f}tj|ddd|
 }|| }|| }tj|ddd|
 }|| }t|}t|}|| }t||| | }t||}t||}|||fS )Nr   )   r   T)axiskeepdims)shapelenrangenpreshapesumsqrt
reciprocal)XWBr   epsilonX_shapeX_rankunsqueezed_rankreduction_shape
row_number
col_numberix_matx_meanx_diffx_squared_diffvariancevariance_epsstd_devinv_std_devy_matYX_meanX_inv_std_dev r)   b/home/ubuntu/.local/lib/python3.10/site-packages/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                   @  sD   e Zd ZedddZedddZedddZedd	d
ZdS )LayerNormalizationreturnNonec                    sZ   t jddddt j d fd	d
} tt jD ]}| | | |t j  qd S )N            r   intr.   r/   c           	        s   t  j| }tjj| tj}tjj| tj}t ||| \}}}tj	j
dg dg d| d}| dk r=d|   }nd|  }t| ||g|||g|d d S )	Nr-   r   r   r   r&   Mean	InvStdDevinputsoutputsr   r   *test_layer_normalization_4d_axis_negative_ 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   r4   r.   r/   r   rA   rB   rC   rD   r   r   r
   rM   r   r)   rL   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g dg dd	}t|| ||g|||gd
d d S )Nr0   r1   r2   r3   r   r-   r5   r6   )r:   r;   %test_layer_normalization_default_axisr>   )r   rA   rB   rC   rD   r,   r
   r+   rE   rF   rG   r   )r   rI   r   r   r&   rJ   r$   rK   r)   r)   r*   export_default_axisb   s    
z&LayerNormalization.export_default_axisc                    sV   t jddt j d	 fdd} tt jD ]}| | | |t j  qd S )
Nr1   r2   r   r4   r.   r/   c           	        s   t  j| }tjj| tj}tjj| tj}t ||| d\}}}tj	j
dg dg d| d}| dk r>d|   }nd|  }t| ||g|||g|d	 d S )
N)r   r-   r5   r6   r9   r   *test_layer_normalization_2d_axis_negative_ test_layer_normalization_2d_axisr>   r@   rH   rL   r)   r*   rM      s   
 z)LayerNormalization.export2d.<locals>.caserN   rO   rP   r)   rL   r*   export2d{   s   zLayerNormalization.export2dc                    s^   dt jdddt j d fd	d
} tt jD ]}| | | |t j  qd S )Ng?r0   r1   r3   r   r4   r.   r/   c           	        s   t  j| }tjj| tj}tjj| tj}t ||| \}}}tj	j
dg dg d| d}| dk r@d|   d}nd|  d}t| ||g|||g|d	 d S )
Nr-   r5   r6   )r:   r;   r   r   r   *test_layer_normalization_3d_axis_negative__epsilon test_layer_normalization_3d_axisr>   r@   rH   r   r   r)   r*   rM      s    z1LayerNormalization.export3d_epsilon.<locals>.caserN   rO   rP   r)   rZ   r*   export3d_epsilon   s   z#LayerNormalization.export3d_epsilonN)r.   r/   )__name__
__module____qualname__staticmethodrQ   rS   rV   r[   r)   r)   r)   r*   r-   E   s    r-   )r   r   )
__future__r   numpyr   rE   onnx.backend.test.case.baser   onnx.backend.test.case.noder   r+   r,   r-   r)   r)   r)   r*   <module>   s   
0