o
    S"g8                     @  s   d dl mZ d dlZd dlmZ d dlmZ d dlZd dlZd dl	m
Z
 d dlmZmZ d dlmZ eeZG dd	 d	ejZdS )
    )annotationsN)Iterable)Callable)version)Tensornn)SentenceTransformerc                      sD   e Zd Zddde fd fddZdddZedddZ  Z	S )SoftmaxLossTFmodelr   sentence_embedding_dimensionint
num_labelsconcatenation_sent_repboolconcatenation_sent_difference!concatenation_sent_multiplicationloss_fctr   returnNonec           	        s   t    || _|| _|| _|| _|| _d}|r|d7 }|r"|d7 }|r(|d7 }td|  t	j
|| ||jd| _|| _ttjtdk rQtd dS dS )	at  
        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.

        :class:`MultipleNegativesRankingLoss` is an alternative loss function that often yields better results,
        as per https://arxiv.org/abs/2004.09813.

        Args:
            model (SentenceTransformer): The SentenceTransformer model.
            sentence_embedding_dimension (int): The dimension of the sentence embeddings.
            num_labels (int): The number of different labels.
            concatenation_sent_rep (bool): Whether to concatenate vectors u,v for the softmax classifier. Defaults to True.
            concatenation_sent_difference (bool): Whether to add abs(u-v) for the softmax classifier. Defaults to True.
            concatenation_sent_multiplication (bool): Whether to add u*v for the softmax classifier. Defaults to False.
            loss_fct (Callable): Custom pytorch loss function. If not set, uses nn.CrossEntropyLoss(). Defaults to nn.CrossEntropyLoss().

        References:
            - Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks: https://arxiv.org/abs/1908.10084
            - `Training Examples > Natural Language Inference <../../../examples/sentence_transformer/training/nli/README.html>`_

        Requirements:
            1. sentence pairs with a class label

        Inputs:
            +---------------------------------------+--------+
            | Texts                                 | Labels |
            +=======================================+========+
            | (sentence_A, sentence_B) pairs        | class  |
            +---------------------------------------+--------+

        Example:
            ::

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

                model = SentenceTransformer("microsoft/mpnet-base")
                train_dataset = Dataset.from_dict({
                    "sentence1": [
                        "A person on a horse jumps over a broken down airplane.",
                        "A person on a horse jumps over a broken down airplane.",
                        "A person on a horse jumps over a broken down airplane.",
                        "Children smiling and waving at camera",
                    ],
                    "sentence2": [
                        "A person is training his horse for a competition.",
                        "A person is at a diner, ordering an omelette.",
                        "A person is outdoors, on a horse.",
                        "There are children present.",
                    ],
                    "label": [1, 2, 0, 0],
                })
                loss = losses.SoftmaxLoss(model, model.get_sentence_embedding_dimension(), num_labels=3)

                trainer = SentenceTransformerTrainer(
                    model=model,
                    train_dataset=train_dataset,
                    loss=loss,
                )
                trainer.train()
        r         z%Softmax loss: #Vectors concatenated: )devicez4.43.0zSoftmaxLoss requires transformers >= 4.43.0 to work correctly. Otherwise, the classifier layer that maps embeddings to the labels cannot be updated. Consider updating transformers with `pip install transformers>=4.43.0`.N)super__init__r
   r   r   r   r   loggerinfor   Linearr   
classifierr   r   parsetransformers__version__warning)	selfr
   r   r   r   r   r   r   num_vectors_concatenated	__class__ j/mnt/skqttb/ctump_chatbot/chatbot/lib/python3.10/site-packages/sentence_transformers/losses/SoftmaxLoss.pyr      s.   
GzSoftmaxLoss.__init__sentence_featuresIterable[dict[str, Tensor]]labelsr   Tensor | tuple[Tensor, Tensor]c           
        s    fdd|D }|\}}g } j r|| ||  jr)|t||   jr3|||  t|d} |}|d urM ||	d}	|	S ||fS )Nc                   s   g | ]	}  |d  qS )sentence_embedding)r
   ).0sentence_featurer"   r&   r'   
<listcomp>w   s    z'SoftmaxLoss.forward.<locals>.<listcomp>r   )
r   appendr   torchabsr   catr   r   view)
r"   r(   r*   repsrep_arep_bvectors_concatfeaturesoutputlossr&   r/   r'   forwardt   s    


zSoftmaxLoss.forwardstrc                 C  s   dS )Na  
@inproceedings{reimers-2019-sentence-bert,
    title = "Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks",
    author = "Reimers, Nils and Gurevych, Iryna",
    booktitle = "Proceedings of the 2019 Conference on Empirical Methods in Natural Language Processing",
    month = "11",
    year = "2019",
    publisher = "Association for Computational Linguistics",
    url = "https://arxiv.org/abs/1908.10084",
}
r&   r/   r&   r&   r'   citation   s   zSoftmaxLoss.citation)r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r(   r)   r*   r   r   r+   )r   r?   )
__name__
__module____qualname__r   CrossEntropyLossr   r>   propertyr@   __classcell__r&   r&   r$   r'   r	      s    
br	   )
__future__r   loggingcollections.abcr   typingr   r3   r   	packagingr   r   r   )sentence_transformers.SentenceTransformerr   	getLoggerrA   r   Moduler	   r&   r&   r&   r'   <module>   s    
