§
    æ˜ºhÜ
  ã                   óv   — d dl mZmZ d dlmc mZ d dlmZmZ ddl	m
Z
 d dlmZ  G d„ dej        ¦  «        ZdS )	é    )ÚIterableÚDictN)ÚnnÚTensoré   )ÚSiameseDistanceMetric)ÚSentenceTransformerc                   ój   ‡ — e Zd ZdZej        dfdedefˆ fd„Zd
de	e
eef                  defd	„Zˆ xZS )ÚOnlineContrastiveLossa>  
    Online Contrastive loss. Similar to ConstrativeLoss, but it selects hard positive (positives that are far apart)
    and hard negative pairs (negatives that are close) and computes the loss only for these pairs. Often yields
    better performances than  ConstrativeLoss.

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

    Example::

        from sentence_transformers import SentenceTransformer, LoggingHandler, losses, InputExample
        from torch.utils.data import DataLoader

        model = SentenceTransformer('all-MiniLM-L6-v2')
        train_examples = [
            InputExample(texts=['This is a positive pair', 'Where the distance will be minimized'], label=1),
            InputExample(texts=['This is a negative pair', 'Their distance will be increased'], label=0)]

        train_dataloader = DataLoader(train_examples, shuffle=True, batch_size=2)
        train_loss = losses.OnlineContrastiveLoss(model=model)

        model.fit([(train_dataloader, train_loss)], show_progress_bar=True)
    g      à?ÚmodelÚmarginc                 ó€   •— t          t          | ¦  «                             ¦   «          || _        || _        || _        d S )N)Úsuperr   Ú__init__r   r   Údistance_metric)Úselfr   r   r   Ú	__class__s       €úz/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/sentence_transformers/losses/OnlineContrastiveLoss.pyr   zOnlineContrastiveLoss.__init__#   s>   ø€ õ 	Õ# TÑ*Ô*×3Ò3Ñ5Ô5Ð5ØˆŒ
ØˆŒØ.ˆÔÐÐó    FÚsentence_featuresÚlabelsc                 ó†  ‡ — ˆ fd„|D ¦   «         }‰                       |d         |d         ¦  «        }||dk             }||dk             }||t          |¦  «        dk    r|                     ¦   «         n|                     ¦   «         k              }||t          |¦  «        dk    r|                     ¦   «         n|                     ¦   «         k             }	|	                     d¦  «                             ¦   «         }
t          j        ‰ j	        |z
  ¦  «                             d¦  «                             ¦   «         }|
|z   }|S )Nc                 óF   •— g | ]}‰                      |¦  «        d          ‘ŒS )Úsentence_embedding)r   )Ú.0Úsentence_featurer   s     €r   ú
<listcomp>z1OnlineContrastiveLoss.forward.<locals>.<listcomp>,   s-   ø€ ÐsÐsÐsÐM]�d—j’jÐ!1Ñ2Ô2Ð3GÔHÐsÐsÐsr   r   r   é   )
r   ÚlenÚmaxÚmeanÚminÚpowÚsumÚFÚrelur   )r   r   r   Úsize_averageÚ
embeddingsÚdistance_matrixÚnegsÚpossÚnegative_pairsÚpositive_pairsÚpositive_lossÚnegative_lossÚlosss   `            r   ÚforwardzOnlineContrastiveLoss.forward+   s  ø€ ØsÐsÐsÐsÐarÐsÑsÔsˆ
à×.Ò.¨z¸!¬}¸jÈ¼mÑLÔLˆØ˜v¨š{Ô+ˆØ˜v¨š{Ô+ˆð ˜dµC¸±I´IÀ²M°M d§h¢h¡j¤j jÀtÇyÂyÁ{Ä{ÒSÔTˆØ˜dµC¸±I´IÀ²M°M d§h¢h¡j¤j jÀtÇyÂyÁ{Ä{ÒSÔTˆà&×*Ò*¨1Ñ-Ô-×1Ò1Ñ3Ô3ˆÝœ˜tœ{¨^Ñ;Ñ<Ô<×@Ò@ÀÑCÔC×GÒGÑIÔIˆØ˜}Ñ,ˆØˆr   )F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚCOSINE_DISTANCEr	   Úfloatr   r   r   Ústrr   r1   Ú__classcell__)r   s   @r   r   r      s�   ø€ € € € € ðð ð6 ;PÔ:_Ðqtð/ð /Ø(ð/Øinð/ð /ð /ð /ð /ð /ðð ¨°$°s¸F°{Ô2CÔ)Dð Èfð ð ð ð ð ð ð ð r   r   )Útypingr   r   Útorch.nn.functionalr   Ú
functionalr%   Útorchr   ÚContrastiveLossr   Ú)sentence_transformers.SentenceTransformerr	   ÚModuler   © r   r   ú<module>rB      sª   ðØ !Ð !Ð !Ð !Ð !Ð !Ð !Ð !Ø Ð Ð Ð Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ð Ð Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø IÐ IÐ IÐ IÐ IÐ Ið1ð 1ð 1ð 1ð 1˜BœIñ 1ô 1ð 1ð 1ð 1r   