o
    /ѹg"                     @   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__ a/Users/admin/.pyenv/versions/3.10.0/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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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   r1   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__)r1   r   )__name__
__module____qualname____doc__r   r   r#   staticmethodtorchZTensorfloatr   r   npZndarrayintr   r   strr0   r2   r3   r5   __classcell__r   r   r   r   r      s    
 
r   )r-   typingr   r   Z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   