
    Ch-                        S SK Jr  S SKrS SKrS SKrS SKJrJr  S SKJ	r	  S SK
Jr  S SKJr  S SKJrJrJrJr  \(       a
  S SKrS SKJr  \R.                  " \5      r " S	 S
\	5      rg)    )annotationsN)TYPE_CHECKINGLiteral)SentenceEvaluator)InputExample)SimilarityFunction)pairwise_cos_simpairwise_dot_scorepairwise_euclidean_simpairwise_manhattan_sim)SentenceTransformerc                     ^  \ rS rSrSr         S
                       SU 4S jjjrS r\SS j5       r S         SS jjr	      SS jr
S rS	rU =r$ )TripletEvaluator   a
  
Evaluate a model based on a triplet: (sentence, positive_example, negative_example).
Checks if ``similarity(sentence, positive_example) > similarity(sentence, negative_example) + margin``.

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_similarity_function (Union[str, SimilarityFunction], optional):
        The similarity function to use. If not specified, use cosine similarity,
        dot product, Euclidean, and Manhattan similarity. Defaults to None.
    margin (Union[float, Dict[str, float]], optional): Margins for various similarity metrics.
        If a float is provided, it will be used as the margin for all similarity metrics.
        If a dictionary is provided, the keys should be 'cosine', 'dot', 'manhattan', and 'euclidean'.
        The value specifies the minimum margin by which the negative sample should be further from
        the anchor than the positive sample. 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 ``model.similarity_fn_name``.
        Defaults to None.

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 Similarity:        95.60%
        '''
        print(triplet_evaluator.primary_metric)
        # => "all_nli_dev_cosine_accuracy"
        print(results[triplet_evaluator.primary_metric])
        # => 0.956
c                  > [         TU ]  5         Xl        X l        X0l        X`l        Xl        [        U R                  5      [        U R                  5      :X  d   e[        U R                  5      [        U R                  5      :X  d   eUS:w  a  Uc  Un[        R                  S5        U(       a  [        U5      OS U l        U=(       d    / U l        Uc  SSSSS.U l        OW[        U[        [         45      (       a  XUXUS.U l        O1[        U["        5      (       a  0 SSSSS.EUEU l        O[%        S5      eXpl        UcQ  [        R)                  5       [*        R,                  :H  =(       d%    [        R)                  5       [*        R.                  :H  nXl        SU(       a  SU-   OS-   S	-   U l        S
S/U l        Xl        U R9                  U R                  5        g )N
deprecatedzThe 'main_distance_function' parameter is deprecated. Please use 'main_similarity_function' instead. 'main_distance_function' will be removed in a future release.r   cosinedot	manhattan	euclideanzb`margin` should be a float or a dictionary with keys 'cosine', 'dot', 'manhattan', and 'euclidean'triplet_evaluation_ z_results.csvepochsteps)super__init__anchors	positives	negativesnametruncate_dimlenloggerwarningr   main_similarity_functionsimilarity_fn_namesmargin
isinstancefloatintdict
ValueError
batch_sizegetEffectiveLevelloggingINFODEBUGshow_progress_barcsv_filecsv_headers	write_csv_append_csv_headers)selfr   r    r!   r'   r)   r"   r/   r4   r7   r#   r(   main_distance_function	__class__s                i/var/www/html/shao/venv/lib/python3.13/site-packages/sentence_transformers/evaluation/TripletEvaluator.pyr   TripletEvaluator.__init__T   s    	""	(4<< C$77774<< C$7777!\16N6V'=$NNP =U78Z^ 	% $7#<" >%&qqqQDK--%+eDK%%qqqIDK
 t  %$((*gll:if>V>V>X\c\i\i>i  "314S4ZRPSaa#W-"  !9!9:    c                R    U H!  nU R                   R                  SU 35        M#     g )N	accuracy_)r6   append)r9   r(   fn_names      r<   r8   $TripletEvaluator._append_csv_headers   s'    *G##iy$9: +r>   c                    / n/ n/ nU H]  nUR                  UR                  S   5        UR                  UR                  S   5        UR                  UR                  S   5        M_     U " X4U40 UD6$ )Nr         )rA   texts)clsexampleskwargsr   r    r!   examples          r<   from_input_examples$TripletEvaluator.from_input_examples   sr    		GNN7==+,W]]1-.W]]1-.   7y;F;;r>   c                   US:w  a  US:X  a  SU 3nOSU SU S3nOSnU R                   b  USU R                    S3-  n[        R                  S	U R                   S
U S35        U R	                  XR
                  5      nU R	                  XR                  5      nU R	                  XR                  5      nU R                  (       d-  UR                  /U l        U R                  U R                  5        S S S S S.n	0 n
U R                   H  nX;   d  M
  X   " XgU5      u  pXU R                  U   -   :  R                  5       R                  5       R                  5       nXU S3'   [        R                  SUR                  5        SUS 35        M     UGb)  U R                   (       Ga  ["        R$                  R'                  X R(                  5      n["        R$                  R+                  U5      (       ds  [-        USSSS9 n[.        R0                  " U5      nUR3                  U R4                  5        UR3                  X4/[7        U
R9                  5       5      -   5        S S S 5        OW[-        USSSS9 n[.        R0                  " U5      nUR3                  X4/[7        U
R9                  5       5      -   5        S S S 5        [;        U R                  5      S:  a  [=        U
R9                  5       5      U
S'   U R>                  (       aa  [@        RB                  S[@        RD                  S[@        RF                  S[@        RH                  S0RK                  U R>                  5      U l&        O8[;        U R                  5      S:  a  SU l&        OU R                  S    S3U l&        U RO                  XR                  5      n
U RQ                  XX45        U
$ ! , (       d  f       GN= f! , (       d  f       GN/= f) Nz after epoch z
 in epoch z after z stepsr   z (truncated to )z.TripletEvaluator: Evaluating the model on the z dataset:c                .    [        X5      [        X5      4$ N)r	   r   r    r!   s      r<   <lambda>+TripletEvaluator.__call__.<locals>.<lambda>   s     4 4=r>   c                .    [        X5      [        X5      4$ rS   )r
   rT   s      r<   rU   rV      s    "76"76:r>   c                .    [        X5      [        X5      4$ rS   )r   rT   s      r<   rU   rV          &w:&w:@r>   c                .    [        X5      [        X5      4$ rS   )r   rT   s      r<   rU   rV      rY   r>   r   	_accuracyz	Accuracy z Similarity:	z.2%wzutf-8)newlinemodeencodingarE   max_accuracycosine_accuracydot_accuracyeuclidean_accuracymanhattan_accuracyr   ))r#   r%   infor"   embed_inputsr   r    r!   r(   similarity_fn_namer8   r)   r+   meanitem
capitalizer7   ospathjoinr5   isfileopencsvwriterwriterowr6   listvaluesr$   maxr'   r   COSINEDOT_PRODUCT	EUCLIDEAN	MANHATTANgetprimary_metricprefix_name_to_metrics store_metrics_in_model_card_data)r9   modeloutput_pathr   r   out_txtembeddings_anchorsembeddings_positivesembeddings_negativessimilarity_functionsmetricsrB   positive_scoresnegative_scoresaccuracycsv_pathfrr   s                     r<   __call__TripletEvaluator.__call__   so    B;{)%1&ugWUG6BG():):(;1==GDTYYKxX_W``abc!..ullC#00G#00G''(-(@(@'AD$$$T%=%=> 
& //G.3G3P&>R40 ,G@T.TT[[]bbdiik197)9-.i(:(:(<'=^HUX>Z[ 0 "t~~~ww||K?H77>>(++(BS7Kq ZZ]FOOD$4$45OOUNT'..:J5K$KL LK (BS7Kq ZZ]FOOUNT'..:J5K$KL L t''(1,&)'..*:&;GN#(("))+<"..",,.B",,.B	#
 c$//0  4++,q0&4#)-)A)A!)D(EY&O#--gyyA--eeK9 LK LKs   AO9AO$
O!$
O3c                n    UR                   " U4U R                  U R                  SU R                  S.UD6$ )NT)r/   r4   convert_to_numpyr#   )encoder/   r4   r#   )r9   r   	sentencesrJ   s       r<   rg   TripletEvaluator.embed_inputs   sC     ||
"44!**
 
 	
r>   c                    0 nU R                   SSSSS.:w  a  U R                   US'   U R                  b  U R                  US'   U$ )Nr   r   r)   r#   )r)   r#   )r9   config_dicts     r<   get_config_dict TripletEvaluator.get_config_dict  sL    ;;QqqqQQ$(KKK!(*.*;*;K'r>   )r   r/   r5   r6   r'   r)   r"   r!   r    r|   r4   r(   r#   r7   )	NNr      FTNNr   )r   	list[str]r    r   r!   r   r'   str | SimilarityFunction | Noner)   zfloat | dict[str, float] | Noner"   strr/   r,   r4   boolr7   r   r#   z
int | Noner(   z?list[Literal['cosine', 'dot', 'euclidean', 'manhattan']] | Noner:   r   )rI   zlist[InputExample])NrO   rO   )
r   r   r   z
str | Noner   r,   r   r,   returnzdict[str, float])r   r   r   zstr | list[str] | np.ndarrayr   z
np.ndarray)__name__
__module____qualname____firstlineno____doc__r   r8   classmethodrL   r   rg   r   __static_attributes____classcell__)r;   s   @r<   r   r      s+   7| EI26"'#'_cBN>;>; >; 	>;
 #B>; 0>; >; >;  >; >; !>; ]>; !@>; >;@; 	< 	< ikS(S7ASQTSbeS	Sj
"
 0

 

 r>   r   )
__future__r   rq   r1   rl   typingr   r   2sentence_transformers.evaluation.SentenceEvaluatorr   sentence_transformers.readersr   *sentence_transformers.similarity_functionsr   sentence_transformers.utilr	   r
   r   r   numpynp)sentence_transformers.SentenceTransformerr   	getLoggerr   r%   r    r>   r<   <module>r      sQ    " 
  	 ) P 6 I  M			8	$t( tr>   