o
    i8                     @   sp   d dl mZ d dlmZ d dlmZ d dlZd dlZd dlm	Z	 d dl
mZ eddG d	d dejjZdS )
    )Path)Tuple)UnionN)make_pad_mask)tablesnormalize_classes	GlobalMVNc                	       s   e Zd ZdZ			ddeeef dededef fdd	Z	d
d Z
	ddejdejdeejejf fddZ	ddejdejdeejejf fddZ  ZS )r   zApply global mean and variance normalization
    TODO(kamo): Make this class portable somehow
    Args:
        stats_file: npy file
        norm_means: Apply mean normalization
        norm_vars: Apply var normalization
        eps:
    T#B;
stats_file
norm_means	norm_varsepsc                    s   t    || _|| _|| _t|}|| _t|}t	|tj
rA|d  d }|dd df | }|dd df | ||  }n|d }|d }	|d }
|	| }|
| ||  }tt||}| dt| | dt| d S )	Nr      countsum
sum_squaremeanstd)super__init__r   r   r   r   r
   npload
isinstancendarrayflattensqrtmaximumregister_buffertorch
from_numpy)selfr
   r   r   r   statsr   r   varsum_vsum_square_vr   	__class__ V/home/ubuntu/.local/lib/python3.10/site-packages/funasr/models/normalize/global_mvn.pyr      s&   

zGlobalMVN.__init__c                 C   s   d| j  d| j d| j S )Nzstats_file=z, norm_means=z, norm_vars=)r
   r   r   )r!   r(   r(   r)   
extra_repr7   s   
zGlobalMVN.extra_reprNxilensreturnc                 C   s   |du r| |dg|d}| j}| j}| j|j|j| _| j|j|j| _t	||d}|rA|j
r<|| j }n|| j8 }|j
rK||d}n||d |rX|| j }||fS )zZForward function
        Args:
            x: (B, L, ...)
            ilens: (B,)
        Nr   r           new_fullsizer   r   r   todevicedtyper   r   requires_gradmasked_fillmasked_fill_r!   r+   r,   r   r   maskr(   r(   r)   forward=   s"   

zGlobalMVN.forwardc                 C   s   |d u r| |dg|d}| j}| j}| j|j|j| _| j|j|j| _t	||d}|j
r;||d}n||d |rH|| j9 }|rY|| j7 }|t	||dd ||fS )Nr   r   r.   r/   r8   r(   r(   r)   inverse]   s    

zGlobalMVN.inverse)TTr	   )N)__name__
__module____qualname____doc__r   r   strboolfloatr   r*   r   Tensorr   r:   r;   __classcell__r(   r(   r&   r)   r      s>    
 
!)pathlibr   typingr   r   numpyr   r   *funasr.models.transformer.utils.nets_utilsr   funasr.registerr   registernnModuler   r(   r(   r(   r)   <module>   s    
