o
    i                     @   s   d Z ddlZddlZddlZddlmZ ddlmZmZ ddlm  m	Z
 ddlmZ ddlm  m  mZ G dd dejZdS )z&Multi-Head Attention layer definition.    N)nn)OptionalTuple)make_pad_maskc                       s*   e Zd ZdZ fddZdddZ  ZS )CosineDistanceAttentionzCompute Cosine Distance between spk decoder output and speaker profile
    Args:
        profile_path: speaker profile file path (.npy file)
    c                    s   t    tjdd| _d S )Ndim)super__init__r   Softmaxsoftmax)self	__class__ R/home/ubuntu/.local/lib/python3.10/site-packages/funasr/models/sa_asr/attention.pyr      s   
z CosineDistanceAttention.__init__Nc           
      C   s   | d}|durDt|dddddf |j}tttjd|j	d j	j
}tj|| ddd||}| ||d}n$|ddddddddf }tj|| d|jdd}| |}t|||j}	|	|fS )	z|
        Args:
            spk_decoder_out(torch.Tensor):(B, L, D)
            spk_profiles(torch.Tensor):(B, N, D)
           Nr   )dtype   r   r   g        )	unsqueezer   todevicefloatnumpyfinfotorchtensorr   minFcosine_similaritymasked_fillr   matmul)
r   spk_decoder_outprofileprofile_lensxmask	min_valueweights_not_softmaxweightsspk_embeddingr   r   r   forward   s   
"" 
zCosineDistanceAttention.forward)N)__name__
__module____qualname____doc__r   r,   __classcell__r   r   r   r   r      s    r   )r0   mathr   r   r   typingr   r   torch.nn.functional
functionalr   *funasr.models.transformer.utils.nets_utilsr   funasr.models.lora.layersmodelsloralayersModuler   r   r   r   r   <module>   s   