o
    i                     @   sr   d dl mZ d dlmZmZ d dlZd dlZd dlm	Z	 d dl
mZ d dlmZ d dlmZ G dd	 d	eeZdS )
    )Path)TupleUnionN)check_argument_types)AbsNormalize)InversibleInterface)make_pad_maskc                	       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 )	GlobalMVNzApply 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  sJ t   || _|| _|| _t|}|| _t	|}t
|tjrF|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)r   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__ M/home/ubuntu/.local/lib/python3.10/site-packages/espnet2/layers/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_repr:   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 )z[Forward 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/   r0   r9   r)   r)   r*   inversea   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>    
!
"r	   )pathlibr   typingr   r   numpyr   r    	typeguardr   espnet2.layers.abs_normalizer   #espnet2.layers.inversible_interfacer   &espnet.nets.pytorch_backend.nets_utilsr   r	   r)   r)   r)   r*   <module>   s    