o
    ߥi}                     @   sx   d dl mZ d dl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 )    )DictN)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dd	 ZdddZdd Z	dd Z
edd Z  ZS )	NedMetriczThe ned metric computation class for classification classes.

    This metric class calculates the levenshtein distance between sentences for the whole input batches.
    c                    s"   t  j|i | g | _g | _d S N)super__init__predslabels)selfargskwargs	__class__ Q/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/metrics/ned_metric.pyr      s   
zNedMetric.__init__outputsinputsc                 C   s   t j|v rt jnt j}|| }|| }t jt jt jt jt jfD ]}||v r1|| d ur1|| } nqt|t|ks<J t|t	rO| j
| | j| d S t|tjrg| j
|  | j|  d S td)Nzonly support list or np.ndarray)r   LABELLABELSCAPTIONTEXTBOXESSCOREStype
isinstancelistr   extendr   npndarraytolist	Exception)r   r   r   
label_nameground_truthseval_resultskeyr   r   r   add   s$   
zNedMetric.addc                 C   sD   t | jt | jksJ tjtdd t| j| jD  	 iS )Nc                 S   s    g | ]\}}d t || qS )g      ?)r   	_distance).0predrefr   r   r   
<listcomp>2   s    z&NedMetric.evaluate.<locals>.<listcomp>)
lenr   r   r	   NEDr%   asarrayzipmeanitemr   r   r   r   evaluate/   s   zNedMetric.evaluateotherc                 C   s    | j |j  | j|j d S r   )r   r$   r   )r   r;   r   r   r   merge8   s   zNedMetric.mergec                 C   s   | j | jfS r   )r   r   r9   r   r   r   __getstate__<   s   zNedMetric.__getstate__c                 C   s   |    |\| _| _d S r   )r   r   r   )r   stater   r   r   __setstate__?   s   zNedMetric.__setstate__c                 C   s   | d u s|d u rt d| |krdS t| dkrt|S t|dkr&t| S tt| t|}|dkr5dS dd }|| || S )Nz#Argument (pred or ref) is NoneType.g        r   c                 S   s   dgt |d  }dgt |d  }tt |D ]}|||< qtt | D ]:}|d |d< tt |D ]&}d}| | || krAd}t|| d ||d  d || | ||d < q3||}}q%|t | S )Nr   r   )r3   rangemin)s0s1v0v1ijcostr   r   r   levenshteinQ   s   
2z(NedMetric._distance.<locals>.levenshtein)	TypeErrorr3   max)r0   r1   m_lenrI   r   r   r   r.   C   s   zNedMetric._distance)r;   r   )__name__
__module____qualname____doc__r   r   r-   r:   r<   r=   r?   staticmethodr.   __classcell__r   r   r   r   r      s    
	r   )typingr   numpyr%   modelscope.metainfor   modelscope.outputsr   modelscope.utils.registryr   baser   builderr   r	   register_moduler4   r   r   r   r   r   <module>   s   