o
    W+ i                     @   s   d dl mZ d dl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)Z	group_keymodule_namec                       sT   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
  ZS )InbatchRecallMetriczThe metric computation class for in-batch retrieval classes.

    This metric class calculates in-batch image recall@1 for each input batch.
    c                    s"   t  j|i | g | _g | _d S N)super__init__inbatch_t2i_hitcntsbatch_sizes)selfargskwargs	__class__ t/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/modelscope/metrics/inbatch_recall_metric.pyr      s   
zInbatchRecallMetric.__init__outputsinputsc           
      C   s   |t j }|t j }t|tjkrt|tjksJ t > ||  }| }|jd }t	|
 }||j}|d|k   }	| j|	 | j| W d    d S 1 s_w   Y  d S )Nr   )r   ZIMG_EMBEDDINGZTEXT_EMBEDDINGtypetorchZTensorZno_gradtshapeZarangelongtoZdeviceZargmaxsumfloatitemr   appendr   )
r   r   r   Zimage_featuresZtext_featuresZlogits_per_imageZlogits_per_textZ
batch_sizeZground_truthZinbatch_t2i_hitcntr   r   r   add   s&   



"zInbatchRecallMetric.addc                 C   s@   t | jt | jkrt | jdksJ tjt| jt| j iS )Nr   )lenr   r   r	   ZBatchAccr!   r   r   r   r   evaluate1   s   
zInbatchRecallMetric.evaluateotherc                 C   s    | j |j  | j|j d S r   )r   extendr   )r   r)   r   r   r   merge9   s   zInbatchRecallMetric.mergec                 C   s   | j | jfS r   )r   r   r'   r   r   r   __getstate__=   s   z InbatchRecallMetric.__getstate__c                 C   s   |    |\| _| _d S r   )r   r   r   )r   stater   r   r   __setstate__@   s   z InbatchRecallMetric.__setstate__)r)   r   )__name__
__module____qualname____doc__r   r   r%   r(   r+   r,   r.   __classcell__r   r   r   r   r      s    
r   )typingr   numpynpr   Zmodelscope.metainfor   Zmodelscope.outputsr   Zmodelscope.utils.registryr   baser   Zbuilderr   r	   Zregister_moduleZinbatch_recallr   r   r   r   r   <module>   s   