o
    ߥi(                     @   s   d dl mZ d dlZd dlmZmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ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 )    )DictN)accuracy_scoref1_score)Metrics)
OutputKeys)default_group)torch_nested_detachtorch_nested_numpify   )Metric)METRICS
MetricKeys)	group_keymodule_namec                       s^   e Zd ZdZejejf fdd	ZdedefddZ	dd	 Z
dddZdd Zdd Z  ZS )SequenceClassificationMetrica  The metric computation class for sequence classification tasks.

    This metric class calculates accuracy/F1 of all the input batches.

    Args:
        label_name: The key of label column in the 'inputs' arg.
        logit_name: The key of logits column in the 'inputs' arg.
    c                    s.   t  j|i | g | _g | _|| _|| _d S N)super__init__predslabels
label_name
logit_name)selfr   r   argskwargs	__class__ e/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/metrics/sequence_classification_metric.pyr      s
   
z%SequenceClassificationMetric.__init__outputsinputsc                 C   s@   || j  }|| j }| jtt| | jtt| d S r   )r   r   r   appendr	   r   r   )r   r   r    ground_truthseval_resultsr   r   r   add(   s   



z SequenceClassificationMetric.addc              
   C   s   t j| jdd}t j| jdd}t|jdksJ dt j|dd}|jd dkrKtjt	||tj
t||ddtjt||ddi}|tj
 |tj< |S tjt	||tjt||d	di}|tj |tj< |S )
Nr   )axis   zOnly support predictions with shape: (batch_size, num_labels),multi-label classification is not supported in this metric class.r
   micro)averagemacrobinary)npconcatenater   r   lenshapeargmaxr   ACCURACYr   Micro_F1r   Macro_F1F1	Binary_F1)r   r   r   	preds_maxmetricsr   r   r   evaluate0   s(   z%SequenceClassificationMetric.evaluateotherc                 C   s    | j |j  | j|j d S r   )r   extendr   )r   r8   r   r   r   mergeK   s   z"SequenceClassificationMetric.mergec                 C   s   | j | j| j| jfS r   )r   r   r   r   )r   r   r   r   __getstate__O   s   z)SequenceClassificationMetric.__getstate__c                 C   s    |    |\| _| _| _| _d S r   )r   r   r   r   r   )r   stater   r   r   __setstate__R   s   z)SequenceClassificationMetric.__setstate__)r8   r   )__name__
__module____qualname____doc__r   LABELSLOGITSr   r   r$   r7   r:   r;   r=   __classcell__r   r   r   r   r      s    

r   )typingr   numpyr+   sklearn.metricsr   r   modelscope.metainfor   modelscope.outputsr   modelscope.utils.registryr   modelscope.utils.tensor_utilsr   r	   baser   builderr   r   register_moduleseq_cls_metricr   r   r   r   r   <module>   s   