ó
    — óhj  ã                  óœ   • S SK Jr  S SKrS SKrS SKrS SKJr  S SKJr  \(       a
  S SK	r
S SKJr  \R                  " \5      r " S S\5      rg)é    )ÚannotationsN)ÚTYPE_CHECKING)ÚSentenceEvaluator)ÚSentenceTransformerc                  ó¤   ^ • \ rS rSrSr      S	             S
U 4S jjjr S     SS jjr      SS jr\SS j5       r	S r
SrU =r$ )ÚMSEEvaluatoré   ab	  
Computes the mean squared error (x100) between the computed sentence embedding
and some target sentence embedding.

The MSE is computed between ||teacher.encode(source_sentences) - student.encode(target_sentences)||.

For multilingual knowledge distillation (https://arxiv.org/abs/2004.09813), source_sentences are in English
and target_sentences are in a different language like German, Chinese, Spanish...

Args:
    source_sentences (List[str]): Source sentences to embed with the teacher model.
    target_sentences (List[str]): Target sentences to embed with the student model.
    teacher_model (SentenceTransformer, optional): The teacher model to compute the source sentence embeddings.
    show_progress_bar (bool, optional): Show progress bar when computing embeddings. Defaults to False.
    batch_size (int, optional): Batch size to compute sentence embeddings. Defaults to 32.
    name (str, optional): Name of the evaluator. Defaults to "".
    write_csv (bool, optional): Write results to 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.

Example:
    ::

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

        # Load a model
        student_model = SentenceTransformer('paraphrase-multilingual-mpnet-base-v2')
        teacher_model = SentenceTransformer('all-mpnet-base-v2')

        # Load any dataset with some texts
        dataset = load_dataset("sentence-transformers/stsb", split="validation")
        sentences = dataset["sentence1"] + dataset["sentence2"]

        # Given queries, a corpus and a mapping with relevant documents, the MSEEvaluator computes different MSE metrics.
        mse_evaluator = MSEEvaluator(
            source_sentences=sentences,
            target_sentences=sentences,
            teacher_model=teacher_model,
            name="stsb-dev",
        )
        results = mse_evaluator(student_model)
        '''
        MSE evaluation (lower = better) on the stsb-dev dataset:
        MSE (*100):  0.805045
        '''
        print(mse_evaluator.primary_metric)
        # => "stsb-dev_negative_mse"
        print(results[mse_evaluator.primary_metric])
        # => -0.8050452917814255
c	                óÐ   >• [         T	U ]  5         X€l        X l        X@l        XPl        X`l        SU-   S-   U l        / SQU l        Xpl	        SU l
        U R                  X15      U l        g )NÚmse_evaluation_z_results.csv)ÚepochÚstepsÚMSEÚnegative_mse)ÚsuperÚ__init__Útruncate_dimÚtarget_sentencesÚshow_progress_barÚ
batch_sizeÚnameÚcsv_fileÚcsv_headersÚ	write_csvÚprimary_metricÚembed_inputsÚsource_embeddings)
ÚselfÚsource_sentencesr   Úteacher_modelr   r   r   r   r   Ú	__class__s
            €Úg/home/james-whalen/.local/lib/python3.13/site-packages/sentence_transformers/evaluation/MSEEvaluator.pyr   ÚMSEEvaluator.__init__H   se   ø€ ô 	‰ÑÔØ(ÔØ 0ÔØ!2ÔØ$ŒØŒ	à)¨DÑ0°>ÑAˆŒÚ4ˆÔØ"ŒØ,ˆÔà!%×!2Ñ!2°=Ó!SˆÕó    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U R                  XR                  5      nU R                  U-
  S	-  R	                  5       nUS
-  n[
        R                  SU R                   SU S35        [
        R                  SUS 35        Ub×  U R                  (       aÆ  [        R                  " USS9  [        R                  R                  X R                  5      n[        R                  R                  U5      n	[        USU	(       a  SOSSS9 n
[         R"                  " U
5      nU	(       d  UR%                  U R&                  5        UR%                  X4U/5        S S S 5        SU* 0nU R)                  XÀR                  5      nU R+                  XX45        U$ ! , (       d  f       NB= f)Néÿÿÿÿz after epoch z
 in epoch z after z stepsÚ z (truncated to Ú)é   éd   z'MSE evaluation (lower = better) on the z datasetÚ:zMSE (*100):	Ú4fT)Úexist_okÚaÚwzutf-8)ÚnewlineÚmodeÚencodingr   )r   r   r   r   ÚmeanÚloggerÚinfor   r   ÚosÚmakedirsÚpathÚjoinr   ÚisfileÚopenÚcsvÚwriterÚwriterowr   Úprefix_name_to_metricsÚ store_metrics_in_model_card_data)r   ÚmodelÚoutput_pathr   r   Úout_txtÚtarget_embeddingsÚmseÚcsv_pathÚoutput_file_existsÚfr<   Úmetricss                r!   Ú__call__ÚMSEEvaluator.__call__a   s©  € ð B‹;Ø˜‹{Ø)¨%¨Ð1‘à& u g¨W°U°G¸6ÐB‘àˆGØ×ÑÑ(Ø˜¨×):Ñ):Ð(;¸1Ð=Ñ=ˆGà ×-Ñ-¨e×5JÑ5JÓKÐà×&Ñ&Ð):Ñ:¸qÑ@×FÑFÓHˆØC‰iˆä‰Ð=¸d¿i¹i¸[ÈÐQXÐPYÐYZÐ[Ô\Ü‰m C¨ 8Ð,Ô-àÑ" t§~§~ÜKŠK˜¨dÒ3Ü—w‘w—|‘| K·±Ó?ˆHÜ!#§¡§¡°Ó!9ÐÜh¨Ö8J±ÐPSÐ^eÒfÐjkÜŸš A›Þ)Ø—O‘O D×$4Ñ$4Ô5à—‘ ¨sÐ 3Ô4÷ gð " C 4Ð(ˆØ×-Ñ-¨g·y±yÓAˆØ×-Ñ-¨e¸eÔKØˆ÷ gÕfús   ÅAGÇ
Gc                ón   • UR                   " U4U R                  U R                  SU R                  S.UD6$ )NT)r   r   Úconvert_to_numpyr   )Úencoder   r   r   )r   r@   Ú	sentencesÚkwargss       r!   r   ÚMSEEvaluator.embed_inputs‡   sC   € ð |Š|Øð
à—‘Ø"×4Ñ4Ø!Ø×*Ñ*ñ
ð ñ
ð 	
r#   c                ó   • g)NzKnowledge Distillation© )r   s    r!   ÚdescriptionÚMSEEvaluator.description–   s   € à'r#   c                óB   • 0 nU R                   b  U R                   US'   U$ )Nr   )r   )r   Úconfig_dicts     r!   Úget_config_dictÚMSEEvaluator.get_config_dictš   s)   € ØˆØ×ÑÑ(Ø*.×*;Ñ*;ˆK˜Ñ'ØÐr#   )
r   r   r   r   r   r   r   r   r   r   )NFé    r&   TN)r   ú	list[str]r   rZ   r   Úboolr   Úintr   Ústrr   r[   r   z
int | None)Nr%   r%   )r@   r   rA   z
str | NoneÚreturnzdict[str, float])r@   r   rN   zstr | list[str] | np.ndarrayr^   z
np.ndarray)r^   r]   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   rI   r   ÚpropertyrS   rW   Ú__static_attributes__Ú__classcell__)r    s   @r!   r   r      sØ   ø† ñ3ðr Ø"'ØØØØ#'ðTà#ðTð $ðTð
  ðTð ðTð ðTð ðTð !÷Tð Tð4 []ð$Ø(ð$Ø7Að$à	õ$ðL
à"ð
ð 0ð
ð
 
ô
ð ó(ó ð(÷ð r#   r   )Ú
__future__r   r;   Úloggingr5   Útypingr   Ú2sentence_transformers.evaluation.SentenceEvaluatorr   ÚnumpyÚnpÚ)sentence_transformers.SentenceTransformerr   Ú	getLoggerr_   r3   r   rR   r#   r!   Ú<module>ro      s?   ðÝ "ã 
Û Û 	Ý  å PæÛåMà	×	Ò	˜8Ó	$€ôLÐ$õ Lr#   