§
    æ˜ºhÈ  ã                   óÌ  — d dl Z d dlZd dlZd dlZd dlmZ d dlZd dlmZm	Z	m
Z
mZmZmZmZmZmZmZ d dlZd dlmZ d dlZd dlmZ d dl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" 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,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3 d
dl4m5Z5m6Z6m7Z7 d
dl8m9Z9 d
dl(m:Z:  ej;        e<¦  «        Z=erd dl>m?Z? ded         fd„Z@ G d„ dejA        ¦  «        ZBdS )é    N)ÚOrderedDict)
ÚListÚDictÚTupleÚIterableÚTypeÚUnionÚCallableÚOptionalÚLiteralÚTYPE_CHECKING)Úndarray)ÚHfApi)ÚnnÚTensorÚdevice)Ú	Optimizer)Ú
DataLoader)Útrangeé   )Ú__MODEL_HUB_ORGANIZATION__)ÚSentenceEvaluator)Úimport_from_stringÚbatch_to_deviceÚfullnameÚis_sentence_transformer_modelÚload_dir_pathÚload_file_pathÚsave_to_hub_args_decorator)ÚTransformerÚPoolingÚ	Normalize)ÚModelCardTemplate)Ú__version__)ÚInputExampleÚreturn)ÚmpsÚcudaÚcpuc                  ó�   — t           j                             ¦   «         rdS t           j        j                             ¦   «         rdS dS )ak  
    Returns the name of the device where this module is running on.
    It's simple implementation that doesn't cover cases when more powerful GPUs are available and
    not a primary device ('cuda:0') or MPS device is available, but not configured properly:
    https://pytorch.org/docs/master/notes/mps.html

    :return: Device name, like 'cuda' or 'cpu'
    r(   r'   r)   )Útorchr(   Úis_availableÚbackendsr'   © ó    úq/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/sentence_transformers/SentenceTransformer.pyÚget_device_namer1   ,   sB   € õ „z×ÒÑ Ô ð ØˆvÝ	ŒÔ	×	(Ò	(Ñ	*Ô	*ð Øˆuàˆur/   c            %       óÜ  ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 dedee         deeej                          dee         dee         de	d	ee         d
ee
e	ef                  dee
e	ef                  fˆ fd„Z	 	 	 	 	 	 	 dfde
eee         f         dede	dede	de	dede	de
ee         eef         fd„Zdgdee         fd„Zed„ ¦   «         Z	 	 	 dhdee         deeef         dedede	f
d„Zedefd „¦   «         Zd!„ Zd"e
ee         ee         eeeef                  f         fd#„Zd$„ Zd%„ Zd&„ Zd'„ Z	 	 	 did(ed)ee         d*e	d+eee                  fd,„Z	 djd(ed)ee         d+eee                  fd-„Z e!	 	 	 	 	 	 	 	 dkd/ed0ee         d
ee         d1ee	         d2ed3ee         d4e	d5e	d+eee                  fd6„¦   «         Z"d7ed8         deeeeef                  ef         fd9„Z#d:e
ee         eee                  f         fd;„Z$dd<dd=d>e%j&        j'        d?d@idAdBddd<dddddCdBfdDeee(ej        f                  dEe)dFedGedHedIe*e+         dJeeef         dKe,dLedMedNe	dOe,dPe	dQe-e,eegdf         de	dRedSedTef$dU„Z.dgdEe)dMefdV„Z/dW„ Z0dX„ Z1	 	 dlded
ee
e	ef                  dee         d	ee         de	f
dY„Z2	 	 dlded
ee
e	ef                  dee         d	ee         de	f
dZ„Z3ed[„ ¦   «         Z4edGedHed\efd]„¦   «         Z5e6de7fd^„¦   «         Z7e6d_„ ¦   «         Z8e8j9        d`„ ¦   «         Z8e6da„ ¦   «         Z:e:j9        db„ ¦   «         Z:e6de%j7        fdc„¦   «         Z;e;j9        dgdee
eee%j7        f                  ddfdd„¦   «         Z;ˆ xZ<S )mÚSentenceTransformeraC  
    Loads or creates a SentenceTransformer model that can be used to map sentences / text to embeddings.

    :param model_name_or_path: If it is a filepath on disc, it loads the model from that path. If it is not a path,
        it first tries to download a pre-trained SentenceTransformer model. If that fails, tries to construct a model
        from the Hugging Face Hub with that name.
    :param modules: A list of torch Modules that should be called sequentially, can be used to create custom
        SentenceTransformer models from scratch.
    :param device: Device (like "cuda", "cpu", "mps") that should be used for computation. If None, checks if a GPU
        can be used.
    :param cache_folder: Path to store models. Can also be set by the SENTENCE_TRANSFORMERS_HOME environment variable.
    :param revision: The specific model version to use. It can be a branch name, a tag name, or a commit id,
        for a stored model on Hugging Face.
    :param trust_remote_code: Whether or not to allow for custom models defined on the Hub in their own modeling files.
        This option should only be set to True for repositories you trust and in which you have read the code, as it
        will execute code present on the Hub on your local machine.
    :param token: Hugging Face authentication token to download private models.
    NFÚmodel_name_or_pathÚmodulesr   Úcache_folderÚtrust_remote_codeÚrevisionÚtokenÚuse_auth_tokenc	                 ó*  •— i | _         d | _        i | _        |�-t          j        dt
          ¦  «         |�t          d¦  «        ‚|}|€t          j        d¦  «        }|��|dk    rþt           
                    d                     |¦  «        ¦  «         g d¢}	t          j                             |¦  «        sfd|v s|                     d¦  «        d	k    r"t          d
                     |¦  «        ¦  «        ‚d|vr#|                     ¦   «         |	vrt           dz   |z   }t#          ||||¬¦  «        r|                      |||||¬¦  «        }n|                      |||||¬¦  «        }|�;t)          |t*          ¦  «        s&t+          d„ t-          |¦  «        D ¦   «         ¦  «        }t/          ¦   «                              |¦  «         |€;t3          ¦   «         }t           
                    d                     |¦  «        ¦  «         |                      |¦  «         d S )Nz^The `use_auth_token` argument is deprecated and will be removed in v3 of SentenceTransformers.zV`token` and `use_auth_token` are both specified. Please set only the argument `token`.ÚSENTENCE_TRANSFORMERS_HOMEÚ z'Load pretrained SentenceTransformer: {})Dzalbert-base-v1zalbert-base-v2zalbert-large-v1zalbert-large-v2zalbert-xlarge-v1zalbert-xlarge-v2zalbert-xxlarge-v1zalbert-xxlarge-v2zbert-base-cased-finetuned-mrpczbert-base-casedzbert-base-chinesezbert-base-german-casedzbert-base-german-dbmdz-casedzbert-base-german-dbmdz-uncasedzbert-base-multilingual-casedzbert-base-multilingual-uncasedzbert-base-uncasedz3bert-large-cased-whole-word-masking-finetuned-squadz#bert-large-cased-whole-word-maskingzbert-large-casedz5bert-large-uncased-whole-word-masking-finetuned-squadz%bert-large-uncased-whole-word-maskingzbert-large-uncasedzcamembert-baseÚctrlz%distilbert-base-cased-distilled-squadzdistilbert-base-casedzdistilbert-base-german-casedz"distilbert-base-multilingual-casedz'distilbert-base-uncased-distilled-squadz/distilbert-base-uncased-finetuned-sst-2-englishzdistilbert-base-uncasedÚ
distilgpt2zdistilroberta-basez
gpt2-largezgpt2-mediumzgpt2-xlÚgpt2z
openai-gptzroberta-base-openai-detectorzroberta-basezroberta-large-mnlizroberta-large-openai-detectorzroberta-largezt5-11bzt5-3bzt5-basezt5-largezt5-smallztransfo-xl-wt103zxlm-clm-ende-1024zxlm-clm-enfr-1024zxlm-mlm-100-1280zxlm-mlm-17-1280zxlm-mlm-en-2048zxlm-mlm-ende-1024zxlm-mlm-enfr-1024zxlm-mlm-enro-1024zxlm-mlm-tlm-xnli15-1024zxlm-mlm-xnli15-1024zxlm-roberta-basez)xlm-roberta-large-finetuned-conll02-dutchz+xlm-roberta-large-finetuned-conll02-spanishz+xlm-roberta-large-finetuned-conll03-englishz*xlm-roberta-large-finetuned-conll03-germanzxlm-roberta-largezxlnet-base-casedzxlnet-large-casedú\ú/r   zPath {} not found)r6   r8   )r9   r6   r8   r7   c                 ó6   — g | ]\  }}t          |¦  «        |f‘ŒS r.   )Ústr)Ú.0ÚidxÚmodules      r0   ú
<listcomp>z0SentenceTransformer.__init__.<locals>.<listcomp>Ó   s'   € Ð"\Ð"\Ð"\¹+¸#¸v¥C¨¡H¤H¨fÐ#5Ð"\Ð"\Ð"\r/   zUse pytorch device_name: {})Ú_model_card_varsÚ_model_card_textÚ_model_configÚwarningsÚwarnÚFutureWarningÚ
ValueErrorÚosÚgetenvÚloggerÚinfoÚformatÚpathÚexistsÚcountÚlowerr   r   Ú_load_sbert_modelÚ_load_auto_modelÚ
isinstancer   Ú	enumerateÚsuperÚ__init__r1   Úto)Úselfr4   r5   r   r6   r7   r8   r9   r:   Úbasic_transformer_modelsÚ	__class__s             €r0   r^   zSentenceTransformer.__init__Q   s]  ø€ ð !#ˆÔØ $ˆÔØˆÔØÐ%ÝŒMØpÝñô ð ð Ð Ý Ølñô ð ð #ˆEàÐÝœ9Ð%AÑBÔBˆLàÑ)Ð.@ÀBÒ.FÐ.FÝ�KŠKÐA×HÒHÐI[Ñ\Ô\Ñ]Ô]Ð]ðE(ð E(ð E(Ð$õN ”7—>’>Ð"4Ñ5Ô5ð _àÐ-Ð-Ð-Ð1C×1IÒ1IÈ#Ñ1NÔ1NÐQRÒ1RÐ1RÝ$Ð%8×%?Ò%?Ð@RÑ%SÔ%SÑTÔTÐTàÐ0Ð0Ð0Ð5G×5MÒ5MÑ5OÔ5OÐWoÐ5oÐ5oå)CÀcÑ)IÐL^Ñ)^Ð&å,Ð-?ÀÐUaÐltÐuÑuÔuð Ø×0Ò0Ø&ØØ!-Ø%Ø&7ð 1ñ ô ��ð ×/Ò/Ø&ØØ!-Ø%Ø&7ð 0ñ ô �ð Ð¥z°'½;Ñ'GÔ'GÐÝ!Ð"\Ð"\ÍÐSZÑI[ÔI[Ð"\Ñ"\Ô"\Ñ]Ô]ˆGå‰Œ×Ò˜Ñ!Ô!Ð!Øˆ>Ý$Ñ&Ô&ˆFÝ�KŠKÐ5×<Ò<¸VÑDÔDÑEÔEÐEà�Š�‰Œˆˆˆr/   é    Úsentence_embeddingTÚ	sentencesÚ
batch_sizeÚshow_progress_barÚoutput_valueÚconvert_to_numpyÚconvert_to_tensorÚnormalize_embeddingsr&   c	           	      óò  ‡ ‡‡‡‡— ‰                       ¦   «          |€Nt                               ¦   «         t          j        k    p&t                               ¦   «         t          j        k    }|rd}|dk    rd}d}d}	t          ‰t          ¦  «        st          ‰d¦  «        s‰gŠd}	|€‰ j	        }‰  
                    |¦  «         g Št          j        ˆ fd„‰D ¦   «         ¦  «        }
ˆfd„|
D ¦   «         }t          dt          ‰¦  «        |d	| ¬
¦  «        D �]Ý}||||z   …         }‰                      |¦  «        }t!          ||¦  «        }t#          j        ¦   «         5  ‰                      |¦  «        Š|dk    r¤g }t)          ‰|         ‰d         ¦  «        D ]„\  }}t          |¦  «        dz
  }|dk    rG||                              ¦   «         dk    r)|dz  }|dk    r||                              ¦   «         dk    °)|                     |d|dz   …         ¦  «         Œ…n©|€Lg }t/          t          ‰d         ¦  «        ¦  «        D ]&Šˆˆfd„‰D ¦   «         }|                     |¦  «         Œ'n[‰|         }|                     ¦   «         }|r't"          j        j                             |dd¬¦  «        }|r|                     ¦   «         }‰                     |¦  «         ddd¦  «         n# 1 swxY w Y   �Œßˆfd„t          j        |
¦  «        D ¦   «         Š|r8t          ‰¦  «        rt#          j        ‰¦  «        Šn4t#          j        ¦   «         Šn |rt          j         d„ ‰D ¦   «         ¦  «        Š|	r‰d         Š‰S )a·  
        Computes sentence embeddings.

        :param sentences: the sentences to embed.
        :param batch_size: the batch size used for the computation.
        :param show_progress_bar: Whether to output a progress bar when encode sentences.
        :param output_value: The type of embeddings to return: "sentence_embedding" to get sentence embeddings,
            "token_embeddings" to get wordpiece token embeddings, and `None`, to get all output values. Defaults
            to "sentence_embedding".
        :param convert_to_numpy: Whether the output should be a list of numpy vectors. If False, it is a list of PyTorch tensors.
        :param convert_to_tensor: Whether the output should be one large tensor. Overwrites `convert_to_numpy`.
        :param device: Which `torch.device` to use for the computation.
        :param normalize_embeddings: Whether to normalize returned vectors to have length 1. In that case,
            the faster dot-product (util.dot_score) instead of cosine similarity can be used.

        :return: By default, a list of tensors is returned. If convert_to_tensor, a stacked tensor is returned.
            If convert_to_numpy, a numpy matrix is returned.
        NFrd   Ú__len__Tc                 ó<   •— g | ]}‰                      |¦  «         ‘ŒS r.   )Ú_text_length)rE   Úsenr`   s     €r0   rH   z.SentenceTransformer.encode.<locals>.<listcomp>  s*   ø€ Ð'UÐ'UÐ'UÀC¨×):Ò):¸3Ñ)?Ô)?Ð(?Ð'UÐ'UÐ'Ur/   c                 ó    •— g | ]
}‰|         ‘ŒS r.   r.   )rE   rF   re   s     €r0   rH   z.SentenceTransformer.encode.<locals>.<listcomp>  s   ø€ ÐHÐHÐH¨s˜I cœNÐHÐHÐHr/   r   ÚBatches©ÚdescÚdisableÚtoken_embeddingsÚattention_maskr   c                 ó.   •— i | ]}|‰|         ‰         “ŒS r.   r.   )rE   ÚnameÚout_featuresÚsent_idxs     €€r0   ú
<dictcomp>z.SentenceTransformer.encode.<locals>.<dictcomp>)  s%   ø€ Ð[Ð[Ð[Àd˜t \°$Ô%7¸Ô%AÐ[Ð[Ð[r/   é   )ÚpÚdimc                 ó    •— g | ]
}‰|         ‘ŒS r.   r.   )rE   rF   Úall_embeddingss     €r0   rH   z.SentenceTransformer.encode.<locals>.<listcomp>7  s   ø€ ÐWÐWÐW°#˜.¨Ô-ÐWÐWÐWr/   c                 ó6   — g | ]}|                      ¦   «         ‘ŒS r.   )Únumpy)rE   Úembs     r0   rH   z.SentenceTransformer.encode.<locals>.<listcomp>?  s    € Ð(OÐ(OÐ(O¸¨¯ª©¬Ð(OÐ(OÐ(Or/   )!ÚevalrR   ÚgetEffectiveLevelÚloggingÚINFOÚDEBUGr[   rD   Úhasattrr   r_   ÚnpÚargsortr   ÚlenÚtokenizer   r+   Úno_gradÚforwardÚzipÚitemÚappendÚrangeÚdetachr   Ú
functionalÚ	normalizer)   ÚextendÚstackr   Úasarray)r`   re   rf   rg   rh   ri   rj   r   rk   Úinput_was_stringÚlength_sorted_idxÚsentences_sortedÚstart_indexÚsentences_batchÚfeaturesÚ
embeddingsÚ	token_embÚ	attentionÚlast_mask_idÚrowr�   rz   r{   s   ``                  @@@r0   ÚencodezSentenceTransformer.encodeÜ   s9  øøøøø€ ð: 	�	Š	‰ŒˆØÐ$å×(Ò(Ñ*Ô*­g¬lÒ:Ði½f×>VÒ>VÑ>XÔ>XÕ\cÔ\iÒ>ið ð ð 	%Ø$ÐàÐ/Ò/Ð/Ø %ÐØ$Ðà ÐÝ�i¥Ñ%Ô%ð 	$­WØ�yñ.
ô .
ð 	$ð #˜ˆIØ#Ðàˆ>Ø”[ˆFà�Š�‰ŒˆàˆÝœJÐ'UÐ'UÐ'UÐ'UÈ9Ð'UÑ'UÔ'UÑVÔVÐØHÐHÐHÐHÐ6GÐHÑHÔHÐå! !¥S¨¡^¤^°ZÀiÐ]nÐYnÐoÑoÔoð 	2ñ 	2ˆKØ.¨{¸[È:Ñ=UÐ/UÔVˆOØ—}’} _Ñ5Ô5ˆHÝ& x°Ñ8Ô8ˆHå”‘”ð 2ð 2Ø#Ÿ|š|¨HÑ5Ô5�àÐ#5Ò5Ð5Ø!#�JÝ03°LÀÔ4NÐP\Ð]mÔPnÑ0oÔ0oð Kð KÑ,˜	 9Ý'*¨9¡~¤~¸Ñ'9˜Ø*¨QÒ.Ð.°9¸\Ô3J×3OÒ3OÑ3QÔ3QÐUVÒ3VÐ3VØ(¨AÑ-˜Lð +¨QÒ.Ð.°9¸\Ô3J×3OÒ3OÑ3QÔ3QÐUVÒ3VÐ3Vð #×)Ò)¨)°A¸ÀqÑ8HÐ4HÔ*IÑJÔJÐJÐJðKð "Ð)Ø!#�JÝ$)­#¨lÐ;OÔ.PÑ*QÔ*QÑ$RÔ$Rð /ð /˜Ø[Ð[Ð[Ð[Ð[ÈlÐ[Ñ[Ô[˜Ø"×)Ò)¨#Ñ.Ô.Ð.Ð.ð/ð ".¨lÔ!;�JØ!+×!2Ò!2Ñ!4Ô!4�JØ+ð [Ý%*¤XÔ%8×%BÒ%BÀ:ÐQRÐXYÐ%BÑ%ZÔ%Z˜
ð (ð 6Ø%/§^¢^Ñ%5Ô%5˜
à×%Ò% jÑ1Ô1Ð1ð52ð 2ð 2ñ 2ô 2ð 2ð 2ð 2ð 2ð 2ð 2øøøð 2ð 2ð 2ð 2ùð8 XÐWÐWÐW½¼ÐDUÑ9VÔ9VÐWÑWÔWˆàð 	QÝ�>Ñ"Ô"ð 0Ý!&¤¨^Ñ!<Ô!<��å!&¤¡¤��Øð 	QÝœZÐ(OÐ(OÀÐ(OÑ(OÔ(OÑPÔPˆNàð 	/Ø+¨AÔ.ˆNàÐs   ÅE>K&Ë&K*	Ë-K*	Útarget_devicesc           
      ó  — |€tt           j                             ¦   «         r6d„ t          t           j                             ¦   «         ¦  «        D ¦   «         }n t
                               d¦  «         dgdz  }t
                               d                     d                     t          t          |¦  «        ¦  «        ¦  «        ¦  «         |                      d¦  «         |                      ¦   «          t          j        d¦  «        }|                     ¦   «         }|                     ¦   «         }g }|D ]Q}|                     t"          j        || ||fd	¬
¦  «        }|                     ¦   «          |                     |¦  «         ŒR|||dœS )aî  
        Starts multi process to process the encoding with several, independent processes.
        This method is recommended if you want to encode on multiple GPUs or CPUs. It is advised
        to start only one process per GPU. This method works together with encode_multi_process
        and stop_multi_process_pool.

        :param target_devices: PyTorch target devices, e.g. ["cuda:0", "cuda:1", ...] or ["cpu", "cpu", "cpu", "cpu"].
            If target_devices is None and CUDA is available, then all available CUDA devices will be used. If
            target_devices is None and CUDA is not available, then 4 CPU devices will be used.
        :return: Returns a dict with the target processes, an input queue and and output queue.
        Nc                 ó8   — g | ]}d                       |¦  «        ‘ŒS )zcuda:{})rT   )rE   Úis     r0   rH   z@SentenceTransformer.start_multi_process_pool.<locals>.<listcomp>T  s&   € Ð!`Ð!`Ð!`¸! )×"2Ò"2°1Ñ"5Ô"5Ð!`Ð!`Ð!`r/   z-CUDA is not available. Starting 4 CPU workersr)   é   z'Start multi-process pool on devices: {}z, ÚspawnT)ÚtargetÚargsÚdaemon)ÚinputÚoutputÚ	processes)r+   r(   r,   r”   Údevice_countrR   rS   rT   ÚjoinÚmaprD   r_   Úshare_memoryÚmpÚget_contextÚQueueÚProcessr3   Ú_encode_multi_process_workerÚstartr“   )r`   r§   ÚctxÚinput_queueÚoutput_queuer²   Ú	device_idr~   s           r0   Ústart_multi_process_poolz,SentenceTransformer.start_multi_process_poolF  sc  € ð Ð!ÝŒz×&Ò&Ñ(Ô(ð -Ø!`Ð!`½uÅUÄZ×E\ÒE\ÑE^ÔE^Ñ?_Ô?_Ð!`Ñ!`Ô!`��å—’ÐKÑLÔLÐLØ"' ¨1¡�å�ŠÐ=×DÒDÀTÇYÂYÍsÕSVÐXfÑOgÔOgÑEhÔEhÑiÔiÑjÔjÐjà�Š�‰ŒˆØ×ÒÑÔÐÝŒn˜WÑ%Ô%ˆØ—i’i‘k”kˆØ—y’y‘{”{ˆØˆ	à'ð 	 ð 	 ˆIØ—’Ý*ÔGØ  {°LÐAØð ñ ô ˆAð
 �GŠG‰IŒIˆIØ×Ò˜QÑÔÐÐà$°È9ÐUÐUÐUr/   c                 ó  — | d         D ]}|                      ¦   «          Œ| d         D ]*}|                     ¦   «          |                     ¦   «          Œ+| d                              ¦   «          | d                              ¦   «          dS )zK
        Stops all processes started with start_multi_process_pool
        r²   r°   r±   N)Ú	terminater´   Úclose)Úpoolr~   s     r0   Ústop_multi_process_poolz+SentenceTransformer.stop_multi_process_poolm  s‰   € ð
 �kÔ"ð 	ð 	ˆAØ�KŠK‰MŒMˆMˆMà�kÔ"ð 	ð 	ˆAØ�FŠF‰HŒHˆHØ�GŠG‰IŒIˆIˆIàˆWŒ×ÒÑÔÐØˆXŒ×ÒÑÔÐÐÐr/   rÅ   Ú
chunk_sizec           	      óÖ  ‡— |€Ht          t          j        t          |¦  «        t          |d         ¦  «        z  dz  ¦  «        d¦  «        }t                               dt          j        t          |¦  «        |z  ¦  «        › d|› �¦  «         |d         }d}g }|D ]J}	|                     |	¦  «         t          |¦  «        |k    r |                     ||||g¦  «         |d	z  }g }ŒKt          |¦  «        dk    r|                     ||||g¦  «         |d	z  }|d
         Št          ˆfd„t          |¦  «        D ¦   «         d„ ¬¦  «        }
t          j        d„ |
D ¦   «         ¦  «        }|S )aW  
        This method allows to run encode() on multiple GPUs. The sentences are chunked into smaller packages
        and sent to individual processes, which encode these on the different GPUs. This method is only suitable
        for encoding large sets of sentences

        :param sentences: List of sentences
        :param pool: A pool of workers started with SentenceTransformer.start_multi_process_pool
        :param batch_size: Encode sentences with batch size
        :param chunk_size: Sentences are chunked and sent to the individual processes. If none, it determine a sensible size.
        :param normalize_embeddings: Whether to normalize returned vectors to have length 1. In that case,
            the faster dot-product (util.dot_score) instead of cosine similarity can be used.
        :return: Numpy matrix with all embeddings
        Nr²   é
   iˆ  zChunk data into z packages of size r°   r   r   r±   c                 ó8   •— g | ]}‰                      ¦   «         ‘ŒS r.   )Úget)rE   Ú_r¿   s     €r0   rH   z<SentenceTransformer.encode_multi_process.<locals>.<listcomp>§  s%   ø€ ÐPÐPÐP°a˜|×/Ò/Ñ1Ô1ÐPÐPÐPr/   c                 ó   — | d         S )Nr   r.   ©Úxs    r0   ú<lambda>z:SentenceTransformer.encode_multi_process.<locals>.<lambda>§  s   € Ð`aÐbcÔ`d€ r/   ©Úkeyc                 ó   — g | ]
}|d          ‘ŒS )r   r.   )rE   Úresults     r0   rH   z<SentenceTransformer.encode_multi_process.<locals>.<listcomp>¨  s   € Ð$JÐ$JÐ$J°6 V¨A¤YÐ$JÐ$JÐ$Jr/   )ÚminÚmathÚceilr�   rR   Údebugr“   ÚputÚsortedr”   r‹   Úconcatenate)r`   re   rÅ   rf   rÇ   rk   r¾   Úlast_chunk_idÚchunkÚsentenceÚresults_listr¡   r¿   s               @r0   Úencode_multi_processz(SentenceTransformer.encode_multi_process|  s‚  ø€ ð, ÐÝ�TœY¥s¨9¡~¤~½¸DÀÔ<MÑ8NÔ8NÑ'NÐQSÑ'SÑTÔTÐVZÑ[Ô[ˆJå�ŠÐn­¬	µ#°i±.´.À:Ñ2MÑ(NÔ(NÐnÐnÐblÐnÐnÑoÔoÐoà˜7”mˆØˆØˆà!ð 	ð 	ˆHØ�LŠL˜Ñ"Ô"Ð"Ý�5‰zŒz˜ZÒ'Ð'Ø—’ °
¸EÐCWÐ XÑYÔYÐYØ Ñ"�Ø�øåˆu‰:Œ:˜Š>ˆ>Ø�OŠO˜]¨J¸Ð?SÐTÑUÔUÐUØ˜QÑˆMà˜H”~ˆÝÐPÐPÐPÐP½5ÀÑ;OÔ;OÐPÑPÔPÐVdÐVdÐeÑeÔeˆÝ”^Ð$JÐ$J¸\Ð$JÑ$JÔ$JÑKÔKˆ
ØÐr/   Útarget_devicec                 óÌ   — 	 	 |                      ¦   «         \  }}}}|                     || dd||¬¦  «        }|                     ||g¦  «         n# t          j        $ r Y dS w xY wŒd)zU
        Internal working process to encode sentences in multi-process setup
        TF)r   rg   ri   rf   rk   N)rË   r¦   rÙ   ÚqueueÚEmpty)	rá   Úmodelr¾   Úresults_queueÚchunk_idrf   re   rk   r¡   s	            r0   r»   z0SentenceTransformer._encode_multi_process_worker«  s–   € ð
	ðØHSÏÊÑHYÔHYÑE�˜* iÐ1EØ"Ÿ\š\ØØ(Ø&+Ø%)Ø)Ø)=ð *ñ ô �
ð ×!Ò! 8¨ZÐ"8Ñ9Ô9Ð9Ð9øÝ”;ð ð ð Ø��ðøøøð	s   ƒAA ÁA"Á!A"c                 ó|   — t          |                      ¦   «         d¦  «        r|                      ¦   «         j        S dS )zr
        Returns the maximal sequence length for input the model accepts. Longer inputs will be truncated
        Úmax_seq_lengthN)rŠ   Ú_first_moduleré   ©r`   s    r0   Úget_max_seq_lengthz&SentenceTransformer.get_max_seq_lengthÀ  s=   € õ �4×%Ò%Ñ'Ô'Ð)9Ñ:Ô:ð 	7Ø×%Ò%Ñ'Ô'Ô6Ð6àˆtr/   Útextsc                 óP   — |                       ¦   «                              |¦  «        S )z%
        Tokenizes the texts
        )rê   rŽ   )r`   rí   s     r0   rŽ   zSentenceTransformer.tokenizeÉ  s$   € ð ×!Ò!Ñ#Ô#×,Ò,¨UÑ3Ô3Ð3r/   c                 ó:   —  |                       ¦   «         j        |Ž S ©N)rê   Úget_sentence_features)r`   r    s     r0   rñ   z)SentenceTransformer.get_sentence_featuresÏ  s   € Ø9ˆt×!Ò!Ñ#Ô#Ô9¸8ÐDÐDr/   c                 ó°   — t          | j                             ¦   «         ¦  «        D ].}t          |dd ¦  «        }t	          |¦  «        r |¦   «         c S Œ/d S )NÚ get_sentence_embedding_dimension)ÚreversedÚ_modulesÚvaluesÚgetattrÚcallable)r`   ÚmodÚsent_embedding_dim_methods      r0   ró   z4SentenceTransformer.get_sentence_embedding_dimensionÒ  sk   € Ý˜DœM×0Ò0Ñ2Ô2Ñ3Ô3ð 	3ð 	3ˆCÝ(/°Ð5WÐY]Ñ(^Ô(^Ð%ÝÐ1Ñ2Ô2ð 3Ø0Ð0Ñ2Ô2Ð2Ð2Ð2ð3àˆtr/   c                 óZ   — | j         t          t          | j         ¦  «        ¦  «                 S )z4Returns the first module of this sequential embedder)rõ   ÚnextÚiterrë   s    r0   rê   z!SentenceTransformer._first_moduleÙ  s!   € àŒ}�T¥$ t¤}Ñ"5Ô"5Ñ6Ô6Ô7Ð7r/   c                 óZ   — | j         t          t          | j         ¦  «        ¦  «                 S )z3Returns the last module of this sequential embedder)rõ   rü   rô   rë   s    r0   Ú_last_modulez SentenceTransformer._last_moduleÝ  s!   € àŒ}�T¥(¨4¬=Ñ"9Ô"9Ñ:Ô:Ô;Ð;r/   rU   Ú
model_nameÚcreate_model_cardÚtrain_datasetsc           	      ó®  — |€dS t          j        |d¬¦  «         t                               d                     |¦  «        ¦  «         g }d| j        vr't          t          j        t          j        dœ| j        d<   t          t           j
                             |d¦  «        d¦  «        5 }t          j        | j        |d	¬
¦  «         ddd¦  «         n# 1 swxY w Y   t          | j        ¦  «        D ]ì\  }}| j        |         }	|dk    rt!          |	t"          ¦  «        r|dz   }
nEt           j
                             |t%          |¦  «        dz   t'          |	¦  «        j        z   ¦  «        }
t          j        |
d¬¦  «         |	                     |
¦  «         |                     ||t           j
                             |
¦  «        t'          |	¦  «        j        dœ¦  «         Œít          t           j
                             |d¦  «        d¦  «        5 }t          j        ||d	¬
¦  «         ddd¦  «         n# 1 swxY w Y   |r|                      |||¦  «         dS dS )a~  
        Saves all elements for this seq. sentence embedder into different sub-folders

        :param path: Path on disc
        :param model_name: Optional model name
        :param create_model_card: If True, create a README.md with basic information about this model
        :param train_datasets: Optional list with the names of the datasets used to to train the model
        NT©Úexist_okzSave model to {}r$   )Úsentence_transformersÚtransformersÚpytorchú!config_sentence_transformers.jsonÚwr}   )Úindentr   rB   rÌ   )rF   ry   rU   Útypeúmodules.json)rP   ÚmakedirsrR   rS   rT   rK   r$   r  r+   ÚopenrU   r´   ÚjsonÚdumpr\   rõ   r[   r    rD   r  Ú__name__Úsaver“   ÚbasenameÚ
__module__Ú_create_model_card)r`   rU   r   r  r  Úmodules_configÚfOutrF   ry   rG   Ú
model_paths              r0   r  zSentenceTransformer.saveá  s¶  € ð ˆ<ØˆFå
Œ�D 4Ð(Ñ(Ô(Ð(å�ŠÐ&×-Ò-¨dÑ3Ô3Ñ4Ô4Ð4Øˆð  Ô 2Ð2Ð2å)4Ý ,Ô 8Ý Ô,ð1ð 1ˆDÔ˜}Ñ-õ •"”'—,’,˜tÐ%HÑIÔIÈ3ÑOÔOð 	:ÐSWÝŒI�dÔ(¨$°qÐ9Ñ9Ô9Ð9ð	:ð 	:ð 	:ñ 	:ô 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:øøøð 	:ð 	:ð 	:ð 	:õ # 4¤=Ñ1Ô1ð 	ð 	‰IˆC�Ø”] 4Ô(ˆFØ�aŠxˆx�J v­{Ñ;Ô;ˆxØ! C™Z�
�
åœWŸ\š\¨$µ°C±´¸3±ÅÀfÁÄÔAVÑ0VÑWÔW�
åŒK˜
¨TÐ2Ñ2Ô2Ð2Ø�KŠK˜
Ñ#Ô#Ð#Ø×!Ò!Ø Tµ2´7×3CÒ3CÀJÑ3OÔ3OÕY]Ð^dÑYeÔYeÔYpÐqÐqñô ð ð õ •"”'—,’,˜t ^Ñ4Ô4°cÑ:Ô:ð 	6¸dÝŒI�n d°1Ð5Ñ5Ô5Ð5ð	6ð 	6ð 	6ñ 	6ô 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6øøøð 	6ð 	6ð 	6ð 	6ð ð 	FØ×#Ò# D¨*°nÑEÔEÐEÐEÐEð	Fð 	Fs$   Â(CÃCÃCÈH/È/H3È6H3c                 óÐ  — | j         �!t          | j         ¦  «        dk    r	| j         }�n£t          j                             ¦   «         }t          j        }t          | j        ¦  «        dk    �r)t          |                      ¦   «         t          ¦  «        �rt          |  
                    ¦   «         t          ¦  «        rÚ|  
                    ¦   «                              ¦   «         dv r²|  
                    ¦   «         }|                     ¦   «         }|                     dt          j        ¦  «        }t          j        |¦  «        \  }}	|                     d|	¦  «                             d|¦  «                             d|¦  «        }|                     d	¦  «         |                     d
t#          | ¦  «        ¦  «        }|                     dd                     d„ |D ¦   «         ¦  «        ¦  «        }d}
|�"dd                     d„ |D ¦   «         ¦  «        z   }
|                     d|
¦  «        }|                      ¦   «         | j        d<   | j                             ¦   «         D ](\  }}|                     |t#          |¦  «        ¦  «        }Œ)t          j                             ¦   «         D ](\  }}|                     |t#          |¦  «        ¦  «        }Œ)|�(|                     d|                     ¦   «         ¦  «        }t1          t2          j                             |d¦  «        dd¬¦  «        5 }|                     |                     ¦   «         ¦  «         ddd¦  «         dS # 1 swxY w Y   dS )zA
        Create an automatic model and stores it in path
        Nr   r}   )ÚclsÚmaxÚmeanz{USAGE_TRANSFORMERS_SECTION}z{POOLING_FUNCTION}z{POOLING_FUNCTION_NAME}z{POOLING_MODE}r  z{FULL_MODEL_STR}z{TAGS}ú
c                 ó   — g | ]}d |z   ‘ŒS ©z- r.   ©rE   Úts     r0   rH   z:SentenceTransformer._create_model_card.<locals>.<listcomp>;  s   € Ð@XÐ@XÐ@XÈaÀÈÁÐ@XÐ@XÐ@Xr/   r=   z
datasets:
c                 ó   — g | ]}d |z   ‘ŒS r   r.   )rE   Úds     r0   rH   z:SentenceTransformer._create_model_card.<locals>.<listcomp>?  s   € Ð9[Ð9[Ð9[Àq¸$À¹(Ð9[Ð9[Ð9[r/   z
{DATASETS}z{NUM_DIMENSIONS}z{MODEL_NAME}ú	README.mdr
  Úutf8©Úencoding)rJ   r�   r#   Ú__TAGS__ÚcopyÚ__MODEL_CARD__rõ   r[   rê   r    rÿ   r!   Úget_pooling_mode_strÚreplaceÚ__USAGE_TRANSFORMERS__Úmodel_card_get_pooling_functionr“   rD   r´   ró   rI   ÚitemsÚ__DEFAULT_VARS__Ústripr  rP   rU   Úwrite)r`   rU   r   r  Ú
model_cardÚtagsÚpooling_moduleÚpooling_modeÚpooling_fct_nameÚpooling_fctÚdatasets_strry   Úvaluer  s                 r0   r  z&SentenceTransformer._create_model_card  sl  € ð Ô Ð,µ°TÔ5JÑ1KÔ1KÈaÒ1OÐ1OØÔ.ˆJ‰Jå$Ô-×2Ò2Ñ4Ô4ˆDÝ*Ô9ˆJõ �D”MÑ"Ô" aÒ'Ñ'Ý˜t×1Ò1Ñ3Ô3µ[ÑAÔAñ (å˜t×0Ò0Ñ2Ô2µGÑ<Ô<ð (ð ×%Ò%Ñ'Ô'×<Ò<Ñ>Ô>ÐBXÐXÐXà!%×!2Ò!2Ñ!4Ô!4�Ø-×BÒBÑDÔD�Ø'×/Ò/Ø2Õ4EÔ4\ñô �
õ 1BÔ0aÐbnÑ0oÔ0oÑ-Ð  +à×&Ò&Ð';¸[ÑIÔIß’WÐ6Ð8HÑIÔIß’WÐ-¨|Ñ<Ô<ð ð
 —’˜NÑ+Ô+Ð+ð $×+Ò+Ð,>ÅÀDÁ	Ä	ÑJÔJˆJð $×+Ò+¨H°d·i²iÐ@XÐ@XÐSWÐ@XÑ@XÔ@XÑ6YÔ6YÑZÔZˆJàˆLØÐ)Ø,¨t¯yªyÐ9[Ð9[ÈNÐ9[Ñ9[Ô9[Ñ/\Ô/\Ñ\�Ø#×+Ò+¨L¸,ÑGÔGˆJð 9=×8]Ò8]Ñ8_Ô8_ˆDÔ!Ð"4Ñ5ð  $Ô4×:Ò:Ñ<Ô<ð Bð B‘��eØ'×/Ò/°µc¸%±j´jÑAÔA�
�
õ  1ÔA×GÒGÑIÔIð Bð B‘��eØ'×/Ò/°µc¸%±j´jÑAÔA�
�
àÐ!Ø#×+Ò+¨N¸J×<LÒ<LÑ<NÔ<NÑOÔOˆJå•"”'—,’,˜t [Ñ1Ô1°3ÀÐHÑHÔHð 	+ÈDØ�JŠJ�z×'Ò'Ñ)Ô)Ñ*Ô*Ð*ð	+ð 	+ð 	+ñ 	+ô 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+øøøð 	+ð 	+ð 	+ð 	+ð 	+ð 	+s   Ì&(MÍMÍ"Mú"Add new SentenceTransformer model.Úrepo_idÚorganizationÚprivateÚcommit_messageÚlocal_model_pathr  Úreplace_model_cardc
                 ó:  — |ryd|vr)t                                d|› d|› d�¦  «         |› d|› �}nL|                     d¦  «        d         |k    rt          d¦  «        ‚t                                d|› d�¦  «         t	          |¬¦  «        }
|
                     ||d|¬	¦  «        }|r|
                     |||¬
¦  «        }n¡t          j        ¦   «         5 }|p=t          j
                             t          j
                             |d¦  «        ¦  «         }|                      ||j        ||	¬¦  «         |
                     |||¬
¦  «        }ddd¦  «         n# 1 swxY w Y   |
                     |¬¦  «        }|j        D ]}|j        dk    rd|› d|j        › �c S Œ|S )a¶  
        Uploads all elements of this Sentence Transformer to a new HuggingFace Hub repository.

        :param repo_id: Repository name for your model in the Hub, including the user or organization.
        :param token: An authentication token (See https://huggingface.co/settings/token)
        :param private: Set to true, for hosting a private model
        :param commit_message: Message to commit while pushing.
        :param local_model_path: Path of the model locally. If set, this file path will be uploaded. Otherwise, the current model will be uploaded
        :param exist_ok: If true, saving to an existing repository is OK. If false, saving only to a new repository is possible
        :param replace_model_card: If true, replace an existing model card in the hub with the automatically created model card
        :param train_datasets: Datasets used to train the model. If set, the datasets will be added to the model card in the Hub.
        :param organization: Deprecated. Organization in which you want to push your model or tokenizer (you must be a member of this organization).

        :return: The url of the commit of your model in the repository on the Hugging Face Hub.
        rB   zQProviding an `organization` to `save_to_hub` is deprecated, please use `repo_id="z"` instead.r   zVProviding an `organization` to `save_to_hub` is deprecated, please only use `repo_id`.zVProviding an `organization` to `save_to_hub` is deprecated, please only use `repo_id=")r9   N)r=  r?  Ú	repo_typer  )r=  Úfolder_pathr@  r%  )r   r  r  )r=  Úmainzhttps://huggingface.co/z/commit/)rR   ÚwarningÚsplitrO   r   Úcreate_repoÚupload_folderÚtempfileÚTemporaryDirectoryrP   rU   rV   r´   r  r=  Úlist_repo_refsÚbranchesry   Útarget_commit)r`   r=  r>  r9   r?  r@  rA  r  rB  r  ÚapiÚrepo_urlÚ
folder_urlÚtmp_dirr  ÚrefsÚbranchs                    r0   Úsave_to_hubzSentenceTransformer.save_to_hubS  sƒ  € ð8 ð 	Ø˜'Ð!Ð!Ý—’ð LÐhtð  Lð  LÐw~ð  Lð  Lð  Lñô ð ð *Ð5Ð5¨GÐ5Ð5��Ø—’˜sÑ#Ô# AÔ&¨,Ò6Ð6Ý Ølñô ð õ —’ð BÐmtð  Bð  Bð  Bñô ð õ ˜%Ð Ñ Ô ˆØ—?’?ØØØØð	 #ñ 
ô 
ˆð ð 	tØ×*Ò*ØÐ-=Ènð +ñ ô ˆJˆJõ Ô,Ñ.Ô.ð t°'Ø$6Ð$p½b¼g¿nºnÍRÌWÏ\Ê\ÐZaÐcnÑMoÔMoÑ>pÔ>pÐ:pÐ!Ø—	’	ØØ'Ô/Ø&7Ø#1ð	 ñ ô ð ð !×.Ò.°wÈGÐdrÐ.ÑsÔs�
ðtð tð tñ tô tð tð tð tð tð tð tøøøð tð tð tð tð ×!Ò!¨'Ð!Ñ2Ô2ˆØ”mð 	Yð 	YˆFØŒ{˜fÒ$Ð$ØX°ÐXÐXÀ&ÔBVÐXÐXÐXÐXÐXð %ð Ðs   ÃA7EÅEÅEÚbatchr%   c                 óŠ   ‡ — d„ |D ¦   «         }ˆ fd„t          |Ž D ¦   «         }t          j        d„ |D ¦   «         ¦  «        }||fS )a;  
        Transforms a batch from a SmartBatchingDataset to a batch of tensors for the model
        Here, batch is a list of InputExample instances: [InputExample(...), ...]

        :param batch:
            a batch from a SmartBatchingDataset
        :return:
            a batch of tensors for the model
        c                 ó   — g | ]	}|j         ‘Œ
S r.   )rí   ©rE   Úexamples     r0   rH   z>SentenceTransformer.smart_batching_collate.<locals>.<listcomp>¥  s   € Ð4Ð4Ð4 7�”Ð4Ð4Ð4r/   c                 ó:   •— g | ]}‰                      |¦  «        ‘ŒS r.   )rŽ   )rE   rÞ   r`   s     €r0   rH   z>SentenceTransformer.smart_batching_collate.<locals>.<listcomp>¦  s%   ø€ ÐQÐQÐQ¸˜TŸ]š]¨8Ñ4Ô4ÐQÐQÐQr/   c                 ó   — g | ]	}|j         ‘Œ
S r.   )ÚlabelrZ  s     r0   rH   z>SentenceTransformer.smart_batching_collate.<locals>.<listcomp>§  s   € ÐBÐBÐB°˜wœ}ÐBÐBÐBr/   )r‘   r+   Útensor)r`   rW  rí   Úsentence_featuresÚlabelss   `    r0   Úsmart_batching_collatez*SentenceTransformer.smart_batching_collate›  s_   ø€ ð 5Ð4¨eÐ4Ñ4Ô4ˆØQÐQÐQÐQÅSÈ%À[ÐQÑQÔQÐÝ”ÐBÐB¸EÐBÑBÔBÑCÔCˆØ  &Ð(Ð(r/   Útextc                 ór  — t          |t          ¦  «        r;t          t          t	          |                     ¦   «         ¦  «        ¦  «        ¦  «        S t          |d¦  «        sdS t          |¦  «        dk    st          |d         t          ¦  «        rt          |¦  «        S t          d„ |D ¦   «         ¦  «        S )zé
        Help function to get the length for the input text. Text can be either
        a list of ints (which means a single text as input), or a tuple of list of ints
        (representing several text inputs to the model).
        rm   r   r   c                 ó,   — g | ]}t          |¦  «        ‘ŒS r.   ©r�   r!  s     r0   rH   z4SentenceTransformer._text_length.<locals>.<listcomp>¸  s   € Ð-Ð-Ð- 1�˜A™œÐ-Ð-Ð-r/   )	r[   Údictr�   rü   rý   rö   rŠ   ÚintÚsum)r`   rc  s     r0   ro   z SentenceTransformer._text_lengthª  s�   € õ �d�DÑ!Ô!ð 	/Ý•t�D §¢¡¤Ñ/Ô/Ñ0Ô0Ñ1Ô1Ð1Ý˜˜yÑ)Ô)ð 	/Ø�1Ý�‰YŒY˜!Š^ˆ^�z¨$¨q¬'µ3Ñ7Ô7ˆ^Ý�t‘9”9ÐåÐ-Ð-¨Ð-Ñ-Ô-Ñ.Ô.Ð.r/   r   ÚWarmupLineari'  Úlrgñhãˆµøô>g{®Gáz„?r   iô  Útrain_objectivesÚ	evaluatorÚepochsÚ	schedulerÚwarmup_stepsÚoptimizer_classÚoptimizer_paramsÚweight_decayÚevaluation_stepsÚoutput_pathÚsave_best_modelÚmax_grad_normÚuse_ampÚcallbackÚcheckpoint_pathÚcheckpoint_save_stepsÚcheckpoint_save_total_limitc                 ó´  ‡ ‡2— g }|D ]-\  }}|                      t          j        ||¦  «        ¦  «         Œ.d                     d„ |D ¦   «         ¦  «        }t	          j        t          |¦  «        ||||t          |¦  «        ||	|
|dœ
dd¬¦  «        }d‰ _        t          j	         
                    d|¦  «         
                    d	|¦  «        ‰ j        d
<   |r)ddlm} t          j        j                             ¦   «         }‰                      ‰ j        ¦  «         d„ |D ¦   «         }|D ]}‰ j        |_        Œd„ |D ¦   «         }|D ]}|                     ‰ j        ¦  «         Œd‰ _        |�|dk    rt/          d„ |D ¦   «         ¦  «        }t1          ||z  ¦  «        }g }g }|D ]•}t3          |                     ¦   «         ¦  «        } g d¢Š2ˆ2fd„| D ¦   «         |	dœˆ2fd„| D ¦   «         ddœg}! ||!fi |¤Ž}"‰                      |"|||¬¦  «        }#|                     |"¦  «         |                     |#¦  «         Œ–d}$d„ |D ¦   «         }%t;          |¦  «        }&d}'t=          |d| ¬¦  «        D �]:}(d})|D ]*}|                     ¦   «          |                      ¦   «          Œ+t=          |dd| ¬¦  «        D �]Ø}*tC          |&¦  «        D �]:}+||+         }||+         }"||+         }|%|+         },	 tE          |,¦  «        }-n9# tF          $ r, tI          ||+         ¦  «        },|,|%|+<   tE          |,¦  «        }-Y nw xY w|-\  }.}/|/                     ‰ j        ¦  «        }/t3          tK          ˆ fd„|.¦  «        ¦  «        }.|r÷ |¦   «         5   ||.|/¦  «        }0ddd¦  «         n# 1 swxY w Y   | &                    ¦   «         }1| '                    |0¦  «         (                    ¦   «          | )                    |"¦  «         t          j*        j+         ,                    | -                    ¦   «         |¦  «         | .                    |"¦  «         | /                    ¦   «          | &                    ¦   «         |1k    }'nk ||.|/¦  «        }0|0 (                    ¦   «          t          j*        j+         ,                    | -                    ¦   «         |¦  «         |" .                    ¦   «          |"                     ¦   «          |'s| .                    ¦   «          �Œ<|)dz  })|$dz  }$|
dk    rP|)|
z  dk    rG‰  0                    ||||(|)|¦  «         |D ]*}|                     ¦   «          |                      ¦   «          Œ+|�(|�&|dk    r |$|z  dk    r‰  1                    |||$¦  «         �ŒÚ‰  0                    ||||(d |¦  «         �Œ<|€|�‰  2                    |¦  «         |�‰  1                    |||$¦  «         dS dS )!a	  
        Train the model with the given training objective
        Each training objective is sampled in turn for one batch.
        We sample only as many batches from each objective as there are in the smallest one
        to make sure of equal training with each dataset.

        :param train_objectives: Tuples of (DataLoader, LossFunction). Pass more than one for multi-task learning
        :param evaluator: An evaluator (sentence_transformers.evaluation) evaluates the model performance during training on held-out dev data. It is used to determine the best model that is saved to disc.
        :param epochs: Number of epochs for training
        :param steps_per_epoch: Number of training steps per epoch. If set to None (default), one epoch is equal the DataLoader size from train_objectives.
        :param scheduler: Learning rate scheduler. Available schedulers: constantlr, warmupconstant, warmuplinear, warmupcosine, warmupcosinewithhardrestarts
        :param warmup_steps: Behavior depends on the scheduler. For WarmupLinear (default), the learning rate is increased from o up to the maximal learning rate. After these many training steps, the learning rate is decreased linearly back to zero.
        :param optimizer_class: Optimizer
        :param optimizer_params: Optimizer parameters
        :param weight_decay: Weight decay for model parameters
        :param evaluation_steps: If > 0, evaluate the model using evaluator after each number of training steps
        :param output_path: Storage path for the model and evaluation files
        :param save_best_model: If true, the best model (according to evaluator) is stored at output_path
        :param max_grad_norm: Used for gradient normalization.
        :param use_amp: Use Automatic Mixed Precision (AMP). Only for Pytorch >= 1.6.0
        :param callback: Callback function that is invoked after each evaluation.
                It must accept the following three parameters in this order:
                `score`, `epoch`, `steps`
        :param show_progress_bar: If True, output a tqdm progress bar
        :param checkpoint_path: Folder to save checkpoints during training
        :param checkpoint_save_steps: Will save a checkpoint after so many steps
        :param checkpoint_save_total_limit: Total number of checkpoints to store
        z

c                 ó   — g | ]}|‘ŒS r.   r.   )rE   rc  s     r0   rH   z+SentenceTransformer.fit.<locals>.<listcomp>ò  s   € Ð*PÐ*PÐ*P°D¨4Ð*PÐ*PÐ*Pr/   )
rm  rn  Ústeps_per_epochro  rp  rq  rr  rs  rt  rw  r«   T)r  Ú	sort_keysNz{LOSS_FUNCTIONS}z{FIT_PARAMETERS}z{TRAINING_SECTION}r   )Úautocastc                 ó   — g | ]\  }}|‘ŒS r.   r.   )rE   Ú
dataloaderrÌ   s      r0   rH   z+SentenceTransformer.fit.<locals>.<listcomp>  s   € ÐHÐHÐH¡m j°!�zÐHÐHÐHr/   c                 ó   — g | ]\  }}|‘ŒS r.   r.   )rE   rÌ   Úlosss      r0   rH   z+SentenceTransformer.fit.<locals>.<listcomp>  s   € Ð<Ð<Ð<¡  4�tÐ<Ð<Ð<r/   i�igÿc                 ó,   — g | ]}t          |¦  «        ‘ŒS r.   rf  ©rE   rƒ  s     r0   rH   z+SentenceTransformer.fit.<locals>.<listcomp>  s   € Ð"QÐ"QÐ"Q°z¥3 z¡?¤?Ð"QÐ"QÐ"Qr/   )ÚbiaszLayerNorm.biaszLayerNorm.weightc                 óR   •‡— g | ]"\  Š}t          ˆfd „‰D ¦   «         ¦  «        ° |‘Œ#S )c              3   ó    •K  — | ]}|‰v V — Œ	d S rð   r.   ©rE   ÚndÚns     €r0   ú	<genexpr>z5SentenceTransformer.fit.<locals>.<listcomp>.<genexpr>*  s(   øè è € ÐGcÐGcÐTVÈÈaÈÐGcÐGcÐGcÐGcÐGcÐGcr/   ©Úany©rE   r~   r�  Úno_decays     @€r0   rH   z+SentenceTransformer.fit.<locals>.<listcomp>*  sA   øø€ ÐdÐdÐd¡T Q¨ÅCÐGcÐGcÐGcÐGcÐZbÐGcÑGcÔGcÑDcÔDcÐd˜qÐdÐdÐdr/   )Úparamsrs  c                 óR   •‡— g | ]"\  Š}t          ˆfd „‰D ¦   «         ¦  «        ¯ |‘Œ#S )c              3   ó    •K  — | ]}|‰v V — Œ	d S rð   r.   r‹  s     €r0   rŽ  z5SentenceTransformer.fit.<locals>.<listcomp>.<genexpr>-  s'   øè è € Ð@\Ð@\ÈRÀÀqÀÐ@\Ð@\Ð@\Ð@\Ð@\Ð@\r/   r�  r‘  s     @€r0   rH   z+SentenceTransformer.fit.<locals>.<listcomp>-  sA   øø€ Ð]Ð]Ð]¡$ ! Q½SÐ@\Ð@\Ð@\Ð@\ÐS[Ð@\Ñ@\Ô@\Ñ=\Ô=\Ð]˜AÐ]Ð]Ð]r/   g        )ro  rp  Út_totalc                 ó,   — g | ]}t          |¦  «        ‘ŒS r.   )rý   r‡  s     r0   rH   z+SentenceTransformer.fit.<locals>.<listcomp>9  s    € ÐIÐIÐI¨z�$˜zÑ*Ô*ÐIÐIÐIr/   FÚEpochrs   Ú	Iterationgš™™™™™©?)rt   Ú	smoothingru   c                 ó.   •— t          | ‰j        ¦  «        S rð   )r   r   )rW  r`   s    €r0   rÐ   z)SentenceTransformer.fit.<locals>.<lambda>U  s   ø€ µoÀeÈTÌ[Ñ6YÔ6Y€ r/   r   éÿÿÿÿ)3r˜   r#   Úget_train_objective_infor´   r  Údumpsr   rD   rJ   Ú__TRAINING_SECTION__r-  rI   Útorch.cuda.ampr�  r+   r(   ÚampÚ
GradScalerr_   r   rb  Ú
collate_fnÚ
best_scorerÕ   rh  ÚlistÚnamed_parametersÚ_get_schedulerr“   r�   r   Ú	zero_gradÚtrainr”   rü   ÚStopIterationrý   rµ   Ú	get_scaleÚscaleÚbackwardÚunscale_r   ÚutilsÚclip_grad_norm_Ú
parametersÚstepÚupdateÚ_eval_during_trainingÚ_save_checkpointr  )3r`   rl  rm  rn  r  ro  rp  rq  rr  rs  rt  ru  rv  rw  rx  ry  rg   rz  r{  r|  Úinfo_loss_functionsrƒ  r…  Úinfo_fit_parametersr�  ÚscalerÚdataloadersÚloss_modelsÚ
loss_modelÚnum_train_stepsÚ
optimizersÚ
schedulersÚparam_optimizerÚoptimizer_grouped_parametersÚ	optimizerÚscheduler_objÚglobal_stepÚdata_iteratorsÚnum_train_objectivesÚskip_schedulerÚepochÚtraining_stepsrÌ   Ú	train_idxÚdata_iteratorÚdatar    ra  Ú
loss_valueÚscale_before_stepr’  s3   `                                                 @r0   ÚfitzSentenceTransformer.fitº  sƒ  øø€ ðj !ÐØ 0ð 	eð 	eÑˆJ˜Ø×&Ò&Õ'8Ô'QÐR\Ð^bÑ'cÔ'cÑdÔdÐdÐdØ$ŸkškÐ*PÐ*PÐ<OÐ*PÑ*PÔ*PÑQÔQÐå"œjå% iÑ0Ô0Ø Ø#2Ø&Ø ,Ý#& Ñ#7Ô#7Ø$4Ø ,Ø$4Ø!.ðð ð Øð
ñ 
ô 
Ðð  !%ˆÔÝ6GÔ6\×6dÒ6dØÐ 3ñ7
ô 7
ç
Š'Ð$Ð&9Ñ
:Ô
:ð 	ÔÐ2Ñ3ð ð 	1Ø/Ð/Ð/Ð/Ð/Ð/å”Z”^×.Ò.Ñ0Ô0ˆFà�Š�”ÑÔÐàHÐHÐ7GÐHÑHÔHˆð &ð 	@ð 	@ˆJØ$(Ô$?ˆJÔ!Ð!à<Ð<Ð+;Ð<Ñ<Ô<ˆØ%ð 	'ð 	'ˆJØ�MŠM˜$œ+Ñ&Ô&Ð&Ð&à"ˆŒàÐ" o¸Ò&:Ð&:Ý!Ð"QÐ"QÀ[Ð"QÑ"QÔ"QÑRÔRˆOå˜o°Ñ6Ñ7Ô7ˆð ˆ
Øˆ
Ø%ð 	-ð 	-ˆJÝ" :×#>Ò#>Ñ#@Ô#@ÑAÔAˆOàEÐEÐEˆHð eÐdÐdÐd¨_ÐdÑdÔdØ$0ðð ð ^Ð]Ð]Ð]¨/Ð]Ñ]Ô]ÐorÐsÐsð,Ð(ð (˜Ð(DÐYÐYÐHXÐYÐYˆIØ ×/Ò/Ø Y¸\ÐSbð 0ñ ô ˆMð ×Ò˜iÑ(Ô(Ð(Ø×Ò˜mÑ,Ô,Ð,Ð,àˆØIÐI¸[ÐIÑIÔIˆå"Ð#3Ñ4Ô4ÐàˆÝ˜F¨Ð>OÐ:OÐPÑPÔPð D	eñ D	eˆEØˆNà)ð #ð #�
Ø×$Ò$Ñ&Ô&Ð&Ø× Ò Ñ"Ô"Ð"Ð"å˜O°+ÈÐ[lÐWlÐmÑmÔmð ;eñ ;e�Ý!&Ð';Ñ!<Ô!<ð &)ñ &)�IØ!,¨YÔ!7�JØ *¨9Ô 5�IØ *¨9Ô 5�IØ$2°9Ô$=�Mð3Ý# MÑ2Ô2˜˜øÝ(ð 3ð 3ð 3Ý(,¨[¸Ô-CÑ(DÔ(D˜Ø4A˜ yÑ1Ý# MÑ2Ô2˜˜˜ð3øøøð
 (,Ñ$�H˜fØ#ŸYšY t¤{Ñ3Ô3�FÝ#¥CÐ(YÐ(YÐ(YÐ(YÐ[cÑ$dÔ$dÑeÔe�Hàð )Ø%˜X™ZœZð Fð FØ)3¨°H¸fÑ)EÔ)E˜JðFð Fð Fñ Fô Fð Fð Fð Fð Fð Fð Føøøð Fð Fð Fð Fð -3×,<Ò,<Ñ,>Ô,>Ð)ØŸš ZÑ0Ô0×9Ò9Ñ;Ô;Ð;ØŸš¨	Ñ2Ô2Ð2Ýœœ×6Ò6°z×7LÒ7LÑ7NÔ7NÐP]Ñ^Ô^Ð^ØŸš IÑ.Ô.Ð.ØŸš™œ˜à)/×)9Ò)9Ñ);Ô);Ð?PÒ)P˜˜à%/ Z°¸&Ñ%AÔ%A˜
Ø"×+Ò+Ñ-Ô-Ð-Ýœœ×6Ò6°z×7LÒ7LÑ7NÔ7NÐP]Ñ^Ô^Ð^Ø!ŸšÑ(Ô(Ð(à×'Ò'Ñ)Ô)Ð)à)ð )Ø!ŸšÑ(Ô(Ð(ùà !Ñ#�Ø˜qÑ �à# aÒ'Ð'¨NÐ=MÑ,MÐQRÒ,RÐ,RØ×.Ò.Ø! ;°ÀÈÐX`ñô ð ð '2ð +ð +˜
Ø"×,Ò,Ñ.Ô.Ð.Ø"×(Ò(Ñ*Ô*Ð*Ð*ð $Ð/Ø-Ð9Ø-°Ò1Ð1Ø#Ð&;Ñ;¸qÒ@Ð@à×)Ò)¨/Ð;VÐXcÑdÔdÐdùà×&Ò& y°+¸ÐPUÐWYÐ[cÑdÔdÐdÑdàÐ Ð!8Ø�IŠI�kÑ"Ô"Ð"àÐ&Ø×!Ò! /Ð3NÐP[Ñ\Ô\Ð\Ð\Ð\ð 'Ð&s$   Ë$K4Ë43L*	Ì)L*	Í8N	ÎNÎNc                 óJ   — |�t          j        |d¬¦  «          || |¦  «        S )z²
        Evaluate the model

        :param evaluator:
            the evaluator
        :param output_path:
            the evaluator can write the results to this path
        NTr  )rP   r  )r`   rm  ru  s      r0   ÚevaluatezSentenceTransformer.evaluateŠ  s1   € ð Ð"ÝŒK˜¨dÐ3Ñ3Ô3Ð3Øˆy˜˜{Ñ+Ô+Ð+r/   c                 óD  — |}|�Lt          j        |d¬¦  «         t           j                             |d¦  «        }t          j        |d¬¦  «         |�I || |||¬¦  «        }|� ||||¦  «         || j        k    r"|| _        |r|                      |¦  «         dS dS dS dS )z#Runs evaluation during the trainingNTr  r…   )ru  rÇ  Ústeps)rP   r  rU   r´   r¤  r  )	r`   rm  ru  rv  rÇ  rÒ  ry  Ú	eval_pathÚscores	            r0   r´  z)SentenceTransformer._eval_during_training—  sÒ   € àˆ	ØÐ"ÝŒK˜¨dÐ3Ñ3Ô3Ð3ÝœŸš [°&Ñ9Ô9ˆIÝŒK˜	¨DÐ1Ñ1Ô1Ð1àÐ Ø�I˜d°	ÀÈeÐTÑTÔTˆEØÐ#Ø�˜  uÑ-Ô-Ð-Ø�t”Ò&Ð&Ø"'�”Ø"ð +Ø—I’I˜kÑ*Ô*Ð*Ð*Ð*ð !Ð ð 'Ð&ð+ð +r/   c                 ó  — |                       t          j                             |t	          |¦  «        ¦  «        ¦  «         |�½|dk    r¹g }t          j        |¦  «        D ]Y}|                     ¦   «         rC|                     t          |¦  «        t          j                             ||¦  «        dœ¦  «         ŒZt          |¦  «        |k    r8t          |d„ ¬¦  «        }t          j        |d         d         ¦  «         d S d S d S d S )Nr   )r²  rU   c                 ó   — | d         S )Nr²  r.   rÎ   s    r0   rÐ   z6SentenceTransformer._save_checkpoint.<locals>.<lambda>´  s
   € ÈÈ&Ì	€ r/   rÑ   rU   )r  rP   rU   r´   rD   ÚlistdirÚisdigitr“   rh  r�   rÚ   ÚshutilÚrmtree)r`   rz  r|  r²  Úold_checkpointsÚsubdirs         r0   rµ  z$SentenceTransformer._save_checkpoint¨  s  € à�	Š	•"”'—,’,˜µ°D±	´	Ñ:Ô:Ñ;Ô;Ð;ð 'Ð2Ð7RÐUVÒ7VÐ7VØ ˆOÝœ* _Ñ5Ô5ð qð q�Ø—>’>Ñ#Ô#ð qØ#×*Ò*µC¸±K´KÍÌÏÊÐVeÐgmÑInÔInÐ+oÐ+oÑpÔpÐpøå�?Ñ#Ô#Ð&AÒAÐAÝ"(¨Ð>QÐ>QÐ"RÑ"RÔ"R�Ý”˜o¨aÔ0°Ô8Ñ9Ô9Ð9Ð9Ð9ð 3Ð2Ð7VÐ7Vð BÐAr/   c           	      óÞ   — t                                d                     |¦  «        ¦  «         t          |||||dœ|||dœ¬¦  «        }t	          |                     ¦   «         d¦  «        }||gS )z[
        Creates a simple Transformer + Mean Pooling model and returns the modules
        zXNo sentence-transformers model found with name {}. Creating a new one with MEAN pooling.©r9   r7   r8   )Ú	cache_dirÚ
model_argsÚtokenizer_argsr  )rR   rG  rT   r    r!   Úget_word_embedding_dimension)r`   r4   r9   r6   r8   r7   Útransformer_modelÚpooling_models           r0   rZ   z$SentenceTransformer._load_auto_model·  s•   € õ 	�ŠØf×mÒmØ"ñô ñ	
ô 	
ð 	
õ
 (ØØ"Ø!&Ð=NÐ\dÐeÐeØ%*ÐARÐ`hÐiÐið	
ñ 
ô 
Ðõ  Ð 1× NÒ NÑ PÔ PÐRXÑYÔYˆØ! =Ð1Ð1r/   c           	      óš  — t          |d|||¬¦  «        }|�¸t          |¦  «        5 }t          j        |¦  «        | _        ddd¦  «         n# 1 swxY w Y   d| j        v rod| j        d         v r`| j        d         d         t
          k    rDt                               d                     | j        d         d         t
          ¦  «        ¦  «         t          |d|||¬¦  «        }|�T	 t          |d¬	¦  «        5 }| 	                    ¦   «         | _
        ddd¦  «         n# 1 swxY w Y   n# t          $ r Y nw xY wt          |d
|||¬¦  «        }	t          |	¦  «        5 }t          j        |¦  «        }
ddd¦  «         n# 1 swxY w Y   t          ¦   «         }|
D �]1}t          |d         ¦  «        }|t          k    rÆ|d         dk    rºi }dD ]U}t          |||||¬¦  «        }|�=t          |¦  «        5 }t          j        |¦  «        }ddd¦  «         n# 1 swxY w Y    nŒV|||dœ}d|v r|d                              |¦  «         n||d<   d|v r|d                              |¦  «         n||d<   t          |fd|i|¤Ž}n=|t           k    rd}nt#          ||d         |||¬¦  «        }|                     |¦  «        }|||d         <   �Œ3|S )z:
        Loads a full sentence-transformers model
        r	  )r9   r6   r8   Nr$   r  z»You try to use a model that was created with version {}, however, your version is {}. This might cause unexpected behavior or errors. In that case, try to update to the latest version.


r%  r&  r'  r  r  rU   r=   )zsentence_bert_config.jsonzsentence_roberta_config.jsonzsentence_distilbert_config.jsonzsentence_camembert_config.jsonzsentence_albert_config.jsonz sentence_xlm-roberta_config.jsonzsentence_xlnet_config.jsonrÞ  rà  rá  rß  ry   )r   r  r  ÚloadrK   r$   rR   rG  rT   ÚreadrJ   Ú	Exceptionr   r   r    r³  r"   r   )r`   r4   r9   r6   r8   r7   Ú&config_sentence_transformers_json_pathÚfInÚmodel_card_pathÚmodules_json_pathr  r5   Úmodule_configÚmodule_classÚkwargsÚconfig_nameÚconfig_pathÚ
hub_kwargsrG   Úmodule_paths                       r0   rY   z%SentenceTransformer._load_sbert_modelÐ  sz  € õ 2@ØØ/ØØ%Øð2
ñ 2
ô 2
Ð.ð 2Ð=ÝÐ<Ñ=Ô=ð 4ÀÝ%)¤Y¨s¡^¤^�Ô"ð4ð 4ð 4ñ 4ô 4ð 4ð 4ð 4ð 4ð 4ð 4øøøð 4ð 4ð 4ð 4ð  Ô!3Ð3Ð3Ø+¨tÔ/AÀ-Ô/PÐPÐPØÔ& }Ô5Ð6MÔNÕQ\Ò\Ð\å—’ð U÷  \ò  \ØÔ*¨=Ô9Ð:QÔRÕT_ñô ñô ð õ )Ø °5À|Ð^fð
ñ 
ô 
ˆð Ð&ðÝ˜/°FÐ;Ñ;Ô;ð 7¸sØ,/¯HªH©J¬J�DÔ)ð7ð 7ð 7ñ 7ô 7ð 7ð 7ð 7ð 7ð 7ð 7øøøð 7ð 7ð 7ð 7øøåð ð ð Ø�ðøøøõ +Ø °eÈ,Ðaið
ñ 
ô 
Ðõ Ð#Ñ$Ô$ð 	,¨Ý!œY s™^œ^ˆNð	,ð 	,ð 	,ñ 	,ô 	,ð 	,ð 	,ð 	,ð 	,ð 	,ð 	,øøøð 	,ð 	,ð 	,ð 	,õ ‘-”-ˆØ+ð -	4ñ -	4ˆMÝ-¨m¸FÔ.CÑDÔDˆLð �{Ò*Ð*¨}¸VÔ/DÈÒ/JÐ/JØ�ð$ð ð �Kõ #1Ø*¨K¸uÐS_Ðjrð#ñ #ô #�Kð #Ð.Ý! +Ñ.Ô.ð 4°#Ý%)¤Y¨s¡^¤^˜Fð4ð 4ð 4ñ 4ô 4ð 4ð 4ð 4ð 4ð 4ð 4øøøð 4ð 4ð 4ð 4à˜ð /ð (-ÐCTÐbjÐkÐk�
Ø 6Ð)Ð)Ø˜<Ô(×/Ò/°
Ñ;Ô;Ð;Ð;à+5�F˜<Ñ(Ø# vÐ-Ð-ØÐ+Ô,×3Ò3°JÑ?Ô?Ð?Ð?à/9�FÐ+Ñ,Ý$Ð%7ÐZÐZÀ<ÐZÐSYÐZÐZ��ð  ¥9Ò,Ð,Ø"&�K�Kå"/Ø*Ø% fÔ-Ø#Ø%1Ø!)ð#ñ #ô #�Kð &×*Ò*¨;Ñ7Ô7�Ø-3ˆG�M &Ô)Ñ*Ñ*àˆsk   ¦AÁAÁAÃ&D) Ã7DÄD) ÄD!Ä!D) Ä$D!Ä%D) Ä)
D6Ä5D6ÅE=Å=FÆFÇ2HÈHÈHc                 ó    — t          | ¦  «        S rð   )r3   )Ú
input_paths    r0   ræ  zSentenceTransformer.load6  s   € å" :Ñ.Ô.Ð.r/   r–  c                 óˆ  — |                      ¦   «         }|dk    rt          j        | ¦  «        S |dk    rt          j        | |¬¦  «        S |dk    rt          j        | ||¬¦  «        S |dk    rt          j        | ||¬¦  «        S |dk    rt          j        | ||¬¦  «        S t          d                     |¦  «        ¦  «        ‚)	z¨
        Returns the correct learning rate scheduler. Available scheduler: constantlr, warmupconstant, warmuplinear, warmupcosine, warmupcosinewithhardrestarts
        Ú
constantlrÚwarmupconstant)Únum_warmup_stepsÚwarmuplinear)rù  Únum_training_stepsÚwarmupcosineÚwarmupcosinewithhardrestartszUnknown scheduler {})	rX   r  Úget_constant_scheduleÚ!get_constant_schedule_with_warmupÚget_linear_schedule_with_warmupÚget_cosine_schedule_with_warmupÚ2get_cosine_with_hard_restarts_schedule_with_warmuprO   rT   )rÁ  ro  rp  r–  s       r0   r§  z"SentenceTransformer._get_scheduler:  sú   € ð
 —O’OÑ%Ô%ˆ	Ø˜Ò$Ð$ÝÔ5°iÑ@Ô@Ð@ØÐ*Ò*Ð*ÝÔAÀ)Ð^jÐkÑkÔkÐkØ˜.Ò(Ð(ÝÔ?Ø¨LÈWðñ ô ð ð ˜.Ò(Ð(ÝÔ?Ø¨LÈWðñ ô ð ð Ð8Ò8Ð8ÝÔRØ¨LÈWðñ ô ð õ Ð3×:Ò:¸9ÑEÔEÑFÔFÐFr/   c                 ó<  — 	 t          |                      ¦   «         ¦  «        j        S # t          $ ri dt          j        dt          t          t          t          f                  fd„}|  
                    |¬¦  «        }t          |¦  «        }|d         j        cY S w xY w)z^
        Get torch.device from module, assuming that the whole module has one device.
        rG   r&   c                 óL   — d„ | j                              ¦   «         D ¦   «         }|S )Nc                 óD   — g | ]\  }}t          j        |¦  «        ¯||f‘ŒS r.   )r+   Ú	is_tensor)rE   ÚkÚvs      r0   rH   zNSentenceTransformer.device.<locals>.find_tensor_attributes.<locals>.<listcomp>^  s0   € Ð[Ð[Ð[¡T Q¨ÍÌÐXYÑHZÔHZÐ[˜1˜a˜&Ð[Ð[Ð[r/   )Ú__dict__r0  )rG   Útupless     r0   Úfind_tensor_attributesz:SentenceTransformer.device.<locals>.find_tensor_attributes]  s(   € Ø[Ð[¨V¬_×-BÒ-BÑ-DÔ-DÐ[Ñ[Ô[�Ø�r/   )Úget_members_fnr   )rü   r±  r   rª  r   ÚModuler   r   rD   r   Ú_named_members)r`   r  ÚgenÚfirst_tuples       r0   r   zSentenceTransformer.deviceS  s¦   € ð
	)Ý˜ŸšÑ)Ô)Ñ*Ô*Ô1Ð1øÝð 		)ð 		)ð 		)ð­r¬yð ½TÅ%ÍÍVÈÔBTÔ=Uð ð ð ð ð ×%Ò%Ð5KÐ%ÑLÔLˆCÝ˜s™)œ)ˆKØ˜q”>Ô(Ð(Ð(Ð(ð		)øøøs   ‚%( ¨A0BÂBc                 ó4   — |                       ¦   «         j        S )zJ
        Property to get the tokenizer that is used by this model
        ©rê   Ú	tokenizerrë   s    r0   r  zSentenceTransformer.tokenizere  s   € ð
 ×!Ò!Ñ#Ô#Ô-Ð-r/   c                 ó8   — ||                       ¦   «         _        dS )zQ
        Property to set the tokenizer that should be used by this model
        Nr  ©r`   r;  s     r0   r  zSentenceTransformer.tokenizerl  s   € ð
 */ˆ×ÒÑÔÔ&Ð&Ð&r/   c                 ó4   — |                       ¦   «         j        S )zs
        Property to get the maximal input sequence length for the model. Longer inputs will be truncated.
        ©rê   ré   rë   s    r0   ré   z"SentenceTransformer.max_seq_lengths  s   € ð
 ×!Ò!Ñ#Ô#Ô2Ð2r/   c                 ó8   — ||                       ¦   «         _        dS )zs
        Property to set the maximal input sequence length for the model. Longer inputs will be truncated.
        Nr  r  s     r0   ré   z"SentenceTransformer.max_seq_lengthz  s   € ð
 /4ˆ×ÒÑÔÔ+Ð+Ð+r/   c                 óD   — t                                d¦  «         | j        S )Nzg`SentenceTransformer._target_device` has been removed, please use `SentenceTransformer.device` instead.)rR   rG  r   rë   s    r0   Ú_target_devicez"SentenceTransformer._target_device�  s%   € å�ŠØuñ	
ô 	
ð 	
ð Œ{Ðr/   c                 ó0   — |                       |¦  «         d S rð   )r_   )r`   r   s     r0   r  z"SentenceTransformer._target_deviceˆ  s   € à�Š�‰Œˆˆˆr/   )NNNNFNNN)rc   Nrd   TFNFrð   )rc   NF)NTN)NN)NNNr<  NFFN)NF)=r  r  Ú__qualname__Ú__doc__r   rD   r   r   r  Úboolr	   r^   r   rh  r   r   r¦   rÁ   ÚstaticmethodrÆ   r   Úobjectrà   r»   rì   r   rŽ   rñ   ró   rê   rÿ   r  r  r   rV  rb  ro   r+   ÚoptimÚAdamWr   r   r   r   Úfloatr
   rÎ  rÐ  r´  rµ  rZ   rY   ræ  r§  Úpropertyr   r  Úsetterré   r  Ú__classcell__)rb   s   @r0   r3   r3   =   s×  ø€ € € € € ðð ð* -1Ø15Ø $Ø&*Ø"'Ø"&Ø,0Ø59ðIð Ià$ SœMðIð ˜( 2¤9Ô-Ô.ðIð ˜”ð	Ið
 ˜s”mðIð  ðIð ˜3”-ðIð ˜˜d C˜iÔ(Ô)ðIð !  t¨S yÔ!1Ô2ðIð Ið Ið Ið Ið Ið\ Ø"&Ø0Ø!%Ø"'ØØ%*ðhð hà˜˜d 3œi˜Ô(ðhð ðhð  ð	hð
 ðhð ðhð  ðhð ðhð #ðhð 
ˆt�FŒ|˜W fÐ,Ô	-ðhð hð hð hðT%Vð %V°t¸C´yð %Vð %Vð %Vð %VðN ðð ñ „\ðð$ ØØ%*ð-ð -à˜”9ð-ð �3˜�;Ôð-ð ð	-ð
 ð-ð #ð-ð -ð -ð -ð^ ð°Cð ð ð ñ „\ðð(ð ð ð4˜e D¨¤I¨t°D¬z¸4ÀÀcÈ3ÀhÄÔ;PÐ$PÔQð 4ð 4ð 4ð 4ðEð Eð Eðð ð ð8ð 8ð 8ð<ð <ð <ð %)Ø"&Ø.2ð5Fð 5Fàð5Fð ˜S”Mð5Fð  ð	5Fð
 !  c¤Ô+ð5Fð 5Fð 5Fð 5Fðp bfð9+ð 9+Øð9+Ø%-¨c¤]ð9+ØKSÐTXÐY\ÔT]ÔK^ð9+ð 9+ð 9+ð 9+ðv  ð '+Ø#Ø"&ØBØ*.ØØ#(Ø.2ðEð EàðEð ˜s”mðEð ˜Œ}ð	Eð
 ˜$”ðEð ðEð # 3œ-ðEð ðEð !ðEð !  c¤Ô+ðEð Eð Eñ  ÔðEðN)¨D°Ô,@ð )ÀUÈ4ÐPTÐUXÐZ`ÐU`ÔPaÔKbÐdjÐKjÔEkð )ð )ð )ð )ð/  t¨C¤y°$°t¸C´y´/Ð'AÔ!Bð /ð /ð /ð /ð& (,ØØØ'Ø!Ø+0¬;Ô+<Ø/3°T¨lØ"Ø !ØØ $Ø ØØ6:Ø"&Ø#Ø%(Ø+,ð)N]ð N]à" 5¨°R´YÐ)>Ô#?Ô@ðN]ð %ðN]ð ð	N]ð ðN]ð ðN]ð ˜iœðN]ð ˜s F˜{Ô+ðN]ð ðN]ð ðN]ð ðN]ð ðN]ð ðN]ð ðN]ð  ˜E 3¨Ð,¨dÐ2Ô3ð!N]ð"  ð#N]ð$ ð%N]ð&  #ð'N]ð( &)ð)N]ð N]ð N]ð N]ð`,ð ,Ð"3ð ,À#ð ,ð ,ð ,ð ,ð+ð +ð +ð":ð :ð :ð( #'Ø"'ð2ð 2àð2ð ˜˜d C˜iÔ(Ô)ð2ð ˜s”mð	2ð
 ˜3”-ð2ð  ð2ð 2ð 2ð 2ð< #'Ø"'ðdð dàðdð ˜˜d C˜iÔ(Ô)ðdð ˜s”mð	dð
 ˜3”-ðdð  ðdð dð dð dðL ð/ð /ñ „\ð/ð ðG¨Sð GÀð GÈcð Gð Gð Gñ „\ðGð0 ð)˜ð )ð )ð )ñ „Xð)ð" ð.ð .ñ „Xð.ð Ôð/ð /ñ Ôð/ð ð3ð 3ñ „Xð3ð Ôð4ð 4ñ Ôð4ð ð ¤ð ð ð ñ „Xðð Ôðð  X¨e°C¸¸e¼lÐ4JÔ.KÔ%Lð ÐX\ð ð ð ñ Ôðð ð ð ð r/   r3   )Cr  r‡   rP   rÙ  Úcollectionsr   rL   Útypingr   r   r   r   r   r	   r
   r   r   r   rƒ   r‹   r   r  Úhuggingface_hubr   r+   r   r   r   Útorch.optimr   Útorch.utils.datar   Útorch.multiprocessingÚmultiprocessingr·   Útqdm.autonotebookr   rÖ   rã   rK  r=   r   Ú
evaluationr   Úutilr   r   r   r   r   r   r   Úmodelsr    r!   r"   Úmodel_card_templatesr#   r$   Ú	getLoggerr  rR   Úsentence_transformers.readersr%   r1   Ú
Sequentialr3   r.   r/   r0   ú<module>r6     s£  ðØ €€€Ø €€€Ø 	€	€	€	Ø €€€Ø #Ð #Ð #Ð #Ð #Ð #Ø €€€Ø gÐ gÐ gÐ gÐ gÐ gÐ gÐ gÐ gÐ gÐ gÐ gÐ gÐ gÐ gÐ gÐ gÐ gÐ gÐ gÐ gÐ gÐ gÐ gØ Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !Ø €€€Ø $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ø !Ð !Ð !Ð !Ð !Ð !Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø "Ð "Ð "Ð "Ð "Ð "Ø $Ð $Ð $Ð $Ð $Ð $Ø €€€Ø €€€Ø €€€à (Ð (Ð (Ð (Ð (Ð (Ø )Ð )Ð )Ð )Ð )Ð )ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð 4Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø Ð Ð Ð Ð Ð à	ˆÔ	˜8Ñ	$Ô	$€ð ð ;Ø:Ð:Ð:Ð:Ð:Ð:ð˜Ð!5Ô6ð ð ð ð ð"Mð Mð Mð Mð M˜"œ-ñ Mô Mð Mð Mð Mr/   