
    <iY(              	       ~   % S SK JrJrJr  S SKrS SKJr  S SK	J
r
  S SKJrJrJr  S SKJrJrJrJr   " S S5      r " S	 S
5      r " S S5      r " S S5      r\
\-  \-  \-  r\\S'    S$S\
S\\
   S\S\R8                  4S jjrS\
S\
S\R<                  S-  4S jrS\\   S\\
   S\R8                  4S jr S\S\\
   S\R8                  4S jr!S\S\\
   S\R8                  4S jr"S\S\\
   S\R8                  4S jr#S\S\\
   S\R8                  4S jr$S\
S\
S\S\
4S jr%S\\
   S\
4S  jr&S!\
S"\
S\
4S# jr'g)%    )CallableSequence	TypeAliasN)common_types)SparseVector)EPSILONfast_sigmoidscaled_fast_sigmoid)empty_sparse_vector	is_sortedsort_sparse_vectorvalidate_sparse_vectorc                       \ rS rSr   SS\\   S-  S\\   S-  S\R                  S-  4S jjrS\	S/S4   S	S 4S
 jr
Srg)SparseRecoQuery   Npositivenegativestrategyc                    Uc   S5       eX0l         Ub  UO/ nUb  UO/ n[        U5       H  u  pE[        U5        [        U5      X'   M     [        U5       H  u  pE[        U5        [        U5      X$'   M     Xl        X l        g )Nz#Recommend strategy must be provided)r   	enumerater   r   r   r   )selfr   r   r   ivectors         ^/home/james-whalen/.local/lib/python3.13/site-packages/qdrant_client/local/sparse_distances.py__init__SparseRecoQuery.__init__   s     #J%JJ# '38'38"8,IA"6*,V4HK - #8,IA"6*,V4HK - !     foor   returnc           	          [        U R                   Vs/ s H
  o!" U5      PM     snU R                   Vs/ s H
  o!" U5      PM     snU R                  S9$ s  snf s  snf )N)r   r   r   )r   r   r   r   )r   r   r   s      r   transform_sparse SparseRecoQuery.transform_sparse)   sR     04>fc&k>04>fc&k>]]
 	
>>s
   AA
)r   r   r   )NNN)__name__
__module____qualname____firstlineno__listr   typesRecommendStrategyr   r   r!   __static_attributes__ r   r   r   r      so     /3.237	!|$t+! |$t+! ))D0	!0
^,n<=
	
r   r   c                   &    \ rS rSrS\S\4S jrSrg)SparseContextPair3   r   r   c                 p    [        U5        [        U5        [        U5      U l        [        U5      U l        g N)r   r   r   r   )r   r   r   s      r   r   SparseContextPair.__init__4   s*    x(x(&8&B&8&Br   )r   r   N)r#   r$   r%   r&   r   r   r*   r+   r   r   r-   r-   3   s    C C Cr   r-   c                   J    \ rS rSrS\S\\   4S jrS\S/S4   SS 4S jr	S	r
g
)SparseDiscoveryQuery;   targetcontextc                 F    [        U5        [        U5      U l        X l        g r0   )r   r   r5   r6   )r   r5   r6   s      r   r   SparseDiscoveryQuery.__init__<   s    v&$6v$>r   r   r   r   c                     [        U" U R                  5      U R                   Vs/ s H/  n[        U" UR                  5      U" UR
                  5      5      PM1     snS9$ s  snf )N)r5   r6   )r3   r5   r6   r-   r   r   r   r   pairs      r   r!   %SparseDiscoveryQuery.transform_sparseA   sZ     $t{{#VZVbVbVbd!#dmm"4c$--6HIVb
 	
s   6A 
)r6   r5   N)r#   r$   r%   r&   r   r'   r-   r   r   r!   r*   r+   r   r   r3   r3   ;   s=    | d;L6M 

^,n<=
	
r   r3   c                   F    \ rS rSrS\\   4S jrS\S/S4   SS 4S jrSr	g	)
SparseContextQueryL   context_pairsc                     Xl         g r0   r@   )r   r@   s     r   r   SparseContextQuery.__init__M   s    *r   r   r   r   c                     [        U R                   Vs/ s H/  n[        U" UR                  5      U" UR                  5      5      PM1     snS9$ s  snf )NrB   )r>   r@   r-   r   r   r:   s      r   r!   #SparseContextQuery.transform_sparseP   sR     " !...D "#dmm"4c$--6HI.
 	
s   6ArB   N)
r#   r$   r%   r&   r'   r-   r   r   r!   r*   r+   r   r   r>   r>   L   s6    +d+<&= +
^,n<=
	
r   r>   SparseQueryVectorqueryvectorsempty_is_zeror   c                 F   / nU Hw  n[        X5      nUb  UR                  U5        M$  U(       d'  UR                  [        R                  " S5      5        MR  UR                  [        R                  " S5      5        My     [        R                  " U[        R                  S9$ )a  Calculate distances between a query sparse vector and a list of sparse vectors.

Args:
    query (SparseVector): The query sparse vector.
    vectors (list[SparseVector]): A list of sparse vectors to compare against.
    empty_is_zero (bool): If True, distance between vectors with no overlap is treated as zero.
        Otherwise, it is treated as negative infinity.
        Simple nearest search requires `empty_is_zero` to be False, while methods like
        recommend, discovery, and context search require True.
z-inf        dtype)sparse_dot_productappendnpfloat32array)rG   rH   rI   scoresr   scores         r   calculate_distance_sparserU   `   sr     F"51MM% MM"**V,-MM"**S/*  88F"**--r   vector1vector2c                 h   SnSu  p4Sn[        U 5      (       d   S5       e[        U5      (       d   S5       eU[        U R                  5      :  a  U[        UR                  5      :  a  U R                  U   UR                  U   :X  a.  SnX R                  U   UR                  U   -  -  nUS-  nUS-  nO+U R                  U   UR                  U   :  a  US-  nOUS-  nU[        U R                  5      :  a  U[        UR                  5      :  a  M  U(       a  [        R
                  " U5      $ g )NrK   r   r   Fz"Query sparse vector must be sortedz,Sparse vector to compare with must be sortedT   )r   lenindicesvaluesrP   rQ   )rV   rW   resultr   joverlaps         r   rN   rN   ~   s   FDAGWCCCWMMM
c'//"
"q3w+?'???1!33GnnQ''..*;;;FFAFA__Q'//!"44FAFA c'//"
"q3w+?'? zz&!!r   r6   c           	      n   [         R                  " [        U5      [         R                  S9nU  H|  n[	        UR
                  USS9n[	        UR                  USS9n[         R                  " [        XE:  XE:H  5       VVs/ s H  u  pgU(       a  SO
U(       a  SOSPM     snn5      nX(-  nM~     U$ s  snnf )NrL   TrI   rZ   r   )	rP   zerosr[   int32rU   r   r   rR   zip)	r6   rH   overall_ranksr;   posneg	is_biggeris_equal
pair_rankss	            r    calculate_sparse_discovery_ranksrm      s     ')hhs7|288&LM'wdS'wdSXX ,/sy#*+E+E'I Ar9+E

 	#  s   ? B1c                     [        U R                  U5      n[        U R                  USS9n[        R
                  " S U 5       [        R                  5      nX$-   $ )NTrb   c              3   8   #    U  H  n[        U5      v   M     g 7fr0   r
   .0xis     r   	<genexpr>4calculate_sparse_discovery_scores.<locals>.<genexpr>   s     ?+>R	R	 	 +>   )rm   r6   rU   r5   rP   fromiterrQ   )rG   rH   ranksdistances_to_targetsigmoided_distancess        r   !calculate_sparse_discovery_scoresr{      sS     -U]]GDE 4ELL'Y]^++?+>? &&r   c                 x   [         R                  " [        U5      [         R                  S9nU R                   H}  n[        UR                  USS9n[        UR                  USS9nXE-
  [        -
  n[         R                  " S [         R                  " US5       5       [         R                  5      nX'-  nM     U$ )NrL   Trb   c              3   8   #    U  H  n[        U5      v   M     g 7fr0   )r	   rq   s     r   rt   2calculate_sparse_context_scores.<locals>.<genexpr>   s     D(C"\"(Crv   rK   )rP   rd   r[   rQ   r@   rU   r   r   r   rw   minimum)rG   rH   overall_scoresr;   rh   ri   
differencepair_scoress           r   calculate_sparse_context_scoresr      s     (*xxGBJJ'ON##'wdS'wdSY(
kkD

:s(CDbjj
 	% $ r   c                 b  ^ S[         [           S[        R                  4U4S jjnU" U R                  5      nU" U R
                  5      n[        R                  " X4:  [        R                  " S U 5       UR                  5      [        R                  " S U 5       UR                  5      5      $ )Nexamplesr   c                 T  > [        T5      n/ nU  H  n[        UTSS9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$ NTrb   r   rL   )axis)	r[   rU   rO   rP   fullinfrR   rQ   max)r   vector_countrS   examplerT   best_scoresrH   s         r   get_best_scores?calculate_sparse_recommend_best_scores.<locals>.get_best_scores   s    7| *,G-gwdSEMM%   
 v;!MM"'',89hhvRZZ8<<!<Dr   c              3   8   #    U  H  n[        U5      v   M     g 7fr0   rp   rq   s     r   rt   9calculate_sparse_recommend_best_scores.<locals>.<genexpr>   s     ;s(,,srv   c              3   :   #    U  H  n[        U5      * v   M     g 7fr0   rp   rq   s     r   rt   r      s     <")"--s   )
r'   r   r(   
NumpyArrayr   r   rP   whererw   rM   )rG   rH   r   rh   ri   s    `   r   &calculate_sparse_recommend_best_scoresr      s    $|"4 9I9I   %..
)C
%..
)C 88	
;s;SYYG
<<ciiH r   c                    ^ S[         [           S[        R                  4U4S jjnU" U R                  5      nU" U R
                  5      nX4-
  $ )Nr   r   c                 4  > [        T5      n/ nU  H  n[        UTSS9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   )r[   rU   rO   rP   rd   rR   rQ   sum)r   r   rS   r   rT   
sum_scoresrH   s         r   get_sum_scores=calculate_sparse_recommend_sum_scores.<locals>.get_sum_scores   s    7|)+G-gwdSEMM%    v;!MM"((<01XXfBJJ7;;;C
r   )r'   r   r(   r   r   r   )rG   rH   r   rh   ri   s    `   r   %calculate_sparse_recommend_sum_scoresr      sG    l!3 8H8H  
(C

(C9r   opc                    [        5       nSu  pEU[        U R                  5      :  Ga  U[        UR                  5      :  Ga  U R                  U   UR                  U   :X  ao  UR                  R                  U R                  U   5        UR                  R                  U" U R                  U   UR                  U   5      5        US-  nUS-  nOU R                  U   UR                  U   :  a]  UR                  R                  U R                  U   5        UR                  R                  U" U R                  U   S5      5        US-  nO\UR                  R                  UR                  U   5        UR                  R                  U" SUR                  U   5      5        US-  nU[        U R                  5      :  a  U[        UR                  5      :  a  GM  U[        U R                  5      :  aw  UR                  R                  U R                  U   5        UR                  R                  U" U R                  U   S5      5        US-  nU[        U R                  5      :  a  Mw  U[        UR                  5      :  aw  UR                  R                  UR                  U   5        UR                  R                  U" SUR                  U   5      5        US-  nU[        UR                  5      :  a  Mw  U$ )NrY   rZ   rK   )r   r[   r\   rO   r]   )rV   rW   r   r^   r   r_   s         r   combine_aggregater     sL    "FDA
c'//"
"q3w+?'???1!33NN!!'//!"45MM  GNN1$5w~~a7H!IJFAFA__Q'//!"44NN!!'//!"45MM  GNN1$5s!;<FANN!!'//!"45MM  C):!;<FA c'//"
"q3w+?'? c'//"
"gooa01Rq 1378	Q c'//"
"
 c'//"
"gooa01RW^^A%678	Q c'//"
"
 Mr   c                     [        5       n[        U 5      S:X  a  U$ SnU  H  nUS-  n[        XS 5      nM     [        R                  " UR
                  U5      R                  5       Ul        U$ )Nr   rZ   c                 
    X-   $ r0   r+   )v1v2s     r   <lambda>sparse_avg.<locals>.<lambda>-  s    "'r   )r   r[   r   rP   divider]   tolist)rH   r^   sparse_countr   s       r   
sparse_avgr   %  sg     "F
7|qL"63IJ  IIfmm\:AACFMMr   r   r   c                     [        XS 5      $ )Nc                     X -   U-
  $ r0   r+   )rh   ri   s     r   r   1merge_positive_and_negative_avg.<locals>.<lambda>7  s
    #)c/r   )r   )r   r   s     r   merge_positive_and_negative_avgr   4  s     X1QRRr   )F)(typingr   r   r   numpyrP   qdrant_client.conversionsr   r(   qdrant_client.http.modelsr   qdrant_client.local.distancesr   r	   r
   qdrant_client.local.sparser   r   r   r   r   r-   r3   r>   rF   __annotations__r'   boolr   rU   rQ   rN   rm   r{   r   r   r   r   r   r   r+   r   r   <module>r      s   0 0  ; 2 T T  
  
FC C
 
"
 
  ''*<<N 9  MR.."&|"4.EI.
.< | 

UYHY 2#$, ,''*.|*<'
'(,\(:
$%),%7
>%),%7
0| l  Ua @. < SS&2SSr   