o
    4ѹg!
                     @   s   d dl mZ d dlZd dlmZ d dlZG dd dejZG dd dejZ		dd	ej
d
ededeej
 dej
f
ddZdej
fddZdd ZedkrQe  dS dS )    )OptionalNc                       s(   e Zd Zd	 fdd	Zd
ddZ  ZS )MakePadMask   Tc                    sN   t    |rtdt| tj| _d S tt|tj| _d S )N   )	super__init__torchTensornpZtritypeboolmask_padselfmax_seq_lenZflip	__class__ _/Users/admin/.pyenv/versions/3.10.0/lib/python3.10/site-packages/funasr/utils/torch_function.pyr   
   s   
"zMakePadMask.__init__Nc                 C   s   |dkrt d||dur9t|jdkr9|dkr,|dj|ddjdd  }n|dj|jdd  }|dur@|}n|durJ|jd }nt|}| j	|d  dd|f 
tj}|dkrj|ddS |S )	zMake mask tensor containing indices of padded part.
        This implementation creates the same mask tensor with original make_pad_mask,
        which can be converted into onnx format.
        Dimension length of xs should be 2 or 3.
        r   zlength_dim cannot be 0: {}N   r      r   .)
ValueErrorformatlenshape	unsqueezeexpandZ	transposer   maxr   r   float32)r   lengthsxsZ
length_dimmaxlenmmaskr   r   r   forward   s   $
"zMakePadMask.forwardr   T)Nr   N)__name__
__module____qualname__r   r%   __classcell__r   r   r   r   r   	   s    r   c                       s0   e Zd Zd fdd	ZdejdfddZ  ZS )	sequence_maskr   Tc                    s   t    d S N)r   r   r   r   r   r   r   0   s   zsequence_mask.__init__Nc                 C   s^   |d u r|  }td|d|j}tj|dd}||k }|d ur*|||S ||S )Nr   r   r   )dim)r   r   Zarangetodevicer   r   )r   r    r   Zdtyper/   Z
row_vectorZmatrixr$   r   r   r   r%   3   s   "zsequence_mask.forwardr&   )r'   r(   r)   r   r   r   r%   r*   r   r   r   r   r+   /   s    r+          @r   inputpr-   outreturnc                 C   sL   |d u r| j ||dd| }| | S | j ||dd| }tj| ||dS )NT)Zkeepdim)r3   )ZnormZ	expand_asr   div)r1   r2   r-   r3   Zdenomr   r   r   	normalize=   s
   r6   sizec                 C   s   t | |  S r,   )r   ZonesZtril)r7   r   r   r   subsequent_maskH   s   r8   c                  C   s.   t dgt j} t }|| }t| d S )N
   )r   Ztensorr   longr   print)Zfeats_lengthZmask_fnr$   r   r   r   MakePadMask_testL   s   r<   __main__)r0   r   N)typingr   r   Ztorch.nnnnZnumpyr
   Moduler   r+   r	   floatintr6   r8   r<   r'   r   r   r   r   <module>   s.    &

