
    sOi`1                        U d dl mZ 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dZ G d	 d
ee      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Zeez  ez  ez  Zeed<   dej6                  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j6                  de
j:                  fd&Z"de
j:                  d e
j:                  d%ej6                  de
j:                  fd'Z#d(ejH                  dejH                  fd)Z%d(ejH                  dejH                  fd*Z&ded e
j:                  d%ej6                  de
j:                  fd+Z'ded e
j:                  d%ej6                  de
j:                  fd,Z(d-e)e   d e
j:                  d%ej6                  de
j:                  fd.Z*ded e
j:                  d%ej6                  de
j:                  fd/Z+ded e
j:                  d%ej6                  de
j:                  fd0Z,ded e
j:                  d%ej6                  de
j:                  fd1Z-y)2    )Enum)	TypeAlias)permutationsN)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     d/volume1/homes/robertsu/coba/app/.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      dz  deee      dz  dej                  dz  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   listfloatr   RecommendStrategyr!   r   r   r   r   r      sY     .2-148	ZtE{#d*Z tE{#d*Z **T1	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 )N"Target vector must not contain NaN)r   r   r+   r,   r   r   )r   r+   r,   s      r   r!   zDiscoveryQuery.__init__3   sA    (*(888DKK(,,.T0TT..r   N)r   r   r   r"   r#   r&   r!   r   r   r   r*   r*   2   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)r1   )r   r1   s     r   r!   zContextQuery.__init__;   s
    *r   N)r   r   r   r"   r&   r!   r   r   r   r0   r0   :   s    +d;&7 +r   r0   c                   "    e Zd Zdee   defdZy)FeedbackItemr    scorec                     t        j                  |      | _        || _        t        j                  | j                        j                         rJ d       y )N$Feedback vector must not contain NaN)r   r   r    r6   r   r   )r   r    r6   s      r   r!   zFeedbackItem.__init__@   sA    hhv&
88DKK(,,.V0VV..r   Nr(   r   r   r   r5   r5   ?   s    WtE{ W5 Wr   r5   c                        e Zd ZdededefdZy)NaiveFeedbackCoefficientsabcc                 .    || _         || _        || _        y r3   )r;   r<   r=   )r   r;   r<   r=   s       r   r!   z"NaiveFeedbackCoefficients.__init__G   s    r   N)r   r   r   r#   r!   r   r   r   r:   r:   F   s    % E e r   r:   c                   H    e Zd Zdej                  dej                  defdZy)FeedbackContextPairr   r   partial_computationc                 .    || _         || _        || _        y r3   r   r   rA   )r   r   r   rA   s       r   r!   zFeedbackContextPair.__init__N   s     ! #6 r   N)r   r   r   types
NumpyArrayr#   r!   r   r   r   r@   r@   M   s+    7((7494D4D7[`7r   r@   c                   ,    e Zd Zdee   dee   defdZy)NaiveFeedbackQueryr+   feedbackcoefficientsc                 F   t        j                  |      | _        || _        || _        t        j
                  | j                        j                         rJ d       | j                  D ]6  }t        j
                  |j                        j                         s1J d        y )Nr.   r8   )r   r   r+   rH   rI   r   r   r    )r   r+   rH   rI   items        r   r!   zNaiveFeedbackQuery.__init__W   s{     hhv& (88DKK(,,.T0TT.MMDxx,002Z4ZZ2 "r   N)r   r   r   r"   r#   r5   r:   r!   r   r   r   rG   rG   V   s0    [U[ |$[ 0	[r   rG   DenseQueryVector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   )rM   s    r   distance_to_orderrS   i   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
    axisNr      )
r   linalgnormnewaxiswhereEPSILONlenshapedotT)rT   rU   vectors_norm
query_norms       r   cosine_similarityrf   y   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
    rZ   )r`   ra   r   rb   rc   rT   rU   s     r   dot_productri      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
    rZ   rW   rX   N)r`   ra   r   r[   r\   r]   rh   s     r   euclidean_distancerk      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
    rZ   rW   rX   N)r`   ra   r   sumabsr]   rh   s     r   manhattan_distancero      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   rP   COSINErf   DOTri   rQ   rk   rR   ro   
ValueErrorrT   rU   rp   s      r   calculate_distancerw      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
    rr   dtyperZ   )rY   rz   )r   r   r   r   rP   rQ   squarefloat32rm   rR   rn   rw   rv   s      r   calculate_distance_corer}      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addrn   r~   s    r   fast_sigmoidr      s6    	xx{bhhqkrvvc3q6"""r   c                 F    dt        j                  t        |       d      z  S )Ng      ?r   )r   r   r   r   s    r   scaled_fast_sigmoidr      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examplesrN   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   ry   rX   )
ra   r}   appendr`   r   fullinfr   r|   max)r   vector_countscoresexampler6   best_scoresrp   rU   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r3   r   .0xis     r   	<genexpr>z2calculate_recommend_best_scores.<locals>.<genexpr>  s     ;s(,s   c              3   4   K   | ]  }t        |         y wr3   r   r   s     r   r   z2calculate_recommend_best_scores.<locals>.<genexpr>  s     <")"--s   )	r"   rD   rE   r   r   r   r^   fromiterrz   )rT   rU   rp   r   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 )Nr   rN   c                 B   j                   d   }g }| D ]   }t        |      }|j                  |       " t        |      dk(  r$|j                  t	        j
                  |             t	        j                  |t        j                        j                  d      }|S r   )	ra   r}   r   r`   r   zerosr   r|   rm   )r   r   r   r   r6   
sum_scoresrp   rU   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"   rD   rE   r   r   )rT   rU   rp   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   ry   rZ   rW   )	r   r   ra   int32r}   r   r   r   zip)
r,   rU   rp   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r3   r   r   s     r   r   z-calculate_discovery_scores.<locals>.<genexpr>?  s     ?+>R	R	 +>r   )r   r,   r}   r+   r   r   r|   )rT   rU   rp   ranksdistances_to_targetsigmoided_distancess         r   calculate_discovery_scoresr   6  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   ry   c              3   2   K   | ]  }t        |        y wr3   )r   r   s     r   r   z+calculate_context_scores.<locals>.<genexpr>P  s     D(C"\"(Cr   r   )r   r   ra   r|   r1   r}   r   r   r_   r   minimum)	rT   rU   rp   overall_scoresr   r   r   
differencepair_scoress	            r   calculate_context_scoresr   E  s     XXgmmA.bjjAN##%dmmWmL%dmmWmL3Y(
kkD

:s(CDbjj
 	+% $ r   c                    g }t        | j                        dk\  rt        | j                  d      D ]  }|d   |d   }}|j                  |j                  z
  }|t        k  r0|| j
                  j                  z  | j
                  j                  z  }|j                  t        |j                  |j                  |              | j
                  j                  t        | j                  ||      z  }	|D ]G  }
t        |
j                  ||      }t        |
j                  ||      }||z
  }|	|
j                   |z  z  }	I |	S )N   r   rZ   rC   )r`   rH   r   r6    NAIVE_FEEDBACK_CONFIDENCE_MARGINrI   r<   r=   r   r@   r    r;   r}   r+   r   r   rA   )rT   rU   rp   r1   ppositive_itemnegative_item
confidencerA   r6   r   sim_possim_negdeltas                 r   calculate_naive_feedback_queryr   W  s0    02M
5>>aenna0A+,Q41=M&,,}/B/BBJ==#-u/A/A/C/C#CuGYGYG[G["[  #*11*11(; 1    #:5<<R_#``E)$---P)$---P'!))E11  Lr   ).enumr   typingr   	itertoolsr   numpyr   qdrant_client.conversionsr   rD   qdrant_client.httpr   r_   r   strr
   r   r&   r*   r0   r5   r:   r@   rG   rL   __annotations__rP   rS   rE   rf   ri   rk   ro   rw   r}   r|   r   r   r   r   r"   r   r   r   r   r   r   r   <module>r      su     "  ; %
 $'  ,C ,
Z Z(Y YU U+ +
W W 7 7[ [  -|;iGJ\\ ) \* *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??
$(-(8(8IO
r   