o
    ॵi                     @   sD   d dl Z d dlm  mZ d dlmZ dddZG dd deZdS )    N)_Lossc                 C   s   t jt j| ddt j|dddd}t jt j|ddt j| dddd}|jdd}|jdd}|d ur<|| }|| }| }| }|| d }|S )Ndimnone)	reduction   )Fkl_divlog_softmaxsoftmaxsummean)pqfilter_scoresp_lossq_lossloss r   Y/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/utils/nlp/space/criterions.pycompute_kl_loss   s   r   c                       s*   e Zd ZdZd fdd	Zdd Z  ZS )	CatKLLossz
    CatKLLoss
    r   c                    s$   t t|   |dv sJ || _d S )N)r   r   r   )superr   __init__r   )selfr   	__class__r   r   r   #   s   
zCatKLLoss.__init__c                 C   sL   t |}t j|||  dd}| jdkr| }|S | jdkr$| }|S )z
        KL(qy|py) = Eq[qy * log(q(y) / p(y))]

        log_qy: (batch_size, latent_size)
        log_py: (batch_size, latent_size)
           r   r   r   )torchexpr   r   r   )r   log_qylog_pyqyklr   r   r   forward(   s   


zCatKLLoss.forward)r   )__name__
__module____qualname____doc__r   r%   __classcell__r   r   r   r   r      s    r   )N)	r   torch.nn.functionalnn
functionalr	   torch.nn.modules.lossr   r   r   r   r   r   r   <module>   s
   
