Ë
    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 d dl	Z
d dlZd dlmZ d dlmZ erd dlmZ  ej$                  e«      Z G d„ d	e«      Zy)
é    )ÚannotationsN)Únullcontext)ÚTYPE_CHECKING)ÚSentenceEvaluator)Úpytorch_cos_sim)ÚSentenceTransformerc                  ót   ‡ — e Zd ZdZ	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Z	 d	 	 	 	 	 	 	 	 	 dd„Zd„ Zˆ xZS )	ÚTranslationEvaluatora�	  
    Given two sets of sentences in different languages, e.g. (en_1, en_2, en_3...) and (fr_1, fr_2, fr_3, ...),
    and assuming that fr_i is the translation of en_i.
    Checks if vec(en_i) has the highest similarity to vec(fr_i). Computes the accuracy in both directions

    The labels need to indicate the similarity between the sentences.

    Args:
        source_sentences (List[str]): List of sentences in the source language.
        target_sentences (List[str]): List of sentences in the target language.
        show_progress_bar (bool): Whether to show a progress bar when computing embeddings. Defaults to False.
        batch_size (int): The batch size to compute sentence embeddings. Defaults to 16.
        name (str): The name of the evaluator. Defaults to an empty string.
        print_wrong_matches (bool): Whether to print incorrect matches. Defaults to False.
        write_csv (bool): Whether to write the evaluation results to a CSV file. Defaults to True.
        truncate_dim (int, optional): The dimension to truncate sentence embeddings to. If None, the model's
            current truncation dimension will be used. Defaults to None.

    Example:
        ::

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

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

            # Load a parallel sentences dataset
            dataset = load_dataset("sentence-transformers/parallel-sentences-news-commentary", "en-nl", split="train[:1000]")

            # Initialize the TranslationEvaluator using the same texts from two languages
            translation_evaluator = TranslationEvaluator(
                source_sentences=dataset["english"],
                target_sentences=dataset["non_english"],
                name="news-commentary-en-nl",
            )
            results = translation_evaluator(model)
            '''
            Evaluating translation matching Accuracy of the model on the news-commentary-en-nl dataset:
            Accuracy src2trg: 90.80
            Accuracy trg2src: 90.40
            '''
            print(translation_evaluator.primary_metric)
            # => "news-commentary-en-nl_mean_accuracy"
            print(results[translation_evaluator.primary_metric])
            # => 0.906
    c	                ó4  •— t         ‰	| �  «        || _        || _        || _        || _        || _        || _        || _        t        | j                  «      t        | j                  «      k(  sJ ‚|rd|z   }d|z   dz   | _
        g d¢| _        || _        d| _        y )NÚ_Útranslation_evaluationz_results.csv)ÚepochÚstepsÚsrc2trgÚtrg2srcÚmean_accuracy)ÚsuperÚ__init__Úsource_sentencesÚtarget_sentencesÚnameÚ
batch_sizeÚshow_progress_barÚprint_wrong_matchesÚtruncate_dimÚlenÚcsv_fileÚcsv_headersÚ	write_csvÚprimary_metric)
Úselfr   r   r   r   r   r   r   r   Ú	__class__s
            €ús/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/sentence_transformers/evaluation/TranslationEvaluator.pyr   zTranslationEvaluator.__init__G   sž   ø€ ô 	‰ÑÔØ 0ˆÔØ 0ˆÔØˆŒ	Ø$ˆŒØ!2ˆÔØ#6ˆÔ Ø(ˆÔä�4×(Ñ(Ó)¬S°×1FÑ1FÓ-GÒGÐGÐGáØ˜‘:ˆDà0°4Ñ7¸.ÑHˆŒÚCˆÔØ"ˆŒØ-ˆÕó    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  t        j                  |j                  | j                  | j                  | j                  d¬«      «      }t        j                  |j                  | j                  | j                  | j                  d¬«      «      }d d d «       t        «      j                  «       j                  «       j!                  «       }d}	d}
t#        t%        |«      «      D ]ï  }t'        j(                  ||   «      }||k(  r|	dz  }	Œ&| j*                  sŒ3t-        d|d|d|«       t-        d| j                  |   «       t-        d| j                  |   d||   |   d›d�«       t-        d| j                  |   d||   |   d›d�«       t/        ||   «      }t1        |d„ d¬«      }|d d D ]%  \  }}t-        d|d|d›d�| j                  |   «       Œ' Œñ |j2                  }t#        t%        |«      «      D ]%  }t'        j(                  ||   «      }||k(  sŒ!|
dz  }
Œ' |	t%        |«      z  }|
t%        |«      z  }t        j                  d|dz  d›�«       t        j                  d |dz  d›�«       |�¸| j4                  r¬t6        j8                  j;                  || j<                  «      }t6        j8                  j?                  |«      }tA        |d|rd!nd"d#¬$«      5 }tC        jD                  |«      }|s|jG                  | jH                  «       |jG                  ||||g«       d d d «       ||||z   d%z  d&œ}| jK                  || j                  «      }| jM                  ||||«       |S # 1 sw Y   �ŒÞxY w# 1 sw Y   ŒTxY w)'Néÿÿÿÿz after epoch z
 in epoch z after z stepsÚ z (truncated to ú)z=Evaluating translation matching Accuracy of the model on the z datasetú:F)r   r   Úconvert_to_numpyr   é   z
Incorrect  : Sourcezis most similar to targetzinstead of targetzSource     :zPred Target:z(Score: z.4fzTrue Target:c                ó   — | d   S )Nr+   © )Úxs    r#   ú<lambda>z/TranslationEvaluator.__call__.<locals>.<lambda>—   s
   € ¸¸!¹€ r$   T)ÚkeyÚreverseé   ú	zAccuracy src2trg: éd   z.2fzAccuracy trg2src: ÚaÚwzutf-8)ÚnewlineÚmodeÚencodingé   )Úsrc2trg_accuracyÚtrg2src_accuracyr   )'r   ÚloggerÚinfor   r   Útruncate_sentence_embeddingsÚtorchÚstackÚencoder   r   r   r   r   ÚdetachÚcpuÚnumpyÚranger   ÚnpÚargmaxr   ÚprintÚ	enumerateÚsortedÚTr   ÚosÚpathÚjoinr   ÚisfileÚopenÚcsvÚwriterÚwriterowr   Úprefix_name_to_metricsÚ store_metrics_in_model_card_data)r!   ÚmodelÚoutput_pathr   r   Úout_txtÚembeddings1Úembeddings2Úcos_simsÚcorrect_src2trgÚcorrect_trg2srcÚiÚmax_idxÚresultsÚidxÚscoreÚacc_src2trgÚacc_trg2srcÚcsv_pathÚoutput_file_existsÚfrS   Úmetricss                          r#   Ú__call__zTranslationEvaluator.__call__e   s!  € ð �BŠ;Ø˜Š{Ø)¨%¨Ð1‘à& u g¨W°U°G¸6ÐB‘àˆGØ×ÑÐ(Ø˜¨×):Ñ):Ð(;¸1Ð=Ñ=ˆGä�‰ÐSÐTX×T]ÑT]ÐS^Ð^fÐgnÐfoÐopÐqÔrà"×/Ñ/Ð7Œ[Œ]¸U×=_Ñ=_Ð`d×`qÑ`qÓ=rñ 	ÜŸ+™+Ø—‘Ø×)Ñ)Ø&*×&<Ñ&<Ø#Ÿ™Ø%*ð	 ó óˆKô  Ÿ+™+Ø—‘Ø×)Ñ)Ø&*×&<Ñ&<Ø#Ÿ™Ø%*ð	 ó óˆK÷	ô$ # ;°Ó<×CÑCÓE×IÑIÓK×QÑQÓSˆàˆØˆä”s˜8“}Ó%ò 	ZˆAÜ—i‘i ¨¡Ó,ˆGà�GŠ|Ø 1Ñ$‘Ø×)Ó)ÜÐ-¨qÐ2MÈwÐXkÐmnÔoÜ�n d×&;Ñ&;¸AÑ&>Ô?Ü�n d×&;Ñ&;¸GÑ&DÈÐQYÐZ[ÑQ\Ð]dÑQeÐfiÐPjÐjkÐFlÔmÜ�n d×&;Ñ&;¸AÑ&>À(È8ÐTUÉ;ÐWXÉ>ÐZ]ÐJ^Ð^_Ð@`Ôaä# H¨Q¡KÓ0�Ü  ©nÀdÔK�Ø")¨"¨1 +ò Z‘J�C˜Ü˜$  x°°c¨{¸!Ð%<¸d×>SÑ>SÐTWÑ>XÕYñZð	Zð  —:‘:ˆÜ”s˜8“}Ó%ò 	%ˆAÜ—i‘i ¨¡Ó,ˆGØ�G‹|Ø 1Ñ$‘ð	%ð
 &¬¨H«Ñ5ˆØ%¬¨H«Ñ5ˆä�‰Ð(¨°sÑ):¸3Ð(?Ð@ÔAÜ�‰Ð(¨°sÑ):¸3Ð(?Ð@ÔAàÐ" t§~¢~Ü—w‘w—|‘| K°·±Ó?ˆHÜ!#§¡§¡°Ó!9ÐÜ�h¨Ñ8J±ÐPSÐ^eÔfð JÐjkÜŸ™ A›�Ù)Ø—O‘O D×$4Ñ$4Ô5à—‘ ¨¨{¸KÐ HÔI÷Jð !,Ø +Ø)¨KÑ7¸1Ñ<ñ
ˆð
 ×-Ñ-¨g°t·y±yÓAˆØ×-Ñ-¨e°W¸eÀUÔKØˆ÷I	ñ 	ú÷lJð Jús   ÂBO<Í.AP	Ï<PÐ	Pc                ó@   — i }| j                   �| j                   |d<   |S )Nr   )r   )r!   Úconfig_dicts     r#   Úget_config_dictz$TranslationEvaluator.get_config_dictº   s)   € ØˆØ×ÑÐ(Ø*.×*;Ñ*;ˆK˜Ñ'ØÐr$   )Fé   r'   FTN)r   ú	list[str]r   ro   r   Úboolr   Úintr   Ústrr   rp   r   rp   r   z
int | None)Nr&   r&   )
rW   r   rX   rr   r   rq   r   rq   Úreturnzdict[str, float])Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   rj   rm   Ú__classcell__)r"   s   @r#   r
   r
      s°   ø„ ñ/ðj #(ØØØ$)ØØ#'ð.à#ð.ð $ð.ð  ð	.ð
 ð.ð ð.ð "ð.ð ð.ð !õ.ð> bdðSØ(ðSØ7:ðSØJMðSØ[^ðSà	óSöjr$   r
   )Ú
__future__r   rR   ÚloggingrM   Ú
contextlibr   Útypingr   rE   rG   r@   Ú2sentence_transformers.evaluation.SentenceEvaluatorr   Úsentence_transformers.utilr   Ú)sentence_transformers.SentenceTransformerr   Ú	getLoggerrt   r=   r
   r-   r$   r#   ú<module>r�      sJ   ðÝ "ã 
Û Û 	Ý "Ý  ã Û å PÝ 6áÝMà	ˆ×	Ñ	˜8Ó	$€ôiÐ,õ ir$   