
    9i                     J    S SK r S SKJs  Jr  S SKJr  SS jr " S S\5      rg)    N)_Lossc                    [         R                  " [         R                  " U SS9[         R                  " USS9SS9n[         R                  " [         R                  " USS9[         R                  " U SS9SS9nUR	                  SS9nUR	                  SS9nUb  X#-  nX$-  nUR                  5       nUR                  5       nX4-   S-  nU$ )Ndimnone	reduction   )Fkl_divlog_softmaxsoftmaxsummean)pqfilter_scoresp_lossq_losslosss         e/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/modelscope/utils/nlp/space/criterions.pycompute_kl_lossr      s    XX	aR !))A2"6&JFXX	aR !))A2"6&JF ZZBZFZZBZF  ''[[]F[[]FOq DK    c                   6   ^  \ rS rSrSrSU 4S jjrS rSrU =r$ )	CatKLLoss   z
CatKLLoss
c                 F   > [         [        U ]  5         US;   d   eXl        g )N)r   r   r   )superr   __init__r
   )selfr
   	__class__s     r   r    CatKLLoss.__init__#   s$    i')3333"r   c                     [         R                  " U5      n[         R                  " X1U-
  -  SS9nU R                  S:X  a  UR	                  5       nU$ U R                  S:X  a  UR                  5       nU$ )zl
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kls        r   forwardCatKLLoss.forward(   se     YYvYYrf_-15>>V#B 	 ^^u$B	r   r	   )r   )	__name__
__module____qualname____firstlineno____doc__r    r,   __static_attributes____classcell__)r"   s   @r   r   r      s    #
 r   r   )N)	r&   torch.nn.functionalnn
functionalr   torch.nn.modules.lossr   r   r    r   r   <module>r:      s$       ', r   