o
    i}                     @   s   d dl Z d dlmZ d dlmZ d dlmZ d dlmZ d dl	Z	dZ
G dd de jjZ		dd
e jde jdede jfddZ					dd
e jde jdedededee jef fddZdS )    N)Tuple)Union)make_non_pad_mask)
functional-q=c                       s6   e Zd Zd	deeef f fddZd
ddZ  ZS )StatisticPooling   r   pooling_dimc                    s.   t t|   t|tr|f}|| _|| _d S N)superr   __init__
isinstanceintr	   eps)selfr	   r   	__class__ `/home/ubuntu/.local/lib/python3.10/site-packages/funasr/models/sond/pooling/statistic_pooling.pyr      s
   

zStatisticPooling.__init__Nc                 C   s   |d u rt ||}n
t||dd|}t j|| jddt j|| jdd }t || d}t j|| jddt j|| jdd }t| jD ]}t j||dt j||d}}qHt 	|| j
 }d| | || j
  }t |}	t j||	gdd}
|
S 	Nr   )
length_dimT)dimkeepdimg       @r   g      ?   )torch	ones_liketor   sumr	   powreversedsqueeze
less_equalr   floatsqrtcat)r   xs_padilensmasksmeansquared_differencevarianceimaskstddevstat_poolingr   r   r   forward   s"    
zStatisticPooling.forward)r   r   r
   )	__name__
__module____qualname__r   r   r   r   r0   __classcell__r   r   r   r   r      s    r   r      r&   r'   r	   returnc                 C   s   |d u rt | | }n
t|| dd| }t j| |ddt j||dd }t | | d}t j||ddt j||dd }t|D ]}t j||dt j||d}}qCt |t	
 }d| | |t	  }t |}	t j||	gdd}
|
S r   )r   r   r   r   r   r   r    r!   r"   VAR2STD_EPSILONr#   r$   r%   )r&   r'   r	   seq_maskr)   r*   r+   r,   
value_maskr.   r/   r   r   r   statistic_pooling-   s"    
r;      r   pooling_sizepooling_stridec                 C   s   | j d }tt|| }|d }t| j dkr%t| dd||fd}n	t| ||fd}g }	t|D ]&}
|
| |
| | }}t|d d d d ||f |d}|		|
d q4tj|	dd|| fS )Nr      r   	replicate)r	   r   )shaper   mathceillenFpadranger;   append	unsqueezer   r%   )r&   r'   r	   r=   r>   tt	num_chunkrF   features	stat_listr,   stedstatr   r   r   windowed_statistic_poolingI   s   
	"rQ   )Nr5   )Nr5   r<   r   )r   typingr   r   *funasr.models.transformer.utils.nets_utilsr   torch.nnr   rE   rB   r8   nnModuler   Tensorr;   r   rQ   r   r   r   r   <module>   sF    #
