o
    rqi}                     @   sp   d dl mZmZ d dlZd dlmZ d dlmZ d dl	m
Z
mZ d dlmZ e
jeejdG dd	 d	eZdS )
    )DictListN)Metrics)Metric)METRICS
MetricKeys)default_group)Z	group_keymodule_namec                   @   s   e Zd ZdZddedefddZdeeef deeef fd	d
Z	dd Z
edd Zdd Zdd ZdddZdd Zdd ZdS )TextRankingMetrica8  The metric computation class for text ranking classes.

    This metric class calculates mrr and ndcg metric for the whole evaluation dataset.

    Args:
        target_text: The key of the target text column in the `inputs` arg.
        pred_text: The key of the predicted text column in the `outputs` arg.
       mrr_kndcg_kc                 C   s"   g | _ g | _g | _|| _|| _d S Nlabelsqidslogitsr   r   )selfr   r    r   m/home/app/PaddleOCR-VL/.venv_paddleocr/lib/python3.10/site-packages/modelscope/metrics/text_ranking_metric.py__init__   s
   
zTextRankingMetric.__init__outputsinputsc                 C   st   | j |d    | j|d    |d d   }| |	 }| j
| d S )Nr   qidr   )r   extendpopdetachcpunumpyr   Zsqueeze_sigmoidtolistr   )r   r   r   r   r   r   r   add    s
   zTextRankingMetric.addc                 C   s   i }t | j| j| jD ]\}}}||vrg ||< || ||f q|D ]}t|| dd d||< q$tj| |tj	| 
|iS )Nc                 S      | d S Nr   r   xr   r   r   <lambda>0       z,TextRankingMetric.evaluate.<locals>.<lambda>)key)zipr   r   r   appendsortedr   ZMRR_compute_mrrZNDCG_compute_ndcg)r   Zrank_resultr   Zscorelabelr   r   r   evaluate(   s   zTextRankingMetric.evaluatec                 C   s   t | dt |   S )Nr   )npexp)r   r   r   r   r    7   s   zTextRankingMetric._sigmoidc                 C   sx   d}|  D ]/}t|dd dd}d}t|d | j D ]\}}t|d dkr0d|d  } nq||7 }q|t| S )	Nr   c                 S   r#   r$   r   r%   r   r   r   r'   >   r(   z0TextRankingMetric._compute_mrr.<locals>.<lambda>Tr)   reverser   1g      ?)valuesr,   	enumerater   strlen)r   resultZmrrres
sorted_resarindexeler   r   r   r-   ;   s   
zTextRankingMetric._compute_mrrc                 C   s   d}ddl m} | D ]-}t|dd dd}tdd |D g}td	d |D g}|t|||| jd
7 }q|t| S )Nr   )
ndcg_scorec                 S   s   dgS r$   r   r%   r   r   r   r'   K   s    z1TextRankingMetric._compute_ndcg.<locals>.<lambda>Tr3   c                 S      g | ]}|d  qS )r   r   .0r?   r   r   r   
<listcomp>L       z3TextRankingMetric._compute_ndcg.<locals>.<listcomp>c                 S   rA   )r   r   rB   r   r   r   rD   M   rE   )k)	Zsklearn.metricsr@   r6   r,   r1   arrayfloatr   r9   )r   r:   Zndcgr@   r;   r<   r   Zscoresr   r   r   r.   G   s   zTextRankingMetric._compute_ndcgotherc                 C   s.   | j |j  | j|j | j|j d S r   )r   r   r   r   )r   rI   r   r   r   mergeQ   s   zTextRankingMetric.mergec                 C   s   | j | j| j| j| jfS r   r   )r   r   r   r   __getstate__V   s   zTextRankingMetric.__getstate__c                 C   s$   |    |\| _| _| _| _| _d S r   )r   r   r   r   r   r   )r   stater   r   r   __setstate__Y   s   zTextRankingMetric.__setstate__N)r   r   )rI   r
   )__name__
__module____qualname____doc__intr   r   r8   r   r"   r0   staticmethodr    r-   r.   rJ   rK   rM   r   r   r   r   r
      s    	"


r
   )typingr   r   r   r1   Zmodelscope.metainfor   Zmodelscope.metrics.baser   Zmodelscope.metrics.builderr   r   Zmodelscope.utils.registryr   Zregister_moduleZtext_ranking_metricr
   r   r   r   r   <module>   s   