o
    rqi"                     @   s   d dl Z d dlmZmZ d dlZd dlZd dlm  m	Z
 d dlmZ d dlmZ d dlmZ ddlmZ ddlmZmZ ejeejd	G d
d deZdS )    N)DictUnion)Metrics)
OutputKeys)default_group   )Metric)METRICS
MetricKeys)Z	group_keymodule_namec                       s   e Zd ZdZ fddZdedefddZedej	d	ej	d
e
fddZedeejej	f d
efddZde
fddZd
eee
f fddZdddZdd Zdd Z  ZS )	PplMetricz|The metric computation class for any classes.

    This metric class calculates perplexity for the whole input batches.
    c                    s"   t  j|i | d| _d| _d S )Ng        r   )super__init__avg_loss	batch_num)selfargskwargs	__class__ d/home/app/PaddleOCR-VL/.venv_paddleocr/lib/python3.10/site-packages/modelscope/metrics/ppl_metric.pyr      s   
zPplMetric.__init__outputsinputsc                 C   sP   |t j }|t j }| ||}| |t j }| ||| _|  j|7  _d S N)r   ZLOGITSZLABELS	_get_loss_get_batch_num_average_lossr   r   )r   r   r   logitslabelsin_lossin_batch_numr   r   r   add   s   

zPplMetric.addr   r   returnc                 C   s,   | d}|  |jd d} t| | S )Nr   )viewshapeFZcross_entropyitem)r   r   r   r   r   r   '   s   
zPplMetric._get_lossmatrixc                 C   s
   | j d S )Nr   )r&   )r)   r   r   r   r   -   s   
zPplMetric._get_batch_numr    c                 C   s   | j | j ||  | j|  S r   r   r   )r   r    r!   r   r   r   r   1   s   zPplMetric._average_lossc                 C   s   t jt| jiS r   )r
   PPLmathexpr   r   r   r   r   evaluate5   s   zPplMetric.evaluateotherc                 C   s&   |  |j|j| _|  j|j7  _d S r   )r   r   r   )r   r0   r   r   r   merge8   s   zPplMetric.mergec                 C   s   | j | jfS r   r*   r.   r   r   r   __getstate__<   s   zPplMetric.__getstate__c                 C   s   |    |\| _| _d S r   )r   r   r   )r   stater   r   r   __setstate__?   s   zPplMetric.__setstate__)r0   r   )__name__
__module____qualname____doc__r   r   r"   staticmethodtorchZTensorfloatr   r   npZndarrayintr   r   strr/   r1   r2   r4   __classcell__r   r   r   r   r      s    
 
r   )r,   typingr   r   numpyr<   r:   Ztorch.nn.functionalnnZ
functionalr'   Zmodelscope.metainfor   Zmodelscope.outputsr   Zmodelscope.utils.registryr   baser   Zbuilderr	   r
   Zregister_moduler+   r   r   r   r   r   <module>   s   