
    'Xhx                     \   d dl 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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f   Zde
j.                  dee
j.                     dej2                  de
j.                  fdZde
j.                  dee
j.                     dej2                  de
j.                  fdZdedee
j.                     dej2                  de
j.                  fdZdedee
j.                     dej2                  de
j.                  fdZdee   dee
j.                     dej2                  de
j.                  fdZdedee
j.                     dej2                  de
j.                  fdZdedee
j.                     dej2                  de
j.                  fdZ y)    )OptionalUnionAnyN)models)common_types)distance_to_orderDistanceOrdercalculate_distancescaled_fast_sigmoidEPSILONfast_sigmoidc            	       r    e Zd Z	 	 	 ddeeeee            deeeee            deej                     fdZy)MultiRecoQueryNpositivenegativestrategyc                    |J d       || _         ||ng }||ng }|D ],  }t        j                  |      j                         s'J d        |D ],  }t        j                  |      j                         s'J d        |D cg c]  }t        j                  |       c}| _        |D cg c]  }t        j                  |       c}| _        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isnananyarrayr   r   )selfr   r   r   vectors        M/RAG/venv/lib/python3.12/site-packages/qdrant_client/local/multi_distances.py__init__zMultiRecoQuery.__init__   s     #J%JJ# '38'38Fxx'++-V/VV- Fxx'++-V/VV-  QY0YPXf&1APX0YPX0YPXf&1APX0Y 1Z0Ys   C+C)NNN)	__name__
__module____qualname__r   listfloatr   RecommendStrategyr        r   r   r      sc     7;6:7;	Z4T%[ 123Z 4T%[ 123Z 6334	Zr#   r   c                   4    e Zd Zdeee      deee      fdZy)MultiContextPairr   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MultiContextPair.__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d5k!2 Yd4;>O Yr#   r%   c                   .    e Zd Zdeee      dee   fdZy)MultiDiscoveryQuery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MultiDiscoveryQuery.__init__2   sA    (*(888DKK(,,.T0TT..r#   N)r   r   r   r   r    r%   r   r"   r#   r   r(   r(   1   s'    UtDK0 U4@P;Q Ur#   r(   c                       e Zd Zdee   fdZy)MultiContextQuerycontext_pairsc                     || _         y N)r.   )r   r.   s     r   r   zMultiContextQuery.__init__:   s
    *r#   N)r   r   r   r   r%   r   r"   r#   r   r-   r-   9   s    +d+;&< +r#   r-   query_matrixmatricesdistance_typereturnc                    t        j                  |       j                         rJ d       t        | j                        dk(  sJ d       t        | ||      }|t        j                  j                  k(  r*t        j                  t        j                  |            }|S |t        j                  j                  k(  rt        j                  |      }|S )Nz!Query matrix must not contain NaN   zQuery must be a matrix)r   r   r   lenshapecalculate_multi_distance_corer   DistanceEUCLIDsqrtabs	MANHATTAN)r1   r2   r3   	distancess       r   calculate_multi_distancer@   E   s    
 xx%))+P-PP+|!!"a'A)AA'-lHmTI...GGBFF9-.	  
&//33	3FF9%	r#   c           	          dt         j                  dt         j                  dt        dt         j                  fd}dt         j                  dt         j                  dt        dt         j                  fd}t        j                  |       j                         rJ d       g }|t        j                  j                  t        j                  j                  fv r9| d d t        j                  f   } |t        j                  j                  k(  r|n|}nt        }|D ]P  } || ||      }t        t        j                  t        j                  |d	                  }	|j                  |	       R t        j                   |      S )
Nqm_r4   c                     t        j                  || z
  t         j                        j                  dt         j                         S Ndtype)axisrH   )r   squarefloat32sumrB   rC   rD   s      r   	euclideanz0calculate_multi_distance_core.<locals>.euclidean[   s2    		!a%rzz266Bbjj6QQQr#   c                     t        j                  || z
  t         j                        j                  dt         j                         S rF   )r   r=   rL   rM   rN   s      r   	manhattanz0calculate_multi_distance_core.<locals>.manhattan^   s2    q1uBJJ/332::3NNNr#   z!Query vector must not contain NaNrI   rJ   )types
NumpyArrayr   r   r   r   r   r:   r;   r>   newaxisr
   r    rM   maxappendr   )
r1   r2   r3   rO   rQ   similarities	dist_funcmatrix
sim_matrix
similaritys
             r   r9   r9   V   sA   
RU%% R%*:*: R RHXHX ROU%% O%*:*: O OHXHX O xx%))+P-PP+ "L //1J1JKK#ArzzM2!.&//2H2H!HIi	&	|V]C
266"&&""=>?
J'  88L!!r#   queryc                 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examplesr4   c                 Z   t              }g }| D ]   }t        |      }|j                  |       " t        |      dk(  r4|j                  t        j                  |t        j
                                t        j                  |t        j                        j                  d      }|S Nr   rG   rR   )	r7   r9   rW   r   fullinfr   rL   rV   )r_   matrix_countscoresexamplescorebest_scoresr3   r2   s         r   get_best_scoresz>calculate_multi_recommend_best_scores.<locals>.get_best_scoresv   s    8} *,G1'8]SEMM%   
 v;!MM"'',89hhvRZZ8<<!<Dr#   c              3   2   K   | ]  }t        |        y wr0   r   .0xis     r   	<genexpr>z8calculate_multi_recommend_best_scores.<locals>.<genexpr>   s     ;s(,s   c              3   4   K   | ]  }t        |         y wr0   rk   rl   s     r   ro   z8calculate_multi_recommend_best_scores.<locals>.<genexpr>   s     <")"--s   )	r   rS   rT   r   r   r   wherefromiterrH   )r]   r2   r3   ri   posnegs    ``   r   %calculate_multi_recommend_best_scoresrv   s   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_   r4   c                 :   t              }g }| D ]   }t        |      }|j                  |       " t        |      dk(  r$|j                  t        j                  |             t        j
                  |t        j                        j                  d      }|S ra   )r7   r9   rW   r   zerosr   rL   rM   )r_   rd   re   rf   rg   
sum_scoresr3   r2   s         r   get_sum_scoresz<calculate_multi_recommend_sum_scores.<locals>.get_sum_scores   s    8})+G1'8]SEMM%    v;!MM"((<01XXfBJJ7;;;C
r#   )r   rS   rT   r   r   )r]   r2   r3   r{   rt   ru   s    ``   r   $calculate_multi_recommend_sum_scoresr|      sO    e&6&6!7 E<L<L  
(C

(C9r#   r*   c           	      b   t        j                  t        |      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 )NrG      r   rI   )	r   ry   r7   int32r9   r   r   r   zip)
r*   r2   r3   overall_rankspairrt   ru   	is_biggeris_equal
pair_rankss
             r   calculate_multi_discovery_ranksr      s    
 ')hhs8}BHH&MM+DMM8]S+DMM8]S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r0   rk   rl   s     r   ro   z3calculate_multi_discovery_scores.<locals>.<genexpr>   s     ?+>R	R	 +>rp   )r   r*   r9   r)   r   rs   rL   )r]   r2   r3   ranksdistances_to_targetsigmoided_distancess         r    calculate_multi_discovery_scoresr      sX     ,EMM8]SE 8hP]^++?+>? &&&r#   c                    t        j                  t        |      t         j                        }| j                  D ]  }t        |j                  ||      }t        |j                  ||      }||z
  t        z
  }t        j                  d t        j                  |d      D        t         j                        }||z  } |S )NrG   c              3   2   K   | ]  }t        |        y wr0   )r   rl   s     r   ro   z1calculate_multi_context_scores.<locals>.<genexpr>   s     D(C"\"(Crp   g        )r   ry   r7   rL   r.   r9   r   r   r   rs   minimum)	r]   r2   r3   overall_scoresr   rt   ru   
differencepair_scoress	            r   calculate_multi_context_scoresr      s     (*xxHRZZ'PN##+DMM8]S+DMM8]S3Y(
kkD

:s(CDbjj
 	+% $ r#   )!typingr   r   r   numpyr   qdrant_client.httpr   qdrant_client.conversionsr   rS   qdrant_client.local.distancesr   r	   r
   r   r   r   r   r%   r(   r-   MultiQueryVectorrT   r   r:   r@   r9   rv   r|   r   r   r   r"   r#   r   <module>r      s   ' '  % ; Z Z.Y YU U+ +
  ""5##$ ?? 	"""""5##$" ??" 	":%)%*:*:%;LROO
>%)%*:*:%;LROO
."#5##$ ?? 	.''*.u/?/?*@'QWQ`Q`'
'(,U-=-=(>OU
r#   