
    Ngn1                        d dl mZ d dlZd dlZd dlZd dlmZ d dl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 )    )annotationsN)nullcontext)TYPE_CHECKINGCallable)average_precision_score
ndcg_score)SentenceEvaluator)cos_sim)SentenceTransformerc            	      V     e Zd ZdZdddedddddf	d# fdZ	 d$d%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intnamestr	write_csvboolsimilarity_fct4Callable[[torch.Tensor, torch.Tensor], torch.Tensor]
batch_sizeshow_progress_baruse_batched_encodingtruncate_dim
int | Nonemrr_at_kc                L   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     o/var/www/html/ai-engine/env/lib/python3.11/site-packages/sentence_transformers/evaluation/RerankingEvaluator.py
<listcomp>z/RerankingEvaluator.__init__.<locals>.<listcomp>O   sQ     
 
 
VJ5G1H1H11L1LQTU[\fUgQhQhklQlQlFQlQlQl    r   _r   z
_results_@z.csvepochstepsMAPMRR@NDCG@map)super__init__samplesr   loggerwarningr   r   r   r   r   r   
isinstancedictlistvaluescsv_filecsv_headersr   primary_metric)selfr4   r   r   r   r   r   r   r   r   r   	__class__s              r(   r3   zRerankingEvaluator.__init__.   sL    		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49DI
 ##r*   modelr   output_pathr,   r-   returndict[str, float]c                   |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                   dt          j        |
          ddt          j	        |
          ddt          j
        |
          ddt          j        |          ddt          j	        |          ddt          j
        |          d           t                              d|dz  d           t                              d| j         d|dz  d           t                              d| j         d|	dz  d           || 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:r1   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>   rK   r*   z	Queries: z 	 Positives: Min z.1fz, Mean z, Max z 	 Negatives: Min zMAP: d   z.2fr/   z: r0   awzutf-8)newlinemodeencodingzmrr@zndcg@)r   r5   infor   compute_metricesr4   r$   npminmeanmaxr   r   ospathjoinr;   isfileopencsvwriterwriterowr<   prefix_name_to_metrics store_metrics_in_model_card_data)r>   rA   rB   r,   r-   out_txtscoresmean_apmean_mrr	mean_ndcgnum_positivesnum_negativescsv_pathoutput_file_existsfr_   metricss                    r(   __call__zRerankingEvaluator.__call__^   s    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 PDL))  P  Pbf]>S>S  P  P  P`b`ghu`v`v  P  P  P  CE  CI  JW  CX  CX  P  P  P  qs  qw  xE  qF  qF  P  P  P  SU  SZ  [h  Si  Si  P  P  P  uw  u{  |I  uJ  uJ  P  P  P	
 	
 	
 	/GcM///000<49<<3<<<===>DI>>S>>>??? "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   3AJ

JJ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)r>   rA   s     r(   rT   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r1   rH   rI   )r   r   truncate_sentence_embeddingsencoder4   r   r   extendr$   r   shapetorchargsortcputolist	enumerater   appendr   r   rU   rW   )r>   rA   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indexre   rf   rg   s                            r(   rp   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descrt   r!   r"   r   rx   NTFrv   ry   r{   )tqdmr4   r   r9   r$   r   r   r|   r}   r   r   r   r   r   r   r   r   r   r   r   r   rU   rW   )r>   rA   r   r   r   r   rt   r!   r"   docsr   r   r   r   r   r   r   r   re   rf   rg   s                        r(   rq   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.	)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )Nr@   r@   )
rA   r   rB   r   r,   r   r-   r   rC   rD   )__name__
__module____qualname____doc__r
   r3   rn   rT   rp   rq   __classcell__)r?   s   @r(   r   r      s         2 OV"'%)#'#.$ .$ .$ .$ .$ .$ .$b bd= = = = =~
 
 
 HD HD HDT:D :D :D :D :D :D :Dr*   r   )
__future__r   r^   loggingrY   
contextlibr   typingr   r   numpyrU   r   r   sklearn.metricsr   r   2sentence_transformers.evaluation.SentenceEvaluatorr	   sentence_transformers.utilr
   )sentence_transformers.SentenceTransformerr   	getLoggerr   r5   r   ru   r*   r(   <module>r      s,   " " " " " " 



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