
    rh                        d dl mZ d dlZd dlZd dlmZ d dlmZ d dlm	Z	 ddl
mZmZmZmZ  e	j                  e      ZddZdd	Zdd
ZddZddZddZddZddZddZddZy)    )annotationsN)pairwise_distances)Tensor)logging   )_convert_to_batch_tensor_convert_to_tensornormalize_embeddingsto_scipy_cooc                    t        | |      S )  
    Computes the cosine similarity between two tensors.

    Args:
        a (Union[list, np.ndarray, Tensor]): The first tensor.
        b (Union[list, np.ndarray, Tensor]): The second tensor.

    Returns:
        Tensor: Matrix with res[i][j] = cos_sim(a[i], b[j])
    )cos_simabs     x/var/www/html/ai-insurance-compliance-backend/venv/lib/python3.12/site-packages/sentence_transformers/util/similarity.pypytorch_cos_simr      s     1a=    c                    t        |       } t        |      }t        |       }t        |      }t        j                  ||j	                  dd            j                         S )r   r   r   )r   r
   torchmm	transposeto_denser   r   a_normb_norms       r   r   r      sS     	!#A #A!!$F!!$F88FF,,Q23<<>>r   c                (   t        |       } t        |      }| j                  s|j                  r9t        |       }t        |      }||z  j                  d      j	                         S t        t        |       t        |            j	                         S )a  
    Computes the pairwise cosine similarity cos_sim(a[i], b[i]).

    Args:
        a (Union[list, np.ndarray, Tensor]): The first tensor.
        b (Union[list, np.ndarray, Tensor]): The second tensor.

    Returns:
        Tensor: Vector with res[i] = cos_sim(a[i], b[i])
    dim)r	   	is_sparser
   sumr   pairwise_dot_scorer   s       r   pairwise_cos_simr$   0   s     	1A1A 	{{akk%a(%a($$$,5577!"6q"9;OPQ;RS\\^^r   c                    t        |       } t        |      }t        j                  | |j                  dd            j	                         S )a  
    Computes the dot-product dot_prod(a[i], b[j]) for all i and j.

    Args:
        a (Union[list, np.ndarray, Tensor]): The first tensor.
        b (Union[list, np.ndarray, Tensor]): The second tensor.

    Returns:
        Tensor: Matrix with res[i][j] = dot_prod(a[i], b[j])
    r   r   )r   r   r   r   r   r   s     r   	dot_scorer&   G   s=     	!#A #A88Aq{{1a()2244r   c                t    t        |       } t        |      }| |z  j                  d      j                         S )a  
    Computes the pairwise dot-product dot_prod(a[i], b[i]).

    Args:
        a (Union[list, np.ndarray, Tensor]): The first tensor.
        b (Union[list, np.ndarray, Tensor]): The second tensor.

    Returns:
        Tensor: Vector with res[i] = dot_prod(a[i], b[i])
    r   r   )r	   r"   r   r   s     r   r#   r#   X   s6     	1A1AE;;2;''))r   c                   t        |       } t        |      }| j                  s|j                  rt        j                  d       t	        |       }t	        |      }t        ||d      }t        j                  |       j                         j                  | j                        j                         S t        j                  | |d      j                          S )a  
    Computes the manhattan similarity (i.e., negative distance) between two tensors.
    Handles sparse tensors without converting to dense when possible.

    Args:
        a (Union[list, np.ndarray, Tensor]): The first tensor.
        b (Union[list, np.ndarray, Tensor]): The second tensor.

    Returns:
        Tensor: Matrix with res[i][j] = -manhattan_distance(a[i], b[j])
    z8Using scipy for sparse Manhattan similarity computation.	manhattan)metricg      ?p)r   r!   loggerwarning_oncer   r   r   
from_numpyfloattodevicer   cdist)r   r   a_coob_coodists        r   manhattan_simr7   i   s     	!#A #A{{akkVWQQ!%{C&,,.11!((;DDFF AqC(11333r   c                    t        |       } t        |      }t        j                  t        j                  | |z
        d      j	                          S )a<  
    Computes the manhattan similarity (i.e., negative distance) between pairs of tensors.

    Args:
        a (Union[list, np.ndarray, Tensor]): The first tensor.
        b (Union[list, np.ndarray, Tensor]): The second tensor.

    Returns:
        Tensor: Vector with res[i] = -manhattan_distance(a[i], b[i])
    r   r   )r	   r   r"   absr   r   s     r   pairwise_manhattan_simr:      sB     	1A1AIIeiiA&B/88:::r   c                l   t        |       } t        |      }| j                  rt        j                  j	                  | | z  d      j                         j                  d      }t        j                  j	                  ||z  d      j                         j                  d      }t        j                  | |j                               j                         }|d|z  z
  |z   }t        j                  |d      }t        j                  |      j                          S t        j                  | |d       S )	a  
    Computes the euclidean similarity (i.e., negative distance) between two tensors.
    Handles sparse tensors without converting to dense when possible.

    Args:
        a (Union[list, np.ndarray, Tensor]): The first tensor.
        b (Union[list, np.ndarray, Tensor]): The second tensor.

    Returns:
        Tensor: Matrix with res[i][j] = -euclidean_distance(a[i], b[j])
    r   r   r      g        )ming       @r+   )r   r!   r   sparser"   r   	unsqueezematmultclampsqrtr3   )r   r   	a_norm_sq	b_norm_sqdot_productsquared_dists         r   euclidean_simrH      s     	!#A #A{{LL$$QU$2;;=GGJ	LL$$QU$2;;=GGJ	ll1acce,557 !1{?2Y> {{<S9

<(11333AqC(((r   c                    t        |       } t        |      }t        j                  t        j                  | |z
  dz  d            j	                          S )a:  
    Computes the euclidean distance (i.e., negative distance) between pairs of tensors.

    Args:
        a (Union[list, np.ndarray, Tensor]): The first tensor.
        b (Union[list, np.ndarray, Tensor]): The second tensor.

    Returns:
        Tensor: Vector with res[i] = -euclidean_distance(a[i], b[i])
    r<   r   r   )r	   r   rC   r"   r   r   s     r   pairwise_euclidean_simrJ      sF     	1A1AJJuyy!a%A267@@BBBr   c                   | j                   rQt        j                  d       | j                         j	                         } |j                         j	                         }t        |       } t        |      }t        j                  | dd      \  }}t        j                  |dd      \  }}t        j                  |dz  |dz  z   dd      }||z  ||z  z   |z  }||z  ||z  z
  |z  }t        j                  |dz  |dz  z   dd      dz  }	t        j                  |dz  |dz  z   dd      dz  }
||	|
z  z  }||	|
z  z  }t        j                  t        j                  ||fd      d      }t        j                  |      S )aP  
    Computes the absolute normalized angle distance. See :class:`~sentence_transformers.losses.AnglELoss`
    or https://arxiv.org/abs/2309.12871v1 for more information.

    Args:
        x (Tensor): The first tensor.
        y (Tensor): The second tensor.

    Returns:
        Tensor: Vector with res[i] = angle_sim(a[i], b[i])
    zOPairwise angle similarity does not support sparse tensors. Converting to dense.r<   r   r   T)r    keepdimg      ?)r!   r-   r.   coalescer   r	   r   chunkr"   concatr9   )xyr   r   cdzreimdzdw
norm_angles               r   pairwise_angle_simrZ      s\    	{{mnJJL!!#JJL!!#1A1A ;;q!#DAq;;q!#DAq		!Q$A+1d3A
a%!a%-1	B
a%!a%-1	B	1a4!Q$;At	4	;B	1a4!Q$;At	4	;B"r'MB"r'MB5<<Ra8a@J99Z  r   )r   r   r   r   returnr   )r   list | np.ndarray | Tensorr   r\   r[   r   )r   r\   r   r\   )rP   r   rQ   r   r[   r   )
__future__r   numpynpr   sklearn.metricsr   r   transformers.utilsr   tensorr   r	   r
   r   
get_logger__name__r-   r   r   r$   r&   r#   r7   r:   rH   rJ   rZ    r   r   <module>rf      se    "   .  & d d 
		H	%?&_.5"*"46;")>C"#!r   