o
    if                     @   s   d Z ddlmZmZmZ ddlZ		ddedee dee deejj	ef fdd	Z
G d
d dejj	ZG dd dejj	ZG dd dejj	ZdS )z*Normalization modules for X-former blocks.    )DictOptionalTupleNnormalization_typeepspartialreturnc                 C   sx   t d|dur|ndiftjjd|dur|ndift|dur|nd|dur&|nddftd|dur2|ndifd}||  S )	a\  Get normalization module and arguments given parameters.

    Args:
        normalization_type: Normalization module type.
        eps: Value added to the denominator.
        partial: Value defining the part of the input used for RMS stats (RMSNorm).

    Return:
        : Normalization module class
        : Normalization module arguments

    r   N      ?g-q=h㈵>g      )r   r   )
basic_norm
layer_normrms_norm
scale_norm)	BasicNormtorchnn	LayerNormRMSNorm	ScaleNorm)r   r   r   norm r   h/home/ubuntu/.local/lib/python3.10/site-packages/espnet2/asr_transducer/encoder/modules/normalization.pyget_normalization   s   r   c                       sH   e Zd ZdZ	ddededdf fddZd	ejdejfd
dZ	  Z
S )r   zBasicNorm module definition.

    Reference: https://github.com/k2-fsa/icefall/pull/288

    Args:
        normalized_shape: Expected size.
        eps: Value added to the denominator for numerical stability.

    r	   normalized_shaper   r   Nc                    s*   t    tjt|  | _dS )zConstruct a BasicNorm object.N)	super__init__r   r   	Parametertensorlogdetachr   selfr   r   	__class__r   r   r   :   s   
 zBasicNorm.__init__xc                 C   s,   t j|dddd| j  d }|| S )zCompute basic normalization.

        Args:
            x: Input sequences. (B, T, D_hidden)

        Returns:
            : Output sequences. (B, T, D_hidden)

           Tdimkeepdim      )r   meanpowr   exp)r!   r$   scalesr   r   r   forwardD   s   $
zBasicNorm.forward)r	   __name__
__module____qualname____doc__intfloatr   r   Tensorr/   __classcell__r   r   r"   r   r   /   s    
r   c                	       sN   e Zd ZdZ		ddedededdf fd	d
ZdejdejfddZ	  Z
S )r   a  RMSNorm module definition.

    Reference: https://arxiv.org/pdf/1910.07467.pdf

    Args:
        normalized_shape: Expected size.
        eps: Value added to the denominator for numerical stability.
        partial: Value defining the part of the input used for RMS stats.

    r
           r   r   r   r   Nc                    sV   t    || _d|  k rdk rn ndnd| _|| _|| _tjt	|| _
dS )zConstruct a RMSNorm object.r      TFN)r   r   r   r   pr   r   r   r   onesscale)r!   r   r   r   r"   r   r   r   _   s   
"zRMSNorm.__init__r$   c                 C   s   | j r%t| j| j }tj||| j| gdd\}}|jdddd}|}n|jdddd}| j}||d  }| j||| j   }|S )zCompute RMS normalization.

        Args:
            x: Input sequences. (B, T, D_hidden)

        Returns:
            x: Output sequences. (B, T, D_hidden)

        r&   )r(   r%   Tr'   r*   )	r   r5   r   r;   r   splitr   r=   r   )r!   r$   partial_size	partial_x_norm_xd_xrms_xr   r   r   r/   p   s   

zRMSNorm.forward)r
   r9   r0   r   r   r"   r   r   S   s    r   c                       sF   e Zd ZdZddededdf fddZd	ejdejfd
dZ	  Z
S )r   zScaleNorm module definition.

    Reference: https://arxiv.org/pdf/1910.05895.pdf

    Args:
        normalized_shape: Expected size.
        eps: Value added to the denominator for numerical stability.

    r
   r   r   r   Nc                    s,   t    || _tjt|d | _dS )zConstruct a ScaleNorm object.g      ?N)r   r   r   r   r   r   r   r=   r    r"   r   r   r      s   
zScaleNorm.__init__r$   c                 C   s(   | j tj|dddj| jd }|| S )zCompute scale normalization.

        Args:
            x: Input sequences. (B, T, D_hidden)

        Returns:
            : Output sequences. (B, T, D_hidden)

        r&   Tr'   )min)r=   r   r   clampr   )r!   r$   r   r   r   r   r/      s    
zScaleNorm.forward)r
   r0   r   r   r"   r   r      s    
r   )NN)r4   typingr   r   r   r   strr6   r   Moduler   r   r   r   r   r   r   r   <module>   s"    
'$9