§
    æ˜ºhr  ã                   ó’   — d dl mZmZ d dlmZmZ d dlmc mZ d dl	m
Z
 ddlmZ  G d„ de
¦  «        Z G d	„ d
ej        ¦  «        ZdS )é    )ÚnnÚTensor)ÚIterableÚDictN)ÚEnumé   )ÚSentenceTransformerc                   ó$   — e Zd ZdZd„ Zd„ Zd„ ZdS )ÚTripletDistanceMetricz)
    The metric for the triplet loss
    c                 ó2   — dt          j        | |¦  «        z
  S )Né   )ÚFÚcosine_similarity©ÚxÚys     úp/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/sentence_transformers/losses/TripletLoss.pyú<lambda>zTripletDistanceMetric.<lambda>   s   € ˜!�aÔ1°!°QÑ7Ô7Ñ7€ ó    c                 ó0   — t          j        | |d¬¦  «        S )Nr   ©Úp©r   Úpairwise_distancer   s     r   r   zTripletDistanceMetric.<lambda>   ó   € �QÔ0°°A¸Ð;Ñ;Ô;€ r   c                 ó0   — t          j        | |d¬¦  «        S )Nr   r   r   r   s     r   r   zTripletDistanceMetric.<lambda>   r   r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚCOSINEÚ	EUCLIDEANÚ	MANHATTAN© r   r   r   r      s2   € € € € € ðð ð 8Ð7€FØ;Ð;€IØ;Ð;€I€I€Ir   r   c                   ón   ‡ — e Zd ZdZej        dfdedefˆ fd„Zd„ Z	de
eeef                  defd	„Zˆ xZS )
ÚTripletLossa©  
    This class implements triplet loss. Given a triplet of (anchor, positive, negative),
    the loss minimizes the distance between anchor and positive while it maximizes the distance
    between anchor and negative. It compute the following loss function:

    loss = max(||anchor - positive|| - ||anchor - negative|| + margin, 0).

    Margin is an important hyperparameter and needs to be tuned respectively.

    For further details, see: https://en.wikipedia.org/wiki/Triplet_loss

    :param model: SentenceTransformerModel
    :param distance_metric: Function to compute distance between two embeddings. The class TripletDistanceMetric contains common distance metrices that can be used.
    :param triplet_margin: The negative should be at least this much further away from the anchor than the positive.

    Example::

        from sentence_transformers import SentenceTransformer,  SentencesDataset, LoggingHandler, losses
        from sentence_transformers.readers import InputExample

        model = SentenceTransformer('distilbert-base-nli-mean-tokens')
        train_examples = [InputExample(texts=['Anchor 1', 'Positive 1', 'Negative 1']),
            InputExample(texts=['Anchor 2', 'Positive 2', 'Negative 2'])]
        train_dataset = SentencesDataset(train_examples, model)
        train_dataloader = DataLoader(train_dataset, shuffle=True, batch_size=train_batch_size)
        train_loss = losses.TripletLoss(model=model)
    é   ÚmodelÚtriplet_marginc                 ó€   •— t          t          | ¦  «                             ¦   «          || _        || _        || _        d S )N)Úsuperr&   Ú__init__r(   Údistance_metricr)   )Úselfr(   r-   r)   Ú	__class__s       €r   r,   zTripletLoss.__init__/   s>   ø€ õ 	�k˜4Ñ Ô ×)Ò)Ñ+Ô+Ð+ØˆŒ
Ø.ˆÔØ,ˆÔÐÐr   c                 óÊ   — | j         j        }t          t          ¦  «                             ¦   «         D ]'\  }}|| j         k    rd                     |¦  «        } nŒ(|| j        dœS )NzTripletDistanceMetric.{})r-   r)   )r-   r   Úvarsr   ÚitemsÚformatr)   )r.   Údistance_metric_nameÚnameÚvalues       r   Úget_config_dictzTripletLoss.get_config_dict7   su   € Ø#Ô3Ô<ÐÝÕ 5Ñ6Ô6×<Ò<Ñ>Ô>ð 	ð 	‰KˆD�%Ø˜Ô,Ò,Ð,Ø'A×'HÒ'HÈÑ'NÔ'NÐ$Ø�ð -ð $8È4ÔK^Ð_Ð_Ð_r   Úsentence_featuresÚlabelsc                 óê   ‡ — ˆ fd„|D ¦   «         }|\  }}}‰                       ||¦  «        }‰                       ||¦  «        }t          j        ||z
  ‰ j        z   ¦  «        }	|	                     ¦   «         S )Nc                 óF   •— g | ]}‰                      |¦  «        d          ‘ŒS )Úsentence_embedding)r(   )Ú.0Úsentence_featurer.   s     €r   ú
<listcomp>z'TripletLoss.forward.<locals>.<listcomp>A   s-   ø€ ÐmÐmÐmÐGW�—
’
Ð+Ñ,Ô,Ð-AÔBÐmÐmÐmr   )r-   r   Úrelur)   Úmean)
r.   r8   r9   ÚrepsÚ
rep_anchorÚrep_posÚrep_negÚdistance_posÚdistance_negÚlossess
   `         r   ÚforwardzTripletLoss.forward@   s}   ø€ ØmÐmÐmÐmÐ[lÐmÑmÔmˆà'+Ñ$ˆ
�G˜WØ×+Ò+¨J¸Ñ@Ô@ˆØ×+Ò+¨J¸Ñ@Ô@ˆå”˜ |Ñ3°dÔ6IÑIÑJÔJˆØ�{Š{‰}Œ}Ðr   )r   r   r   r    r   r"   r	   Úfloatr,   r7   r   r   Ústrr   rI   Ú__classcell__)r/   s   @r   r&   r&      sª   ø€ € € € € ðð ð: ;PÔ:YÐstð-ð -Ø(ð-Økpð-ð -ð -ð -ð -ð -ð`ð `ð `ð¨°$°s¸F°{Ô2CÔ)Dð Èfð ð ð ð ð ð ð ð r   r&   )Útorchr   r   Útypingr   r   Útorch.nn.functionalÚ
functionalr   Úenumr   r	   r   ÚModuler&   r$   r   r   ú<module>rS      sÔ   ðØ Ð Ð Ð Ð Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !Ð !Ð !Ø Ð Ð Ð Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5ð<ð <ð <ð <ð <˜Dñ <ô <ð <ð6ð 6ð 6ð 6ð 6�"”)ñ 6ô 6ð 6ð 6ð 6r   