
    Ng5$                     t   d dl mZ d dlmZ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$dS )%    )Enum)ListOptionalUnionN)common_types)modelsg  >c                       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     Y/var/www/html/ai-engine/env/lib/python3.11/site-packages/qdrant_client/local/distances.pyr
   r
      s        )+r   r
   c                   l    e Zd Z	 	 ddeeee                           deeee                           fdZdS )	RecoQueryNpositivenegativec                 6   ||ng }||ng }d |D             | _         d |D             | _        t          j        | j                                                   r
J d            t          j        | j                                                  r
J d            d S )Nc                 6    g | ]}t          j        |          S r   nparray.0vectors     r   
<listcomp>z&RecoQuery.__init__.<locals>.<listcomp>   "    0Y0Y0Yf&1A1A0Y0Y0Yr   c                 6    g | ]}t          j        |          S r   r   r   s     r   r!   z&RecoQuery.__init__.<locals>.<listcomp>   r"   r   z%Positive vectors must not contain NaNz%Negative vectors must not contain NaN)r   r   r   isnananyselfr   r   s      r   __init__zRecoQuery.__init__   s    
  (388'3880Y0YPX0Y0Y0Y0Y0YPX0Y0Y0Y8DM**..00YY2YYYY8DM**..00YY2YYYYYYr   )NN)r   r   r   r   r   floatr(   r   r   r   r   r      sl         1504Z Z4U,-Z 4U,-Z Z Z Z Z Zr   r   c                   6    e Zd Zdee         dee         fdZdS )ContextPairr   r   c                 >   t          j        |          | _        t          j        |          | _        t          j        | j                                                  r
J d            t          j        | 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&   s      r   r(   zContextPair.__init__#   s    *,(8*<*<*,(8*<*<8DM**..00XX2XXXX8DM**..00XX2XXXXXXr   N)r   r   r   r   r)   r(   r   r   r   r+   r+   "   sF        Ye YU Y Y Y Y Y Yr   r+   c                   6    e Zd Zdee         dee         fdZdS )DiscoveryQuerytargetcontextc                     t          j        |          | _        || _        t          j        | j                                                  r
J d            d S )Nz"Target vector must not contain NaN)r   r   r/   r0   r$   r%   )r'   r/   r0   s      r   r(   zDiscoveryQuery.__init__,   sM    (*(8(88DK((,,..TT0TTTTTTr   N)r   r   r   r   r)   r+   r(   r   r   r   r.   r.   +   sG        UtE{ UT+5F U U U U U Ur   r.   c                   &    e Zd Zdee         fdZdS )ContextQuerycontext_pairsc                     || _         d S N)r4   )r'   r4   s     r   r(   zContextQuery.__init__4   s    *r   N)r   r   r   r   r+   r(   r   r   r   r3   r3   3   s4        +d;&7 + + + + + +r   r3   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   )r7   s    r   distance_to_orderr=   ?   s?     6?)))..	V_.	.	...))r   queryvectorsc                 n   t           j                            |d          ddt           j        f         }|t          j        |dk    |t
                    z  }t          | j                  dk    rVt           j                            |           }| t          j        |dk    |t
                    z  } t          j        ||           S t           j                            | d          ddt           j        f         }| t          j        |dk    |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)r>   r?   vectors_norm
query_norms       r   cosine_similarityrQ   O   s     9>>'>33AAArzMBLrx+\7CCCG
5;1Y^^E**
*+ZAAAvgu%%%B//2:>J	RXjC'W===E6%###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
    rE   )rK   rL   r   rM   rN   r>   r?   s     r   dot_productrT   e   s?     5;1vgu%%%veWY'''r   c                     t          | j                  dk    r$t          j                            || z
  d          S t          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
    rE   rA   rB   N)rK   rL   r   rF   rG   rH   rS   s     r   euclidean_distancerV   t   sa     5;1y~~goB~777y~~gaaam(<<2~F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
    rE   rA   rB   N)rK   rL   r   sumabsrH   rS   s     r   manhattan_distancerZ      so     5;1vbfWu_--B7777vbfWuQQQ
]';;<<2FFFFr   distance_typec                    t          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   r:   COSINErQ   DOTrT   r;   rV   r<   rZ   
ValueErrorr>   r?   r[   s      r   calculate_distancerb      s     x""$$II&IIII... 000	&/-	-	-5'***	&/0	0	0!%111	&/3	3	3!%111A-AABBBr   c                    t          j        |                                           r
J d            |t          j        j        k    rCt          j        || z
  t           j                                      dt           j                   S |t          j        j	        k    rCt          j
        || z
  t           j                                      dt           j                   S t          | ||          S )z`
    Calculate same internal distances as in core, rather than the final displayed distance
    r]   dtyperE   )rC   re   )r   r$   r%   r   r:   r;   squarefloat32rX   r<   rY   rb   ra   s      r   calculate_distance_corerh      s     x""$$II&IIII...	'E/<<<@@arz@ZZZZ111wbj999==1BJ=WWWW!%-@@@r   xc                     t          j        |           st          j        |           r| S | t          j        dt	          |                     z  S )N      ?)r   r$   isinfaddrY   ri   s    r   fast_sigmoidro      sC    	x{{ bhqkk rvc3q66""""r   c                 L    dt          j        t          |           d          z  S )Ng      ?rk   )r   rm   ro   rn   s    r   scaled_fast_sigmoidrq      s    "&a#..//r   c                 V   dt           t          j                 dt          j        ffd} || j                  } || j                  }t          j        ||k    t          j        d |D             |j                  t          j        d |D             |j                            S )Nexamplesr8   c                 p   j         d         }g }| D ](}t          |          }|                    |           )t          |          dk    r3|                    t	          j        |t          j                              t	          j        |t          j                  	                    d          }|S )Nr   rd   rB   )
rL   rh   appendrK   r   fullinfr   rg   max)rs   vector_countscoresexamplescorebest_scoresr[   r?   s         r   get_best_scoresz8calculate_recommend_best_scores.<locals>.get_best_scores   s    }Q' *, 	! 	!G+GWmLLEMM%     v;;!MM"',88999hvRZ888<<!<DDr   c              3   4   K   | ]}t          |          V  d S r6   rq   r   xis     r   	<genexpr>z2calculate_recommend_best_scores.<locals>.<genexpr>   s+      ;;(,,;;;;;;r   c              3   6   K   | ]}t          |           V  d S r6   r   r   s     r   r   z2calculate_recommend_best_scores.<locals>.<genexpr>   s.      <<")"---<<<<<<r   )	r   types
NumpyArrayr   r   r   rI   fromiterre   )r>   r?   r[   r~   posnegs    ``   r   calculate_recommend_best_scoresr      s    $u'7"8 U=M         /%.
)
)C
/%.
)
)C 8c	
;;s;;;SYGG
<<<<<ciHH  r   r0   c           	      0   t          j        |j        d         t           j                  }| D ]g}t	          |j        ||          }t	          |j        ||          }t          j        d t          ||k    ||k              D                       }||z  }h|S )Nr   rd   c                 (    g | ]\  }}|rd n|rdndS )rE   r   rA   r   )r   	is_biggeris_equals      r   r!   z-calculate_discovery_ranks.<locals>.<listcomp>   s>       'Ix 9$9AAr  r   )	r   zerosrL   int32rh   r   r   r   zip)r0   r?   r[   overall_rankspairr   r   
pair_rankss           r   calculate_discovery_ranksr      s    
 HW]1-RX>>>M $ $%dmWmLL%dmWmLLX +.sSy#*+E+E  
 

 	#r   c                     t          | j        ||          }t          | j        ||          }t	          j        d |D             t          j                  }||z   S )Nc              3   4   K   | ]}t          |          V  d S r6   r   r   s     r   r   z-calculate_discovery_scores.<locals>.<genexpr>   s+      ??R	R	 	 ??????r   )r   r0   rh   r/   r   r   rg   )r>   r?   r[   ranksdistances_to_targetsigmoided_distancess         r   calculate_discovery_scoresr      sc     &emWmLLE 2%,WW+??+>???  &&&r   c                 d   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   rd   c              3   4   K   | ]}t          |          V  d S r6   )ro   r   s     r   r   z+calculate_context_scores.<locals>.<genexpr>  s*      DD"\"DDDDDDr   rD   )r   r   rL   rg   r4   rh   r   r   rJ   r   minimum)	r>   r?   r[   overall_scoresr   r   r   
differencepair_scoress	            r   calculate_context_scoresr     s     XgmA.bjAAAN# 	& 	&%dmWmLL%dmWmLL3Y(
kDD
:s(C(CDDDbj
 
 	+%r   )%enumr   typingr   r   r   numpyr   qdrant_client.conversionsr   r   qdrant_client.httpr   rJ   strr
   r   r+   r.   r3   DenseQueryVectorr:   r=   r   rQ   rT   rV   rZ   rb   rh   rg   ro   rq   r   r   r   r   r   r   r   <module>r      s@         ( ( ( ( ( ( ( ( ( (     ; ; ; ; ; ; % % % % % %
, , , , ,C , , ,
Z Z Z Z Z Z Z Z Y Y Y Y Y Y Y YU U U U U U U U+ + + + + + + +
  * *M * * * * $U- $8H $UM] $ $ $ $,(u' (%2B (uGW ( ( ( (Ge. G9I GeN^ G G G GGe. G9I GeN^ G G G GCC&+&6CGMC
C C C C"AA&+&6AGMA
A A A A #BJ #2: # # # #02: 0"* 0 0 0 0$/@F
   >+ ? 	   .''$)$4'EK_'
' ' ' '"'"2CI?
     r   