
    si'2                         d dl Z d dlZd dlZd dlmZ d dlmZmZmZm	Z	 d dl
Zd dlZd dlZd dlmZmZ d dlmZ d dlmZ erd dlmZ  ej        e          Z G d d	e          ZdS )
    N)nullcontext)TYPE_CHECKINGCallableDictOptional)average_precision_score
ndcg_score)SentenceEvaluator)cos_sim)SentenceTransformerc                        e Zd ZdZdddedddddf	ded	ed
edee	j
        e	j
        ge	j
        f         dedededee         dee         f fdZ	 ddddedededeeef         f
dZd Zd Zd Z xZS )RerankingEvaluatora  
    This class evaluates a SentenceTransformer model for the task of re-ranking.

    Given a query and a list of documents, it computes the score [query, doc_i] for all possible
    documents and sorts them in decreasing order. Then, MRR@10, NDCG@10 and MAP is compute to measure the quality of the ranking.

    Args:
        samples (list): A list of dictionaries, where each dictionary represents a sample and has the following keys:
            - 'query': The search query.
            - 'positive': A list of positive (relevant) documents.
            - 'negative': A list of negative (irrelevant) documents.
        at_k (int, optional): Only consider the top k most similar documents to each query for the evaluation. Defaults to 10.
        name (str, optional): Name of the evaluator. Defaults to "".
        write_csv (bool, optional): Write results to CSV file. Defaults to True.
        similarity_fct (Callable[[torch.Tensor, torch.Tensor], torch.Tensor], optional): Similarity function between sentence embeddings. By default, cosine similarity. Defaults to cos_sim.
        batch_size (int, optional): Batch size to compute sentence embeddings. Defaults to 64.
        show_progress_bar (bool, optional): Show progress bar when computing embeddings. Defaults to False.
        use_batched_encoding (bool, optional): Whether or not to encode queries and documents in batches for greater speed, or 1-by-1 to save memory. Defaults to True.
        truncate_dim (Optional[int], optional): The dimension to truncate sentence embeddings to. `None` uses the model's current truncation dimension. Defaults to None.
        mrr_at_k (Optional[int], optional): Deprecated parameter. Please use `at_k` instead. Defaults to None.
    
    T@   FNat_kname	write_csvsimilarity_fct
batch_sizeshow_progress_baruse_batched_encodingtruncate_dimmrr_at_kc                    t                                                       || _        || _        |
&t                              d|
 d           |
| _        n|| _        || _        || _        || _	        || _
        |	| _        t          | j        t                    r+t          | j                                                  | _        d | j        D             | _        d|rd|z   ndz   d| j         dz   | _        d	d
dd                    | j                  d                    | j                  g| _        || _        d| _        d S )Nz?The `mrr_at_k` parameter has been deprecated; please use `at_k=z
` instead.c                 v    g | ]6}t          |d                    dk    t          |d                   dk    4|7S )positiver   negativelen.0samples     f/var/www/icac/venv/lib/python3.11/site-packages/sentence_transformers/evaluation/RerankingEvaluator.py
<listcomp>z/RerankingEvaluator.__init__.<locals>.<listcomp>M   sQ     
 
 
VJ5G1H1H11L1LQTU[\fUgQhQhklQlQlFQlQlQl    r   _r   z
_results_@z.csvepochstepsMAPzMRR@{}zNDCG@{}map)super__init__samplesr   loggerwarningr   r   r   r   r   r   
isinstancedictlistvaluescsv_fileformatcsv_headersr   primary_metric)selfr.   r   r   r   r   r   r   r   r   r   	__class__s              r$   r-   zRerankingEvaluator.__init__,   sV    		NNq]eqqqrrr DIIDI,$!2$8!(dlD)) 	7 3 3 5 566DL
 
!%
 
 
 -d0Jd

KNj[_[dNjNjNjjOODI&&TY''
 ##r&   modelr   output_pathr(   r)   returnc                    |dk    r|dk    rd| }nd| d| d}nd}| j         |d| j          d	z  }t                              d
| j         d| d           |                     |          }|d         }|d         }|d         }	d | j        D             }
d | j        D             }t                              d                    t          | j                  t          j	        |
          t          j
        |
          t          j        |
          t          j	        |          t          j
        |          t          j        |                               t                              d                    |dz                       t                              d                    | j        |dz                       t                              d                    | j        |	dz                       || j        rt          j                            || j                  }t          j                            |          }t'          |d|rdndd          5 }t)          j        |          }|s|                    | j                   |                    |||||	g           ddd           n# 1 swxY w Y   d|d| j         |d| j         |	i}|                     || j                  }|                     ||           |S )a  
        Evaluates the model on the dataset and returns the evaluation metrics.

        Args:
            model (SentenceTransformer): The SentenceTransformer model to evaluate.
            output_path (str, optional): The output path to write the results. Defaults to None.
            epoch (int, optional): The current epoch number. Defaults to -1.
            steps (int, optional): The current step number. Defaults to -1.

        Returns:
            Dict[str, float]: A dictionary containing the evaluation metrics.
        r;   z after epoch z
 in epoch z after z stepsr   Nz (truncated to )z0RerankingEvaluator: Evaluating the model on the z dataset:r+   mrrndcgc                 8    g | ]}t          |d                    S )r   r   r!   s     r$   r%   z/RerankingEvaluator.__call__.<locals>.<listcomp>}   %    LLLVVJ/00LLLr&   c                 8    g | ]}t          |d                    S )r   r   r!   s     r$   r%   z/RerankingEvaluator.__call__.<locals>.<listcomp>~   rE   r&   zmQueries: {} 	 Positives: Min {:.1f}, Mean {:.1f}, Max {:.1f} 	 Negatives: Min {:.1f}, Mean {:.1f}, Max {:.1f}zMAP: {:.2f}d   zMRR@{}: {:.2f}zNDCG@{}: {:.2f}awzutf-8)newlinemodeencodingzmrr@zndcg@)r   r/   infor   compute_metricesr.   r6   r    npminmeanmaxr   r   ospathjoinr5   isfileopencsvwriterwriterowr7   prefix_name_to_metrics store_metrics_in_model_card_data)r9   r<   r=   r(   r)   out_txtscoresmean_apmean_mrr	mean_ndcgnum_positivesnum_negativescsv_pathoutput_file_existsfrY   metricss                    r$   __call__zRerankingEvaluator.__call__\   sS    B;;{{1%11BuBBUBBBG(=):====GdtyddZadddeee&&u---%=6N	 MLt|LLLLLt|LLL}  E  EDL!!}%%&&}%%}%%&&}%% 
	
 
	
 
	
 	M((377888$++DIx#~FFGGG%,,TY	CHHIII "t~"w||K??H!#!9!9h8J1SPS^efff NjkA) 6OOD$4555w) LMMMN N N N N N N N N N N N N N N 749DI

 --gtyAA--eW===s   AJ11J58J5c                 d    | j         r|                     |          n|                     |          S )a  
        Computes the evaluation metrics for the given model.

        Args:
            model (SentenceTransformer): The SentenceTransformer model to compute metrics for.

        Returns:
            Dict[str, float]: A dictionary containing the evaluation metrics.
        )r   compute_metrices_batchedcompute_metrices_individual)r9   r<   s     r$   rN   z#RerankingEvaluator.compute_metrices   s8     (9D))%00011%88	
r&   c                 X   g }g }g }| j         t                      n|                    | j                   5  |                    d | j        D             d| j        | j                  }g }| j        D ]8}|                    |d                    |                    |d                    9|                    |d| j        | j                  }ddd           n# 1 swxY w Y   d\  }	}
| j        D ]w}||	         }|	dz  }	t          |d                   }t          |d                   }||
|
|z   |z            }|
||z   z  }
|d	k    s|d	k    r_| 	                    ||          }t          |j
                  dk    r|d	         }t          j        |           }|                                                                }dg|z  d	g|z  z   }d	}t          |d	| j                           D ]\  }}||         r
d|dz   z  } n|                    |           |                    t%          |g|g| j        
                     |                    t'          ||                     yt)          j        |          }t)          j        |          }t)          j        |          }|||dS )aE  
        Computes the evaluation metrics in a batched way, by batching all queries and all documents together.

        Args:
            model (SentenceTransformer): The SentenceTransformer model to compute metrics for.

        Returns:
            Dict[str, float]: A dictionary containing the evaluation metrics.
        Nc                     g | ]
}|d          S )query r!   s     r$   r%   z?RerankingEvaluator.compute_metrices_batched.<locals>.<listcomp>   s    <<<V<<<r&   Tconvert_to_tensorr   r   r   r   )r   r      r   kr+   rB   rC   )r   r   truncate_sentence_embeddingsencoder.   r   r   extendr    r   shapetorchargsortcputolist	enumerater   appendr	   r   rO   rQ   )r9   r<   all_mrr_scoresall_ndcg_scoresall_ap_scoresall_query_embsall_docsr#   all_docs_embs	query_idxdocs_idxinstance	query_embnum_posnum_negdocs_embpred_scorespred_scores_argsortis_relevant	mrr_scorerankindexr_   r`   ra   s                            r$   rj   z+RerankingEvaluator.compute_metrices_batched   s6    "/7[]]]U=_=_`d`q=r=r 	 	"\\<<t|<<<"&?"&"8	 *  N H, 4 4z 2333z 23333!LLDT_`d`v )  M	 	 	 	 	 	 	 	 	 	 	 	 	 	 	& #	8  	T  	TH&y1INI(:.//G(:.//G$X70BW0L%LMH'))H!||w!||--iBBK;$%%)))!n"'-"="=%//++2244K #-1#-7KI()<Q])KLL  eu%  !TAXIE !!),,, "":{mk]di#X#X#XYYY   !8k!R!RSSSS'-((7>**GO,,	xCCCs   BCC!Cc                    g }g }g }t          j         | j        | j         d          D ]}|d         }t          |d                   }t          |d                   }t	          |          dk    st	          |          dk    r\||z   }	dgt	          |          z  dgt	          |          z  z   }
| j        t                      n|                    | j                  5  |                    |gd	| j	        d
          }|                    |	d	| j	        d
          }ddd           n# 1 swxY w Y   | 
                    ||          }t	          |j                  dk    r|d         }t          j        |           }|                                                                }d}t!          |d| j                           D ]\  }}|
|         r
d|dz   z  } n|                    |           |                    t'          |
g|g| j                             |                    t)          |
|                     t+          j        |          }t+          j        |          }t+          j        |          }|||dS )aO  
        Computes the evaluation metrics individually by embedding every (query, positive, negative) tuple individually.

        Args:
            model (SentenceTransformer): The SentenceTransformer model to compute metrics for.

        Returns:
            Dict[str, float]: A dictionary containing the evaluation metrics.
        Samples)disabledescrn   r   r   r   rr   NTFrp   rs   ru   )tqdmr.   r   r3   r    r   r   rv   rw   r   r   ry   rz   r{   r|   r}   r~   r   r   r	   r   rO   rQ   )r9   r<   r   r   r   r   rn   r   r   docsr   r   r   r   r   r   r   r   r_   r`   ra   s                        r$   rk   z.RerankingEvaluator.compute_metrices_individual   s    	$,D<R8RYbccc &	T &	THW%EHZ011HHZ011H8}}!!S]]a%7%7h&D#H-c(mm0CCK"&"3";AcAcdhduAvAv  !LLGtch )  	 !<<DT_`e (  	               --iBBK;$%%)))!n"'-"="=%//++2244K I()<Q])KLL  eu%  !TAXIE !!),,, "":{mk]di#X#X#XYYY   !8k!R!RSSSS'-((7>**GO,,	xCCCs    >D**D.	1D.	)Nr;   r;   )__name__
__module____qualname____doc__r   intstrboolr   rz   Tensorr   r-   r   floatrh   rN   rj   rk   __classcell__)r:   s   @r$   r   r      sx        2 OV"'%)&*"&.$ .$ .$ 	.$
 .$ !%,!=u|!KL.$ .$  .$ #.$ sm.$ 3-.$ .$ .$ .$ .$ .$b dfE E*E9<ELOE]`E	c5j	E E E EN
 
 
 HD HD HDT:D :D :D :D :D :D :Dr&   r   )rX   loggingrS   
contextlibr   typingr   r   r   r   numpyrO   rz   r   sklearn.metricsr   r	   2sentence_transformers.evaluation.SentenceEvaluatorr
   sentence_transformers.utilr   )sentence_transformers.SentenceTransformerr   	getLoggerr   r/   r   ro   r&   r$   <module>r      s&   



  				 " " " " " " : : : : : : : : : : : :       ? ? ? ? ? ? ? ? P P P P P P . . . . . . NMMMMMM		8	$	$bD bD bD bD bD* bD bD bD bD bDr&   