Ë
    l^(h°.  ã                  óÊ   — 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
mZ d dlmZ d dlmZ d dlmZmZmZmZ erd d	lmZ  ej.                  e«      Z G d
„ de«      Zy)é    )ÚannotationsN)Únullcontext)ÚTYPE_CHECKINGÚLiteral)ÚSentenceEvaluator)ÚInputExample)ÚSimilarityFunction)Úpairwise_cos_simÚpairwise_dot_scoreÚpairwise_euclidean_simÚpairwise_manhattan_sim)ÚSentenceTransformerc                  ó¢   ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zd„ Zed	d„«       Z	 d
	 	 	 	 	 	 	 	 	 dd„Zd„ Z	ˆ xZ
S )ÚTripletEvaluatora¸  
    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         ‰| �  «        || _        || _        || _        || _        |
| _        t        | j                  «      t        | j                  «      k(  sJ ‚t        | j                  «      t        | j                  «      k(  sJ ‚|dk7  r|€|}t        j                  d«       |rt        |«      nd | _        |xs g | _        |€dddddœ| _        nOt        |t        t         f«      r||||dœ| _        n,t        |t"        «      ri dddddœ¥|¥| _        nt%        d«      ‚|| _        |€Lt        j)                  «       t*        j,                  k(  xs% t        j)                  «       t*        j.                  k(  }|| _        d|rd|z   ndz   d	z   | _        d
dg| _        |	| _        | j9                  | j                  «       y )NÚ
deprecatedz¢The '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                €úo/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/sentence_transformers/evaluation/TripletEvaluator.pyr   zTripletEvaluator.__init__S   sÄ  ø€ ô 	‰ÑÔØˆŒØ"ˆŒØ"ˆŒØˆŒ	Ø(ˆÔä�4—<‘<Ó ¤C¨¯©Ó$7Ò7Ð7Ð7Ü�4—<‘<Ó ¤C¨¯©Ó$7Ò7Ð7Ð7à! \Ò1Ð6NÐ6VØ'=Ð$Ü�N‰NðPôñ =UÔÐ7Ô8ÐZ^ð 	Ô%ð $7Ò#<¸"ˆÔ àˆ>Ø%&¨q¸qÈqÑQˆD�KÜ˜¤¬ Ô-Ø%+°FÈÐ^dÑeˆD�KÜ˜¤Ô%ðØ q°qÀqÑIðàðˆD�Kô
 Øtóð ð %ˆŒØÐ$ä×(Ñ(Ó*¬g¯l©lÑ:Òi¼f×>VÑ>VÓ>XÔ\c×\iÑ\iÑ>ið ð "3ˆÔà1Á4°S¸4²ZÈRÑPÐSaÑaˆŒØ# WÐ-ˆÔØ"ˆŒà× Ñ  ×!9Ñ!9Õ:ó    c                óN   — |D ]   }| j                   j                  d|› �«       Œ" y )NÚ	accuracy_)r6   Úappend)r9   r(   Úfn_names      r<   r8   z$TripletEvaluator._append_csv_headers“   s,   € Ø*ò 	;ˆGØ×Ñ×#Ñ# i°¨yÐ$9Õ:ñ	;r=   c                óæ   — g }g }g }|D ]\  }|j                  |j                  d   «       |j                  |j                  d   «       |j                  |j                  d   «       Œ^  | |||fi |¤ŽS )Nr   é   é   )r@   Útexts)ÚclsÚexamplesÚkwargsr   r    r!   Úexamples          r<   Úfrom_input_examplesz$TripletEvaluator.from_input_examples—   sy   € àˆØˆ	Øˆ	àò 	/ˆGØ�N‰N˜7Ÿ=™=¨Ñ+Ô,Ø×Ñ˜WŸ]™]¨1Ñ-Ô.Ø×Ñ˜WŸ]™]¨1Ñ-Õ.ð	/ñ �7˜I yÑ;°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 ]ˆ  }||	v sŒ |	|   «      \  }}||| j                  |   z   kD  j!                  «       j#                  «       j%                  «       }||
|› d�<   t        j                  d|j'                  «       › d|d›�«       ŒŠ |��&| j(                  �rt*        j,                  j/                  || j0                  «      }t*        j,                  j3                  |«      svt5        |ddd¬«      5 }t7        j8                  |«      }|j;                  | j<                  «       |j;                  ||gt?        |
jA                  «       «      z   «       d d d «       nZt5        |ddd¬«      5 }t7        j8                  |«      }|j;                  ||gt?        |
jA                  «       «      z   «       d d d «       tC        | j                  «      dkD  rtE        |
jA                  «       «      |
d<   | jF                  ratH        jJ                  dtH        jL                  dtH        jN                  dtH        jP                  d ijS                  | jF                  «      | _*        n7tC        | j                  «      dkD  rd| _*        n| j                  d!   › d�| _*        | jW                  |
| j                  «      }
| jY                  ||
||«       |
S # 1 sw Y   �ŒxY w# 1 sw Y   �Œ!xY w# 1 sw Y   �Œ.xY w)"Néÿÿÿÿz after epoch z
 in epoch z after z stepsr   z (truncated to ú)z.TripletEvaluator: Evaluating the model on the z datasetú:T)r/   r4   Úconvert_to_numpyc                ó2   — t        | |«      t        | |«      fS ©N)r
   ©r   r    r!   s      r<   ú<lambda>z+TripletEvaluator.__call__.<locals>.<lambda>Ë   s   € Ü  ¨)Ó4Ü  ¨)Ó4ð=€ r=   c                ó2   — t        | |«      t        | |«      fS rQ   )r   rR   s      r<   rS   z+TripletEvaluator.__call__.<locals>.<lambda>Ï   s   € Ü" 7¨IÓ6Ü" 7¨IÓ6ð:€ r=   c                ó2   — t        | |«      t        | |«      fS rQ   )r   rR   s      r<   rS   z+TripletEvaluator.__call__.<locals>.<lambda>Ó   ó   € Ü& w°	Ó:Ü& w°	Ó:ð@€ r=   c                ó2   — t        | |«      t        | |«      fS rQ   )r   rR   s      r<   rS   z+TripletEvaluator.__call__.<locals>.<lambda>×   rV   r=   r   Ú	_accuracyz	Accuracy z Similarity:	z.2%Úwzutf-8)ÚnewlineÚmodeÚencodingÚarC   Úmax_accuracyÚcosine_accuracyÚdot_accuracyÚeuclidean_accuracyÚmanhattan_accuracyr   )-r#   r%   Úinfor"   r   Útruncate_sentence_embeddingsÚencoder   r/   r4   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ÚmetricsrA   Úpositive_scoresÚnegative_scoresÚaccuracyÚcsv_pathÚfrp   s                     r<   Ú__call__zTripletEvaluator.__call__£   s/  € ð �BŠ;Ø˜Š{Ø)¨%¨Ð1‘à& u g¨W°U°G¸6ÐB‘àˆGØ×ÑÐ(Ø˜¨×):Ñ):Ð(;¸1Ð=Ñ=ˆGä�‰ÐDÀTÇYÁYÀKÈxÐX_ÐW`Ð`aÐbÔcà"×/Ñ/Ð7Œ[Œ]¸U×=_Ñ=_Ð`d×`qÑ`qÓ=rñ 	Ø!&§¡Ø—‘ØŸ?™?Ø"&×"8Ñ"8Ø!%ð	 ".ó "Ðð $)§<¡<Ø—‘ØŸ?™?Ø"&×"8Ñ"8Ø!%ð	 $0ó $Ð ð $)§<¡<Ø—‘ØŸ?™?Ø"&×"8Ñ"8Ø!%ð	 $0ó $Ð ÷	ð( ×'Ò'Ø(-×(@Ñ(@Ð'AˆDÔ$Ø×$Ñ$ T×%=Ñ%=Ô>ñññññ 
Ðð& ˆØ×/Ñ/ò 	\ˆGØÐ.Ò.Ø3PÐ3GÈÑ3PØ&Ð(<Ð>Ró4Ñ0� ð ,¨oÀÇÁÈGÑ@TÑ.TÑT×[Ñ[Ó]×bÑbÓd×iÑiÓk�Ø19�˜7˜) 9Ð-Ñ.Ü—‘˜i¨×(:Ñ(:Ó(<Ð'=¸^ÈHÐUXÈ>ÐZÕ[ð	\ð Ñ" t§~£~Ü—w‘w—|‘| K°·±Ó?ˆHÜ—7‘7—>‘> (Ô+Ü˜(¨B°SÀ7ÔKð MÈqÜ ŸZ™Z¨›]�FØ—O‘O D×$4Ñ$4Ô5Ø—O‘O U¨E N´T¸'¿.¹.Ó:JÓ5KÑ$KÔL÷Mð Mô ˜(¨B°SÀ7ÔKð MÈqÜ ŸZ™Z¨›]�FØ—O‘O U¨E N´T¸'¿.¹.Ó:JÓ5KÑ$KÔL÷Mô ˆt×'Ñ'Ó(¨1Ò,Ü&)¨'¯.©.Ó*:Ó&;ˆG�NÑ#à×(Ò(ä"×)Ñ)Ð+<Ü"×.Ñ.°Ü"×,Ñ,Ð.BÜ"×,Ñ,Ð.Bð	#÷
 ‰c�$×/Ñ/Ó0ð Õô �4×+Ñ+Ó,¨qÒ0Ø&4�Õ#à)-×)AÑ)AÀ!Ñ)DÐ(EÀYÐ&O�Ô#à×-Ñ-¨g°t·y±yÓAˆØ×-Ñ-¨e°W¸eÀUÔKØˆ÷i	ñ 	ú÷pMñ Mú÷Mñ Mús'   ÂBQÉ:AQË0AQÑQÑQÑQ)c                ó†   — i }| j                   dddddœk7  r| j                   |d<   | j                  �| j                  |d<   |S )Nr   r   r)   r#   )r)   r#   )r9   Úconfig_dicts     r<   Úget_config_dictz TripletEvaluator.get_config_dict  sL   € ØˆØ�;‰; Q¨q¸qÈqÑQÒQØ$(§K¡KˆK˜Ñ!Ø×ÑÐ(Ø*.×*;Ñ*;ˆK˜Ñ'ØÐr=   )	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�   )rG   zlist[InputExample])NrL   rL   )
r}   r   r~   r‘   r   r,   r   r,   Úreturnzdict[str, float])Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r8   ÚclassmethodrJ   rŠ   r�   Ú__classcell__)r;   s   @r<   r   r      s   ø„ ñ7ð| EIØ26ØØØ"'ØØ#'Ø_cØBNð>;àð>;ð ð>;ð ð	>;ð
 #Bð>;ð 0ð>;ð ð>;ð ð>;ð  ð>;ð ð>;ð !ð>;ð ]ð>;ð !@õ>;ò@;ð ò	<ó ð	<ð bdðcØ(ðcØ7:ðcØJMðcØ[^ðcà	ócöJr=   r   )Ú
__future__r   ro   r1   rj   Ú
contextlibr   Útypingr   r   Ú2sentence_transformers.evaluation.SentenceEvaluatorr   Úsentence_transformers.readersr   Ú*sentence_transformers.similarity_functionsr	   Úsentence_transformers.utilr
   r   r   r   Ú)sentence_transformers.SentenceTransformerr   Ú	getLoggerr”   r%   r   © r=   r<   ú<module>r¤      sS   ðÝ "ã 
Û Û 	Ý "ß )å PÝ 6Ý I÷ó ñ ÝMà	ˆ×	Ñ	˜8Ó	$€ôuÐ(õ ur=   