
    Ohm                        S r SSKrSSKrSSKrSSKrSSKrSSKrS rS r	S r
S rS rS r\R                  SS	 j5       r SS jrS r\R$                  S   r\" \5       HI  r\" \\5      r\R0                  " \5      (       d  M%  \r\" \\R6                  5      (       d  MA  \" \5        MK     \R8                  S4S jr\" \S\SS5        SS\R8                  SS
4S jr\" \S\SS5        S\R8                  S4S jr\" \S\SS5        g)a  

This is a set of function wrappers that override the default numpy versions.

Interoperability functions for pytorch and Faiss: Importing this will allow
pytorch Tensors (CPU or GPU) to be used as arguments to Faiss indexes and
other functions. Torch GPU tensors can only be used with Faiss GPU indexes.
If this is imported with a package that supports Faiss GPU, the necessary
stream synchronization with the current pytorch stream will be automatically
performed.

Numpy ndarrays can continue to be used in the Faiss python interface after
importing this file. All arguments must be uniformly either numpy ndarrays
or Torch tensors; no mixing is allowed.

    Nc                     U R                  5       (       d   eU R                  [        R                  :X  d   e[        R
                  " U R                  5       R                  5       U R                  5       -   5      $ )@gets a Faiss SWIG pointer from a pytorch tensor (on CPU or GPU) )	is_contiguousdtypetorchuint8faisscast_integer_to_uint8_ptruntyped_storagedata_ptrstorage_offsetxs    Q/var/www/html/shao/venv/lib/python3.13/site-packages/faiss/contrib/torch_utils.pyswig_ptr_from_UInt8Tensorr   #   sa    ??77ekk!!!**	$$&)9)9);;= =    c                     U R                  5       (       d   eU R                  [        R                  :X  d   e[        R
                  " U R                  5       R                  5       U R                  5       S-  -   5      $ r      )	r   r   r   float16r	   cast_integer_to_void_ptrr   r   r   r   s    r   swig_ptr_from_HalfTensorr   +   sh    ??77emm###))	$$&)9)9);a)??A Ar   c                     U R                  5       (       d   eU R                  [        R                  :X  d   e[        R
                  " U R                  5       R                  5       U R                  5       S-  -   5      $ )r      )	r   r   r   float32r	   cast_integer_to_float_ptrr   r   r   r   s    r   swig_ptr_from_FloatTensorr   4   sh    ??77emm###**	$$&)9)9);a)??A Ar   c                     U R                  5       (       d   eU R                  [        R                  :X  d   e[        R
                  " U R                  5       R                  5       U R                  5       S-  -   5      $ r   )	r   r   r   bfloat16r	   r   r   r   r   r   s    r   swig_ptr_from_BFloat16Tensorr    ;   sh    ??77enn$$$))	$$&)9)9);a)??A Ar   c                     U R                  5       (       d   eU R                  [        R                  :X  d   SU R                  -  5       e[        R
                  " U R                  5       R                  5       U R                  5       S-  -   5      $ )r   dtype=%sr   )	r   r   r   int32r	   cast_integer_to_int_ptrr   r   r   r   s    r   swig_ptr_from_IntTensorr%   C   sv    ??77ekk!7:#77!((	$$&)9)9);a)??A Ar   c                     U R                  5       (       d   eU R                  [        R                  :X  d   SU R                  -  5       e[        R
                  " U R                  5       R                  5       U R                  5       S-  -   5      $ )r   r"      )	r   r   r   int64r	   cast_integer_to_idx_t_ptrr   r   r   r   s    r   swig_ptr_from_IndicesTensorr*   K   sv    ??77ekk!7:#77!**	$$&)9)9);a)??A Ar   c              #     #    Uc  [         R                  R                  5       n[        R                  " UR
                  5      n[         R                  R                  5       nU R                  [         R                  R                  5       5      nU R                  [         R                  R                  5       U5         Sv   U R                  X45        g! U R                  X45        f = f7f)zCreates a scoping object to make Faiss GPU use the same stream
as pytorch, based on torch.cuda.current_stream().
Or, a specific pytorch stream can be passed in as a second
argument, in which case we will use that stream.
N)	r   cudacurrent_streamr	   cast_integer_to_cudastream_tcuda_streamcurrent_devicegetDefaultStreamsetDefaultStream)respytorch_streamcuda_stream_s	prior_devprior_streams        r   using_streamr8   V   s      224 66~7Q7QRM 

))+I''

(A(A(CDL224mD6Y5Y5s   B;C*>C C*C''C*Fc                      [        X5      nUR                  SU-   :X  a  g U(       d  UR                  SU-   :X  d   e[        XS-   U5        [        XU5        g ! [         a    U(       a   g e f = f)Ntorch_replacement_replacement__numpy)getattrAttributeError__name__setattr)	the_classnamereplacementignore_missingignore_no_baseorig_methods         r   torch_replace_methodrG   p   sy    i.
 3d:: k22nt6KKLLIh4I[)  s   A A.,A.c                   ^ [         R                  4S jn[         R                  4S jnS!S jn[         R                  4S jn[         R                  4S jmS S [         R                  4U4S jjnS"U4S jjnS S S.U4S	 jjnS
 nS!S jn	S#S jn
S nS nS!S jnS!S jn[        U SU5        [        U SU5        [        U SU5        [        U SU5        [        U SU5        [        U SU5        [        U SU	5        [        U SU
5        [        U SU5        [        U SUSS9  [        U SUSS9  [        U SUSS9  [        U SU5        [        U S U5        g )$Nc                 p   [        U5      [        R                  L a  U R                  U5      $ [        U5      [        R
                  L d   eUR                  u  p4X@R                  :X  d   eU[        R                  :X  a  [        U5      nO+U[        R                  :X  a  [        U5      nO[        S5      eUR                  (       aM  [        U S5      (       d   S5       e[!        U R#                  5       5         U R%                  X5U5        S S S 5        g U R%                  X5U5        g ! , (       d  f       g = fN;numeric type must be either faiss.Float32 or faiss.Float16 	getDevice#GPU tensor on CPU index not allowed)typenpndarray	add_numpyr   Tensorshapedr	   Float32r   Float16r   
ValueErroris_cudahasattrr8   getResourcesaddExselfr   numeric_typenrT   x_ptrs         r   torch_replacement_add1handle_torch_Index.<locals>.torch_replacement_add   s    7bjj >>!$$Aw%,,&&&wwFF{{5==(-a0EU]]*,Q/EZ[[ 994--T/TT- d//12

1\2 32 JJq.	 32   8D''
D5c                    [        U5      [        R                  L a  U R                  X5      $ [        U5      [        R
                  L d   eUR                  u  pEXPR                  :X  d   eU[        R                  :X  a  [        U5      nO+U[        R                  :X  a  [        U5      nO[        S5      e[        U5      [        R
                  L d   eUR                  U4:X  d   S5       e[        U5      nUR                  (       aM  [!        U S5      (       d   S5       e[#        U R%                  5       5         U R'                  XFX75        S S S 5        g U R'                  XFX75        g ! , (       d  f       g = f)NrK   z!not same number of vectors as idsrL   rM   )rN   rO   rP   add_with_ids_numpyr   rR   rS   rT   r	   rU   r   rV   r   rW   r*   rX   rY   r8   rZ   add_with_idsEx)r]   r   idsr^   r_   rT   r`   ids_ptrs           r   torch_replacement_add_with_ids:handle_torch_Index.<locals>.torch_replacement_add_with_ids   s*   7bjj **122Aw%,,&&&wwFF{{5==(-a0EU]]*,Q/EZ[[CyELL(((yyQE!F#FF!-c2994--T/TT- d//12##AlD 32 ,@	 32s   9E((
E6c                    [        U5      [        R                  L a  U R                  XU5      $ [        U5      [        R
                  L d   eUR                  u  pEXPR                  :X  d   e[        U5      nUc/  [        R                  " XBUR                  [        R                  S9nO1[        U5      [        R
                  L d   eUR                  XB4:X  d   e[        U5      nUR                  (       aN  [        U S5      (       d   S5       e[        U R!                  5       5         U R#                  XFXr5        S S S 5        U$ U R#                  XFXr5        U$ ! , (       d  f       U$ = f)Ndevicer   rL   rM   )rN   rO   rP   assign_numpyr   rR   rS   rT   r   emptyrm   r(   r*   rX   rY   r8   rZ   assign_c)r]   r   klabelsr_   rT   r`   L_ptrs           r   torch_replacement_assign4handle_torch_Index.<locals>.torch_replacement_assign   s#   7bjj $$Q622Aw%,,&&&wwFF{{)!,>[[ahhekkJF<5<<///<<A6)))+F3994--T/TT- d//12a1 3  MM!E- 32 s   'E
E'c                 p   [        U5      [        R                  L a  U R                  U5      $ [        U5      [        R
                  L d   eUR                  u  p4X@R                  :X  d   eU[        R                  :X  a  [        U5      nO+U[        R                  :X  a  [        U5      nO[        S5      eUR                  (       aM  [        U S5      (       d   S5       e[!        U R#                  5       5         U R%                  X5U5        S S S 5        g U R%                  X5U5        g ! , (       d  f       g = frJ   )rN   rO   rP   train_numpyr   rR   rS   rT   r	   rU   r   rV   r   rW   rX   rY   r8   rZ   trainExr\   s         r   torch_replacement_train3handle_torch_Index.<locals>.torch_replacement_train   s    7bjj ##A&&Aw%,,&&&wwFF{{5==(-a0EU]]*,Q/EZ[[994--T/TT- d//12Q|4 32 LL<0	 32rc   c                 v   U R                   u  pVU[        R                  :X  a  [        U 5      nO+U[        R                  :X  a  [        U 5      nO[        S5      eUc/  [        R                  " XQU R                  [        R                  S9nO1[        U5      [        R                  L d   eUR                   XQ4:X  d   e[        U5      nUc/  [        R                  " XQU R                  [        R                  S9nO1[        U5      [        R                  L d   eUR                   XQ4:X  d   e[        U5      n	XxXU4$ )NrK   rl   )rS   r	   rU   r   rV   r   rW   r   ro   rm   r   rN   rR   r(   r*   )
r   rq   DIr^   r_   rT   r`   D_ptrI_ptrs
             r   search_methods_common1handle_torch_Index.<locals>.search_methods_common   s    ww5==(-a0EU]]*,Q/EZ[[9AGA7ell***77qf$$$)!,9AEA7ell***77qf$$$+A.Uq((r   c           	        > [        U5      [        R                  L a  U R                  XX4S9$ [        U5      [        R
                  L d   eUR                  u  pgXpR                  :X  d   eT" XX45      u  ppnUR                  (       aP  [        U S5      (       d   S5       e[        U R                  5       5         U R                  XhXRX5        S S S 5        X44$ U R                  XhXRX5        X44$ ! , (       d  f       X44$ = f)Nr|   r}   rL   rM   )rN   rO   rP   search_numpyr   rR   rS   rT   rX   rY   r8   rZ   searchEx)r]   r   rq   r|   r}   r^   r_   rT   r`   r~   r   r   s              r   torch_replacement_search4handle_torch_Index.<locals>.torch_replacement_search  s    7bjj $$QQ$44Aw%,,&&&wwFF{{$9!$E!e994--T/TT- d//12aF 3 t MM!LUBt 32 ts   :C//
C?c           	        > [        U5      [        R                  L a  U R                  XX4US9$ [        U5      [        R
                  L d   eUR                  u  pgXpR                  :X  d   eT" XX45      u  ppnUc/  [        R                  " XbXqR                  [        R                  S9nO2[        U5      [        R
                  L d   eUR                  XbU4:X  d   e[        U5      nUR                  (       aN  [        U S5      (       d   S5       e[        U R                  5       5         U R!                  XhX)X5        S S S 5        OU R!                  XhX)X5        X4U4$ ! , (       d  f       N= f)N)r|   r}   Rrl   rL   rM   )rN   rO   rP   search_and_reconstruct_numpyr   rR   rS   rT   ro   rm   r   r   rX   rY   r8   rZ   search_and_reconstruct_c)r]   r   rq   r|   r}   r   r_   rT   r`   r~   r   R_ptrr   s               r   (torch_replacement_search_and_reconstructDhandle_torch_Index.<locals>.torch_replacement_search_and_reconstruct#  s5   7bjj 44QQq4IIAw%,,&&&wwFF{{$9!$E!e9A!HHEMMJA7ell***77qQi''')!,994--T/TT- d//12--a%O 32 ))!AeKQw 32s   *E
E,r   c                  > [        U5      [        R                  L a  U R                  XX4XVS9$ [        U5      [        R
                  L d   eUR                  u  pxXR                  :X  d   eT" XXV5      u  ppnUR                  XpR                  4:X  d   eUR                  5       n[        U5      nUb8  UR                  5       nUR                  UR                  :X  d   e[        U5      nOS nUR                  (       aR  [        U S5      (       d   S5       e[        U R                  5       5         U R!                  XyX,XUS5        S S S 5        XV4$ U R!                  XyX,XUS5        XV4$ ! , (       d  f       XV4$ = f)Nr   rL   rM   F)rN   rO   rP   search_preassigned_numpyr   rR   rS   rT   nprobe
contiguousr*   r   rX   rY   r8   rZ   search_preassigned_c)r]   r   rq   IqDqr|   r}   r_   rT   r`   r~   r   Iq_ptrDq_ptrr   s                 r   $torch_replacement_search_preassigned@handle_torch_Index.<locals>.torch_replacement_search_preassignedA  sZ   7bjj 00r0HHAw%,,&&&wwFF{{$9!$E!exxA{{++++]]_,R0>B88rxx'''.r2FF994--T/TT- d//12))!AveUZ[ 3 t %%a6%QVWt 32 ts   0E))
E9c                 j    [        U5      [        R                  Ld   S5       eU R                  U5      $ )Nz(remove_ids not yet implemented for torch)rN   r   rR   remove_ids_numpy)r]   r   s     r   torch_replacement_remove_ids8handle_torch_Index.<locals>.torch_replacement_remove_idsc  s/    Awell*V,VV*$$Q''r   c                    Ub-  [        U5      [        R                  L a  U R                  X5      $ [        R
                  " S5      n[        U S5      (       a%  [        R
                  " SU R                  5       5      nUc/  [        R                  " U R                  U[        R                  S9nO;[        U5      [        R                  L d   eUR                  U R                  4:X  d   e[        U5      nUR                  (       aM  [        U S5      (       d   S5       e[        U R!                  5       5         U R#                  X5        S S S 5        U$ U R#                  X5        U$ ! , (       d  f       U$ = f)NcpurL   r,   rl   rM   )rN   rO   rP   reconstruct_numpyr   rm   rY   rL   ro   rT   r   rR   rS   r   rX   r8   rZ   reconstruct_c)r]   keyr   rm   r`   s        r   torch_replacement_reconstruct9handle_torch_Index.<locals>.torch_replacement_reconstructh  s&    MQ2:: 5))#11 e$4%%\\&$..*:;F9DFF6GA7ell***77tvvj((()!,994--T/TT- d//12""3. 3  s* 32 s   7E&&
E5c                    US:X  a  U R                   nUb.  [        U5      [        R                  L a  U R	                  XU5      $ [
        R                  " S5      n[        U S5      (       a%  [
        R                  " SU R                  5       5      nUc/  [
        R                  " X R                  U[
        R                  S9nO;[        U5      [
        R                  L d   eUR                  X R                  4:X  d   e[        U5      nUR                  (       aN  [        U S5      (       d   S5       e[!        U R#                  5       5         U R%                  XU5        S S S 5        U$ U R%                  XU5        U$ ! , (       d  f       U$ = f)Nr   rL   r,   rl   rM   )ntotalrN   rO   rP   reconstruct_n_numpyr   rm   rY   rL   ro   rT   r   rR   rS   r   rX   r8   rZ   reconstruct_n_c)r]   n0nir   rm   r`   s         r   torch_replacement_reconstruct_n;handle_torch_Index.<locals>.torch_replacement_reconstruct_n  s<   8B
 MQ2:: 5++BA66 e$4%%\\&$..*:;F9BvU]]KA7ell***77r66l***)!,994--T/TT- d//12$$RU3 3    / 32 s   
E;;
F
c                 Z   [        U5      [        R                  L a  U R                  X5      $ [        U5      [        R
                  L d   eUR                  u  n[        U5      n[        U5      [        R
                  L d   eUR                  X0R                  4:X  d   e[        U5      nUR                  (       aM  [        U S5      (       d   S5       e[        U R                  5       5         U R                  X4U5        S S S 5        g U R                  X4U5        g ! , (       d  f       g = f)NrL   rM   )rN   rO   rP   update_vectors_numpyr   rR   rS   r*   rT   r   rX   rY   r8   rZ   update_vectors_c)r]   keysr   r_   keys_ptrr`   s         r    torch_replacement_update_vectors<handle_torch_Index.<locals>.torch_replacement_update_vectors  s    :#,,T55DzU\\)))

.t4Aw%,,&&&ww1ff+%%%)!,994--T/TT- d//12%%a59 32 !!!u5	 32s   -D
D*c                 v   [        U5      [        R                  L a  U R                  X5      $ [        U5      [        R
                  L d   eUR                  u  p4X@R                  :X  d   e[        U5      nUR                  (       a   S5       e[        U S5      (       a   S5       e[        R                  " U5      nU R                  X5X&5        [        R                  " [        R                  " UR                   US-   5      R#                  5       R%                  S5      5      n['        US   5      n[        R                  " [        R                  " UR(                  U5      R#                  5       5      n	[        R                  " [        R                  " UR*                  U5      R#                  5       5      n
XyU
4$ )Nz1Range search using GPU tensor not yet implementedrL   z-Range search on GPU index not yet implemented   r(   r   )rN   rO   rP   range_search_numpyr   rR   rS   rT   r   rX   rY   r	   RangeSearchResultrange_search_c
from_numpyrev_swig_ptrlimscopyastypeint	distancesrr   )r]   r   threshr_   rT   r`   r3   r   ndr|   r}   s              r   torch_replacement_range_search:handle_torch_Index.<locals>.torch_replacement_range_search  sN   7bjj **155Aw%,,&&&wwFF{{)!,99QQQ}4--^/^^-%%a(Af2  2 2388QU C H H J Q QRY Z[b]U//rBGGIJU//

B?DDFGzr   c                    [        U5      [        R                  L a  U R                  X5      $ [        U5      [        R
                  L d   eUR                  u  p4X@R                  :X  d   e[        U5      nUc2  [        R                  " X0R                  5       [        R                  S9nO!UR                  X0R                  5       4:X  d   e[        U5      nUR                  (       aN  [        U S5      (       d   S5       e[        U R!                  5       5         U R#                  X5U5        S S S 5        U$ U R#                  X5U5        U$ ! , (       d  f       U$ = fN)r   rL   rM   )rN   rO   rP   sa_encode_numpyr   rR   rS   rT   r   ro   sa_code_sizer   r   rX   rY   r8   rZ   sa_encode_c)r]   r   codesr_   rT   r`   	codes_ptrs          r   torch_replacement_sa_encode7handle_torch_Index.<locals>.torch_replacement_sa_encode  s   7bjj ''11Aw%,,&&&wwFF{{)!,=KK#4#4#6ekkJE;;1&7&7&9"::::-e4	994--T/TT- d//12  95 3  Qy1 32 s   E


Ec                    [        U5      [        R                  L a  U R                  X5      $ [        U5      [        R
                  L d   eUR                  u  p4X@R                  5       :X  d   e[        U5      nUc.  [        R                  " X0R                  [        R                  S9nO;[        U5      [        R
                  L d   eUR                  X0R                  4:X  d   e[        U5      nUR                  (       aN  [        U S5      (       d   S5       e[        U R!                  5       5         U R#                  X5U5        S S S 5        U$ U R#                  X5U5        U$ ! , (       d  f       U$ = fr   )rN   rO   rP   sa_decode_numpyr   rR   rS   r   r   ro   rT   r   r   rX   rY   r8   rZ   sa_decode_c)r]   r   r   r_   csr   r`   s          r   torch_replacement_sa_decode7handle_torch_Index.<locals>.torch_replacement_sa_decode  s.   ;"**$''11E{ell***&&((((-e4	9AvvU]];A7ell***77q&&k))))!,==4--T/TT- d//12  u5 3  Q51 32 s   3E$$
E3addadd_with_idsassigntrainsearch
remove_idsreconstructreconstruct_nrange_searchupdate_vectorsT)rD   search_and_reconstructsearch_preassigned	sa_encode	sa_decodeN)NNN)r   r   N)r	   rU   rG   )rA   ra   ri   rt   ry   r   r   r   r   r   r   r   r   r   r   r   s                  @r   handle_torch_Indexr      s\   6;mm /4 EJMM A:: 9> 12 8=}} )2 04t%-- .< GKd    D(
 D#J6268< E+@AN4RSH.FGG-DEH.FGL2NOM3PQO5TUN4RS$46V(,.$<ARVX$8<TSK1LMK1LMr   r	   c                    [        U5      [        R                  L a  [        R                  " XX#US9$ UR                  5       u  pVUR                  5       (       d   eUR                  [        R                  :X  d   eUR                  (       a   S5       eU R                  5       u  pxX:X  d   eU R                  5       (       d   eU R                  [        R                  :X  d   eU R                  (       a   S5       e[        R                  " XrUR                  [        R                  S9n	[        R                  " XrUR                  [        R                  S9n
[        U
5      n[        U	5      n[        U5      n[        U 5      nU[        R                   :X  a  [        R"                  " XXgXRX5        X4$ U[        R$                  :X  a  [        R&                  " XXgXRX5        X4$ [        R(                  " XXgXSXBX5
        X4$ )N)metric
metric_argzuse knn_gpu for GPU tensorsrl   )rN   rO   rP   r	   	knn_numpysizer   r   r   r   rX   ro   rm   r(   r*   r   	METRIC_L2	knn_L2sqrMETRIC_INNER_PRODUCTknn_inner_productknn_extra_metrics)xqxbrq   r   r   nbrT   nqd2r|   r}   r   r~   xb_ptrxq_ptrs                  r   torch_replacement_knnr   ;  s   Bx2::rqJOOGGIEB88u}}$$$zz888>WWYFB7N788u}}$$$zz888>B"))5==AAB"))5;;?A'*E%a(E&r*F&r*F 2%	
 4K 
5--	-2%	
 4K 	2ze	

 4Kr   knnTr   c	           
      &	   [        U5      [        R                  L a  [        R                  " XX#XEXg5      $ UR                  5       u  pUR                  5       (       a  SnOAUR                  5       R                  5       (       a  UR                  5       nSnO[        S5      eUR                  [        R                  :X  a  [        R                  n[        U5      nOUR                  [        R                  :X  a  [        R                  n[!        U5      nOEUR                  [        R"                  :X  a  [        R$                  n['        U5      nO[        S5      eUR                  5       u  pX:X  d   eUR                  5       (       a  SnOAUR                  5       R                  5       (       a  UR                  5       nSnO[        S5      eUR                  [        R                  :X  a  [        R                  n[        U5      nOUR                  [        R                  :X  a  [        R                  n[!        U5      nOEUR                  [        R"                  :X  a  [        R$                  n['        U5      nO[        S5      eUc/  [        R(                  " XUR*                  [        R                  S9nO3UR,                  X4:X  d   eUR                  [        R                  :X  d   eUc/  [        R(                  " XUR*                  [        R.                  S9nOUR,                  X4:X  d   eUR                  [        R.                  :X  a  [        R0                  n[3        U5      nOYUR                  UR                  s=:X  a  [        R4                  :X  a  O  O[        R6                  n[9        U5      nO[        S5      e[        U5      n[        R:                  " 5       nUUl        UUl        U
Ul         UUl!        UUl"        UUl#        U	Ul$        UUl%        UUl&        UUl'        UUl(        UUl)        UUl*        UUl+        UUl        UUl,        [[        U 5         [        R\                  " U U5        S S S 5        XE4$ ! , (       d  f       XE4$ = f)NTFz$matrix should be row or column-majorz'xq must be float32, float16 or bfloat16rl   zI must be i64 or i32)/rN   rO   rP   r	   knn_gpu_numpyr   r   t	TypeErrorr   r   r   DistanceDataType_F32r   r   DistanceDataType_F16r   r   DistanceDataType_BF16r    ro   rm   rS   r(   IndicesDataType_I64r*   r#   IndicesDataType_I32r%   GpuDistanceParamsr   rq   dimsvectorsvectorsRowMajor
vectorType
numVectorsqueriesqueriesRowMajor	queryType
numQueriesoutDistances
outIndicesoutIndicesTypeuse_cuvsr8   bfKnn)r3   r   r   rq   r|   r}   r   rm   r  r   rT   xb_row_majorxb_typer   r   r   xq_row_majorxq_typer   I_typer   r~   argss                          r   torch_replacement_knn_gpur  i  si   Bx2::""3B1HHGGIEB						TTV>??	xx5== ,,*2.	U]]	",,)"-	U^^	#---b1ABBWWYFB7N7						TTV>??	xx5== ,,*2.	U]]	",,)"-	U^^	#---b1ABByKKbiiu}}Eww2'!!!5==()(yKKbiiu{{Cww2'!!!ww%++**+A.	
AGG	*u{{	***'*.//%a(E""$DDKDFDIDL'DDODODL'DDNDODDO DDKDM	c	C 
 4K 
	 4Ks   R  
Rknn_gpuc                 ^   [        U5      [        R                  L a  [        R                  " XX#U5      $ UR                  5       u  pgUR                  5       (       a  SnOAUR                  5       R                  5       (       a  UR                  5       nSnO[        S5      eUR                  [        R                  :X  a  [        R                  n	[        U5      n
OEUR                  [        R                  :X  a  [        R                  n	[!        U5      n
O[        S5      eUR                  5       u  pX:X  d   eUR                  5       (       a  SnOAUR                  5       R                  5       (       a  UR                  5       nSnO[        S5      eUR                  [        R                  :X  a  [        R                  n[        U5      nOEUR                  [        R                  :X  a  [        R                  n[!        U5      nO[        S5      eUc/  [        R"                  " XUR$                  [        R                  S9nO3UR&                  X4:X  d   eUR                  [        R                  :X  d   e[        U5      n[        R(                  " 5       nUUl        SUl        UUl        U
Ul        UUl        U	Ul        UUl        UUl        UUl        UUl        UUl        UUl         UUl        [C        U 5         [        RD                  " U U5        S S S 5        U$ ! , (       d  f       U$ = f)	NTFz'xb matrix should be row or column-majorzxb must be float32 or float16z'xq matrix should be row or column-majorzxq must be float32 or float16rl   r   )#rN   rO   rP   r	   pairwise_distance_gpu_numpyr   r   r   r   r   r   r   r   r   r   r   r   ro   rm   rS   r   r   rq   r  r  r  r  r  r  r  r  r	  r
  r8   r  )r3   r   r   r|   r   rm   r   rT   r  r  r   r   r   r  r  r   r~   r  s                     r   'torch_replacement_pairwise_distance_gpur    sq   Bx2::00"HHGGIEB						TTVABB	xx5== ,,*2.	U]]	",,)"-788WWYFB7N7						TTVABB	xx5== ,,*2.	U]]	",,)"-788yKKryyFww2("""5==()(%a(E""$DDKDFDIDL'DDODODL'DDNDODDK	c	C 
 H 
	 Hs   ;L
L,pairwise_distance_gpur   )FF) __doc__r	   r   
contextlibinspectsysnumpyrO   r   r   r   r    r%   r*   contextmanagerr8   rG   r   modulesfaiss_moduledirsymbolr=   objisclassrA   
issubclassIndexr   r   r  r   r   r   <module>r*     sE  $     
 =AAAAA 6 64 ?D**hNT {{7# ,F
,
'Cs	i--y)   -2OO 'T \5*?t L 15U__]_jo \| \9.Gt T <@`b EN \#:<ceiko pr   