
    9i"                         S SK r S SKJrJr  S SKrS SKrS SKJs  J	r
  S SKJr  S SKJr  S SKJr  SSKJr  SSKJrJr  \R,                  " \\R.                  S	9 " S
 S\5      5       rg)    N)DictUnion)Metrics)
OutputKeys)default_group   )Metric)METRICS
MetricKeys)	group_keymodule_namec                     ^  \ rS rSrSrU 4S jrS\S\4S jr\S\	R                  S\	R                  S	\4S
 j5       r\S\\R                  \	R                  4   S	\4S j5       rS\4S jrS	\\\4   4S jrSS jrS rS rSrU =r$ )	PplMetric   ztThe metric computation class for any classes.

This metric class calculates perplexity for the whole input batches.
c                 B   > [         TU ]  " U0 UD6  SU l        SU l        g )Ng        r   )super__init__avg_loss	batch_num)selfargskwargs	__class__s      ]/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/modelscope/metrics/ppl_metric.pyr   PplMetric.__init__   s#    $)&)!    outputsinputsc                    U[         R                     nU[         R                     nU R                  X45      nU R	                  U[         R                     5      nU R                  XV5      U l        U =R                  U-  sl        g N)r   LOGITSLABELS	_get_loss_get_batch_num_average_lossr   r   )r   r   r   logitslabelsin_lossin_batch_nums          r   addPplMetric.add   sk    **+
))*..0**6*2C2C+DE**7A,&r   r&   r'   returnc                     UR                  S5      nU R                  UR                  S   S5      n [        R                  " X5      R	                  5       $ )Nr   )viewshapeFcross_entropyitem)r&   r'   s     r   r#   PplMetric._get_loss'   s?    RV\\!_b1v.3355r   matrixc                      U R                   S   $ )Nr   )r0   )r5   s    r   r$   PplMetric._get_batch_num-   s    ||Ar   r(   c                 ^    U R                   U R                  -  X-  -   U R                  U-   -  $ r    r   r   )r   r(   r)   s      r   r%   PplMetric._average_loss1   s0    .1GG~~,. 	.r   c                 b    [         R                  [        R                  " U R                  5      0$ r    )r   PPLmathexpr   r   s    r   evaluatePplMetric.evaluate5   s     788r   c                     U R                  UR                  UR                  5      U l        U =R                  UR                  -  sl        g r    )r%   r   r   )r   others     r   mergePplMetric.merge8   s0    **5>>5??K%//)r   c                 2    U R                   U R                  4$ r    r9   r?   s    r   __getstate__PplMetric.__getstate__<   s    }}dnn,,r   c                 B    U R                  5         Uu  U l        U l        g r    )r   r   r   )r   states     r   __setstate__PplMetric.__setstate__?   s    (-%t~r   r9   )rC   r   )__name__
__module____qualname____firstlineno____doc__r   r   r*   staticmethodtorchTensorfloatr#   r   npndarrayintr$   r%   strr@   rD   rG   rK   __static_attributes____classcell__)r   s   @r   r   r      s    
 
'4 ' ' 6%,, 6 6 6 6
 uRZZ%=> 3  .U .9$sEz* 9*-. .r   r   )r=   typingr   r   numpyrV   rS   torch.nn.functionalnn
functionalr1   modelscope.metainfor   modelscope.outputsr   modelscope.utils.registryr   baser	   builderr
   r   register_moduler<   r    r   r   <module>rh      sU          ' ) 3  ( 	=gkkJ/. /. K/.r   