o
    ´©i!
  ã                   @   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ÚnpÚtriÚtypeÚboolÚmask_pad©ÚselfÚmax_seq_lenÚflip©Ú	__class__© úO/home/ubuntu/.local/lib/python3.10/site-packages/funasr/utils/torch_function.pyr   
   s   
"zMakePadMask.__init__Néÿÿÿÿc                 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 )	zôMake 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ÚexpandÚ	transposer   Úmaxr   r   Úfloat32)r   ÚlengthsÚxsÚ
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   ÚarangeÚtoÚdevicer   r   )r   r#   r   Údtyper4   Ú
row_vectorÚ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Úpr1   ÚoutÚreturnc                 C   sL   |d u r| j ||dd | ¡}| | S | j ||dd | ¡}tj| ||dS )NT)Úkeepdim)r;   )ÚnormÚ	expand_asr   Údiv)r9   r:   r1   r;   Údenomr   r   r   Ú	normalize=   s
   rB   Úsizec                 C   s   t  | | ¡ ¡ S r0   )r   ÚonesÚtril)rC   r   r   r   Úsubsequent_maskH   s   rF   c                  C   s.   t  dg¡ t j¡} tƒ }|| ƒ}t|ƒ d S )Né
   )r   Útensorr   Úlongr   Úprint)Úfeats_lengthÚmask_fnr(   r   r   r   ÚMakePadMask_testL   s   rM   Ú__main__)r8   r   N)Útypingr   r   Útorch.nnÚnnÚnumpyr
   ÚModuler   r/   r	   ÚfloatÚintrB   rF   rM   r+   r   r   r   r   Ú<module>   s.    &ÿÿÿÿÿ
þ
ÿ