o
    ip                     @   s8   d Z ddlZdejfddZdd Zdejfdd	ZdS )
zMask module.    Ncpuc                 C   s    t j| | ||d}t j||dS )a#  Create mask for subsequent steps (size, size).

    :param int size: size of mask
    :param str device: "cpu" or "cuda" or torch.Tensor.device
    :param torch.dtype dtype: result dtype
    :rtype: torch.Tensor
    >>> subsequent_mask(3)
    [[1, 0, 0],
     [1, 1, 0],
     [1, 1, 1]]
    devicedtype)out)torchonestril)sizer   r   ret r   X/home/ubuntu/.local/lib/python3.10/site-packages/funasr/models/transformer/utils/mask.pysubsequent_mask	   s   r   c                 C   s0   | |k}t |d|jdd}|d|@ S )zCreate mask for decoder self-attention.

    :param torch.Tensor ys_pad: batch of padded target sequences (B, Lmax)
    :param int ignore_id: index of padding
    :param torch.dtype dtype: result dtype
    :rtype: torch.Tensor (B, Lmax, Lmax)
    )r   r   )r   r
   r   	unsqueeze)	ys_in_pad	ignore_idys_maskmr   r   r   target_mask   s   r   c                 C   s\   t j| | ||d}|dks|| kr|S t j|d | | ||d}||d|d |df< |S )a  Create mask for decoder self-attention.

    :param int size: size of mask
    :param int vad_pos: index of vad index
    :param str device: "cpu" or "cuda" or torch.Tensor.device
    :param torch.dtype dtype: result dtype
    :rtype: torch.Tensor (B, Lmax, Lmax)
    r   r      N)r   r   zeros)r
   vad_posr   r   r   
sub_cornerr   r   r   vad_mask&   s   	r   )__doc__r   boolr   r   r   r   r   r   r   <module>   s
   