Ë
    l^(hŠ  ã                  ó¢   — d dl mZ d dlmZ d dlmZ d dlmZ d dlm	c m
Z d dlmZm	Z	 d dlmZ  G d„ d	e«      Z G d
„ de	j"                  «      Zy)é    )Úannotations)ÚIterable)ÚEnum)ÚAnyN)ÚTensorÚnn)ÚSentenceTransformerc                  ó"   — e Zd ZdZd„ Zd„ Zd„ Zy)ÚSiameseDistanceMetricz#The metric for the contrastive lossc                ó2   — t        j                  | |d¬«      S )Né   ©Úp©ÚFÚpairwise_distance©ÚxÚys     új/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/sentence_transformers/losses/ContrastiveLoss.pyú<lambda>zSiameseDistanceMetric.<lambda>   ó   € œQ×0Ñ0°°A¸Ô;€ ó    c                ó2   — t        j                  | |d¬«      S )Né   r   r   r   s     r   r   zSiameseDistanceMetric.<lambda>   r   r   c                ó4   — dt        j                  | |«      z
  S )Nr   )r   Úcosine_similarityr   s     r   r   zSiameseDistanceMetric.<lambda>   s   €  1¤q×':Ñ':¸1¸aÓ'@Ñ#@€ r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	EUCLIDEANÚ	MANHATTANÚCOSINE_DISTANCE© r   r   r   r      s   „ Ù-á;€IÙ;€IÙ@�Or   r   c                  ól   ‡ — e Zd Zej                  ddf	 	 	 	 	 	 	 dˆ fd„Zdd„Zd	d„Zed
d„«       Z	ˆ xZ
S )ÚContrastiveLossç      à?Tc                óZ   •— t         ‰| �  «        || _        || _        || _        || _        y)a¿	  
        Contrastive loss. Expects as input two texts and a label of either 0 or 1. If the label == 1, then the distance between the
        two embeddings is reduced. If the label == 0, then the distance between the embeddings is increased.

        Args:
            model: SentenceTransformer model
            distance_metric: Function that returns a distance between
                two embeddings. The class SiameseDistanceMetric contains
                pre-defined metrices that can be used
            margin: Negative samples (label == 0) should have a distance
                of at least the margin value.
            size_average: Average by the size of the mini-batch.

        References:
            * Further information: http://yann.lecun.com/exdb/publis/pdf/hadsell-chopra-lecun-06.pdf
            * `Training Examples > Quora Duplicate Questions <../../../examples/sentence_transformer/training/quora_duplicate_questions/README.html>`_

        Requirements:
            1. (anchor, positive/negative) pairs

        Inputs:
            +-----------------------------------------------+------------------------------+
            | Texts                                         | Labels                       |
            +===============================================+==============================+
            | (anchor, positive/negative) pairs             | 1 if positive, 0 if negative |
            +-----------------------------------------------+------------------------------+

        Relations:
            - :class:`OnlineContrastiveLoss` is similar, but uses hard positive and hard negative pairs.
              It often yields better results.

        Example:
            ::

                from sentence_transformers import SentenceTransformer, SentenceTransformerTrainer, losses
                from datasets import Dataset

                model = SentenceTransformer("microsoft/mpnet-base")
                train_dataset = Dataset.from_dict({
                    "sentence1": ["It's nice weather outside today.", "He drove to work."],
                    "sentence2": ["It's so sunny.", "She walked to the store."],
                    "label": [1, 0],
                })
                loss = losses.ContrastiveLoss(model)

                trainer = SentenceTransformerTrainer(
                    model=model,
                    train_dataset=train_dataset,
                    loss=loss,
                )
                trainer.train()
        N)ÚsuperÚ__init__Údistance_metricÚmarginÚmodelÚsize_average)Úselfr.   r,   r-   r/   Ú	__class__s        €r   r+   zContrastiveLoss.__init__   s/   ø€ ôv 	‰ÑÔØ.ˆÔØˆŒØˆŒ
Ø(ˆÕr   c                óØ   — | j                   j                  }t        t        «      j	                  «       D ]  \  }}|| j                   k(  sŒd|› �} n || j
                  | j                  dœS )NzSiameseDistanceMetric.)r,   r-   r/   )r,   r   Úvarsr   Úitemsr-   r/   )r0   Údistance_metric_nameÚnameÚvalues       r   Úget_config_dictzContrastiveLoss.get_config_dictW   sn   € Ø#×3Ñ3×<Ñ<ÐÜÔ 5Ó6×<Ñ<Ó>ò 	‰KˆD�%Ø˜×,Ñ,Ó,Ø)?À¸vÐ'FÐ$Ùð	ð
 $8À4Ç;Á;Ð`d×`qÑ`qÑrÐrr   c                óÊ  — |D �cg c]  }| j                  |«      d   ‘Œ }}t        |«      dk(  sJ ‚|\  }}| j                  ||«      }d|j                  «       |j	                  d«      z  d|z
  j                  «       t        j                  | j                  |z
  «      j	                  d«      z  z   z  }| j                  r|j                  «       S |j                  «       S c c}w )NÚsentence_embeddingr   r(   r   )r.   Úlenr,   ÚfloatÚpowr   Úrelur-   r/   ÚmeanÚsum)	r0   Úsentence_featuresÚlabelsÚsentence_featureÚrepsÚ
rep_anchorÚ	rep_otherÚ	distancesÚlossess	            r   ÚforwardzContrastiveLoss.forward`   sÐ   € Ø[lÖmÐGW�—
‘
Ð+Ó,Ð-AÓBÐmˆÐmÜ�4‹y˜AŠ~Ðˆ~Ø $Ñˆ
�IØ×(Ñ(¨°YÓ?ˆ	ØØ�L‰L‹N˜YŸ]™]¨1Ó-Ñ-°°V±×0BÑ0BÓ0DÄqÇvÁvÈdÏkÉkÐ\eÑNeÓGf×GjÑGjÐklÓGmÑ0mÑmñ
ˆð !%× 1Ò 1ˆv�{‰{‹}ÐC°v·z±z³|ÐCùò ns   …C c                 ó   — y)Na~  
@inproceedings{hadsell2006dimensionality,
    author={Hadsell, R. and Chopra, S. and LeCun, Y.},
    booktitle={2006 IEEE Computer Society Conference on Computer Vision and Pattern Recognition (CVPR'06)},
    title={Dimensionality Reduction by Learning an Invariant Mapping},
    year={2006},
    volume={2},
    number={},
    pages={1735-1742},
    doi={10.1109/CVPR.2006.100}
}
r%   )r0   s    r   ÚcitationzContrastiveLoss.citationj   s   € ðr   )r.   r	   r-   r<   r/   ÚboolÚreturnÚNone)rM   zdict[str, Any])rA   zIterable[dict[str, Tensor]]rB   r   rM   r   )rM   Ústr)r   r   r    r   r$   r+   r8   rI   ÚpropertyrK   Ú__classcell__)r1   s   @r   r'   r'      s`   ø„ ð .×=Ñ=ØØ!ð?)à"ð?)ð ð	?)ð
 ð?)ð 
õ?)óBsóDð òó ôr   r'   )Ú
__future__r   Úcollections.abcr   Úenumr   Útypingr   Útorch.nn.functionalr   Ú
functionalr   Útorchr   Ú)sentence_transformers.SentenceTransformerr	   r   ÚModuler'   r%   r   r   ú<module>r[      s=   ðÝ "å $Ý Ý ç Ð ß å IôA˜Dô Aôb�b—i‘iõ br   