
    +sg'                        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j0                  e      Z G d
 de      Zy)    )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
    c                   t         |           || _        || _        || _        || _        |	| _        t        | j                        t        | j                        k(  sJ t        | j                        t        | j                        k(  sJ |rt        |      nd| _	        |
xs g | _
        || _        |Lt        j                         t        j                  k(  xs% t        j                         t        j                   k(  }|| _        d|rd|z   ndz   dz   | _        ddg| _        || _        | j+                  | j                         y)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_ z_results.csvepochsteps)super__init__anchors	positives	negativesnametruncate_dimlenr   main_distance_functionsimilarity_fn_names
batch_sizeloggergetEffectiveLevelloggingINFODEBUGshow_progress_barcsv_filecsv_headers	write_csv_append_csv_headers)selfr   r   r   r   r   r    r&   r)   r   r   	__class__s              d/var/www/html/venv/lib/python3.12/site-packages/sentence_transformers/evaluation/TripletEvaluator.pyr   zTripletEvaluator.__init__:   s#   B 	""	(4<< C$77774<< C$7777Tj&89O&Ppt##6#<" $$((*gll:if>V>V>X\c\i\i>i  "314S4ZRPSaa#W-"  !9!9:    c                N    |D ]   }| j                   j                  d|        " y )N	accuracy_)r(   append)r+   r   fn_names      r-   r*   z$TripletEvaluator._append_csv_headersu   s,    * 	;G##iy$9:	;r.   c                    g }g }g }|D ]\  }|j                  |j                  d          |j                  |j                  d          |j                  |j                  d          ^  | |||fi |S )Nr         )r1   texts)clsexampleskwargsr   r   r   examples          r-   from_input_examplesz$TripletEvaluator.from_input_examplesy   sy    		 	/GNN7==+,W]]1-.W]]1-.	/ 7Iy;F;;r.   c                   |dk7  r|dk(  rd| }nd| d| d}nd}| j                   |d| j                    dz  }t        j                  d	| j                   d
| d       | j                   
t	               n|j                  | j                         5  |j                  | j                  | j                  | j                  d      }|j                  | j                  | j                  | j                  d      }|j                  | j                  | j                  | j                  d      }d d d        | j                  s-|j                  g| _        | j                  | j                         d d d d d}	i }
| j                  D ]a  }||	v s |	|         \  }}t        j                   ||k        }||
| d<   t        j                  d|j#                          d|d       c |&| j$                  rt&        j(                  j+                  || j,                        }t&        j(                  j/                  |      svt1        |ddd      5 }t3        j4                  |      }|j7                  | j8                         |j7                  ||gt;        |
j=                               z          d d d        nZt1        |ddd      5 }t3        j4                  |      }|j7                  ||gt;        |
j=                               z          d d d        t?        | j                        dkD  rtA        |
j=                               |
d<   | jB                  ratD        jF                  dtD        jH                  dtD        jJ                  dtD        jL                  d ijO                  | jB                        | _(        n7t?        | j                        dkD  rd| _(        n| j                  d!    d| _(        | jS                  |
| j                        }
| jU                  ||
       |
S # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   ,xY w)"Nz 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                2    t        | |      t        | |      fS N)r   r   r   r   s      r-   <lambda>z+TripletEvaluator.__call__.<locals>.<lambda>   s    ';';= r.   c                j    t        j                  | |z  d      t        j                  | |z  d      fS )Nr=   )axis)npsumrC   s      r-   rD   z+TripletEvaluator.__call__.<locals>.<lambda>   s/    w*4w*4: r.   c                2    t        | |      t        | |      fS rB   )r	   rC   s      r-   rD   z+TripletEvaluator.__call__.<locals>.<lambda>       *7I>*7I>@ r.   c                2    t        | |      t        | |      fS rB   )r   rC   s      r-   rD   z+TripletEvaluator.__call__.<locals>.<lambda>   rJ   r.   )cosinedot	manhattan	euclidean	_accuracyz	Accuracy z Distance:	z.2%wzutf-8)newlinemodeencodingar4   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_namer*   rG   mean
capitalizer)   ospathjoinr'   isfileopencsvwriterwriterowr(   listvaluesr   maxr   r   COSINEDOT_PRODUCT	EUCLIDEAN	MANHATTANgetprimary_metricprefix_name_to_metrics store_metrics_in_model_card_data)r+   modeloutput_pathr   r   out_txtembeddings_anchorsembeddings_positivesembeddings_negativessimilarity_functionsmetricsr2   positive_scoresnegative_scoresaccuracycsv_pathfrg   s                     r-   __call__zTripletEvaluator.__call__   s    B;{)%1&ugWUG6BG():):(;1==GDTYYKxX_W``abc"//7[]U=_=_`d`q`q=r 	!&??"&"8"8!%	 ". " $)<<??"&"8"8!%	 $0 $  $)<<??"&"8"8!%	 $0 $ 	( ''(-(@(@'AD$$$T%=%=> 
& // 	ZG..3P3G3P&(<>R40 77?_#DE197)9-.i(:(:(<'=\(SVXY	Z "t~~ww||K?H77>>(+(BS7K Mq ZZ]FOOD$4$45OOUENT'..:J5K$KLM M (BS7K Mq ZZ]FOOUENT'..:J5K$KLM t''(1,&)'..*:&;GN#&&"))+<"..",,.B",,.B	#
 c$--.  4++,q0&4#)-)A)A!)D(EY&O#--gtyyA--eW=i	 	pM MM Ms'   BPAP)	AP6P&)P36Q )Nr      FTNN)r   	list[str]r   r   r   r   r   zstr | SimilarityFunction | Noner   strr    intr&   boolr)   r   r   z
int | Noner   z?list[Literal['cosine', 'dot', 'euclidean', 'manhattan']] | None)r8   zlist[InputExample])Nr=   r=   )
rt   r   ru   r   r   r   r   r   returnzdict[str, float])
__name__
__module____qualname____doc__r   r*   classmethodr;   r   __classcell__)r,   s   @r-   r   r      s    !P CG"'#'_c9;9; 9; 	9;
 !@9; 9; 9;  9; 9; !9; ]9;v; 	< 	< bdc(c7:cJMc[^c	cr.   r   )
__future__r   rf   r#   ra   
contextlibr   typingr   r   numpyrG   sklearn.metrics.pairwiser   r   r	   2sentence_transformers.evaluation.SentenceEvaluatorr
   sentence_transformers.readersr   *sentence_transformers.similarity_functionsr   )sentence_transformers.SentenceTransformerr   	getLoggerr   r!   r    r.   r-   <module>r      sP    " 
  	 " )  t t P 6 IM			8	$R( Rr.   