o
    rq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   )FZkl_divZlog_softmaxZsoftmaxsummean)pqZfilter_scoresZp_lossZq_lossZloss r   l/home/app/PaddleOCR-VL/.venv_paddleocr/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   Zlog_qyZlog_pyZ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   Ztorch.nn.functionalnnZ
functionalr	   Ztorch.nn.modules.lossr   r   r   r   r   r   r   <module>   s
   
