
    'Xho(              	       \   d dl mZmZmZmZ d dlZd dlmZ	 d dl
mZ d dlmZmZmZ d dlmZmZmZmZ  G d d      Z G d	 d
      Z G d d      Z G d d      Zeeeeef   Z	 d#dedee   dede	j8                  fdZdededeej<                     fdZdee   dee   de	j8                  fdZ dedee   de	j8                  fdZ!dedee   de	j8                  fdZ"dedee   de	j8                  fdZ#dedee   de	j8                  fdZ$dedededefdZ%dee   defdZ&d ed!edefd"Z'y)$    )CallableOptionalSequenceUnionN)common_types)SparseVector)EPSILONfast_sigmoidscaled_fast_sigmoid)empty_sparse_vector	is_sortedsort_sparse_vectorvalidate_sparse_vectorc                   v    e Zd Z	 	 	 d
deee      deee      deej                     fdZde	dgdf   dd fd	Z
y)SparseRecoQueryNpositivenegativestrategyc                    |J d       || _         ||ng }||ng }t        |      D ]  \  }}t        |       t        |      ||<     t        |      D ]  \  }}t        |       t        |      ||<     || _        || _        y )Nz#Recommend strategy must be provided)r   	enumerater   r   r   r   )selfr   r   r   ivectors         N/RAG/venv/lib/python3.12/site-packages/qdrant_client/local/sparse_distances.py__init__zSparseRecoQuery.__init__   s     #J%JJ# '38'38"8,IAv"6*,V4HQK - #8,IAv"6*,V4HQK - !     foor   returnc           	          t        | j                  D cg c]
  } ||       c}| j                  D cg c]
  } ||       c}| j                        S c c}w c c}w )N)r   r   r   )r   r   r   r   )r   r   r   s      r   transform_sparsez SparseRecoQuery.transform_sparse)   sR     04>fc&k>04>fc&k>]]
 	
>>s
   AA
)NNN)__name__
__module____qualname__r   listr   typesRecommendStrategyr   r   r     r   r   r   r      so     26156:	!4-.! 4-.! 5223	!0
^,n<=
	
r   r   c                       e Zd ZdedefdZy)SparseContextPairr   r   c                 p    t        |       t        |       t        |      | _        t        |      | _        y N)r   r   r   r   )r   r   r   s      r   r   zSparseContextPair.__init__4   s*    x(x(&8&B&8&Br   N)r!   r"   r#   r   r   r'   r   r   r)   r)   3   s    C C Cr   r)   c                   >    e Zd Zdedee   fdZdedgdf   dd fdZy)	SparseDiscoveryQuerytargetcontextc                 H    t        |       t        |      | _        || _        y r+   )r   r   r.   r/   )r   r.   r/   s      r   r   zSparseDiscoveryQuery.__init__<   s    v&$6v$>r   r   r   r   c                     t         || j                        | j                  D cg c].  }t         ||j                         ||j
                              0 c}      S c c}w )N)r.   r/   )r-   r.   r/   r)   r   r   r   r   pairs      r   r    z%SparseDiscoveryQuery.transform_sparseA   sZ     $t{{#VZVbVbVbd!#dmm"4c$--6HIVb
 	
s   3A 
N)	r!   r"   r#   r   r$   r)   r   r   r    r'   r   r   r-   r-   ;   s=    | d;L6M 

^,n<=
	
r   r-   c                   :    e Zd Zdee   fdZdedgdf   dd fdZy)SparseContextQuerycontext_pairsc                     || _         y r+   r6   )r   r6   s     r   r   zSparseContextQuery.__init__M   s
    *r   r   r   r   c                     t        | j                  D cg c].  }t         ||j                         ||j                              0 c}      S c c}w )Nr8   )r5   r6   r)   r   r   r2   s      r   r    z#SparseContextQuery.transform_sparseP   sR     " !...D "#dmm"4c$--6HI.
 	
s   3AN)r!   r"   r#   r$   r)   r   r   r    r'   r   r   r5   r5   L   s6    +d+<&= +
^,n<=
	
r   r5   queryvectorsempty_is_zeror   c                 4   g }|D ]m  }t        | |      }||j                  |       #|s%|j                  t        j                  d             J|j                  t        j                  d             o t        j                  |t        j                        S )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)r:   r;   r<   scoresr   scores         r   calculate_distance_sparserH   c   st     F"5&1MM% MM"**V,-MM"**S/*  88F"**--r   vector1vector2c                 >   d}d\  }}d}t        |       sJ d       t        |      sJ d       |t        | j                        k  r|t        |j                        k  r| j                  |   |j                  |   k(  r/d}|| j                  |   |j                  |   z  z  }|dz  }|dz  }n*| j                  |   |j                  |   k  r|dz  }n|dz  }|t        | j                        k  r|t        |j                        k  r|rt	        j
                  |      S y )Nr>   r   r   Fz"Query sparse vector must be sortedz,Sparse vector to compare with must be sortedT   )r   lenindicesvaluesrC   rD   )rI   rJ   resultr   joverlaps         r   rA   rA      s   FDAqGWCCCWMMM
c'//"
"q3w+?'???1!33GgnnQ''..*;;;FFAFA__Q'//!"44FAFA c'//"
"q3w+?'? zz&!!r   r/   c           	      f   t        j                  t        |      t         j                        }| D ]w  }t	        |j
                  |d      }t	        |j                  |d      }t        j                  t        ||kD  ||k(        D cg c]  \  }}|rdn|rdnd c}}      }||z  }y |S c c}}w )Nr?   Tr<   rM   r   )	rC   zerosrN   int32rH   r   r   rE   zip)	r/   r;   overall_ranksr3   posneg	is_biggeris_equal
pair_rankss	            r    calculate_sparse_discovery_ranksr`      s     ')hhs7|288&LM'wdS'wdSXX ,/sSy#*+E+E'Ix Ar9+E

 	#  s   B-c                     t        | j                  |      }t        | j                  |d      }t	        j
                  d |D        t        j                        }||z   S )NTrU   c              3   2   K   | ]  }t        |        y wr+   r   .0xis     r   	<genexpr>z4calculate_sparse_discovery_scores.<locals>.<genexpr>   s     ?+>R	R	 +>   )r`   r/   rH   r.   rC   fromiterrD   )r:   r;   ranksdistances_to_targetsigmoided_distancess        r   !calculate_sparse_discovery_scoresrm      sV     -U]]GDE 4ELL'Y]^++?+>? &&&r   c                    t        j                  t        |      t         j                        }| j                  D ]  }t        |j                  |d      }t        |j                  |d      }||z
  t        z
  }t        j                  d t        j                  |d      D        t         j                        }||z  } |S )Nr?   TrU   c              3   2   K   | ]  }t        |        y wr+   )r
   rd   s     r   rg   z2calculate_sparse_context_scores.<locals>.<genexpr>   s     D(C"\"(Crh   r>   )rC   rW   rN   rD   r6   rH   r   r   r	   ri   minimum)r:   r;   overall_scoresr3   r[   r\   
differencepair_scoress           r   calculate_sparse_context_scoresrt      s     (*xxGBJJ'ON##'wdS'wdS3Y(
kkD

:s(CDbjj
 	+% $ r   c                 Z   dt         t           dt        j                  ffd} || j                        } || j
                        }t        j                  ||kD  t        j                  d |D        |j                        t        j                  d |D        |j                              S )Nexamplesr   c                 \   t              }g }| D ]!  }t        |d      }|j                  |       # t        |      dk(  r4|j                  t        j                  |t        j
                                t        j                  |t        j                        j                  d      }|S NTrU   r   r?   )axis)	rN   rH   rB   rC   fullinfrE   rD   max)rv   vector_countrF   examplerG   best_scoresr;   s         r   get_best_scoresz?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   2   K   | ]  }t        |        y wr+   rc   rd   s     r   rg   z9calculate_sparse_recommend_best_scores.<locals>.<genexpr>   s     ;s(,srh   c              3   4   K   | ]  }t        |         y wr+   rc   rd   s     r   rg   z9calculate_sparse_recommend_best_scores.<locals>.<genexpr>   s     <")"--s   )
r$   r   r%   
NumpyArrayr   r   rC   whereri   r@   )r:   r;   r   r[   r\   s    `   r   &calculate_sparse_recommend_best_scoresr      s    $|"4 9I9I   %..
)C
%..
)C 88c	
;s;SYYG
<<ciiH r   c                     dt         t           dt        j                  ffd} || j                        } || j
                        }||z
  S )Nrv   r   c                 <   t              }g }| D ]!  }t        |d      }|j                  |       # t        |      dk(  r$|j                  t        j                  |             t        j
                  |t        j                        j                  d      }|S rx   )rN   rH   rB   rC   rW   rE   rD   sum)rv   r}   rF   r~   rG   
sum_scoresr;   s         r   get_sum_scoresz=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   )r:   r;   r   r[   r\   s    `   r   %calculate_sparse_recommend_sum_scoresr      sI    l!3 8H8H  
(C

(C9r   opc                    t               }d\  }}|t        | j                        k  r|t        |j                        k  r| j                  |   |j                  |   k(  ro|j                  j                  | j                  |          |j                  j                   || j                  |   |j                  |                |dz  }|dz  }n| j                  |   |j                  |   k  r]|j                  j                  | j                  |          |j                  j                   || j                  |   d             |dz  }n\|j                  j                  |j                  |          |j                  j                   |d|j                  |                |dz  }|t        | j                        k  r|t        |j                        k  r|t        | j                        k  ru|j                  j                  | j                  |          |j                  j                   || j                  |   d             |dz  }|t        | j                        k  ru|t        |j                        k  ru|j                  j                  |j                  |          |j                  j                   |d|j                  |                |dz  }|t        |j                        k  ru|S )NrL   rM   r>   )r   rN   rO   rB   rP   )rI   rJ   r   rQ   r   rR   s         r   combine_aggregater     sN    "FDAq
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                     t               }t        |       dk(  r|S d}| D ]  }|dz  }t        ||d       } t        j                  |j
                  |      j                         |_        |S )Nr   rM   c                     | |z   S r+   r'   )v1v2s     r   <lambda>zsparse_avg.<locals>.<lambda>0  s    "r'r   )r   rN   r   rC   dividerP   tolist)r;   rQ   sparse_countr   s       r   
sparse_avgr   (  si     "F
7|qL"663IJ  IIfmm\:AACFMMr   r   r   c                     t        | |d       S )Nc                     | | z   |z
  S r+   r'   )r[   r\   s     r   r   z1merge_positive_and_negative_avg.<locals>.<lambda>:  s    #)c/r   )r   )r   r   s     r   merge_positive_and_negative_avgr   7  s     Xx1QRRr   )F)(typingr   r   r   r   numpyrC   qdrant_client.conversionsr   r%   qdrant_client.http.modelsr   qdrant_client.local.distancesr	   r
   r   qdrant_client.local.sparser   r   r   r   r   r)   r-   r5   SparseQueryVectorr$   boolr   rH   rD   rA   r`   rm   rt   r   r   r   r   r   r'   r   r   <module>r      s   6 6  ; 2 T T  
  
FC C
 
"
 
   MR.."&|"4.EI.
.< | QSQ[Q[H\ 2#$, ,''*.|*<'
'(,\(:
$%),%7
>%),%7
0| l  Ua @. < SS&2SSr   