
    'Xh'                     
   d dl mZ d dlmZmZ d dlZd dlmZ	 d dl
mZ dZ G d dee      Z G d	 d
      Z G d d      Z G d d      Z G d d      Zeeeef   Zdej(                  defdZde	j,                  de	j,                  de	j,                  fdZde	j,                  de	j,                  de	j,                  fdZde	j,                  de	j,                  de	j,                  fdZde	j,                  de	j,                  de	j,                  fdZde	j,                  de	j,                  dej(                  de	j,                  fdZde	j,                  de	j,                  dej(                  de	j,                  fdZdej:                  dej:                  fdZdej:                  dej:                  fdZdede	j,                  dej(                  de	j,                  fd Z dede	j,                  dej(                  de	j,                  fd!Z!d"e"e   de	j,                  dej(                  de	j,                  fd#Z#dede	j,                  dej(                  de	j,                  fd$Z$dede	j,                  dej(                  de	j,                  fd%Z%y)&    )Enum)OptionalUnionN)common_types)modelsg  >c                       e Zd ZdZdZy)DistanceOrderbigger_is_bettersmaller_is_betterN)__name__
__module____qualname__BIGGER_IS_BETTERSMALLER_IS_BETTER     G/RAG/venv/lib/python3.12/site-packages/qdrant_client/local/distances.pyr	   r	      s    )+r   r	   c                   f    e Zd Z	 	 	 ddeeee         deeee         deej                     fdZy)	RecoQueryNpositivenegativestrategyc                    |J d       || _         ||ng }||ng }|D cg c]  }t        j                  |       c}| _        |D cg c]  }t        j                  |       c}| _        t        j
                  | j                        j                         rJ d       t        j
                  | j                        j                         rJ d       y c c}w c c}w )Nz#Recommend strategy must be providedz%Positive vectors must not contain NaNz%Negative vectors must not contain NaN)r   nparrayr   r   isnanany)selfr   r   r   vectors        r   __init__zRecoQuery.__init__   s     #J%JJ# '38'38PX0YPXf&1APX0YPX0YPXf&1APX0Y88DMM*..0Y2YY088DMM*..0Y2YY00	 1Z0Ys   C	C)NNN)	r   r   r   r   listfloatr   RecommendStrategyr    r   r   r   r   r      sY     15047;	Z4U,-Z 4U,-Z 6334	Zr   r   c                   (    e Zd Zdee   dee   fdZy)ContextPairr   r   c                 <   t        j                  |      | _        t        j                  |      | _        t        j                  | j                        j                         rJ d       t        j                  | j                        j                         rJ d       y )Nz$Positive vector must not contain NaNz$Negative vector must not contain NaN)r   r   r   r   r   r   )r   r   r   s      r   r    zContextPair.__init__'   so    *,((8*<*,((8*<88DMM*..0X2XX088DMM*..0X2XX00r   N)r   r   r   r!   r"   r    r   r   r   r%   r%   &   s     Ye YU Yr   r%   c                   (    e Zd Zdee   dee   fdZy)DiscoveryQuerytargetcontextc                     t        j                  |      | _        || _        t        j                  | j                        j                         rJ d       y )Nz"Target vector must not contain NaN)r   r   r)   r*   r   r   )r   r)   r*   s      r   r    zDiscoveryQuery.__init__0   sA    (*(888DKK(,,.T0TT..r   N)r   r   r   r!   r"   r%   r    r   r   r   r(   r(   /   s!    UtE{ UT+5F Ur   r(   c                       e Zd Zdee   fdZy)ContextQuerycontext_pairsc                     || _         y N)r.   )r   r.   s     r   r    zContextQuery.__init__8   s
    *r   N)r   r   r   r!   r%   r    r   r   r   r-   r-   7   s    +d;&7 +r   r-   distancereturnc                     | 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   )r1   s    r   distance_to_orderr7   C   sL     6??)))...	V__..	....)))r   queryvectorsc                 z   t         j                  j                  |d      ddt         j                  f   }|t        j                  |dk7  |t
              z  }t        | j                        dk(  rVt         j                  j                  |       }| t        j                  |dk7  |t
              z  } t        j                  ||       S t         j                  j                  | d      ddt         j                  f   }| t        j                  |dk7  |t
              z  } t        j                  | |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)r8   r9   vectors_norm
query_norms       r   cosine_similarityrK   S   s     99>>'>3ArzzMBLrxx+\7CCG
5;;1YY^^E*
*+ZAAvvgu%%B/2::>J	RXXjC'W==E66%##r   c                     t        | j                        dk(  rt        j                  ||       S t        j                  | |j                        S )z
    Calculate dot product between query and vectors
    Args:
        query: query vector.
        vectors: vectors to calculate distance with
    Returns:
        distances
    r?   )rE   rF   r   rG   rH   r8   r9   s     r   dot_productrN   i   s;     5;;1vvgu%%vveWYY''r   c                     t        | j                        dk(  r$t        j                  j	                  || z
  d      S t        j                  j	                  || ddt        j
                  f   z
  d      S )z
    Calculate euclidean distance between query and vectors
    Args:
        query: query vector.
        vectors: vectors to calculate distance with
    Returns:
        distances
    r?   r;   r<   N)rE   rF   r   r@   rA   rB   rM   s     r   euclidean_distancerP   x   sY     5;;1yy~~goB~77yy~~gam(<<2~FFr   c                    t        | j                        dk(  r-t        j                  t        j                  || z
        d      S t        j                  t        j                  || ddt        j
                  f   z
        d      S )z
    Calculate manhattan distance between query and vectors
    Args:
        query: query vector.
        vectors: vectors to calculate distance with
    Returns:
        distances
    r?   r;   r<   N)rE   rF   r   sumabsrB   rM   s     r   manhattan_distancerT      s_     5;;1vvbffWu_-B77vvbffWuQ

]';;<2FFr   distance_typec                    t        j                  |       j                         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(  rt        | |      S t        d|       )N!Query vector must not contain NaNzUnknown distance type )r   r   r   r   r4   COSINErK   DOTrN   r5   rP   r6   rT   
ValueErrorr8   r9   rU   s      r   calculate_distancer\      s     xx""$I&II$... 00	&//--	-5'**	&//00	0!%11	&//33	3!%111-ABBr   c                    t        j                  |       j                         rJ d       |t        j                  j
                  k(  rHt        j                  || z
  t         j                        j                  dt         j                         S |t        j                  j                  k(  rHt        j                  || z
  t         j                        j                  dt         j                         S t        | ||      S )z`
    Calculate same internal distances as in core, rather than the final displayed distance
    rW   dtyper?   )r=   r_   )r   r   r   r   r4   r5   squarefloat32rR   r6   rS   r\   r[   s      r   calculate_distance_corerb      s     xx""$I&II$...		'E/<@@arzz@ZZZ111wbjj9==1BJJ=WWW!%-@@r   xc                     t        j                  |       st        j                  |       r| S | t        j                  dt	        |             z  S )N      ?)r   r   isinfaddrS   rc   s    r   fast_sigmoidri      s6    	xx{bhhqkrvvc3q6"""r   c                 F    dt        j                  t        |       d      z  S )Ng      ?re   )r   rg   ri   rh   s    r   scaled_fast_sigmoidrk      s    "&&a#.//r   c                 r   dt         t        j                     dt        j                  ffd} || j                        } || j                        }t        j                  ||kD  t        j                  d |D        |j                        t        j                  d |D        |j                              S )Nexamplesr2   c                 b   j                   d   }g }| D ]   }t        |      }|j                  |       " t        |      dk(  r4|j                  t	        j
                  |t        j                                t	        j                  |t        j                        j                  d      }|S Nr   r^   r<   )
rF   rb   appendrE   r   fullinfr   ra   max)rm   vector_countscoresexamplescorebest_scoresrU   r9   s         r   get_best_scoresz8calculate_recommend_best_scores.<locals>.get_best_scores   s    }}Q' *,G+GWmLEMM%   
 v;!MM"'',89hhvRZZ8<<!<Dr   c              3   2   K   | ]  }t        |        y wr0   rk   .0xis     r   	<genexpr>z2calculate_recommend_best_scores.<locals>.<genexpr>   s     ;s(,s   c              3   4   K   | ]  }t        |         y wr0   r{   r|   s     r   r   z2calculate_recommend_best_scores.<locals>.<genexpr>   s     <")"--s   )	r!   types
NumpyArrayr   r   r   rC   fromiterr_   )r8   r9   rU   ry   posnegs    ``   r   calculate_recommend_best_scoresr      s    $u'7'7"8 U=M=M   %..
)C
%..
)C 88c	
;s;SYYG
<<ciiH r   c                     dt         t        j                     dt        j                  ffd} || j                        } || j                        }||z
  S )Nrm   r2   c                 B   j                   d   }g }| D ]   }t        |      }|j                  |       " t        |      dk(  r$|j                  t	        j
                  |             t	        j                  |t        j                        j                  d      }|S ro   )	rF   rb   rp   rE   r   zerosr   ra   rR   )rm   rt   ru   rv   rw   
sum_scoresrU   r9   s         r   get_sum_scoresz6calculate_recommend_sum_scores.<locals>.get_sum_scores   s    }}Q')+G+GWmLEMM%    v;!MM"((<01XXfBJJ7;;;C
r   )r!   r   r   r   r   )r8   r9   rU   r   r   r   s    ``   r   calculate_recommend_sum_scoresr      sO    e&6&6!7 E<L<L  
(C

(C9r   r*   c           	      j   t        j                  |j                  d   t         j                        }| D ]u  }t	        |j
                  ||      }t	        |j                  ||      }t        j                  t        ||kD  ||k(        D cg c]  \  }}|rdn|rdnd c}}      }	||	z  }w |S c c}}w )Nr   r^   r?   r;   )	r   r   rF   int32rb   r   r   r   zip)
r*   r9   rU   overall_rankspairr   r   	is_biggeris_equal
pair_rankss
             r   calculate_discovery_ranksr      s    
 HHW]]1-RXX>M%dmmWmL%dmmWmLXX ,/sSy#*+E+E'Ix Ar9+E

 	#  s   
B/c                     t        | j                  ||      }t        | j                  ||      }t	        j
                  d |D        t        j                        }||z   S )Nc              3   2   K   | ]  }t        |        y wr0   r{   r|   s     r   r   z-calculate_discovery_scores.<locals>.<genexpr>  s     ?+>R	R	 +>r   )r   r*   rb   r)   r   r   ra   )r8   r9   rU   ranksdistances_to_targetsigmoided_distancess         r   calculate_discovery_scoresr     sW     &emmWmLE 2%,,W++?+>? &&&r   c                    t        j                  |j                  d   t         j                        }| j                  D ]  }t        |j                  ||      }t        |j                  ||      }||z
  t        z
  }t        j                  d t        j                  |d      D        t         j                        }||z  } |S )Nr   r^   c              3   2   K   | ]  }t        |        y wr0   )ri   r|   s     r   r   z+calculate_context_scores.<locals>.<genexpr>*  s     D(C"\"(Cr   r>   )r   r   rF   ra   r.   rb   r   r   rD   r   minimum)	r8   r9   rU   overall_scoresr   r   r   
differencepair_scoress	            r   calculate_context_scoresr     s     XXgmmA.bjjAN##%dmmWmL%dmmWmL3Y(
kkD

:s(CDbjj
 	+% $ r   )&enumr   typingr   r   numpyr   qdrant_client.conversionsr   r   qdrant_client.httpr   rD   strr	   r   r%   r(   r-   DenseQueryVectorr4   r7   r   rK   rN   rP   rT   r\   rb   ra   ri   rk   r   r   r!   r   r   r   r   r   r   <module>r      s    "  ; %
,C ,
Z Z(Y YU U+ +
  * *M * $U-- $8H8H $UM]M] $,(u'' (%2B2B (uGWGW (Ge.. G9I9I GeN^N^ GGe.. G9I9I GeN^N^ GCC&+&6&6CGMC
C"AA&+&6&6AGMA
A #BJJ #2:: #02:: 0"** 0$//@F
>$//@F
0+ ?? 	.''$)$4$4'EK__'
'"'"2"2CI??
r   