§
    æ˜ºh:  ã                   óŒ   — d dl Z d dl mZmZ d dlmZmZmZ ddlmZ d dlZ ej	        e
¦  «        Z G d„ dej        ¦  «        ZdS )é    N)ÚnnÚTensor)ÚIterableÚDictÚCallableé   )ÚSentenceTransformerc                   ó�   ‡ — e Zd ZdZddd ej        ¦   «         fdededededed	ed
e	fˆ fd„Z
deeeef                  defd„Zˆ xZS )ÚSoftmaxLossaÓ  
    This loss was used in our SBERT publication (https://arxiv.org/abs/1908.10084) to train the SentenceTransformer
    model on NLI data. It adds a softmax classifier on top of the output of two transformer networks.

    :param model: SentenceTransformer model
    :param sentence_embedding_dimension: Dimension of your sentence embeddings
    :param num_labels: Number of different labels
    :param concatenation_sent_rep: Concatenate vectors u,v for the softmax classifier?
    :param concatenation_sent_difference: Add abs(u-v) for the softmax classifier?
    :param concatenation_sent_multiplication: Add u*v for the softmax classifier?
    :param loss_fct: Optional: Custom pytorch loss function. If not set, uses nn.CrossEntropyLoss()

    Example::

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

        model = SentenceTransformer('distilbert-base-nli-mean-tokens')
        train_examples = [InputExample(texts=['First pair, sent A', 'First pair, sent B'], label=0),
            InputExample(texts=['Second Pair, sent A', 'Second Pair, sent B'], label=3)]
        train_dataset = SentencesDataset(train_examples, model)
        train_dataloader = DataLoader(train_dataset, shuffle=True, batch_size=train_batch_size)
        train_loss = losses.SoftmaxLoss(model=model, sentence_embedding_dimension=model.get_sentence_embedding_dimension(), num_labels=train_num_labels)
    TFÚmodelÚsentence_embedding_dimensionÚ
num_labelsÚconcatenation_sent_repÚconcatenation_sent_differenceÚ!concatenation_sent_multiplicationÚloss_fctc                 óz  •— t          t          | ¦  «                             ¦   «          || _        || _        || _        || _        || _        d}|r|dz  }|r|dz  }|r|dz  }t           	                    d 
                    |¦  «        ¦  «         t          j        ||z  ||j        ¬¦  «        | _        || _        d S )Nr   r   é   z'Softmax loss: #Vectors concatenated: {})Údevice)Úsuperr   Ú__init__r   r   r   r   r   ÚloggerÚinfoÚformatr   ÚLinearr   Ú
classifierr   )
Úselfr   r   r   r   r   r   r   Únum_vectors_concatenatedÚ	__class__s
            €úp/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/sentence_transformers/losses/SoftmaxLoss.pyr   zSoftmaxLoss.__init__%   sÞ   ø€ õ 	�k˜4Ñ Ô ×)Ò)Ñ+Ô+Ð+ØˆŒ
Ø$ˆŒØ&<ˆÔ#Ø-JˆÔ*Ø1RˆÔ.à#$Ð Ø!ð 	*Ø$¨Ñ)Ð$Ø(ð 	*Ø$¨Ñ)Ð$Ø,ð 	*Ø$¨Ñ)Ð$Ý�ŠÐ=×DÒDÐE]Ñ^Ô^Ñ_Ô_Ð_Ýœ)Ø$Ð'CÑCÀZÐX]ÔXdð
ñ 
ô 
ˆŒð !ˆŒˆˆó    Úsentence_featuresÚlabelsc                 óæ  ‡ — ˆ fd„|D ¦   «         }|\  }}g }‰ j         r*|                     |¦  «         |                     |¦  «         ‰ j        r*|                     t          j        ||z
  ¦  «        ¦  «         ‰ j        r|                     ||z  ¦  «         t          j        |d¦  «        }‰                      |¦  «        }|�+‰                      || 	                    d¦  «        ¦  «        }	|	S ||fS )Nc                 óF   •— g | ]}‰                      |¦  «        d          ‘ŒS )Úsentence_embedding)r   )Ú.0Úsentence_featurer   s     €r    ú
<listcomp>z'SoftmaxLoss.forward.<locals>.<listcomp>D   s-   ø€ ÐmÐmÐmÐGW�—
’
Ð+Ñ,Ô,Ð-AÔBÐmÐmÐmr!   r   éÿÿÿÿ)
r   Úappendr   ÚtorchÚabsr   Úcatr   r   Úview)
r   r"   r#   ÚrepsÚrep_aÚrep_bÚvectors_concatÚfeaturesÚoutputÚlosss
   `         r    ÚforwardzSoftmaxLoss.forwardC   s  ø€ ØmÐmÐmÐmÐ[lÐmÑmÔmˆØ‰ˆˆuàˆØÔ&ð 	)Ø×!Ò! %Ñ(Ô(Ð(Ø×!Ò! %Ñ(Ô(Ð(àÔ-ð 	<Ø×!Ò!¥%¤)¨E°E©MÑ":Ô":Ñ;Ô;Ð;àÔ1ð 	1Ø×!Ò! %¨%¡-Ñ0Ô0Ð0å”9˜^¨QÑ/Ô/ˆà—’ Ñ*Ô*ˆàÐØ—=’= ¨¯ª°R©¬Ñ9Ô9ˆDØˆKà˜�<Ðr!   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚCrossEntropyLossr	   ÚintÚboolr   r   r   r   Ústrr   r7   Ú__classcell__)r   s   @r    r   r      sÙ   ø€ € € € € ðð ð< (,Ø.2Ø27Ø0˜RÔ0Ñ2Ô2ð!ð !à"ð!ð '*ð!ð ð	!ð
 !%ð!ð (,ð!ð ,0ð!ð ð!ð !ð !ð !ð !ð !ð< ¨°$°s¸F°{Ô2CÔ)Dð  Èfð  ð  ð  ð  ð  ð  ð  ð  r!   r   )r,   r   r   Útypingr   r   r   r	   ÚloggingÚ	getLoggerr8   r   ÚModuler   © r!   r    ú<module>rF      s³   ðØ €€€Ø Ð Ð Ð Ð Ð Ð Ð Ø +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø €€€ð 
ˆÔ	˜8Ñ	$Ô	$€ðO ð O ð O ð O ð O �"”)ñ O ô O ð O ð O ð O r!   