o
    ߥ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)	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__ Q/home/ubuntu/.local/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   LOGITS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F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   r4   r   r   r   merge8   s   zPplMetric.mergec                 C   s   | j | jfS r   r.   r2   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__)r4   r   )__name__
__module____qualname____doc__r   r   r%   staticmethodtorchTensorfloatr   r   npndarrayintr   r    strr3   r5   r6   r8   __classcell__r   r   r   r   r      s    
 
r   )r0   typingr   r   numpyrA   r>   torch.nn.functionalnn
functionalr*   modelscope.metainfor   modelscope.outputsr   modelscope.utils.registryr   baser   builderr	   r
   register_moduler/   r   r   r   r   r   <module>   s   