U
    <A·f§  ã                   @   st   d dl mZ d dlmZmZmZ d dlmZ d dlm	Z	 ddl
mZmZmZmZmZmZmZmZ G dd„ deƒZd	S )
é    )ÚEnum)ÚCallableÚListÚUnion)Úndarray)ÚTensoré   )Úcos_simÚ	dot_scoreÚeuclidean_simÚmanhattan_simÚpairwise_cos_simÚpairwise_dot_scoreÚpairwise_euclidean_simÚpairwise_manhattan_simc                   @   sª   e Zd ZdZdZdZdZdZdZe	e
ed f ee
eef e
eef gef dœdd„ƒZe	e
ed f ee
eef e
eef gef dœd	d
„ƒZe	ee dœdd„ƒZdS )ÚSimilarityFunctionaž  
    Enum class for supported similarity functions. The following functions are supported:

    - ``SimilarityFunction.COSINE`` (``"cosine"``): Cosine similarity
    - ``SimilarityFunction.DOT_PRODUCT`` (``"dot"``, ``dot_product``): Dot product similarity
    - ``SimilarityFunction.EUCLIDEAN`` (``"euclidean"``): Euclidean distance
    - ``SimilarityFunction.MANHATTAN`` (``"manhattan"``): Manhattan distance
    ZcosineÚdotZ	euclideanZ	manhattan)Úsimilarity_functionÚreturnc                 C   sX   t | ƒ} | t jkrtS | t jkr$tS | t jkr2tS | t jkr@tS t	d 
| t  ¡ ¡ƒ‚dS )aé  
        Converts a similarity function name or enum value to the corresponding similarity function.

        Args:
            similarity_function (Union[str, SimilarityFunction]): The name or enum value of the similarity function.

        Returns:
            Callable[[Union[Tensor, ndarray], Union[Tensor, ndarray]], Tensor]: The corresponding similarity function.

        Raises:
            ValueError: If the provided function is not supported.

        Example:
            >>> similarity_fn = SimilarityFunction.to_similarity_fn("cosine")
            >>> similarity_scores = similarity_fn(embeddings1, embeddings2)
            >>> similarity_scores
            tensor([[0.3952, 0.0554],
                    [0.0992, 0.1570]])
        úOThe provided function {} is not supported. Use one of the supported values: {}.N)r   ÚCOSINEr	   ÚDOT_PRODUCTr
   Ú	MANHATTANr   Ú	EUCLIDEANr   Ú
ValueErrorÚformatÚpossible_values©r   © r   úN/tmp/pip-unpacked-wheel-i7fohqg6/sentence_transformers/similarity_functions.pyÚto_similarity_fn#   s    



 ÿÿz#SimilarityFunction.to_similarity_fnc                 C   sX   t | ƒ} | t jkrtS | t jkr$tS | t jkr2tS | t jkr@tS t	d 
| t  ¡ ¡ƒ‚dS )aÈ  
        Converts a similarity function into a pairwise similarity function.

        The pairwise similarity function returns the diagonal vector from the similarity matrix, i.e. it only
        computes the similarity(a[i], b[i]) for each i in the range of the input tensors, rather than
        computing the similarity between all pairs of a and b.

        Args:
            similarity_function (Union[str, SimilarityFunction]): The name or enum value of the similarity function.

        Returns:
            Callable[[Union[Tensor, ndarray], Union[Tensor, ndarray]], Tensor]: The pairwise similarity function.

        Raises:
            ValueError: If the provided similarity function is not supported.

        Example:
            >>> pairwise_fn = SimilarityFunction.to_similarity_pairwise_fn("cosine")
            >>> similarity_scores = pairwise_fn(embeddings1, embeddings2)
            >>> similarity_scores
            tensor([0.3952, 0.1570])
        r   N)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Úto_similarity_pairwise_fnK   s    



 ÿÿz,SimilarityFunction.to_similarity_pairwise_fn)r   c                   C   s   dd„ t D ƒS )ad  
        Returns a list of possible values for the SimilarityFunction enum.

        Returns:
            list: A list of possible values for the SimilarityFunction enum.

        Example:
            >>> possible_values = SimilarityFunction.possible_values()
            >>> possible_values
            ['cosine', 'dot', 'euclidean', 'manhattan']
        c                 S   s   g | ]
}|j ‘qS r   )Úvalue)Ú.0Úmr   r   r   Ú
<listcomp>ƒ   s     z6SimilarityFunction.possible_values.<locals>.<listcomp>)r   r   r   r   r   r   v   s    z"SimilarityFunction.possible_valuesN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   ÚDOTr   r   Ústaticmethodr   Ústrr   r   r   r    r!   r   r   r   r   r   r   r      s    	
þ'
þ*r   N)Úenumr   Útypingr   r   r   Znumpyr   Ztorchr   Úutilr	   r
   r   r   r   r   r   r   r   r   r   r   r   Ú<module>   s
   (