
    %Gg/$                        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!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     z/home/kushmeetdev/apache_webroot/langgraph_flaskproject/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         fdZy)	RecoQueryNpositivenegativec                    ||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%Positive vectors must not contain NaNz%Negative vectors must not contain NaNnparrayr   r   isnanany)selfr   r   vectors       r   __init__zRecoQuery.__init__   s    
  (38'38PX0Yf&1A0YPX0Yf&1A0Y88DMM*..0Y2YY088DMM*..0Y2YY00	 1Z0Ys
   CC)NN)r   r   r   r   listfloatr    r   r   r   r   r      s@     1504Z4U,-Z 4U,-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 NaNr   )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__,   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__4   s
    *r   N)r   r   r   r!   r$   r    r   r   r   r,   r,   3   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   )r0   s    r   distance_to_orderr6   ?   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)r7   r8   vectors_norm
query_norms       r   cosine_similarityrJ   O   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>   )rD   rE   r   rF   rG   r7   r8   s     r   dot_productrM   e   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)rD   rE   r   r?   r@   rA   rL   s     r   euclidean_distancerO   t   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)rD   rE   r   sumabsrA   rL   s     r   manhattan_distancerS      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   r3   COSINErJ   DOTrM   r4   rO   r5   rS   
ValueErrorr7   r8   rT   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
    rV   dtyper>   )r<   r^   )r   r   r   r   r3   r4   squarefloat32rQ   r5   rR   r[   rZ   s      r   calculate_distance_corera      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addrR   rb   s    r   fast_sigmoidrh      s6    	xx{bhhqkrvvc3q6"""r   c                 F    dt        j                  t        |       d      z  S )Ng      ?rd   )r   rf   rh   rg   s    r   scaled_fast_sigmoidrj      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examplesr1   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;   )
rE   ra   appendrD   r   fullinfr   r`   max)rl   vector_countscoresexamplescorebest_scoresrT   r8   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r/   rj   .0xis     r   	<genexpr>z2calculate_recommend_best_scores.<locals>.<genexpr>   s     ;(,;   c              3   4   K   | ]  }t        |         y wr/   ry   rz   s     r   r}   z2calculate_recommend_best_scores.<locals>.<genexpr>   s     <")"--<s   )	r!   types
NumpyArrayr   r   r   rB   fromiterr^   )r7   r8   rT   rw   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   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   zerosrE   int32ra   r   r   r   zip)
r)   r8   rT   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'Ix Ar9

 	#$ s   
B/c                     t        | j                  ||      }t        | j                  ||      }t	        j
                  d |D        t        j                        }||z   S )Nc              3   2   K   | ]  }t        |        y wr/   ry   rz   s     r   r}   z-calculate_discovery_scores.<locals>.<genexpr>   s     ?R	R	 ?r~   )r   r)   ra   r(   r   r   r`   )r7   r8   rT   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r/   )rh   rz   s     r   r}   z+calculate_context_scores.<locals>.<genexpr>  s     D"\"Dr~   r=   )r   r   rE   r`   r-   ra   r   r   rC   r   minimum)	r7   r8   rT   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   rC   strr	   r   r$   r'   r,   DenseQueryVectorr3   r6   r   rJ   rM   rO   rS   r[   ra   r`   rh   rj   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
>+ ?? 	.''$)$4$4'EK__'
'"'"2"2CI??
r   