Ë
    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
Zd dlmZm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j6                  e«      Z G d„ de«      Zy)é    )ÚannotationsN)Únullcontext)ÚTYPE_CHECKINGÚLiteral)ÚpearsonrÚ	spearmanr)Ú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
d„Zedd„«       Z	 d	 	 	 	 	 	 	 	 	 dd„Ze	dd„«       Z
d„ Zˆ xZS )ÚEmbeddingSimilarityEvaluatoraÈ  
    Evaluate a model based on the similarity of the embeddings by calculating the Spearman and Pearson rank correlation
    in comparison to the gold standard labels.
    The metrics are the cosine similarity as well as euclidean and Manhattan distance
    The returned score is the Spearman correlation with a specified metric.

    Args:
        sentences1 (List[str]): List with the first sentence in a pair.
        sentences2 (List[str]): List with the second sentence in a pair.
        scores (List[float]): Similarity score between sentences1[i] and sentences2[i].
        batch_size (int, optional): The batch size for processing the sentences. Defaults to 16.
        main_similarity (Optional[Union[str, SimilarityFunction]], optional): The main similarity function to use.
            Can be a string (e.g. "cosine", "dot") or a SimilarityFunction object. Defaults to None.
        similarity_fn_names (List[str], optional): List of similarity function names to use. If None, the
            ``similarity_fn_name`` attribute of the model is used. Defaults to None.
        name (str, optional): The name of the evaluator. Defaults to "".
        show_progress_bar (bool, optional): Whether to show a progress bar during evaluation. Defaults to False.
        write_csv (bool, optional): Whether to write the evaluation results to a CSV file. Defaults to True.
        precision (Optional[Literal["float32", "int8", "uint8", "binary", "ubinary"]], optional): The precision
            to use for the embeddings. Can be "float32", "int8", "uint8", "binary", or "ubinary". Defaults to None.
        truncate_dim (Optional[int], optional): The dimension to truncate sentence embeddings to. `None` uses the
            model's current truncation dimension. Defaults to None.

    Example:
        ::

            from datasets import load_dataset
            from sentence_transformers import SentenceTransformer
            from sentence_transformers.evaluation import EmbeddingSimilarityEvaluator, SimilarityFunction

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

            # Load the STSB dataset (https://huggingface.co/datasets/sentence-transformers/stsb)
            eval_dataset = load_dataset("sentence-transformers/stsb", split="validation")

            # Initialize the evaluator
            dev_evaluator = EmbeddingSimilarityEvaluator(
                sentences1=eval_dataset["sentence1"],
                sentences2=eval_dataset["sentence2"],
                scores=eval_dataset["score"],
                name="sts_dev",
            )
            results = dev_evaluator(model)
            '''
            EmbeddingSimilarityEvaluator: Evaluating the model on the sts-dev dataset:
            Cosine-Similarity :  Pearson: 0.8806 Spearman: 0.8810
            '''
            print(dev_evaluator.primary_metric)
            # => "sts_dev_pearson_cosine"
            print(results[dev_evaluator.primary_metric])
            # => 0.881019449484294
    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   |
rd|
z   ndz   dz   | _        ddg| _        | j-                  | j                  «       y )NÚsimilarity_evaluationÚ_Ú z_results.csvÚepochÚsteps)ÚsuperÚ__init__Ú
sentences1Ú
sentences2ÚscoresÚ	write_csvÚ	precisionÚtruncate_dimÚlenr   Úmain_similarityÚsimilarity_fn_namesÚnameÚ
batch_sizeÚloggerÚgetEffectiveLevelÚloggingÚINFOÚDEBUGÚshow_progress_barÚcsv_fileÚcsv_headersÚ_append_csv_headers)Úselfr   r   r   r$   r!   r"   r#   r*   r   r   r   Ú	__class__s               €ú{/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/sentence_transformers/evaluation/EmbeddingSimilarityEvaluator.pyr   z%EmbeddingSimilarityEvaluator.__init__N   sK  ø€ ô 	‰ÑÔØ$ˆŒØ$ˆŒØˆŒØ"ˆŒØ"ˆŒØ(ˆÔä�4—?‘?Ó#¤s¨4¯?©?Ó';Ò;Ð;Ð;Ü�4—?‘?Ó#¤s¨4¯;©;Ó'7Ò7Ð7Ð7áFUÔ1°/ÔBÐ[_ˆÔØ#6Ò#<¸"ˆÔ ØˆŒ	à$ˆŒØÐ$ä×(Ñ(Ó*¬g¯l©lÑ:Òi¼f×>VÑ>VÓ>XÔ\c×\iÑ\iÑ>ið ð "3ˆÔð $Ù!ˆs�TŠz rñ+á"+ˆs�YŠ°ñ5ð ñð 	Œð Øð
ˆÔð
 	× Ñ  ×!9Ñ!9Õ:ó    c                óh   — ddg}|D ])  }|D ]"  }| j                   j                  |› d|› �«       Œ$ Œ+ y )NÚpearsonÚspearmanr   )r,   Úappend)r.   r"   ÚmetricsÚvÚms        r0   r-   z0EmbeddingSimilarityEvaluator._append_csv_headers   sH   € Ø˜jÐ)ˆà$ò 	4ˆAØò 4�Ø× Ñ ×'Ñ'¨1¨#¨Q¨q¨c¨
Õ3ñ4ñ	4r1   c                óà   — g }g }g }|D ]Y  }|j                  |j                  d   «       |j                  |j                  d   «       |j                  |j                  «       Œ[  | |||fi |¤ŽS )Nr   é   )r5   ÚtextsÚlabel)ÚclsÚexamplesÚkwargsr   r   r   Úexamples          r0   Úfrom_input_examplesz0EmbeddingSimilarityEvaluator.from_input_examples†   st   € àˆ
Øˆ
Øˆàò 	)ˆGØ×Ñ˜gŸm™m¨AÑ.Ô/Ø×Ñ˜gŸm™m¨AÑ.Ô/Ø�M‰M˜'Ÿ-™-Õ(ð	)ñ �:˜z¨6Ñ<°VÑ<Ð<r1   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                  t        | j                  «      ¬«      }|j                  | j                  | j                  | j                  d| j                  t        | j                  «      ¬«      }d d d «       | j                  dk(  rDdz   j                  t        j                  «      }dz   j                  t        j                  «      }| j                  dv r.t        j                   d¬«      }t        j                   d¬«      }| j"                  }| j$                  s-|j&                  g| _        | j)                  | j$                  «       d„ d„ d„ d„ dœ}	i Š| j$                  D ]n  }
|
|	v sŒ |	|
   «      }t+        ||«      \  }}t-        ||«      \  }}|‰d|
› �<   |‰d|
› �<   t        j                  |
j/                  «       › d|d›d|d›�«       Œp |�â| j0                  rÖt2        j4                  j7                  || j8                  «      }t2        j4                  j;                  |«      }t=        |d|rdndd¬ «      5 }t?        j@                  |«      }|s|jC                  | jD                  «       |jC                  ||g| j$                  D �
�cg c]  }
d!D ]  }‰|› d"|
› �   ‘Œ Œ c}}
z   «       d d d «       tG        | j$                  «      dkD  rBtI        ˆfd#„| j$                  D «       «      ‰d$<   tI        ˆfd%„| j$                  D «       «      ‰d&<   | jJ                  ratL        jN                  d'tL        jP                  d(tL        jR                  d)tL        jT                  d*ijW                  | jJ                  «      | _,        n7tG        | j$                  «      dkD  rd&| _,        nd| j$                  d+   › �| _,        | j[                  ‰| j                  «      Š| j]                  |‰||«       ‰S # 1 sw Y   �Œ|xY wc c}}
w # 1 sw Y   �ŒMxY w),Néÿÿÿÿz after epoch z
 in epoch z after z stepsr   z (truncated to ú)z:EmbeddingSimilarityEvaluator: Evaluating the model on the z datasetú:T)r$   r*   Úconvert_to_numpyr   Únormalize_embeddingsÚbinaryé€   )ÚubinaryrH   r:   )Úaxisc                ó    — dt        | |«      z
  S )Nr:   )r	   ©ÚxÚys     r0   ú<lambda>z7EmbeddingSimilarityEvaluator.__call__.<locals>.<lambda>Á   s   €  1Ô'>¸qÀ!Ó'DÑ#D€ r1   c                ó   — t        | |«       S ©N)r   rM   s     r0   rP   z7EmbeddingSimilarityEvaluator.__call__.<locals>.<lambda>Â   ó   € Ô'AÀ!ÀQÓ'GÐ&G€ r1   c                ó   — t        | |«       S rR   )r
   rM   s     r0   rP   z7EmbeddingSimilarityEvaluator.__call__.<locals>.<lambda>Ã   rS   r1   c                ót   — t        | |«      D ��cg c]  \  }}t        j                  ||«      ‘Œ c}}S c c}}w rR   )ÚzipÚnpÚdot)rN   rO   Úemb1Úemb2s       r0   rP   z7EmbeddingSimilarityEvaluator.__call__.<locals>.<lambda>Ä   s)   € ÄcÈ!ÈQÃi× P¹
¸¸d¤§¡¨¨dÕ!3Ó P€ ùÓ Ps   � 4)ÚcosineÚ	manhattanÚ	euclideanrX   Úpearson_Ú	spearman_z-Similarity :	Pearson: z.4fz	Spearman: ÚaÚwzutf-8)ÚnewlineÚmodeÚencoding)r3   r4   r   c              3  ó.   •K  — | ]  }‰d |› �   –— Œ y­w)r^   N© ©Ú.0Úfn_namer6   s     €r0   ú	<genexpr>z8EmbeddingSimilarityEvaluator.__call__.<locals>.<genexpr>è   s   øè ø€ Ò(oÈ7¨°8¸G¸9Ð1EÕ)FÑ(oùó   ƒÚpearson_maxc              3  ó.   •K  — | ]  }‰d |› �   –— Œ y­w)r_   Nrf   rg   s     €r0   rj   z8EmbeddingSimilarityEvaluator.__call__.<locals>.<genexpr>é   s   øè ø€ Ò)qÈW¨'°I¸g¸YÐ2GÕ*HÑ)qùrk   Úspearman_maxÚspearman_cosineÚspearman_euclideanÚspearman_manhattanÚspearman_dotr   )/r   r%   Úinfor#   r   Útruncate_sentence_embeddingsÚencoder   r$   r*   r   Úboolr   ÚastyperW   Úuint8Ú
unpackbitsr   r"   Úsimilarity_fn_namer-   r   r   Ú
capitalizer   ÚosÚpathÚjoinr+   ÚisfileÚopenÚcsvÚwriterÚwriterowr,   r    Úmaxr!   r   ÚCOSINEÚ	EUCLIDEANÚ	MANHATTANÚDOT_PRODUCTÚgetÚprimary_metricÚprefix_name_to_metricsÚ store_metrics_in_model_card_data)r.   ÚmodelÚoutput_pathr   r   Úout_txtÚembeddings1Úembeddings2ÚlabelsÚsimilarity_functionsri   r   Úeval_pearsonr   Úeval_spearmanÚcsv_pathÚoutput_file_existsÚfr‚   Úmetricr6   s                       @r0   Ú__call__z%EmbeddingSimilarityEvaluator.__call__’   s¥  ø€ ð �BŠ;Ø˜Š{Ø)¨%¨Ð1‘à& u g¨W°U°G¸6ÐB‘àˆGØ×ÑÐ(Ø˜¨×):Ñ):Ð(;¸1Ð=Ñ=ˆGä�‰ÐPÐQU×QZÑQZÐP[Ð[cÐdkÐclÐlmÐnÔoà"×/Ñ/Ð7Œ[Œ]¸U×=_Ñ=_Ð`d×`qÑ`qÓ=rñ 	ØŸ,™,Ø—‘ØŸ?™?Ø"&×"8Ñ"8Ø!%ØŸ.™.Ü%)¨$¯.©.Ó%9ð 'ó ˆKð  Ÿ,™,Ø—‘ØŸ?™?Ø"&×"8Ñ"8Ø!%ØŸ.™.Ü%)¨$¯.©.Ó%9ð 'ó ˆK÷	ð$ �>‰>˜XÒ%Ø&¨Ñ,×4Ñ4´R·X±XÓ>ˆKØ&¨Ñ,×4Ñ4´R·X±XÓ>ˆKØ�>‰>Ð2Ñ2ÜŸ-™-¨¸!Ô<ˆKÜŸ-™-¨¸!Ô<ˆKà—‘ˆà×'Ò'Ø(-×(@Ñ(@Ð'AˆDÔ$Ø×$Ñ$ T×%=Ñ%=Ô>ñ EÙGÙGÙPñ	 
Ðð ˆØ×/Ñ/ò 		ˆGØÐ.Ò.Ø6Ð-¨gÑ6°{ÀKÓP�Ü"*¨6°6Ó":‘�˜aÜ#,¨V°VÓ#<Ñ �˜qØ0<�˜( 7 )Ð,Ñ-Ø1>�˜) G 9Ð-Ñ.Ü—‘Ø×)Ñ)Ó+Ð,Ð,DÀ\ÐRUÐDVÐVbÐcpÐqtÐbuÐvõð		ð Ð" t§~¢~Ü—w‘w—|‘| K°·±Ó?ˆHÜ!#§¡§¡°Ó!9ÐÜ�h¨Ñ8J±ÐPSÐ^eÔfð ÐjkÜŸ™ A›�Ù)Ø—O‘O D×$4Ñ$4Ô5à—‘àØðð (,×'?Ñ'?÷à#Ø&=òð #ð   6 (¨!¨G¨9Ð 5Ó6ðØ6óñ	ô
÷ô" ˆt×'Ñ'Ó(¨1Ò,Ü%(Ó(oÐVZ×VnÑVnÔ(oÓ%oˆG�MÑ"Ü&)Ó)qÐX\×XpÑXpÔ)qÓ&qˆG�NÑ#à×Òä"×)Ñ)Ð+<Ü"×,Ñ,Ð.BÜ"×,Ñ,Ð.BÜ"×.Ñ.°ð	#÷
 ‰c�$×&Ñ&Ó'ð Õô �4×+Ñ+Ó,¨qÒ0Ø&4�Õ#à(1°$×2JÑ2JÈ1Ñ2MÐ1NÐ&O�Ô#à×-Ñ-¨g°t·y±yÓAˆØ×-Ñ-¨e°W¸eÀUÔKØˆ÷s	ñ 	üó~÷ñ ús,   ÂB%R3Ì	ASÍS Í1
SÒ3R=Ó SÓSc                 ó   — y)NzSemantic Similarityrf   )r.   s    r0   Údescriptionz(EmbeddingSimilarityEvaluator.descriptionü   s   € à$r1   c                óX   — i }ddg}|D ]  }t        | |«      €Œt        | |«      ||<   Œ  |S )Nr   r   )Úgetattr)r.   Úconfig_dictÚconfig_dict_candidate_keysÚkeys       r0   Úget_config_dictz,EmbeddingSimilarityEvaluator.get_config_dict   sG   € ØˆØ&4°kÐ%BÐ"Ø-ò 	6ˆCÜ�t˜SÓ!Ñ-Ü#*¨4°Ó#5�˜CÒ ð	6ð Ðr1   )é   NNr   FTNN)r   ú	list[str]r   r¤   r   zlist[float]r$   Úintr!   zstr | SimilarityFunction | Noner"   z?list[Literal['cosine', 'euclidean', 'manhattan', 'dot']] | Noner#   Ústrr*   rv   r   rv   r   z?Literal['float32', 'int8', 'uint8', 'binary', 'ubinary'] | Noner   z
int | None)r"   r¤   ÚreturnÚNone)r>   zlist[InputExample])NrC   rC   )
r�   r   rŽ   r¦   r   r¥   r   r¥   r§   zdict[str, float])r§   r¦   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r-   ÚclassmethodrA   rš   Úpropertyrœ   r¢   Ú__classcell__)r/   s   @r0   r   r      s  ø„ ñ4ðv Ø;?Ø_cØØ"'ØØUYØ#'ð/;àð/;ð ð/;ð ð	/;ð
 ð/;ð 9ð/;ð ]ð/;ð ð/;ð  ð/;ð ð/;ð Sð/;ð !õ/;ób4ð ò	=ó ð	=ð bdðhØ(ðhØ7:ðhØJMðhØ[^ðhà	óhðT ò%ó ð%ör1   r   )Ú
__future__r   r�   r'   r|   Ú
contextlibr   Útypingr   r   ÚnumpyrW   Úscipy.statsr   r   Úsklearn.metrics.pairwiser	   r
   r   Ú2sentence_transformers.evaluation.SentenceEvaluatorr   Úsentence_transformers.readersr   Ú*sentence_transformers.similarity_functionsr   Ú)sentence_transformers.SentenceTransformerr   Ú	getLoggerr©   r%   r   rf   r1   r0   ú<module>r»      sS   ðÝ "ã 
Û Û 	Ý "ß )ã ß +ß tÑ tå PÝ 6Ý IáÝMà	ˆ×	Ñ	˜8Ó	$€ôoÐ#4õ or1   