
    <i'                     .   % S SK Jr  S SKJr  S SKrS SKJr  S SK	J
r
  Sr " S S\\5      r " S	 S
5      r " S S5      r " S S5      r " S S5      r\\-  \-  r\\S'   S\
R(                  S\4S jrS\R,                  S\R,                  S\R,                  4S jrS\R,                  S\R,                  S\R,                  4S jrS\R,                  S\R,                  S\R,                  4S jrS\R,                  S\R,                  S\R,                  4S jrS\R,                  S\R,                  S\
R(                  S\R,                  4S jrS\R,                  S\R,                  S\
R(                  S\R,                  4S jrS\R:                  S\R:                  4S jrS\R:                  S\R:                  4S  jrS\S\R,                  S\
R(                  S\R,                  4S! jr S\S\R,                  S\
R(                  S\R,                  4S" jr!S#\"\   S\R,                  S\
R(                  S\R,                  4S$ jr#S\S\R,                  S\
R(                  S\R,                  4S% jr$S\S\R,                  S\
R(                  S\R,                  4S& jr%g)'    )Enum)	TypeAliasN)common_types)modelsg  >c                       \ rS rSrSrSrSrg)DistanceOrder   bigger_is_bettersmaller_is_better N)__name__
__module____qualname____firstlineno__BIGGER_IS_BETTERSMALLER_IS_BETTER__static_attributes__r       W/home/james-whalen/.local/lib/python3.13/site-packages/qdrant_client/local/distances.pyr   r      s    )+r   r   c                   r    \ rS rSr   SS\\\      S-  S\\\      S-  S\R                  S-  4S jjrSr	g)		RecoQuery   Npositivenegativestrategyc                    Uc   S5       eX0l         Ub  UO/ nUb  UO/ nU Vs/ s H  n[        R                  " U5      PM     snU l        U Vs/ s H  n[        R                  " U5      PM     snU l        [        R
                  " U R                  5      R                  5       (       a   S5       e[        R
                  " U R                  5      R                  5       (       a   S5       eg s  snf s  snf )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__RecoQuery.__init__   s     #J%JJ# '38'38PX0YPXf&1APX0YPX0YPXf&1APX0Y88DMM*..00Y2YY088DMM*..00Y2YY00	 1Z0Ys    C, C1)r   r   r   )NNN)
r   r   r   r   listfloatr   RecommendStrategyr#   r   r   r   r   r   r      s_     .2-148	ZtE{#d*Z tE{#d*Z **T1	Z Zr   r   c                   2    \ rS rSrS\\   S\\   4S jrSrg)ContextPair&   r   r   c                 X   [         R                  " U5      U l        [         R                  " U5      U l        [         R                  " U R                  5      R                  5       (       a   S5       e[         R                  " U R                  5      R                  5       (       a   S5       eg )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#   ContextPair.__init__'   su    *,((8*<*,((8*<88DMM*..00X2XX088DMM*..00X2XX00r   )r   r   N)r   r   r   r   r%   r&   r#   r   r   r   r   r)   r)   &   s     Ye YU Yr   r)   c                   2    \ rS rSrS\\   S\\   4S jrSrg)DiscoveryQuery/   targetcontextc                     [         R                  " U5      U l        X l        [         R                  " U R                  5      R                  5       (       a   S5       eg )Nz"Target vector must not contain NaN)r   r   r0   r1   r   r    )r!   r0   r1   s      r   r#   DiscoveryQuery.__init__0   sB    (*(888DKK(,,..T0TT..r   )r1   r0   N)	r   r   r   r   r%   r&   r)   r#   r   r   r   r   r.   r.   /   s!    UtE{ UT+5F Ur   r.   c                   (    \ rS rSrS\\   4S jrSrg)ContextQuery7   context_pairsc                     Xl         g Nr7   )r!   r7   s     r   r#   ContextQuery.__init__8   s    *r   r:   N)r   r   r   r   r%   r)   r#   r   r   r   r   r5   r5   7   s    +d;&7 +r   r5   DenseQueryVectordistancereturnc                     U [         R                  R                  :X  a  [        R                  $ U [         R                  R
                  :X  a  [        R                  $ [        R                  $ )zV
Convert distance to order
Args:
    distance: distance to convert
Returns:
    order
)r   DistanceEUCLIDr   r   	MANHATTANr   )r=   s    r   distance_to_orderrC   ?   sL     6??)))...	V__..	....)))r   queryvectorsc                 v   [         R                  R                  USS9SS2[         R                  4   nU[         R                  " US:g  U[
        5      -  n[        U R                  5      S:X  aW  [         R                  R                  U 5      nU [         R                  " US:g  U[
        5      -  n [         R                  " X5      $ [         R                  R                  U SS9SS2[         R                  4   nU [         R                  " US:g  U[
        5      -  n [         R                  " XR                  5      $ )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)rD   rE   vectors_norm
query_norms       r   cosine_similarityrW   O   s     99>>'>3ArzzMBLrxx+\7CCG
5;;1YY^^E*
*+ZAAvvg%%B/2::>J	RXXjC'W==E66%##r   c                     [        U R                  5      S:X  a  [        R                  " X5      $ [        R                  " XR                  5      $ )z
Calculate dot product between query and vectors
Args:
    query: query vector.
    vectors: vectors to calculate distance with
Returns:
    distances
rK   )rQ   rR   r   rS   rT   rD   rE   s     r   dot_productrZ   e   s7     5;;1vvg%%vveYY''r   c                     [        U R                  5      S:X  a   [        R                  R	                  X-
  SS9$ [        R                  R	                  XSS2[        R
                  4   -
  SS9$ )z
Calculate euclidean distance between query and vectors
Args:
    query: query vector.
    vectors: vectors to calculate distance with
Returns:
    distances
rK   rG   rH   N)rQ   rR   r   rL   rM   rN   rY   s     r   euclidean_distancer\   t   sU     5;;1yy~~goB~77yy~~gam(<<2~FFr   c                 
   [        U R                  5      S:X  a+  [        R                  " [        R                  " X-
  5      SS9$ [        R                  " [        R                  " XSS2[        R
                  4   -
  5      SS9$ )z
Calculate manhattan distance between query and vectors
Args:
    query: query vector.
    vectors: vectors to calculate distance with
Returns:
    distances
rK   rG   rH   N)rQ   rR   r   sumabsrN   rY   s     r   manhattan_distancer`      s[     5;;1vvbffW_-B77vvbffWQ

]';;<2FFr   distance_typec                    [         R                  " U 5      R                  5       (       a   S5       eU[        R                  R
                  :X  a  [        X5      $ U[        R                  R                  :X  a  [        X5      $ U[        R                  R                  :X  a  [        X5      $ U[        R                  R                  :X  a  [        X5      $ [        SU 35      e)N!Query vector must not contain NaNzUnknown distance type )r   r   r    r   r@   COSINErW   DOTrZ   rA   r\   rB   r`   
ValueErrorrD   rE   ra   s      r   calculate_distancerh      s     xx""$$I&II$... 00	&//--	-5**	&//00	0!%11	&//33	3!%111-ABBr   c                    [         R                  " U 5      R                  5       (       a   S5       eU[        R                  R
                  :X  aB  [         R                  " X-
  [         R                  S9R                  S[         R                  S9* $ U[        R                  R                  :X  aB  [         R                  " X-
  [         R                  S9R                  S[         R                  S9* $ [        XU5      $ )zX
Calculate same internal distances as in core, rather than the final displayed distance
rc   dtyperK   )rI   rk   )r   r   r    r   r@   rA   squarefloat32r^   rB   r_   rh   rg   s      r   calculate_distance_corern      s     xx""$$I&II$...		'/<@@arzz@ZZZ111wbjj9==1BJJ=WWW!%-@@r   xc                     [         R                  " U 5      (       d  [         R                  " U 5      (       a  U $ U [         R                  " S[	        U 5      5      -  $ )N      ?)r   r   isinfaddr_   ro   s    r   fast_sigmoidru      s:    	xx{{bhhqkkrvvc3q6"""r   c                 H    S[         R                  " [        U 5      S5      -  $ )Ng      ?rq   )r   rs   ru   rt   s    r   scaled_fast_sigmoidrw      s    "&&a#.//r   c                 z  ^^ S[         [        R                     S[        R                  4UU4S jjnU" U R                  5      nU" U R                  5      n[
        R                  " XE:  [
        R                  " S U 5       UR                  5      [
        R                  " S U 5       UR                  5      5      $ )Nexamplesr>   c                 `  > TR                   S   n/ nU  H!  n[        UTT5      nUR                  U5        M#     [        U5      S:X  a5  UR                  [        R
                  " U[        R                  * 5      5        [        R                  " U[        R                  S9R                  SS9nU$ Nr   rj   rH   )
rR   rn   appendrQ   r   fullinfr   rm   max)ry   vector_countscoresexamplescorebest_scoresra   rE   s         r   get_best_scores8calculate_recommend_best_scores.<locals>.get_best_scores   s    }}Q' *,G+GWmLEMM%   
 v;!MM"'',89hhvRZZ8<<!<Dr   c              3   8   #    U  H  n[        U5      v   M     g 7fr9   rw   .0xis     r   	<genexpr>2calculate_recommend_best_scores.<locals>.<genexpr>   s     ;s(,,s   c              3   :   #    U  H  n[        U5      * v   M     g 7fr9   r   r   s     r   r   r      s     <")"--s   )	r%   types
NumpyArrayr   r   r   rO   fromiterrk   )rD   rE   ra   r   posnegs    ``   r   calculate_recommend_best_scoresr      s    $u'7'7"8 U=M=M    %..
)C
%..
)C 88	
;s;SYYG
<<ciiH r   c                    ^^ S[         [        R                     S[        R                  4UU4S jjnU" U R                  5      nU" U R                  5      nXE-
  $ )Nry   r>   c                 @  > TR                   S   n/ nU  H!  n[        UTT5      nUR                  U5        M#     [        U5      S:X  a%  UR                  [        R
                  " U5      5        [        R                  " U[        R                  S9R                  SS9nU$ r{   )	rR   rn   r|   rQ   r   zerosr   rm   r^   )ry   r   r   r   r   
sum_scoresra   rE   s         r   get_sum_scores6calculate_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   )rD   rE   ra   r   r   r   s    ``   r   calculate_recommend_sum_scoresr      sR    e&6&6!7 E<L<L   
(C

(C9r   r1   c           	      z   [         R                  " UR                  S   [         R                  S9nU  H~  n[	        UR
                  X5      n[	        UR                  X5      n[         R                  " [        XV:  XV:H  5       VVs/ s H  u  pxU(       a  SO
U(       a  SOSPM     snn5      n	X9-  nM     U$ s  snnf )Nr   rj   rK   rG   )	r   r   rR   int32rn   r   r   r   zip)
r1   rE   ra   overall_rankspairr   r   	is_biggeris_equal
pair_rankss
             r   calculate_discovery_ranksr      s    
 HHW]]1-RXX>M%dmmWL%dmmWLXX ,/sy#*+E+E'I Ar9+E

 	#  s    B7c                     [        U R                  X5      n[        U R                  X5      n[        R
                  " S U 5       [        R                  5      nX5-   $ )Nc              3   8   #    U  H  n[        U5      v   M     g 7fr9   r   r   s     r   r   -calculate_discovery_scores.<locals>.<genexpr>  s     ?+>R	R	 	 +>r   )r   r1   rn   r0   r   r   rm   )rD   rE   ra   ranksdistances_to_targetsigmoided_distancess         r   calculate_discovery_scoresr     sP     &emmWLE 2%,,W++?+>? &&r   c                    [         R                  " UR                  S   [         R                  S9nU R                   H  n[        UR                  X5      n[        UR                  X5      nXV-
  [        -
  n[         R                  " S [         R                  " US5       5       [         R                  5      nX8-  nM     U$ )Nr   rj   c              3   8   #    U  H  n[        U5      v   M     g 7fr9   )ru   r   s     r   r   +calculate_context_scores.<locals>.<genexpr>&  s     D(C"\"(Cr   rJ   )r   r   rR   rm   r7   rn   r   r   rP   r   minimum)	rD   rE   ra   overall_scoresr   r   r   
differencepair_scoress	            r   calculate_context_scoresr     s     XXgmmA.bjjAN##%dmmWL%dmmWLY(
kkD

:s(CDbjj
 	% $ r   )&enumr   typingr   numpyr   qdrant_client.conversionsr   r   qdrant_client.httpr   rP   strr   r   r)   r.   r5   r<   __annotations__r@   rC   r   rW   rZ   r\   r`   rh   rn   rm   ru   rw   r   r   r%   r   r   r   r   r   r   <module>r      s      ; %
,C ,
Z Z(Y YU U+ +
 -|;iG ) G* *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   