
    Ng:                        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j        de
j        fdZde
j        dee
j                 dej        de
j        fdZdedee
j                 dej        de
j        fdZdee         dee
j                 dej        de
j        fdZdedee
j                 dej        de
j        fdZdedee
j                 dej        de
j        fdZdS )    )OptionalListUnionN)models)common_types)distance_to_orderDistanceOrdercalculate_distancescaled_fast_sigmoidEPSILONfast_sigmoidc            	           e Zd Z	 	 ddeeeee                                    deeeee                                    fdZdS )MultiRecoQueryN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  nparray.0vectors     _/var/www/html/ai-engine/env/lib/python3.11/site-packages/qdrant_client/local/multi_distances.py
<listcomp>z+MultiRecoQuery.__init__.<locals>.<listcomp>   "    0Y0Y0Yf&1A1A0Y0Y0Y    c                 6    g | ]}t          j        |          S r   r   r   s     r   r   z+MultiRecoQuery.__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MultiRecoQuery.__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)__name__
__module____qualname__r   r   floatr$   r   r   r   r   r      sv         7;6:Z Z4T%[ 123Z 4T%[ 123Z Z Z Z Z Zr   r   c                   N    e Zd Zdeee                  deee                  fdZdS )MultiContextPairr   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MultiContextPair.__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*   !   sP        Yd5k!2 Yd4;>O Y Y Y Y Y Yr   r*   c                   B    e Zd Zdeee                  dee         fdZdS )MultiDiscoveryQuerytargetcontextc                     t          j        |          | _        || _        t          j        | j                                                  r
J d            d S )Nz"Target vector must not contain NaN)r   r   r.   r/   r    r!   )r#   r.   r/   s      r   r$   zMultiDiscoveryQuery.__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-   *   sM        UtDK0 U4@P;Q U U U U U Ur   r-   c                   &    e Zd Zdee         fdZdS )MultiContextQuerycontext_pairsc                     || _         d S N)r3   )r#   r3   s     r   r$   zMultiContextQuery.__init__3   s    *r   N)r%   r&   r'   r   r*   r$   r   r   r   r2   r2   2   s5        +d+;&< + + + + + +r   r2   query_matrixmatricesdistance_typereturnc           	         t          j        |                                           r
J d            t          | j                  dk    s
J d            t          |          t          j        k    }g }|D ]n}t          | ||          }|st           j	        nt           j
        }t          t          j         ||d                              }|                    |           ot          j        |          S )Nz!Query matrix must not contain NaN   zQuery must be a matrixaxis)r   r    r!   lenshaper   r	   SMALLER_IS_BETTERr
   maxminr(   sumappendr   )	r6   r7   r8   reversesimilaritiesmatrix
sim_matrixop
similaritys	            r   calculate_multi_distancerL   >   s    
 x%%))++PP-PPPP|!""a''')A'''..-2QQG "L ( ('fmLL
".RVV26""Zb"9"9"9::;;
J''''8L!!!r   c           	         dt           j        dt           j        dt           j        fd}dt           j        dt           j        dt           j        fd}t          j        |                                           r
J d            |t
          j        j        t
          j        j        fv r| d d t          j	        f         } g }|t
          j        j        k    r|n|}|D ]X} |||           }t          t          j        t          j        |d                              }	|                    |	           Yt          j        |          S t          | ||          S )	Nmqr9   c                     t          j        | |z
  t           j                                      dt           j                   S Ndtype   )r>   rS   )r   squarefloat32rD   rN   rO   s     r   	euclideanz0calculate_multi_distance_core.<locals>.euclideanV   s5    	!a%rz22266ARZ6PPPPr   c                     t          j        | |z
  t           j                                      dt           j                   S rQ   )r   absrV   rD   rW   s     r   	manhattanz0calculate_multi_distance_core.<locals>.manhattanY   s5    q1uBJ///33"*3MMMMr   z!Query vector must not contain NaNr<   r=   )types
NumpyArrayr   r    r!   r   DistanceEUCLID	MANHATTANnewaxisr(   rD   rB   rE   r   rL   )
r6   r7   r8   rX   r[   rG   	dist_funcrH   rI   rK   s
             r   calculate_multi_distance_corerc   Q   sk   
QU% Q%*: Qu?O Q Q Q QNU% N%*: Nu?O N N N N x%%))++PP-PPPP/1JKKK#AAArzM2$&!.&/2H!H!HIIi	 	, 	,F"6<88JrvbfZb&A&A&ABBCCJ
++++x%%%#L(MJJJr   queryc                 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examplesr9   c                 t   t                    }g }| D ](}t          |          }|                    |           )t          |          dk    r3|                    t          j        |t          j                              t          j        |t          j                                      d          }|S )Nr   rR   r=   )	r?   rc   rE   r   fullinfr   rV   rB   )rf   matrix_countscoresexamplescorebest_scoresr8   r7   s         r   get_best_scoresz>calculate_multi_recommend_best_scores.<locals>.get_best_scoresm   s    8}} *, 	! 	!G1'8]SSEMM%     v;;!MM"',88999hvRZ888<<!<DDr   c              3   4   K   | ]}t          |          V  d S r5   r   r   xis     r   	<genexpr>z8calculate_multi_recommend_best_scores.<locals>.<genexpr>   s+      ;;(,,;;;;;;r   c              3   6   K   | ]}t          |           V  d S r5   rq   rr   s     r   rt   z8calculate_multi_recommend_best_scores.<locals>.<genexpr>   s.      <<")"---<<<<<<r   )	r   r\   r]   r   r   r   wherefromiterrS   )rd   r7   r8   ro   posnegs    ``   r   %calculate_multi_recommend_best_scoresrz   j   s    $u'7"8 U=M         /%.
)
)C
/%.
)
)C 8c	
;;s;;;SYGG
<<<<<ciHH  r   r/   c           	      4   t          j        t          |          t           j                  }| D ]g}t	          |j        ||          }t	          |j        ||          }t          j        d t          ||k    ||k              D                       }||z  }h|S )NrR   c                 (    g | ]\  }}|rd n|rdndS )rT   r   r<   r   )r   	is_biggeris_equals      r   r   z3calculate_multi_discovery_ranks.<locals>.<listcomp>   s>       'Ix 9$9AAr  r   )	r   zerosr?   int32rc   r   r   r   zip)r/   r7   r8   overall_rankspairrx   ry   
pair_rankss           r   calculate_multi_discovery_ranksr      s    
 HS]]"(;;;M $ $+DM8]SS+DM8]SS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 r5   rq   rr   s     r   rt   z3calculate_multi_discovery_scores.<locals>.<genexpr>   s+      ??R	R	 	 ??????r   )r   r/   rc   r.   r   rw   rV   )rd   r7   r8   ranksdistances_to_targetsigmoided_distancess         r    calculate_multi_discovery_scoresr      sd     ,EM8]SSE 8hP]^^+??+>???  &&&r   c                 h   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 )NrR   c              3   4   K   | ]}t          |          V  d S r5   )r   rr   s     r   rt   z1calculate_multi_context_scores.<locals>.<genexpr>   s*      DD"\"DDDDDDr   g        )r   r   r?   rV   r3   rc   r   r   r   rw   minimum)	rd   r7   r8   overall_scoresr   rx   ry   
differencepair_scoress	            r   calculate_multi_context_scoresr      s     Xc(mm2:>>>N# 	& 	&+DM8]SS+DM8]SS3Y(
kDD
:s(C(CDDDbj
 
 	+%r   )typingr   r   r   numpyr   qdrant_client.httpr   qdrant_client.conversionsr   r\   qdrant_client.local.distancesr   r	   r
   r   r   r   r   r*   r-   r2   MultiQueryVectorr]   r^   rL   rc   rz   r   r   r   r   r   r   <module>r      s'   ( ( ( ( ( ( ( ( ( (     % % % % % % ; ; ; ; ; ;               Z Z Z Z Z Z Z Z Y Y Y Y Y Y Y YU U U U U U U U+ + + + + + + +
  """5#$" ?" 	" " " "&K"K5#$K ?K 	K K K K2%)%*:%;LRO
   >"#5#$ ? 	   .''*.u/?*@'QWQ`'
' ' ' '(,U-=(>OU
     r   