§
    æ˜ºh´  ã                   óØ   — d dl Z d dl mZmZ d dlmZ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Z G d„ d	ej        ¦  «        Z G d
„ dej        ¦  «        Z G d„ d¦  «        ZdS )é    N)ÚnnÚTensor)ÚIterableÚDicté   )ÚSentenceTransformer)Úutil)ÚInputExamplec                   óT   ‡ — e Zd ZdZdefˆ fd„Zdeeee	f                  de	fd„Z
ˆ xZS )ÚContrastiveTensionLossaË  
    This loss expects as input a batch consisting of multiple mini-batches of sentence pairs (a_1, p_1), (a_2, p_2)..., (a_{K+1}, p_{K+1})
    where p_1 = a_1 = a_2 = ... a_{K+1} and p_2, p_3, ..., p_{K+1} are expected to be different from p_1 (this is done via random sampling).
    The corresponding labels y_1, y_2, ..., y_{K+1} for each mini-batch are assigned as: y_i = 1 if i == 1 and y_i = 0 otherwise.
    In other words, K represent the number of negative pairs and the positive pair is actually made of two identical sentences. The data generation
    process has already been implemented in readers/ContrastiveTensionReader.py
    For tractable optimization, two independent encoders ('model1' and 'model2') are created for encoding a_i and p_i, respectively. For inference,
    only model2 are used, which gives better performance. The training objective is binary cross entropy.
    For more information, see: https://openreview.net/pdf?id=Ov_sMNau-PF

    Úmodelc                 óÊ   •— t          t          | ¦  «                             ¦   «          || _        t	          j        |¦  «        | _        t          j        d¬¦  «        | _	        dS )ú9
        :param model: SentenceTransformer model
        Úsum)Ú	reductionN)
Úsuperr   Ú__init__Úmodel2ÚcopyÚdeepcopyÚmodel1r   ÚBCEWithLogitsLossÚ	criterion)Úselfr   Ú	__class__s     €ú{/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/sentence_transformers/losses/ContrastiveTensionLoss.pyr   zContrastiveTensionLoss.__init__   sS   ø€ õ 	Õ$ dÑ+Ô+×4Ò4Ñ6Ô6Ð6ØˆŒÝ”m EÑ*Ô*ˆŒÝÔ-¸Ð>Ñ>Ô>ˆŒˆˆó    Úsentence_featuresÚlabelsc                 óŒ  — t          |¦  «        \  }}|                      |¦  «        d         }|                      |¦  «        d         }t          j        |d d …d f         |d d …d d …d f         ¦  «                             d¦  «                             d¦  «        }|                      ||                     |¦  «        ¦  «        }|S )NÚsentence_embeddingéÿÿÿÿ)Útupler   r   ÚtorchÚmatmulÚsqueezer   Útype_as)	r   r   r   Úsentence_features1Úsentence_features2Úreps_1Úreps_2Ú
sim_scoresÚlosss	            r   ÚforwardzContrastiveTensionLoss.forward#   s¿   € Ý16Ð7HÑ1IÔ1IÑ.ÐÐ.Ø—’Ð/Ñ0Ô0Ð1EÔFˆØ—’Ð/Ñ0Ô0Ð1EÔFˆõ ŒL˜    4 œ¨&°°°°A°A°A°t°Ô*<Ñ=Ô=×EÒEÀbÑIÔI×QÒQÐRTÑUÔUð 	ð �~Š~˜j¨&¯.ª.¸Ñ*DÔ*DÑEÔEˆØˆr   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   Ústrr   r.   Ú__classcell__©r   s   @r   r   r      s   ø€ € € € € ð
ð 
ð?Ð1ð ?ð ?ð ?ð ?ð ?ð ?ð
¨°$°s¸F°{Ô2CÔ)Dð 
Èfð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
r   r   c                   ód   ‡ — e Zd Zdej        fdedefˆ fd„Zdee	e
ef                  defd„Zˆ xZS )Ú&ContrastiveTensionLossInBatchNegativesg      4@r   Úscalec                 óT  •— t          t          | ¦  «                             ¦   «          || _        t	          j        |¦  «        | _        || _        t          j	        ¦   «         | _
        t          j        t          j        g ¦  «        t          j        |¦  «        z  ¦  «        | _        dS )r   N)r   r7   r   r   r   r   r   Úsimilarity_fctr   ÚCrossEntropyLossÚcross_entropy_lossÚ	Parameterr$   ÚonesÚnpÚlogÚlogit_scale)r   r   r8   r:   r   s       €r   r   z/ContrastiveTensionLossInBatchNegatives.__init__1   s€   ø€ õ 	Õ4°dÑ;Ô;×DÒDÑFÔFÐFØˆŒÝ”m EÑ*Ô*ˆŒØ,ˆÔÝ"$Ô"5Ñ"7Ô"7ˆÔåœ<­¬
°2©¬½¼À¹¼Ñ(FÑGÔGˆÔÐÐr   r   r   c                 óö  — t          |¦  «        \  }}|                      |¦  «        d         }|                      |¦  «        d         }|                      ||¦  «        | j                             ¦   «         z  }t          j        t          t          |¦  «        ¦  «        t          j
        |j        ¬¦  «        }|                      ||¦  «        |                      |                     ¦   «         |¦  «        z   dz  S )Nr!   )ÚdtypeÚdevicer   )r#   r   r   r:   rA   Úexpr$   ÚtensorÚrangeÚlenÚlongrD   r<   Út)r   r   r   r(   r)   Úembeddings_aÚembeddings_bÚscoress           r   r.   z.ContrastiveTensionLossInBatchNegatives.forward=   s×   € Ý16Ð7HÑ1IÔ1IÑ.ÐÐ.Ø—{’{Ð#5Ñ6Ô6Ð7KÔLˆØ—{’{Ð#5Ñ6Ô6Ð7KÔLˆà×$Ò$ \°<Ñ@Ô@À4ÔCS×CWÒCWÑCYÔCYÑYˆÝ”�e¥C¨¡K¤KÑ0Ô0½¼
È6Ì=ÐYÑYÔYˆØ×'Ò'¨°Ñ7Ô7¸$×:QÒ:QÐRX×RZÒRZÑR\ÔR\Ð^dÑ:eÔ:eÑeÐijÑjÐjr   )r/   r0   r1   r	   Úcos_simr   Úfloatr   r   r   r3   r   r.   r4   r5   s   @r   r7   r7   0   s�   ø€ € € € € ØBFÐW[ÔWcð 
Hð 
HÐ1ð 
H¸%ð 
Hð 
Hð 
Hð 
Hð 
Hð 
Hðk¨°$°s¸F°{Ô2CÔ)Dð kÈfð kð kð kð kð kð kð kð kr   r7   c                   ó"   — e Zd Zdd„Zd„ Zd„ ZdS )ÚContrastiveTensionDataLoaderé   c                 ó�   — || _         || _        || _        d | _        | j        | j        z  dk    rt	          d|› d|› d�¦  «        ‚d S )Nr   z@ContrastiveTensionDataLoader was loaded with a pos_neg_ratio of z and a batch size of z7. The batch size must be devisable by the pos_neg_ratio)Ú	sentencesÚ
batch_sizeÚpos_neg_ratioÚ
collate_fnÚ
ValueError)r   rT   rU   rV   s       r   r   z%ContrastiveTensionDataLoader.__init__N   s|   € Ø"ˆŒØ$ˆŒØ*ˆÔØˆŒàŒ?˜TÔ/Ñ/°1Ò4Ð4Ýð {ÐS`ð  {ð  {ð  xBð  {ð  {ð  {ñô ð ð 5Ð4r   c              #   ó  K  — t          j        | j        ¦  «         d}g }|dz   t          | j        ¦  «        k     rÎ| j        |         }t          |¦  «        | j        z  dk    r|dz  }| j        |         }d}n| j        |         }d}|dz  }|                     t          ||g|¬¦  «        ¦  «         t          |¦  «        | j        k    r"| j        �|                      |¦  «        n|V — g }|dz   t          | j        ¦  «        k     °Ìd S d S )Nr   é   )ÚtextsÚlabel)	ÚrandomÚshufflerT   rH   rV   Úappendr
   rU   rW   )r   Úsentence_idxÚbatchÚs1Ús2r\   s         r   Ú__iter__z%ContrastiveTensionDataLoader.__iter__Y   s!  è è € ÝŒ�t”~Ñ&Ô&Ð&ØˆØˆà˜QÑ¥ T¤^Ñ!4Ô!4Ò4Ð4Ø” Ô-ˆBÝ�5‰zŒz˜DÔ.Ñ.°Ò2Ð2Ø Ñ!�Ø”^ LÔ1�Ø��à”^ LÔ1�Ø�à˜AÑˆLØ�LŠL�¨R°¨H¸EÐBÑBÔBÑCÔCÐCå�5‰zŒz˜Tœ_Ò,Ð,Ø04´Ð0K�d—o’o eÑ,Ô,Ð,ÐQVÐVÐVÐVØ�ð ˜QÑ¥ T¤^Ñ!4Ô!4Ò4Ð4Ð4Ð4Ð4Ð4r   c                 ód   — t          j        t          | j        ¦  «        d| j        z  z  ¦  «        S )Nr   )ÚmathÚfloorrH   rT   rU   )r   s    r   Ú__len__z$ContrastiveTensionDataLoader.__len__o   s(   € ÝŒz�#˜dœnÑ-Ô-°°T´_Ñ1DÑEÑFÔFÐFr   N)rR   )r/   r0   r1   r   rd   rh   © r   r   rQ   rQ   M   sK   € € € € € ð	ð 	ð 	ð 	ðð ð ð,Gð Gð Gð Gð Gr   rQ   )r$   r   r   Útypingr   r   r   Ú r	   r   r]   rf   r
   Únumpyr?   ÚModuler   r7   rQ   ri   r   r   ú<module>rn      s8  ðØ €€€Ø Ð Ð Ð Ð Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !Ð !Ð !Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø Ð Ð Ð Ð Ð Ø €€€Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð ð ð  ð  ð  ð  ˜RœYñ  ô  ð  ðFkð kð kð kð k¨R¬Yñ kô kð kð:#Gð #Gð #Gð #Gð #Gñ #Gô #Gð #Gð #Gð #Gr   