
    Ng'                        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mZmZmZ d dl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Literal)paired_cosine_distancespaired_euclidean_distancespaired_manhattan_distances)SentenceEvaluator)InputExample)SimilarityFunction)SentenceTransformerc                  ^     e Zd ZdZ	 	 	 	 	 	 	 d&d' fdZd Zed(d            Z	 d)d*d%Z xZ	S )+TripletEvaluatoram  
    Evaluate a model based on a triplet: (sentence, positive_example, negative_example).
    Checks if distance(sentence, positive_example) < distance(sentence, negative_example).

    Example:
        ::

            from sentence_transformers import SentenceTransformer
            from sentence_transformers.evaluation import TripletEvaluator
            from datasets import load_dataset

            # Load a model
            model = SentenceTransformer('all-mpnet-base-v2')

            # Load a dataset with (anchor, positive, negative) triplets
            dataset = load_dataset("sentence-transformers/all-nli", "triplet", split="dev")

            # Initialize the TripletEvaluator using anchors, positives, and negatives
            triplet_evaluator = TripletEvaluator(
                anchors=dataset[:1000]["anchor"],
                positives=dataset[:1000]["positive"],
                negatives=dataset[:1000]["negative"],
                name="all_nli_dev",
            )
            results = triplet_evaluator(model)
            '''
            TripletEvaluator: Evaluating the model on the all-nli-dev dataset:
            Accuracy Cosine Distance:        95.60%
            '''
            print(triplet_evaluator.primary_metric)
            # => "all_nli_dev_cosine_accuracy"
            print(results[triplet_evaluator.primary_metric])
            # => 0.956
    N    FTanchors	list[str]	positives	negativesmain_distance_functionstr | SimilarityFunction | Nonenamestr
batch_sizeintshow_progress_barbool	write_csvtruncate_dim
int | Nonesimilarity_fn_names?list[Literal['cosine', 'dot', 'euclidean', 'manhattan']] | Nonec                   t                                                       || _        || _        || _        || _        |	| _        t          | j                  t          | j                  k    sJ t          | j                  t          | j                  k    sJ |rt          |          nd| _	        |
pg | _
        || _        |Nt                                          t          j        k    p&t                                          t          j        k    }|| _        d|rd|z   ndz   dz   | _        ddg| _        || _        |                     | j
                   dS )a  
        Initializes a TripletEvaluator object.

        Args:
            anchors (List[str]): Sentences to check similarity to. (e.g. a query)
            positives (List[str]): List of positive sentences
            negatives (List[str]): List of negative sentences
            main_distance_function (Union[str, SimilarityFunction], optional):
                The distance function to use. If not specified, use cosine similarity,
                dot product, Euclidean, and Manhattan. Defaults to None.
            name (str): Name for the output. Defaults to "".
            batch_size (int): Batch size used to compute embeddings. Defaults to 16.
            show_progress_bar (bool): If true, prints a progress bar. Defaults to False.
            write_csv (bool): Write results to a CSV file. Defaults to True.
            truncate_dim (int, optional): The dimension to truncate sentence embeddings to.
                `None` uses the model's current truncation dimension. Defaults to None.
            similarity_fn_names (List[str], optional): List of similarity function names to evaluate.
                If not specified, evaluate using the ``similarity_fn_name`` .
                Defaults to None.
        Ntriplet_evaluation_r   z_results.csvepochsteps)super__init__r   r   r   r   r   lenr   r   r!   r   loggergetEffectiveLevelloggingINFODEBUGr   csv_filecsv_headersr   _append_csv_headers)selfr   r   r   r   r   r   r   r   r   r!   	__class__s              m/var/www/html/ai-engine/env/lib/python3.11/site-packages/sentence_transformers/evaluation/TripletEvaluator.pyr)   zTripletEvaluator.__init__:   sP   B 	""	(4<  C$7$777774<  C$7$77777Tj&t&89O&P&P&Ppt##6#<" $$((**gl:if>V>V>X>X\c\i>i  "3145OS4ZZRPSaa#W-"  !9:::::    c                J    |D ]}| j                             d|             d S )N	accuracy_)r1   append)r3   r!   fn_names      r5   r2   z$TripletEvaluator._append_csv_headersu   s>    * 	; 	;G##$9$9$9::::	; 	;r6   exampleslist[InputExample]c                    g }g }g }|D ]b}|                     |j        d                    |                     |j        d                    |                     |j        d                    c | |||fi |S )Nr         )r9   texts)clsr;   kwargsr   r   r   examples          r5   from_input_examplesz$TripletEvaluator.from_input_examplesy   s    		 	/ 	/GNN7=+,,,W]1-...W]1-....s7Iy;;F;;;r6   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           | j         t	                      n|                    | j                   5  |                    | j        | j        | j	        d          }|                    | j
        | j        | j	        d          }|                    | j        | j        | j	        d          }d d d            n# 1 swxY w Y   | j        s'|j        g| _        |                     | j                   d d d d d}	i }
| j        D ]o}||	v ri |	|         |||          \  }}t          j        ||k               }||
| d<   t                              d|                                 d|d           p|W| j        rOt&          j                            || j                  }t&          j                            |          st1          |ddd          5 }t3          j        |          }|                    | j                   |                    ||gt;          |
                                          z              d d d            n# 1 swxY w Y   nxt1          |ddd          5 }t3          j        |          }|                    ||gt;          |
                                          z              d d d            n# 1 swxY w Y   t?          | j                  dk    r$tA          |
                                          |
d<   | j!        rPtD          j#        dtD          j$        dtD          j%        dtD          j&        d i'                    | j!                  | _(        n5t?          | j                  dk    rd| _(        n| j        d!          d| _(        | )                    |
| j                  }
| *                    ||
           |
S )"NrE   z after epoch z
 in epoch z after z stepsr   z (truncated to )z.TripletEvaluator: Evaluating the model on the z dataset:T)r   r   convert_to_numpyc                B    t          | |          t          | |          fS N)r   r   r   r   s      r5   <lambda>z+TripletEvaluator.__call__.<locals>.<lambda>   s#    ';;';;= r6   c                f    t          j        | |z  d          t          j        | |z  d          fS )NrE   )axis)npsumrP   s      r5   rQ   z+TripletEvaluator.__call__.<locals>.<lambda>   s7    w*444w*444: r6   c                B    t          | |          t          | |          fS rO   )r	   rP   s      r5   rQ   z+TripletEvaluator.__call__.<locals>.<lambda>   $    *7I>>*7I>>@ r6   c                B    t          | |          t          | |          fS rO   )r   rP   s      r5   rQ   z+TripletEvaluator.__call__.<locals>.<lambda>   rW   r6   )cosinedot	manhattan	euclidean	_accuracyz	Accuracy z Distance:	z.2%wzutf-8)newlinemodeencodingar>   max_accuracycosine_accuracydot_accuracyeuclidean_accuracymanhattan_accuracyr   )+r   r+   infor   r   truncate_sentence_embeddingsencoder   r   r   r   r   r!   similarity_fn_namer2   rT   mean
capitalizer   ospathjoinr0   isfileopencsvwriterwriterowr1   listvaluesr*   maxr   r   COSINEDOT_PRODUCT	EUCLIDEAN	MANHATTANgetprimary_metricprefix_name_to_metrics store_metrics_in_model_card_data)r3   rF   rG   r&   r'   out_txtembeddings_anchorsembeddings_positivesembeddings_negativessimilarity_functionsmetricsr:   positive_scoresnegative_scoresaccuracycsv_pathfrt   s                     r5   __call__zTripletEvaluator.__call__   sO    B;;{{1%11BuBBUBBBG(=):====GbTYbbX_bbbccc"/7[]]]U=_=_`d`q=r=r 	 	!&?"&"8!%	 ". " " $)<<?"&"8!%	 $0 $ $  $)<<?"&"8!%	 $0 $ $ 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	( ' 	?(-(@'AD$$$T%=>>>     
  
& / 	Z 	ZG...3P3G3P&(<>R4 40 7?_#DEE197---.X(:(:(<(<XX(XXXYYY"t~"w||K??H7>>(++ 	M(BS7KKK Mq Z]]FOOD$4555OOUENT'..:J:J5K5K$KLLLM M M M M M M M M M M M M M M (BS7KKK Mq Z]]FOOUENT'..:J:J5K5K$KLLLM M M M M M M M M M M M M M M t'((1,,&)'..*:*:&;&;GN#& 	P")+<".",.B",.B	#
 c$-..  4+,,q00&4##)-)A!)D&O&O&O#--gtyAA--eW===s9   	A9DDD-A(J!!J%(J% ALL!L)Nr   r   FTNN)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   )r;   r<   )NrE   rE   )
rF   r   rG   r   r&   r   r'   r   rH   rI   )
__name__
__module____qualname____doc__r)   r2   classmethodrD   r   __classcell__)r4   s   @r5   r   r      s        ! !P CG"'#'_c9; 9; 9; 9; 9; 9; 9;v; ; ; 	< 	< 	< [	< bdc c c c c c c c cr6   r   )
__future__r   rs   r-   rn   
contextlibr   typingr   r   numpyrT   sklearn.metrics.pairwiser   r   r	   2sentence_transformers.evaluation.SentenceEvaluatorr
   sentence_transformers.readersr   *sentence_transformers.similarity_functionsr   )sentence_transformers.SentenceTransformerr   	getLoggerr   r+   r    r6   r5   <module>r      s(   " " " " " " 



  				 " " " " " " ) ) ) ) ) ) ) )     t t t t t t t t t t P P P P P P 6 6 6 6 6 6 I I I I I I NMMMMMM		8	$	$R R R R R( R R R R Rr6   