o
    :i'                     @   s8  U d dl mZ d dlmZ d dlZd dlmZ d dl	m
Z
 dZG dd deeZG d	d
 d
ZG dd dZG dd dZG dd dZeeB eB Zeed< de
jdefddZdejdejdejfddZdejdejdejfddZdejdejdejfddZdejdejdejfddZdejdejd e
jdejfd!d"Zdejdejd e
jdejfd#d$Zd%ejdejfd&d'Zd%ejdejfd(d)Zdedejd e
jdejfd*d+Z dedejd e
jdejfd,d-Z!d.e"e dejd e
jdejfd/d0Z#dedejd e
jdejfd1d2Z$dedejd e
jdejfd3d4Z%dS )5    )Enum)	TypeAliasN)common_types)modelsg  >c                   @   s   e Zd ZdZdZdS )DistanceOrderbigger_is_bettersmaller_is_betterN)__name__
__module____qualname__BIGGER_IS_BETTERSMALLER_IS_BETTER r   r   j/home/aiteam/pcaa-dev/dashboard-backend/venv/lib/python3.10/site-packages/qdrant_client/local/distances.pyr      s    r   c                   @   sH   e Zd Z			ddeee  dB deee  dB dejdB fddZdS )	RecoQueryNpositivenegativestrategyc                 C   s   |d usJ d|| _ |d ur|ng }|d ur|ng }dd |D | _dd |D | _t| j r7J dt| j rCJ dd S )Nz#Recommend strategy must be providedc                 S      g | ]}t |qS r   nparray.0vectorr   r   r   
<listcomp>       z&RecoQuery.__init__.<locals>.<listcomp>c                 S   r   r   r   r   r   r   r   r       r   z%Positive vectors must not contain NaNz%Negative vectors must not contain NaN)r   r   r   r   isnanany)selfr   r   r   r   r   r   __init__   s   zRecoQuery.__init__)NNN)r	   r
   r   listfloatr   RecommendStrategyr    r   r   r   r   r      s    r   c                   @   s&   e Zd Zdee dee fddZdS )ContextPairr   r   c                 C   sL   t || _t || _t | j rJ dt | j r$J dd S )Nz$Positive vector must not contain NaNz$Negative vector must not contain NaN)r   r   r   r   r   r   )r   r   r   r   r   r   r    '   s   zContextPair.__init__N)r	   r
   r   r!   r"   r    r   r   r   r   r$   &       r$   c                   @   s&   e Zd Zdee dee fddZdS )DiscoveryQuerytargetcontextc                 C   s.   t || _|| _t | j rJ dd S )Nz"Target vector must not contain NaN)r   r   r'   r(   r   r   )r   r'   r(   r   r   r   r    0   s   zDiscoveryQuery.__init__N)r	   r
   r   r!   r"   r$   r    r   r   r   r   r&   /   r%   r&   c                   @   s   e Zd Zdee fddZdS )ContextQuerycontext_pairsc                 C   s
   || _ d S N)r*   )r   r*   r   r   r   r    8   s   
zContextQuery.__init__N)r	   r
   r   r!   r$   r    r   r   r   r   r)   7   s    r)   DenseQueryVectordistancereturnc                 C   s*   | t jjkr	tjS | t jjkrtjS tjS )zn
    Convert distance to order
    Args:
        distance: distance to convert
    Returns:
        order
    )r   DistanceEUCLIDr   r   	MANHATTANr   )r-   r   r   r   distance_to_order?   s
   r2   queryvectorsc                 C   s   t jj|ddddt jf }|t |dk|t }t| jdkr8t j| }| t |dk|t } t || S t jj| ddddt jf }| t |dk|t } t | |j	S )z
    Calculate cosine distance between query and vectors
    Args:
        query: query vector
        vectors: vectors to calculate distance with
    Returns:
        distances
    axisN           )
r   linalgnormnewaxiswhereEPSILONlenshapedotT)r3   r4   vectors_norm
query_normr   r   r   cosine_similarityO   s   	rE   c                 C   s(   t | jdkrt|| S t| |jS )z
    Calculate dot product between query and vectors
    Args:
        query: query vector.
        vectors: vectors to calculate distance with
    Returns:
        distances
    r9   )r?   r@   r   rA   rB   r3   r4   r   r   r   dot_producte   s   	rG   c                 C   sD   t | jdkrtjj||  ddS tjj|| ddtjf  ddS )z
    Calculate euclidean distance between query and vectors
    Args:
        query: query vector.
        vectors: vectors to calculate distance with
    Returns:
        distances
    r9   r5   r6   N)r?   r@   r   r:   r;   r<   rF   r   r   r   euclidean_distancet   s   	"rH   c                 C   sL   t | jdkrtjt||  ddS tjt|| ddtjf  ddS )z
    Calculate manhattan distance between query and vectors
    Args:
        query: query vector.
        vectors: vectors to calculate distance with
    Returns:
        distances
    r9   r5   r6   N)r?   r@   r   sumabsr<   rF   r   r   r   manhattan_distance   s   	&rK   distance_typec                 C   s|   t |  rJ d|tjjkrt| |S |tjjkr!t| |S |tjj	kr,t
| |S |tjjkr7t| |S td| )N!Query vector must not contain NaNzUnknown distance type )r   r   r   r   r/   COSINErE   DOTrG   r0   rH   r1   rK   
ValueErrorr3   r4   rL   r   r   r   calculate_distance   s   



rR   c                 C   s~   t |  rJ d|tjjkr"t j||  t jdjdt jd S |tjj	kr9t j
||  t jdjdt jd S t| ||S )z`
    Calculate same internal distances as in core, rather than the final displayed distance
    rM   dtyper9   )r7   rT   )r   r   r   r   r/   r0   squarefloat32rI   r1   rJ   rR   rQ   r   r   r   calculate_distance_core   s   ""rW   xc                 C   s,   t | s
t | r| S | t dt|  S )N      ?)r   r   isinfaddrJ   rX   r   r   r   fast_sigmoid   s   r]   c                 C   s   dt t| d S )Ng      ?rY   )r   r[   r]   r\   r   r   r   scaled_fast_sigmoid   s   r^   c                    sn   dt tj dtjf fdd}|| j}|| j}t||ktdd |D |jtdd |D |jS )Nexamplesr.   c                    sl   j d }g }| D ]}t| }|| q	t|dkr(|t|tj  tj|tjdj	dd}|S Nr   rS   r6   )
r@   rW   appendr?   r   fullinfr   rV   max)r_   vector_countscoresexamplescorebest_scoresrL   r4   r   r   get_best_scores   s   
z8calculate_recommend_best_scores.<locals>.get_best_scoresc                 s       | ]}t |V  qd S r+   r^   r   xir   r   r   	<genexpr>       z2calculate_recommend_best_scores.<locals>.<genexpr>c                 s   s    | ]}t | V  qd S r+   rm   rn   r   r   r   rp      s    )	r!   types
NumpyArrayr   r   r   r=   fromiterrT   )r3   r4   rL   rk   posnegr   rj   r   calculate_recommend_best_scores   s    

rw   c                    s<   dt tj dtjf fdd}|| j}|| j}|| S )Nr_   r.   c                    sf   j d }g }| D ]}t| }|| q	t|dkr%|t| tj|tjdjdd}|S r`   )	r@   rW   ra   r?   r   zerosr   rV   rI   )r_   re   rf   rg   rh   
sum_scoresrj   r   r   get_sum_scores   s   
z6calculate_recommend_sum_scores.<locals>.get_sum_scores)r!   rr   rs   r   r   )r3   r4   rL   rz   ru   rv   r   rj   r   calculate_recommend_sum_scores   s    

r{   r(   c                 C   sj   t j|jd t jd}| D ]%}t|j||}t|j||}t dd t||k||kD }||7 }q|S )Nr   rS   c                 S   s$   g | ]\}}|r
d n|rdndqS )r9   r   r5   r   )r   	is_biggeris_equalr   r   r   r     s    z-calculate_discovery_ranks.<locals>.<listcomp>)	r   rx   r@   int32rW   r   r   r   zip)r(   r4   rL   overall_rankspairru   rv   
pair_ranksr   r   r   calculate_discovery_ranks   s   
r   c                 C   s<   t | j||}t| j||}tdd |D tj}|| S )Nc                 s   rl   r+   rm   rn   r   r   r   rp     rq   z-calculate_discovery_scores.<locals>.<genexpr>)r   r(   rW   r'   r   rt   rV   )r3   r4   rL   ranksdistances_to_targetsigmoided_distancesr   r   r   calculate_discovery_scores  s   r   c           	      C   sv   t j|jd t jd}| jD ]*}t|j||}t|j||}|| t }t 	dd t 
|dD t j}||7 }q|S )Nr   rS   c                 s   rl   r+   )r]   rn   r   r   r   rp   &  rq   z+calculate_context_scores.<locals>.<genexpr>r8   )r   rx   r@   rV   r*   rW   r   r   r>   rt   minimum)	r3   r4   rL   overall_scoresr   ru   rv   
differencepair_scoresr   r   r   calculate_context_scores  s   

r   )&enumr   typingr   numpyr   qdrant_client.conversionsr   rr   qdrant_client.httpr   r>   strr   r   r$   r&   r)   r,   __annotations__r/   r2   rs   rE   rG   rH   rK   rR   rW   rV   r]   r^   rw   r{   r!   r   r   r   r   r   r   r   <module>   s    	





