§
    *�’jÆb  ã                  óþ  — d dl m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
 d dlZd dlmZmZ d dlmZ d dlmZ d d	lmZmZ d d
lmZ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"m#Z# d dl$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	rd dl.m/Z/ d dl0m)Z)  ej1        e2¦  «        Z3 G d„ de¦  «        Z4 G d„ de¦  «        Z5 G d„ de¦  «        Z6 G d„ dej7        ¦  «        Z8 G d„ d¦  «        Z9dS ) é    )ÚannotationsN)ÚCallable)ÚPath)ÚTYPE_CHECKINGÚAny)ÚTensorÚnn)Ú	Optimizer)Ú
DataLoader)ÚtqdmÚtrange)ÚTrainerCallbackÚTrainerControlÚTrainerStateÚis_torch_npu_available)ÚBatchEncoding)ÚBaseEvaluator)ÚBatchSamplers)ÚCrossEncoderTrainingArguments)ÚNoDuplicatesDataLoader)ÚSentenceLabelDataset)ÚSentenceTransformer)ÚInputExample)Úis_datasets_available)ÚDataset)ÚCrossEncoderc                  ó4   ‡ — e Zd ZdZdˆ fd
„Zdd„Zdd„Zˆ xZS )ÚSaveModelCallbackao  A Callback to save the model to the `output_dir`.

    If save_best_model is True and evaluator is defined, then we save on evaluate, but only if the new model is
    better than the currently saved one according to the evaluator.

    This differs from the `SaveModelCallback` used in SentenceTransformer.fit where the model is saved after
    training as well.
    Ú
output_dirÚstrÚ	evaluatorúBaseEvaluator | NoneÚsave_best_modelÚboolÚreturnÚNonec                ó€   •— t          ¦   «                              ¦   «          || _        || _        || _        d | _        d S ©N)ÚsuperÚ__init__r   r!   r#   Úbest_metric)Úselfr   r!   r#   Ú	__class__s       €ú[C:\Projects\DSCons\.venv\Lib\site-packages\sentence_transformers\cross_encoder\fit_mixin.pyr*   zSaveModelCallback.__init__/   s=   ø€ Ý‰Œ×ÒÑÔÐØ$ˆŒØ"ˆŒØ.ˆÔØˆÔÐÐó    Ú
new_metricÚfloatc                óZ   — t          | j        dd¦  «        r|| j        k    S || j        k     S )NÚgreater_is_betterT)Úgetattrr!   r+   )r,   r0   s     r.   Ú	is_betterzSaveModelCallback.is_better6   s5   € Ý�4”>Ð#6¸Ñ=Ô=ð 	1Ø Ô 0Ò0Ð0Ø˜DÔ,Ò,Ð,r/   Úargsr   Ústater   Úcontrolr   Úmetricsúdict[str, Any]Úmodelr   c                ó.  — | j         �‰| j        r„t          | j         dd¦  «        }|                     ¦   «         D ][\  }}	|                     |¦  «        r=| j        �|                      |	¦  «        r!|	| _        |                     | j        ¦  «         ŒXd S d S d S ©NÚprimary_metricr!   )	r!   r#   r4   ÚitemsÚendswithr+   r5   Úsaver   )
r,   r6   r7   r8   r9   r;   ÚkwargsÚ
metric_keyÚkeyÚvalues
             r.   Úon_evaluatezSaveModelCallback.on_evaluate;   s¦   € ð Œ>Ð%¨$Ô*>Ð%Ý  ¤Ð1AÀ;ÑOÔOˆJØ%Ÿmšm™oœoð 4ð 4‘
��UØ—<’< 
Ñ+Ô+ð 4ØÔ'Ð/°4·>²>À%Ñ3HÔ3HÐ/Ø+0˜Ô(ØŸ
š
 4¤?Ñ3Ô3Ð3øð &Ð%Ð%Ð%ð4ð 4r/   )r   r    r!   r"   r#   r$   r%   r&   )r0   r1   r%   r$   )r6   r   r7   r   r8   r   r9   r:   r;   r   r%   r&   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r*   r5   rF   Ú__classcell__©r-   s   @r.   r   r   %   so   ø€ € € € € ðð ð ð  ð  ð  ð  ð  ð-ð -ð -ð -ð
4ð 4ð 4ð 4ð 4ð 4ð 4ð 4r/   r   c                  ó.   ‡ — e Zd ZdZddˆ fd	„Zdd„Zˆ xZS )ÚEvaluatorCallbackzæThe CrossEncoder.fit method always ran the evaluator on every epoch,
    in addition to every "evaluation_steps". This callback is responsible for that.

    The `.trainer` must be provided after the trainer has been created.
    Nr!   r   Úoutput_pathú
str | Noner%   r&   c                ó  •— t          ¦   «                              ¦   «          || _        || _        | j        �Et          j                             | j        d¦  «        | _        t	          j        | j        d¬¦  «         d| _        d | _	        d S )NÚevalT©Úexist_ok)
r)   r*   r!   rO   ÚosÚpathÚjoinÚmakedirsÚmetric_key_prefixÚtrainer)r,   r!   rO   r-   s      €r.   r*   zEvaluatorCallback.__init__T   sw   ø€ Ý‰Œ×ÒÑÔÐØ"ˆŒØ&ˆÔØÔÐ'Ý!œwŸ|š|¨DÔ,<¸fÑEÔEˆDÔÝŒK˜Ô(°4Ð8Ñ8Ô8Ð8à!'ˆÔØˆŒˆˆr/   r6   r   r7   r   r8   r   r;   r   c                ó¦  — |                       || j        |j        |j        ¬¦  «        }t	          |t
          ¦  «        sd|i}t          |                     ¦   «         ¦  «        D ]A}|                     | j	        › d�¦  «        s"| 
                    |¦  «        || j	        › d|› �<   ŒB| j        �%| j        j                             ||||¬¦  «         d S d S )N©rO   ÚepochÚstepsr!   Ú_)r9   )r!   rO   r]   Úglobal_stepÚ
isinstanceÚdictÚlistÚkeysÚ
startswithrY   ÚpoprZ   Úcallback_handlerrF   )r,   r6   r7   r8   r;   rB   Úevaluator_metricsrD   s           r.   Úon_epoch_endzEvaluatorCallback.on_epoch_end_   sþ   € ð !ŸNšNØ˜tÔ/°u´{È%ÔJ[ð +ñ 
ô 
Ðõ Ð+­TÑ2Ô2ð 	AØ!,Ð.?Ð @Ðõ Ð)×.Ò.Ñ0Ô0Ñ1Ô1ð 	bð 	bˆCØ—>’> TÔ%;Ð">Ð">Ð">Ñ?Ô?ð bØGX×G\ÒG\Ð]`ÑGaÔGaÐ! TÔ%;Ð"CÐ"C¸cÐ"CÐ"CÑDøàŒ<Ð#ØŒLÔ)×5Ò5°d¸EÀ7ÐTeÐ5ÑfÔfÐfÐfÐfð $Ð#r/   r(   )r!   r   rO   rP   r%   r&   )
r6   r   r7   r   r8   r   r;   r   r%   r&   )rG   rH   rI   rJ   r*   ri   rK   rL   s   @r.   rN   rN   M   sh   ø€ € € € € ðð ð	ð 	ð 	ð 	ð 	ð 	ð 	ðgð gð gð gð gð gð gð gr/   rN   c                  ó,   ‡ — e Zd ZdZdˆ fd„Zdd„Zˆ xZS )ÚOriginalCallbackzÁA Callback to invoke the original callback function that was provided to CrossEncoder.fit()

    This callback has the following signature: `(score: float, epoch: int, steps: int) -> None`
    Úcallbackú!Callable[[float, int, int], None]r!   r   r%   r&   c                ód   •— t          ¦   «                              ¦   «          || _        || _        d S r(   )r)   r*   rl   r!   )r,   rl   r!   r-   s      €r.   r*   zOriginalCallback.__init__|   s+   ø€ Ý‰Œ×ÒÑÔÐØ ˆŒØ"ˆŒˆˆr/   r6   r   r7   r   r8   r   r9   r:   c                óÖ   — t          | j        dd¦  «        }|                     ¦   «         D ]=\  }}|                     |¦  «        r#|                      ||j        |j        ¦  «        c S Œ>d S r=   )r4   r!   r?   r@   rl   r]   r`   )	r,   r6   r7   r8   r9   rB   rC   rD   rE   s	            r.   rF   zOriginalCallback.on_evaluate�   s}   € õ ˜Tœ^Ð-=¸{ÑKÔKˆ
Ø!Ÿ-š-™/œ/ð 	Lð 	L‰JˆC�Ø�|Š|˜JÑ'Ô'ð LØ—}’} U¨E¬K¸Ô9JÑKÔKÐKÐKÐKðLð	Lð 	Lr/   )rl   rm   r!   r   r%   r&   )
r6   r   r7   r   r8   r   r9   r:   r%   r&   )rG   rH   rI   rJ   r*   rF   rK   rL   s   @r.   rk   rk   v   sc   ø€ € € € € ðð ð
#ð #ð #ð #ð #ð #ð
Lð Lð Lð Lð Lð Lð Lð Lr/   rk   c                  óJ   ‡ — e Zd ZdZ ej        ¦   «         fdˆ fd	„Zdd„Zˆ xZS )ÚFitMixinLossznA wrapper around the torch loss function that just accepts logits and labels, to be used in CrossEncoder.fit()r;   r   Úloss_fctú	nn.ModuleÚactivation_fnr%   r&   c                ór   •— t          ¦   «                              ¦   «          || _        || _        || _        d S r(   )r)   r*   r;   rr   rt   )r,   r;   rr   rt   r-   s       €r.   r*   zFitMixinLoss.__init__’   s5   ø€ Ý‰Œ×ÒÑÔÐØˆŒ
Ø ˆŒØ*ˆÔÐÐr/   Úinputsúlist[list[str]]Úlabelsr   c                óZ  — t          |¦  «        dk    r t          dt          |¦  «        › d�¦  «        ‚t          t          |d         |d         ¦  «        ¦  «        }| j                             |ddd¬¦  «        }|                     | j        j        ¦  «          | j        d
i |¤Žd         }| j        j        j	        dk    r*| 
                    d	¦  «        }|                     ¦   «         }n|                     ¦   «         }|                      |¦  «        }|                      ||¦  «        }|S )Né   z\BinaryCrossEntropyLoss expects a dataset with two non-label columns, but got a dataset with z	 columns.r   é   TÚpt©ÚpaddingÚ
truncationÚreturn_tensorséÿÿÿÿ© )ÚlenÚ
ValueErrorrc   Úzipr;   Ú	tokenizerÚtoÚdeviceÚconfigÚ
num_labelsÚviewr1   Úlongrt   rr   )r,   rv   rx   ÚpairsÚtokensÚlogitsÚlosss          r.   ÚforwardzFitMixinLoss.forward˜   s0  € Ýˆv‰;Œ;˜!ÒÐÝð FÕorÐsyÑozÔozð  Fð  Fð  Fñô ð õ •S˜ œ F¨1¤IÑ.Ô.Ñ/Ô/ˆØ”×%Ò%ØØØØð	 &ñ 
ô 
ˆð 	�	Š	�$”*Ô#Ñ$Ô$Ð$Ø�”Ð%Ð%˜fÐ%Ð% aÔ(ˆØŒ:ÔÔ'¨1Ò,Ð,Ø—[’[ ‘_”_ˆFØ—\’\‘^”^ˆFˆFà—[’[‘]”]ˆFØ×#Ò# FÑ+Ô+ˆØ�}Š}˜V VÑ,Ô,ˆØˆr/   )r;   r   rr   rs   rt   rs   r%   r&   )rv   rw   rx   r   r%   r   )	rG   rH   rI   rJ   r	   ÚIdentityr*   r‘   rK   rL   s   @r.   rq   rq   �   sk   ø€ € € € € ØxÐxà\gÐ\^Ô\gÑ\iÔ\ið +ð +ð +ð +ð +ð +ð +ðð ð ð ð ð ð ð r/   rq   c                  óâ   — e Zd ZdZddd ej        ¦   «         ddej        j        ddidd	dd
dddd
fd2d)„Z	d3d-„Z
d4d/„Zddd ej        ¦   «         ddej        j        ddidd	dd
dddd
fd5d0„Zd6d1„ZdS )7ÚFitMixinzUMixin class for injecting the `fit` and `old_fit` methods into the CrossEncoder classNr{   ÚWarmupLineari'  Úlrgñhãˆµøô>g{®Gáz„?r   TFr,   r   Útrain_dataloaderr   r!   r"   ÚepochsÚintÚ	schedulerr    Úwarmup_stepsÚoptimizer_classútype[Optimizer]Úoptimizer_paramsúdict[str, object]Úweight_decayr1   Úevaluation_stepsrO   rP   r#   r$   Úmax_grad_normÚuse_amprl   rm   Úshow_progress_barr%   r&   c                óú  ‡)— t          ¦   «         st          d¦  «        ‚ddlm} ddlm} ddlm} d„ }||_        t          |dd¦  «        }t          |t          ¦  «        rt          j        }nCt          |d	¦  «        r't          |j        t           ¦  «        rt          j        }nt          j        }g }g }|D ]"}t'          d
„ |D ¦   «         Ž \  }}||z  }||z  }Œ#t)          j        d„ t-          t'          |Ž ¦  «        D ¦   «         ¦  «        }d}	 t/          |¦  «        dhk    rd}n# t0          $ r Y nw xY w|r|                     d|¦  «        }d d„}t5           |¦   «         |||||�|dk    rdnd|||| d¬¦  «        } t7          |                      ¦   «         ¦  «        }!g d¢Š)ˆ)fd„|!D ¦   «         |
dœˆ)fd„|!D ¦   «         ddœg}" ||"fi |	¤Ž}#t          |t:          ¦  «        r<t=          |¦  «        |z  }$t?          |$|z  ¦  «        }%tA          j!        |#|||%¬¦  «        }&|€,| j"        j#        dk    r || |¬¦  «        }n  || |¬¦  «        }ntI          | ||¬¦  «        }g }'|�H|' %                    tM          ||¦  «        ¦  «         |�#|' %                    tO          ||¦  «        ¦  «          || | |d|||#|&f|'¬¦  «        }(|�$|( (                    tS          |||¦  «        ¦  «         |( *                    ¦   «          dS )!az  
        Deprecated training method from before Sentence Transformers v4.0, it is recommended to use
        :class:`~sentence_transformers.cross_encoder.trainer.CrossEncoderTrainer` instead. This method uses
        :class:`~sentence_transformers.cross_encoder.trainer.CrossEncoderTrainer` behind the scenes, but does
        not provide as much flexibility as the Trainer itself.

        This training approach uses a DataLoader and Loss function to train the model.

        This method should produce equivalent results in v4.0 as before v4.0, but if you encounter any issues
        with your existing training scripts, then you may wish to use
        :meth:`CrossEncoder.old_fit <sentence_transformers.cross_encoder.model.CrossEncoder.old_fit>` instead.
        That uses the old training method from before v4.0.

        Args:
            train_dataloader: The DataLoader with InputExample instances
            evaluator: An evaluator (sentence_transformers.cross_encoder.evaluation)
                evaluates the model performance during training on held-
                out dev data. It is used to determine the best model
                that is saved to disk.
            epochs: Number of epochs for training
            loss_fct: Which loss function to use for training. If None,
                will use BinaryCrossEntropy() if self.config.num_labels == 1
                else CrossEntropyLoss(). Defaults to None.
            activation_fct: Activation function applied on top of logits
                output of model.
            scheduler: Learning rate scheduler. Available schedulers:
                constantlr, warmupconstant, warmuplinear, warmupcosine,
                warmupcosinewithhardrestarts
            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.
            optimizer_class: Optimizer
            optimizer_params: Optimizer parameters
            weight_decay: Weight decay for model parameters
            evaluation_steps: If > 0, evaluate the model using evaluator
                after each number of training steps
            output_path: Storage path for the model and evaluation files
            save_best_model: If true, the best model (according to
                evaluator) is stored at output_path
            max_grad_norm: Used for gradient normalization.
            use_amp: Use Automatic Mixed Precision (AMP). Only for
                Pytorch >= 1.6.0
            callback: Callback function that is invoked after each
                evaluation. It must accept the following three
                parameters in this order: `score`, `epoch`, `steps`
            show_progress_bar: If True, output a tqdm progress bar
        zGPlease install `datasets` to use this function: `pip install datasets`.r   )ÚBinaryCrossEntropyLoss)ÚCrossEntropyLoss)ÚCrossEncoderTrainerc                ó   — | S r(   r‚   )Úbatchs    r.   ÚidentityzFitMixin.fit.<locals>.identity  s   € ØˆLr/   Ú
batch_sizeé   Údatasetc                ó*   — g | ]}|j         |j        f‘ŒS r‚   )ÚtextsÚlabel)Ú.0Úexamples     r.   ú
<listcomp>z FitMixin.fit.<locals>.<listcomp>  s"   € Ð-bÐ-bÐ-bÐQX¨w¬}¸g¼mÐ.LÐ-bÐ-bÐ-br/   c                ó    — i | ]\  }}d |› �|“ŒS )Ú	sentence_r‚   )r²   ÚidxÚtexts      r.   ú
<dictcomp>z FitMixin.fit.<locals>.<dictcomp>  s'   € Ð*kÐ*kÐ*kÁyÀsÈDÐ+<°sÐ+<Ð+<¸dÐ*kÐ*kÐ*kr/   TFr±   r%   r    c                 ó¢  — d} d}t          | ¦  «                             ¦   «         r©t          t          t          | ¦  «                             ¦   «         ¦  «        ¦  «        dk    rjd|› �} |dz  }t          | ¦  «                             ¦   «         r?t          t          t          | ¦  «                             ¦   «         ¦  «        ¦  «        dk    °j| S )Nzcheckpoints/modelr{   r   zcheckpoints/model_)r   Úexistsrƒ   rc   Úiterdir)Údir_namer·   s     r.   Ú_default_checkpoint_dirz-FitMixin.fit.<locals>._default_checkpoint_dir   s¹   € Ø*ˆHØˆCÝ�x‘.”.×'Ò'Ñ)Ô)ð ­cµ$µt¸H±~´~×7MÒ7MÑ7OÔ7OÑ2PÔ2PÑ.QÔ.QÐUVÒ.VÐ.VØ5°Ð5Ð5�Ø�q‘�õ �x‘.”.×'Ò'Ñ)Ô)ð ­cµ$µt¸H±~´~×7MÒ7MÑ7OÔ7OÑ2PÔ2PÑ.QÔ.QÐUVÒ.VÐ.Vð ˆOr/   Nr^   Úno)r   Úbatch_samplerÚper_device_train_batch_sizeÚper_device_eval_batch_sizeÚnum_train_epochsÚeval_strategyÚ
eval_stepsr¢   Úfp16Údisable_tqdmÚsave_strategy©ÚbiaszLayerNorm.biaszLayerNorm.weightc                óR   •‡— g | ]"\  Š}t          ˆfd „‰D ¦   «         ¦  «        ° |‘Œ#S )c              3  ó    •K  — | ]}|‰v V — Œ	d S r(   r‚   ©r²   ÚndÚns     €r.   ú	<genexpr>z*FitMixin.fit.<locals>.<listcomp>.<genexpr><  ó(   øè è € ÐC_ÐC_ÐPRÀBÈ!ÀGÐC_ÐC_ÐC_ÐC_ÐC_ÐC_r/   ©Úany©r²   ÚprÏ   Úno_decays     @€r.   r´   z FitMixin.fit.<locals>.<listcomp><  óA   øø€ Ð`Ð`Ð`¡  AÅÐC_ÐC_ÐC_ÐC_ÐV^ÐC_ÑC_ÔC_Ñ@_Ô@_Ð`˜1Ð`Ð`Ð`r/   ©Úparamsr    c                óR   •‡— g | ]"\  Š}t          ˆfd „‰D ¦   «         ¦  «        ¯ |‘Œ#S )c              3  ó    •K  — | ]}|‰v V — Œ	d S r(   r‚   rÍ   s     €r.   rÐ   z*FitMixin.fit.<locals>.<listcomp>.<genexpr>?  ó'   øè è € Ð<XÐ<XÈ¸RÀ1¸WÐ<XÐ<XÐ<XÐ<XÐ<XÐ<Xr/   rÒ   rÔ   s     @€r.   r´   z FitMixin.fit.<locals>.<listcomp>?  ó@   øø€ ÐYÐYÐY™d˜a ½Ð<XÐ<XÐ<XÐ<XÈxÐ<XÑ<XÔ<XÑ9XÔ9XÐY˜ÐYÐYÐYr/   ç        ©rš   r›   Út_totalr{   )rt   )rr   rt   )r;   r6   Útrain_datasetÚeval_datasetr�   r!   Ú
optimizersÚ	callbacks)r%   r    )+r   ÚImportErrorÚ?sentence_transformers.cross_encoder.losses.binary_cross_entropyr¦   Ú8sentence_transformers.cross_encoder.losses.cross_entropyr§   Ú+sentence_transformers.cross_encoder.trainerr¨   Ú
collate_fnr4   ra   r   r   ÚNO_DUPLICATESÚhasattrr®   r   ÚGROUP_BY_LABELÚBATCH_SAMPLERr…   r   Ú	from_dictÚ	enumerateÚsetÚ	TypeErrorÚ
add_columnr   rc   Únamed_parametersr    rƒ   r™   r   Ú_get_schedulerr‰   rŠ   rq   ÚappendrN   rk   Úadd_callbackr   Útrain)*r,   r—   r!   r˜   rr   Úactivation_fctrš   r›   rœ   rž   r    r¡   rO   r#   r¢   r£   rl   r¤   r¦   r§   r¨   r«   r¬   rÀ   r°   rx   rª   Úbatch_textsÚbatch_labelsrá   Úadd_label_columnr¾   r6   Úparam_optimizerÚoptimizer_grouped_parametersÚ	optimizerÚsteps_per_epochÚnum_train_stepsÚscheduler_objrä   rZ   rÖ   s*                                            @r.   ÚfitzFitMixin.fit´   s2  ø€ õJ %Ñ&Ô&ð 	iÝÐgÑhÔhÐhð 	kÐjÐjÐjÐjÐjØ]Ð]Ð]Ð]Ð]Ð]ØSÐSÐSÐSÐSÐSð	ð 	ð 	ð '/ÐÔ#åÐ-¨|¸QÑ?Ô?ˆ
ÝÐ&Õ(>Ñ?Ô?ð 	8Ý)Ô7ˆMˆMÝÐ% yÑ1Ô1ð 	8µjÐAQÔAYÕ[oÑ6pÔ6pð 	8Ý)Ô8ˆMˆMå)Ô7ˆMàˆØˆØ%ð 	#ð 	#ˆEÝ(+Ð-bÐ-bÐ\aÐ-bÑ-bÔ-bÐ(cÑ%ˆK˜Ø�[Ñ ˆEØ�lÑ"ˆFˆFÝÔ)Ð*kÐ*kÕT]Õ^aÐchÐ^iÑTjÔTjÐ*kÑ*kÔ*kÑlÔlˆàÐð	Ý�6‰{Œ{˜q˜cÒ!Ð!Ø#(Ð øøÝð 	ð 	ð 	ØˆDð	øøøàð 	FØ)×4Ò4°W¸fÑEÔEˆMð	ð 	ð 	ð 	õ -Ø.Ð.Ñ0Ô0Ø'Ø(2Ø'1Ø#Ø%5Ð%AÐFVÐYZÒFZÐFZ˜'˜'Ð`dØ'Ø'ØØ.Ð.Øð
ñ 
ô 
ˆõ ˜t×4Ò4Ñ6Ô6Ñ7Ô7ˆàAÐAÐAˆð aÐ`Ð`Ð`¨Ð`Ñ`Ô`Ø ,ðð ð ZÐYÐYÐY oÐYÑYÔYÐknÐoÐoð(
Ð$ð $�OÐ$@ÐUÐUÐDTÐUÐUˆ	Ý�i¥Ñ%Ô%ð 	Ý! -Ñ0Ô0°JÑ>ˆOÝ! /°FÑ":Ñ;Ô;ˆOÝ/Ô>Ø Y¸\ÐSbðñ ô ˆMð ÐØŒ{Ô%¨Ò*Ð*Ø1Ð1°$ÀnÐUÑUÔU��à+Ð+¨DÀÐOÑOÔO��å# D°8È>ÐZÑZÔZˆHð ˆ	ØÐ Ø×ÒÕ.¨y¸+ÑFÔFÑGÔGÐGØÐ#Ø× Ò Õ!1°(¸IÑ!FÔ!FÑGÔGÐGà%Ð%ØØØ'ØØØØ! =Ð1Øð	
ñ 	
ô 	
ˆð Ð"Ø× Ò Õ!2°;À	È?Ñ![Ô![Ñ\Ô\Ð\à�Š‰Œˆˆˆs   ÄD& Ä&
D3Ä2D3rª   úlist[InputExample]útuple[BatchEncoding, Tensor]c                ó°  — d„ t          t          |d         j        ¦  «        ¦  «        D ¦   «         }g }|D ]c}t          |j        ¦  «        D ]2\  }}||                              |                     ¦   «         ¦  «         Œ3|                     |j        ¦  «         Œd | j        |ddddœŽ}| j        �|d         j	        d         | j        k    sJ ‚t          j        || j        j        dk    rt          j        nt          j        ¬	¦  «                             | j        j        ¦  «        }|D ]*}||                              | j        j        ¦  «        ||<   Œ+||fS )
Nc                ó   — g | ]}g ‘ŒS r‚   r‚   ©r²   r_   s     r.   r´   z3FitMixin.smart_batching_collate.<locals>.<listcomp>j  s   € Ð8Ð8Ð8˜�Ð8Ð8Ð8r/   r   TÚlongest_firstr|   r}   Ú	input_idsr{   )Údtype)Úrangerƒ   r°   rï   rõ   Ústripr±   r†   Ú
max_lengthÚshapeÚtorchÚtensorr‰   rŠ   r1   rŒ   r‡   r;   rˆ   )	r,   rª   r°   rx   r³   r·   r¸   Ú	tokenizedÚnames	            r.   Úsmart_batching_collatezFitMixin.smart_batching_collatei  si  € Ø8Ð8�U¥3 u¨Q¤x¤~Ñ#6Ô#6Ñ7Ô7Ð8Ñ8Ô8ˆØˆàð 	)ð 	)ˆGÝ& w¤}Ñ5Ô5ð 0ð 0‘	��TØ�c”
×!Ò! $§*¢*¡,¤,Ñ/Ô/Ð/Ð/à�MŠM˜'œ-Ñ(Ô(Ð(Ð(à"�D”NØØØ&Øð	
ð 
ð 
ˆ	ð ŒÐ&¨)°KÔ*@Ô*FÀqÔ*IÈTÌ_Ò*\Ð*\Ð*\Ð\Ý”˜f¸4¼;Ô;QÐUVÒ;VÐ;V­E¬K¨KÕ\aÔ\fÐgÑgÔg×jÒjØŒJÔñ
ô 
ˆð ð 	Dð 	DˆDØ'¨œo×0Ò0°´Ô1BÑCÔCˆI�d‰OˆOà˜&Ð Ð r/   r   c                ó®  — d„ t          t          |d         ¦  «        ¦  «        D ¦   «         }|D ]D}t          |¦  «        D ]2\  }}||                              |                     ¦   «         ¦  «         Œ3ŒE | j        |ddddœŽ}| j        �|d         j        d         | j        k    sJ ‚|D ]*}||                              | j	        j
        ¦  «        ||<   Œ+|S )Nc                ó   — g | ]}g ‘ŒS r‚   r‚   r  s     r.   r´   z=FitMixin.smart_batching_collate_text_only.<locals>.<listcomp>„  s   € Ð2Ð2Ð2˜�Ð2Ð2Ð2r/   r   Tr|   r}   r	  )r  rƒ   rï   rõ   r  r†   r  r  r‡   r;   rˆ   )r,   rª   r°   r³   r·   r¸   r  r  s           r.   Ú smart_batching_collate_text_onlyz)FitMixin.smart_batching_collate_text_onlyƒ  s  € Ø2Ð2�U¥3 u¨Q¤x¡=¤=Ñ1Ô1Ð2Ñ2Ô2ˆàð 	0ð 	0ˆGÝ& wÑ/Ô/ð 0ð 0‘	��TØ�c”
×!Ò! $§*¢*¡,¤,Ñ/Ô/Ð/Ð/ð0ð #�D”NØØØØð	
ð 
ð 
ˆ	ð ŒÐ&¨)°KÔ*@Ô*FÀqÔ*IÈTÌ_Ò*\Ð*\Ð*\Ð\àð 	Dð 	DˆDØ'¨œo×0Ò0°´Ô1BÑCÔCˆI�d‰OˆOàÐr/   c           
     óz	  ‡!— | j         |_        |rŒ| j        j        j        }t          ¦   «         r$t          j        j         	                    ¦   «         }nI|dk    r$t          j
        j         	                    ¦   «         }nt          j         	                    |¦  «        }|�t          j        |d¬¦  «         d| _        t          t          |¦  «        |z  ¦  «        }t!          | j                             ¦   «         ¦  «        }g d¢Š!ˆ!fd„|D ¦   «         |
dœˆ!fd	„|D ¦   «         d
dœg} ||fi |	¤Ž}t%          |t&          ¦  «        rt)          j        ||||¬¦  «        }|€6| j        j        dk    rt1          j        ¦   «         nt1          j        ¦   «         }d}t7          |d| ¬¦  «        D �]}d}| j                             ¦   «          | j                             ¦   «          t=          |dd| ¬¦  «        D �]§\  }}|�r\t          j        | j        j        j        ¬¦  «        5   | j        di |¤ddi¤Ž} ||j         ¦  «        }| j        j        dk    r| !                    d¦  «        } |||¦  «        }ddd¦  «         n# 1 swxY w Y   | "                    ¦   «         } | #                    |¦  «         $                    ¦   «          | %                    |¦  «         t          j        j&         '                    | j         (                    ¦   «         |¦  «         | )                    |¦  «         | *                    ¦   «          | "                    ¦   «         | k    }n¶ | j        di |¤ddi¤Ž} ||j         ¦  «        }| j        j        dk    r| !                    d¦  «        } |||¦  «        }| $                    ¦   «          t          j        j&         '                    | j         (                    ¦   «         |¦  «         | )                    ¦   «          |                     ¦   «          |s| )                    ¦   «          |dz  }|�[|dk    rU||z  dk    rL|  +                    ||||||¦  «         | j                             ¦   «          | j                             ¦   «          �Œ©|�|  +                    ||||d|¦  «         �ŒdS )aÙ	  
        Deprecated training method from before Sentence Transformers v4.0, it is recommended to use
        :class:`~sentence_transformers.cross_encoder.trainer.CrossEncoderTrainer` instead. This method should
        only be used if you encounter issues with your existing training scripts after upgrading to v4.0.

        This training approach uses a DataLoader and Loss function to train the model.

        Args:
            train_dataloader: The DataLoader with InputExample instances
            evaluator: An evaluator (sentence_transformers.cross_encoder.evaluation)
                evaluates the model performance during training on held-
                out dev data. It is used to determine the best model
                that is saved to disk.
            epochs: Number of epochs for training
            loss_fct: Which loss function to use for training. If None,
                will use BinaryCrossEntropy() if self.config.num_labels == 1
                else CrossEntropyLoss(). Defaults to None.
            activation_fct: Activation function applied on top of logits
                output of model.
            scheduler: Learning rate scheduler. Available schedulers:
                constantlr, warmupconstant, warmuplinear, warmupcosine,
                warmupcosinewithhardrestarts
            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.
            optimizer_class: Optimizer
            optimizer_params: Optimizer parameters
            weight_decay: Weight decay for model parameters
            evaluation_steps: If > 0, evaluate the model using evaluator
                after each number of training steps
            output_path: Storage path for the model and evaluation files
            save_best_model: If true, the best model (according to
                evaluator) is stored at output_path
            max_grad_norm: Used for gradient normalization.
            use_amp: Use Automatic Mixed Precision (AMP). Only for
                Pytorch >= 1.6.0
            callback: Callback function that is invoked after each
                evaluation. It must accept the following three
                parameters in this order: `score`, `epoch`, `steps`
            show_progress_bar: If True, output a tqdm progress bar
        ÚcudaNTrS   i�igÿrÉ   c                óR   •‡— g | ]"\  Š}t          ˆfd „‰D ¦   «         ¦  «        ° |‘Œ#S )c              3  ó    •K  — | ]}|‰v V — Œ	d S r(   r‚   rÍ   s     €r.   rÐ   z.FitMixin.old_fit.<locals>.<listcomp>.<genexpr>í  rÑ   r/   rÒ   rÔ   s     @€r.   r´   z$FitMixin.old_fit.<locals>.<listcomp>í  r×   r/   rØ   c                óR   •‡— g | ]"\  Š}t          ˆfd „‰D ¦   «         ¦  «        ¯ |‘Œ#S )c              3  ó    •K  — | ]}|‰v V — Œ	d S r(   r‚   rÍ   s     €r.   rÐ   z.FitMixin.old_fit.<locals>.<listcomp>.<genexpr>ð  rÜ   r/   rÒ   rÔ   s     @€r.   r´   z$FitMixin.old_fit.<locals>.<listcomp>ð  rÝ   r/   rÞ   rß   r{   FÚEpoch)ÚdescÚdisabler   Ú	Iterationgš™™™™™©?)r  Ú	smoothingr  )Údevice_typeÚreturn_dictr�   r‚   ),r  ré   r;   rˆ   Útyper   r  ÚnpuÚampÚ
GradScalerr  rU   rX   Ú
best_scorer™   rƒ   rc   ró   ra   r    r   rô   r‰   rŠ   r	   ÚBCEWithLogitsLossr§   r   Ú	zero_gradr÷   r   Úautocastr�   r‹   Ú	get_scaleÚscaleÚbackwardÚunscale_ÚutilsÚclip_grad_norm_Ú
parametersÚstepÚupdateÚ_eval_during_training)"r,   r—   r!   r˜   rr   rø   rš   r›   rœ   rž   r    r¡   rO   r#   r¢   r£   rl   r¤   r"  Úscalerr   rü   rý   rþ   Úskip_schedulerr]   Útraining_stepsÚfeaturesrx   Úmodel_predictionsr�   Ú
loss_valueÚscale_before_steprÖ   s"                                    @r.   Úold_fitzFitMixin.old_fit—  sR  ø€ ð~ '+Ô&AÐÔ#àð 	;Øœ*Ô+Ô0ˆKÝ%Ñ'Ô'ð ;Ýœœ×1Ò1Ñ3Ô3��Ø Ò&Ð&Ýœœ×2Ò2Ñ4Ô4��åœ×-Ò-¨kÑ:Ô:�àÐ"ÝŒK˜¨dÐ3Ñ3Ô3Ð3à"ˆŒÝ�cÐ"2Ñ3Ô3°fÑ<Ñ=Ô=ˆõ ˜tœz×:Ò:Ñ<Ô<Ñ=Ô=ˆàAÐAÐAˆð aÐ`Ð`Ð`¨Ð`Ñ`Ô`Ø ,ðð ð ZÐYÐYÐY oÐYÑYÔYÐknÐoÐoð(
Ð$ð $�OÐ$@ÐUÐUÐDTÐUÐUˆ	å�i¥Ñ%Ô%ð 	Ý+Ô:Ø Y¸\ÐSbðñ ô ˆIð ÐØ15´Ô1GÈ1Ò1LÐ1L•rÔ+Ñ-Ô-Ð-ÕRTÔReÑRgÔRgˆHàˆÝ˜F¨Ð>OÐ:OÐPÑPÔPð 2	iñ 2	iˆEØˆNØŒJ× Ò Ñ"Ô"Ð"ØŒJ×ÒÑÔÐå$(Ø  {¸dÐPaÐLað%ñ %ô %ð *'ñ *'Ñ �˜&ð ñ %Ýœ°D´JÔ4EÔ4JÐKÑKÔKð >ð >Ø,6¨D¬JÐ,TÐ,T¸Ð,TÐ,TÈtÐ,TÐ,TÐ,TÐ)Ø!/ Ð0AÔ0HÑ!IÔ!I˜Øœ;Ô1°QÒ6Ð6Ø%+§[¢[°¡_¤_˜FØ%- X¨f°fÑ%=Ô%=˜
ð>ð >ð >ñ >ô >ð >ð >ð >ð >ð >ð >øøøð >ð >ð >ð >ð )/×(8Ò(8Ñ(:Ô(:Ð%Ø—L’L Ñ,Ô,×5Ò5Ñ7Ô7Ð7Ø—O’O IÑ.Ô.Ð.Ý”H”N×2Ò2°4´:×3HÒ3HÑ3JÔ3JÈMÑZÔZÐZØ—K’K 	Ñ*Ô*Ð*Ø—M’M‘O”O�Oà%+×%5Ò%5Ñ%7Ô%7Ð;LÒ%L�N�Nà(2¨¬
Ð(PÐ(P°XÐ(PÐ(PÈ4Ð(PÐ(PÐ(PÐ%Ø+˜^Ð,=Ô,DÑEÔE�FØ”{Ô-°Ò2Ð2Ø!'§¢¨R¡¤˜Ø!) ¨&°&Ñ!9Ô!9�JØ×'Ò'Ñ)Ô)Ð)Ý”H”N×2Ò2°4´:×3HÒ3HÑ3JÔ3JÈMÑZÔZÐZØ—N’NÑ$Ô$Ð$à×#Ò#Ñ%Ô%Ð%à%ð %Ø—N’NÑ$Ô$Ð$à !Ñ#�àÐ(Ð-=ÀÒ-AÐ-AÀnÐWgÑFgÐklÒFlÐFlØ×.Ò.Ø! ;°ÀÈÐX`ñô ð ð ”J×(Ò(Ñ*Ô*Ð*Ø”J×$Ò$Ñ&Ô&Ð&ùàÐ$Ø×*Ò*¨9°kÀ?ÐTYÐ[]Ð_gÑhÔhÐhùðe2	ið 2	is   È!AJ Ê JÊJc                ó  — |�„ || |||¬¦  «        }|� ||||¦  «         t          |t          ¦  «        r&t          |d¦  «        r|j        |v r||j                 }|| j        k    r"|| _        |r|                      |¦  «         dS dS dS dS )z#Runs evaluation during the trainingNr\   r>   )ra   rb   rë   r>   r(  rA   )r,   r!   rO   r#   r]   r^   rl   Úscores           r.   r5  zFitMixin._eval_during_training2  sÉ   € àÐ Ø�I˜d°À5ÐPUÐVÑVÔVˆEØÐ#Ø�˜  uÑ-Ô-Ð-Ý˜%¥Ñ&Ô&ð 8­7°9Ð>NÑ+OÔ+Oð 8ÐT]ÔTlÐpuÐTuÐTuØ˜iÔ6Ô7�Ø�t”Ò&Ð&Ø"'�”Ø"ð +Ø—I’I˜kÑ*Ô*Ð*Ð*Ð*ð !Ð ð 'Ð&ð+ð +r/   )"r,   r   r—   r   r!   r"   r˜   r™   rš   r    r›   r™   rœ   r�   rž   rŸ   r    r1   r¡   r™   rO   rP   r#   r$   r¢   r1   r£   r$   rl   rm   r¤   r$   r%   r&   )rª   r  r%   r  )rª   r  r%   r   ) r—   r   r!   r"   r˜   r™   rš   r    r›   r™   rœ   r�   rž   rŸ   r    r1   r¡   r™   rO   rP   r#   r$   r¢   r1   r£   r$   rl   rm   r¤   r$   r%   r&   )r%   r&   )rG   rH   rI   rJ   r	   r’   r  ÚoptimÚAdamWr  r  r  r=  r5  r‚   r/   r.   r”   r”   ±   s  € € € € € Ø_Ð_ð
 +/ØØØ"�r”{‘}”}Ø'Ø!Ø+0¬;Ô+<Ø/3°T¨lØ"Ø !Ø"&Ø $Ø ØØ6:Ø"&ð%sð sð sð sð sðj!ð !ð !ð !ð4ð ð ð ð. +/ØØØ"�r”{‘}”}Ø'Ø!Ø+0¬;Ô+<Ø/3°T¨lØ"Ø !Ø"&Ø $Ø ØØ6:Ø"&ð%Yið Yið Yið Yið Yiðv+ð +ð +ð +ð +ð +r/   r”   ):Ú
__future__r   ÚloggingrU   Úcollections.abcr   Úpathlibr   Útypingr   r   r  r   r	   Útorch.optimr
   Útorch.utils.datar   Útqdm.autonotebookr   r   Útransformersr   r   r   r   Ú$transformers.tokenization_utils_baser   Ú/sentence_transformers.base.evaluation.evaluatorr   Ú"sentence_transformers.base.samplerr   Ú1sentence_transformers.cross_encoder.training_argsr   ÚLsentence_transformers.sentence_transformer.datasets.no_duplicates_dataloaderr   ÚBsentence_transformers.sentence_transformer.datasets.sentence_labelr   Ú0sentence_transformers.sentence_transformer.modelr   Ú2sentence_transformers.sentence_transformer.readersr   Úsentence_transformers.utilr   Údatasetsr   Ú)sentence_transformers.cross_encoder.modelr   Ú@sentence_transformers.sentence_transformer.readers.input_exampleÚ	getLoggerrG   Úloggerr   rN   rk   ÚModulerq   r”   r‚   r/   r.   ú<module>rZ     så  ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø 	€	€	€	Ø $Ð $Ð $Ð $Ð $Ð $Ø Ð Ð Ð Ð Ð Ø %Ð %Ð %Ð %Ð %Ð %Ð %Ð %à €€€Ø Ð Ð Ð Ð Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø *Ð *Ð *Ð *Ð *Ð *Ð *Ð *Ø ^Ð ^Ð ^Ð ^Ð ^Ð ^Ð ^Ð ^Ð ^Ð ^Ð ^Ð ^Ø >Ð >Ð >Ð >Ð >Ð >à IÐ IÐ IÐ IÐ IÐ IØ <Ð <Ð <Ð <Ð <Ð <Ø [Ð [Ð [Ð [Ð [Ð [Ø oÐ oÐ oÐ oÐ oÐ oØ cÐ cÐ cÐ cÐ cÐ cØ PÐ PÐ PÐ PÐ PÐ PØ KÐ KÐ KÐ KÐ KÐ KØ <Ð <Ð <Ð <Ð <Ð <àÐÑÔð !Ø Ð Ð Ð Ð Ð àð ^ØFÐFÐFÐFÐFÐFØ]Ð]Ð]Ð]Ð]Ð]ð 
ˆÔ	˜8Ñ	$Ô	$€ð%4ð %4ð %4ð %4ð %4˜ñ %4ô %4ð %4ðP&gð &gð &gð &gð &g˜ñ &gô &gð &gðRLð Lð Lð Lð L�ñ Lô Lð Lð2ð ð ð ð �2”9ñ ô ð ðDL+ð L+ð L+ð L+ð L+ñ L+ô L+ð L+ð L+ð L+r/   