
    rhm                        d Z ddlZddlZddlZddlZddlZddlZd Zd Z	d Z
d Zd Zd Zej                  dd	       Z	 ddZd Zej$                  d   Z ee      D ]<  Z eee      Z ej0                  e      seZ eeej6                        s5 ee       > ej8                  dfdZ eededd       ddej8                  dd
fdZ eededd       dej8                  dfdZ eededd       y)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                     | j                         sJ | j                  t        j                  k(  sJ t	        j
                  | j                         j                         | j                         z         S )A 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    l/var/www/html/ai-insurance-compliance-backend/venv/lib/python3.12/site-packages/faiss/contrib/torch_utils.pyswig_ptr_from_UInt8Tensorr   #   s^    ??77ekk!!!**	$$&)9)9);;= =    c                     | j                         sJ | j                  t        j                  k(  sJ t	        j
                  | j                         j                         | j                         dz  z         S r      )	r   r   r   float16r	   cast_integer_to_void_ptrr   r   r   r   s    r   swig_ptr_from_HalfTensorr   +   se    ??77emm###))	$$&)9)9);a)??A Ar   c                     | j                         sJ | j                  t        j                  k(  sJ t	        j
                  | j                         j                         | j                         dz  z         S )r      )	r   r   r   float32r	   cast_integer_to_float_ptrr   r   r   r   s    r   swig_ptr_from_FloatTensorr   4   se    ??77emm###**	$$&)9)9);a)??A Ar   c                     | j                         sJ | j                  t        j                  k(  sJ t	        j
                  | j                         j                         | j                         dz  z         S r   )	r   r   r   bfloat16r	   r   r   r   r   r   s    r   swig_ptr_from_BFloat16Tensorr    ;   se    ??77enn$$$))	$$&)9)9);a)??A Ar   c                    | j                         sJ | j                  t        j                  k(  sJ d| j                  z         t	        j
                  | j                         j                         | j                         dz  z         S )r   dtype=%sr   )	r   r   r   int32r	   cast_integer_to_int_ptrr   r   r   r   s    r   swig_ptr_from_IntTensorr%   C   ss    ??77ekk!7:#77!((	$$&)9)9);a)??A Ar   c                    | j                         sJ | j                  t        j                  k(  sJ d| j                  z         t	        j
                  | j                         j                         | j                         dz  z         S )r   r"      )	r   r   r   int64r	   cast_integer_to_idx_t_ptrr   r   r   r   s    r   swig_ptr_from_IndicesTensorr*   K   ss    ??77ekk!7:#77!**	$$&)9)9);a)??A Ar   c              #     K   |t         j                  j                         }t        j                  |j
                        }t         j                  j                         }| j                  t         j                  j                               }| j                  t         j                  j                         |       	 d | j                  ||       y# | j                  ||       w xY ww)z Creates 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   B9C*<C  C*C''C*Fc                     	 t        | |      }|j                  d|z   k(  ry |s|j                  d|z   k(  sJ t        | |dz   |       t        | ||       y # t        $ r |rY y  w xY w)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   s    i.
 3d:: k22nt6KKLLIth4It[)  s   A A$"A$c                    t         j                  fd}t         j                  fd}d!d}t         j                  fd}t         j                  fdd d t         j                  ffd	}d"fd	}d d dfd	
}d
 }d!d}	d#d}
d }d }d!d}d!d}t        | d|       t        | d|       t        | d|       t        | d|       t        | d|       t        | d|       t        | d|	       t        | d|
       t        | d|       t        | d|d       t        | d|d       t        | d|d       t        | d|       t        | d |       y )$Nc                 P   t        |      t        j                  u r| j                  |      S t        |      t        j
                  u sJ |j                  \  }}|| j                  k(  sJ |t        j                  k(  rt        |      }n*|t        j                  k(  rt        |      }nt        d      |j                  rIt        | d      sJ d       t!        | j#                               5  | j%                  |||       d d d        y | j%                  |||       y # 1 sw Y   y xY w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_addz1handle_torch_Index.<locals>.torch_replacement_add   s    7bjj >>!$$Aw%,,&&&ww1DFF{{5==(-a0EU]]*,Q/EZ[[ 994-T/TT- d//12 3

1e\23 3 JJq%.	3 3   +DD%c                    t        |      t        j                  u r| j                  ||      S t        |      t        j
                  u sJ |j                  \  }}|| j                  k(  sJ |t        j                  k(  rt        |      }n*|t        j                  k(  rt        |      }nt        d      t        |      t        j
                  u sJ |j                  |fk(  sJ d       t        |      }|j                  rJt!        | d      sJ d       t#        | j%                               5  | j'                  ||||       d d d        y | j'                  ||||       y # 1 sw Y   y xY w)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_idsz:handle_torch_Index.<locals>.torch_replacement_add_with_ids   sC   7bjj **1c22Aw%,,&&&ww1DFF{{5==(-a0EU]]*,Q/EZ[[CyELL(((yyQE!F#FF!-c2994-T/TT- d//12 E##AulGDE E 5,@	E Es   +EE'c                    t        |      t        j                  u r| j                  |||      S t        |      t        j
                  u sJ |j                  \  }}|| j                  k(  sJ t        |      }|2t	        j                  |||j                  t        j                        }n0t        |      t        j
                  u sJ |j                  ||fk(  sJ t        |      }|j                  rKt        | d      sJ d       t        | j!                               5  | j#                  ||||       d d d        |S | j#                  ||||       |S # 1 sw Y   |S xY w)Ndevicer   rL   rM   )rN   rO   rP   assign_numpyr   rR   rS   rT   r   emptyrk   r(   r*   rX   rY   r8   rZ   assign_c)r]   r   klabelsr_   rT   r`   L_ptrs           r   torch_replacement_assignz4handle_torch_Index.<locals>.torch_replacement_assign   s4   7bjj $$Q622Aw%,,&&&ww1DFF{{)!,>[[AahhekkJF<5<<///<<Aq6)))+F3994-T/TT- d//12 2aq12  MM!UE1-2 s   EEc                 P   t        |      t        j                  u r| j                  |      S t        |      t        j
                  u sJ |j                  \  }}|| j                  k(  sJ |t        j                  k(  rt        |      }n*|t        j                  k(  rt        |      }nt        d      |j                  rIt        | d      sJ d       t!        | j#                               5  | j%                  |||       d d d        y | j%                  |||       y # 1 sw Y   y xY wrJ   )rN   rO   rP   train_numpyr   rR   rS   rT   r	   rU   r   rV   r   rW   rX   rY   r8   rZ   trainExr\   s         r   torch_replacement_trainz3handle_torch_Index.<locals>.torch_replacement_train   s    7bjj ##A&&Aw%,,&&&ww1DFF{{5==(-a0EU]]*,Q/EZ[[994-T/TT- d//12 5Q|45 5 LLE<0	5 5rb   c                 |   | j                   \  }}|t        j                  k(  rt        |       }n*|t        j                  k(  rt        |       }nt        d      |2t        j                  ||| j                  t        j                        }n0t        |      t        j                  u sJ |j                   ||fk(  sJ t        |      }|2t        j                  ||| j                  t        j                        }n0t        |      t        j                  u sJ |j                   ||fk(  sJ t        |      }	|||	||fS )NrK   rj   )rS   r	   rU   r   rV   r   rW   r   rm   rk   r   rN   rR   r(   r*   )
r   ro   DIr^   r_   rT   r`   D_ptrI_ptrs
             r   search_methods_commonz1handle_torch_Index.<locals>.search_methods_common   s   ww15==(-a0EU]]*,Q/EZ[[9AqGA7ell***77q!f$$$)!,9AqEA7ell***77q!f$$$+A.eUAq((r   c           	         t        |      t        j                  u r| j                  ||||      S t        |      t        j
                  u sJ |j                  \  }}|| j                  k(  sJ  ||||      \  }}	}
}}|j                  rOt        | d      sJ d       t        | j                               5  | j                  |||||	|
       d d d        ||fS | j                  |||||	|
       ||fS # 1 sw Y   ||fS xY w)Nrx   ry   rL   rM   )rN   rO   rP   search_numpyr   rR   rS   rT   rX   rY   r8   rZ   searchEx)r]   r   ro   rx   ry   r^   r_   rT   r`   rz   r{   r|   s              r   torch_replacement_searchz4handle_torch_Index.<locals>.torch_replacement_search  s   7bjj $$QQ!$44Aw%,,&&&ww1DFF{{$9!Q1$E!ueQ994-T/TT- d//12 GaaFG !t MM!UL!UEB!tG !ts   8C55Dc           	         t        |      t        j                  u r| j                  |||||      S t        |      t        j
                  u sJ |j                  \  }}|| j                  k(  sJ  ||||      \  }}	}
}}|3t	        j                  ||||j                  t        j                        }n1t        |      t        j
                  u sJ |j                  |||fk(  sJ t        |      }|j                  rLt        | d      sJ d       t        | j                               5  | j!                  ||||	|
|       d d d        n| j!                  ||||	|
|       |||fS # 1 sw Y   xY w)N)rx   ry   Rrj   rL   rM   )rN   rO   rP   search_and_reconstruct_numpyr   rR   rS   rT   rm   rk   r   r   rX   rY   r8   rZ   search_and_reconstruct_c)r]   r   ro   rx   ry   r   r_   rT   r`   rz   r{   R_ptrr|   s               r   (torch_replacement_search_and_reconstructzDhandle_torch_Index.<locals>.torch_replacement_search_and_reconstruct#  sd   7bjj 44QQ!q4IIAw%,,&&&ww1DFF{{$9!Q1$E!ueQ9Aq!AHHEMMJA7ell***77q!Qi''')!,994-T/TT- d//12 P--a5%OP P ))!UAueUK!QwP Ps   *E%%E.r~   c                   t        |      t        j                  u r| j                  ||||||      S t        |      t        j
                  u sJ |j                  \  }}|| j                  k(  sJ  ||||      \  }	}
}}}|j                  || j                  fk(  sJ |j                         }t        |      }|7|j                         }|j                  |j                  k(  sJ t        |      }nd }|j                  rQt        | d      sJ d       t        | j                               5  | j!                  ||	||||
|d       d d d        ||fS | j!                  ||	||||
|d       ||fS # 1 sw Y   ||fS xY w)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   ro   IqDqrx   ry   r_   rT   r`   rz   r{   Iq_ptrDq_ptrr|   s                 r   $torch_replacement_search_preassignedz@handle_torch_Index.<locals>.torch_replacement_search_preassignedA  s   7bjj 00Ar2a0HHAw%,,&&&ww1DFF{{$9!Q1$E!ueQxxAt{{++++]]_,R0>B88rxx'''.r2FF994-T/TT- d//12 \))!UAvvueUZ[\ !t %%a665%QVW!t\ !ts   -E..E:c                 h    t        |      t        j                  usJ d       | j                  |      S )Nz(remove_ids not yet implemented for torch)rN   r   rR   remove_ids_numpy)r]   r   s     r   torch_replacement_remove_idsz8handle_torch_Index.<locals>.torch_replacement_remove_idsc  s/    Awell*V,VV*$$Q''r   c                    |-t        |      t        j                  u r| j                  ||      S t	        j
                  d      }t        | d      r$t	        j
                  d| j                               }|1t	        j                  | j                  |t        j                        }n9t        |      t        j                  u sJ |j                  | j                  fk(  sJ t        |      }|j                  rIt        | d      sJ d       t        | j!                               5  | j#                  ||       d d d        |S | j#                  ||       |S # 1 sw Y   |S xY w)NcpurL   r,   rj   rM   )rN   rO   rP   reconstruct_numpyr   rk   rY   rL   rm   rT   r   rR   rS   r   rX   r8   rZ   reconstruct_c)r]   keyr   rk   r`   s        r   torch_replacement_reconstructz9handle_torch_Index.<locals>.torch_replacement_reconstructh  s(    MQ2:: 5))#q11 e$4%\\&$..*:;F9DFF6GA7ell***77tvvj((()!,994-T/TT- d//12 /""3./  sE*/ s   $EEc                    |dk(  r| j                   }|.t        |      t        j                  u r| j	                  |||      S t        j                  d      }t        | d      r$t        j                  d| j                               }|2t        j                  || j                  |t
        j                        }n:t        |      t
        j                  u sJ |j                  || j                  fk(  sJ t        |      }|j                  rJt        | d      sJ d       t!        | j#                               5  | j%                  |||       d d d        |S | j%                  |||       |S # 1 sw Y   |S xY w)Nr   rL   r,   rj   rM   )ntotalrN   rO   rP   reconstruct_n_numpyr   rk   rY   rL   rm   rT   r   rR   rS   r   rX   r8   rZ   reconstruct_n_c)r]   n0nir   rk   r`   s         r   torch_replacement_reconstruct_nz;handle_torch_Index.<locals>.torch_replacement_reconstruct_n  sB   8B
 MQ2:: 5++BA66 e$4%\\&$..*:;F9BvU]]KA7ell***77r466l***)!,994-T/TT- d//12 4$$RU34    R/4 s   8E++E5c                 <   t        |      t        j                  u r| j                  ||      S t        |      t        j
                  u sJ |j                  \  }t        |      }t        |      t        j
                  u sJ |j                  || j                  fk(  sJ t        |      }|j                  rIt        | d      sJ d       t        | j                               5  | j                  |||       d d d        y | j                  |||       y # 1 sw Y   y xY w)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_vectorsz<handle_torch_Index.<locals>.torch_replacement_update_vectors  s    :#,,T155DzU\\)))

.t4Aw%,,&&&ww1dff+%%%)!,994-T/TT- d//12 :%%a59: : !!!Xu5	: :s   !DDc                 Z   t        |      t        j                  u r| j                  ||      S t        |      t        j
                  u sJ |j                  \  }}|| j                  k(  sJ t        |      }|j                  rJ d       t        | d      rJ d       t        j                  |      }| j                  ||||       t	        j                  t        j                  |j                   |dz         j#                         j%                  d            }t'        |d         }t	        j                  t        j                  |j(                  |      j#                               }	t	        j                  t        j                  |j*                  |      j#                               }
||	|
fS )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	distancesrp   )r]   r   threshr_   rT   r`   r3   r   ndrx   ry   s              r   torch_replacement_range_searchz:handle_torch_Index.<locals>.torch_replacement_range_search  sW   7bjj **1f55Aw%,,&&&ww1DFF{{)!,99QQQ}4-^/^^-%%a(Aufc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Qzr   c                    t        |      t        j                  u r| j                  ||      S t        |      t        j
                  u sJ |j                  \  }}|| j                  k(  sJ t        |      }|5t	        j                  || j                         t        j                        }n!|j                  || j                         fk(  sJ t        |      }|j                  rJt        | d      sJ d       t        | j!                               5  | j#                  |||       d d d        |S | j#                  |||       |S # 1 sw Y   |S xY wN)r   rL   rM   )rN   rO   rP   sa_encode_numpyr   rR   rS   rT   r   rm   sa_code_sizer   r   rX   rY   r8   rZ   sa_encode_c)r]   r   codesr_   rT   r`   	codes_ptrs          r   torch_replacement_sa_encodez7handle_torch_Index.<locals>.torch_replacement_sa_encode  s)   7bjj ''511Aw%,,&&&ww1DFF{{)!,=KK4#4#4#6ekkJE;;1d&7&7&9"::::-e4	994-T/TT- d//12 6  E956  Qy16 s   EEc                    t        |      t        j                  u r| j                  ||      S t        |      t        j
                  u sJ |j                  \  }}|| j                         k(  sJ t        |      }|1t	        j                  || j                  t        j                        }n:t        |      t        j
                  u sJ |j                  || j                  fk(  sJ t        |      }|j                  rJt        | d      sJ d       t        | j!                               5  | j#                  |||       d d d        |S | j#                  |||       |S # 1 sw Y   |S xY wr   )rN   rO   rP   sa_decode_numpyr   rR   rS   r   r   rm   rT   r   r   rX   rY   r8   rZ   sa_decode_c)r]   r   r   r_   csr   r`   s          r   torch_replacement_sa_decodez7handle_torch_Index.<locals>.torch_replacement_sa_decode  s;   ;"**$''q11E{ell***2T&&((((-e4	9AtvvU]];A7ell***77q$&&k))))!,==4-T/TT- d//12 6  Iu56  Q	516 s   *EE'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   rh   rr   rv   r   r   r   r   r   r   r   r   r   r   r|   s                  @r   handle_torch_Indexr      sW   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                    t        |      t        j                  u rt        j                  | ||||      S |j                         \  }}|j                         sJ |j                  t        j                  k(  sJ |j                  rJ d       | j                         \  }}||k(  sJ | j                         sJ | j                  t        j                  k(  sJ | j                  rJ d       t        j                  |||j                  t        j                        }	t        j                  |||j                  t        j                        }
t        |
      }t        |	      }t        |      }t        |       }|t        j                   k(  r t        j"                  ||||||||       |	|
fS |t        j$                  k(  r t        j&                  ||||||||       |	|
fS t        j(                  ||||||||||
       |	|
fS )N)metric
metric_argzuse knn_gpu for GPU tensorsrj   )rN   rO   rP   r	   	knn_numpysizer   r   r   r   rX   rm   rk   r(   r*   r   	METRIC_L2	knn_L2sqrMETRIC_INNER_PRODUCTknn_inner_productknn_extra_metrics)xqxbro   r   r   nbrT   nqd2rx   ry   r{   rz   xb_ptrxq_ptrs                  r   torch_replacement_knnr   ;  s   Bx2::r2qJ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 Fr2q%	
 a4K 
5--	-Fr2q%	
 a4K 	Fr2vz1eU	

 a4Kr   knnTr   c	           
      	   t        |      t        j                  u rt        j                  | |||||||      S |j                         \  }	}
|j                         rd}n<|j                         j                         r|j                         }d}nt        d      |j                  t        j                  k(  rt        j                  }t        |      }n}|j                  t        j                  k(  rt        j                  }t!        |      }nD|j                  t        j"                  k(  rt        j$                  }t'        |      }nt        d      |j                         \  }}||
k(  sJ |j                         rd}n<|j                         j                         r|j                         }d}nt        d      |j                  t        j                  k(  rt        j                  }t        |      }n}|j                  t        j                  k(  rt        j                  }t!        |      }nD|j                  t        j"                  k(  rt        j$                  }t'        |      }nt        d      |2t        j(                  |||j*                  t        j                        }n2|j,                  ||fk(  sJ |j                  t        j                  k(  sJ |2t        j(                  |||j*                  t        j.                        }n|j,                  ||fk(  sJ |j                  t        j.                  k(  rt        j0                  }t3        |      }na|j                  |j                  cxk(  rt        j4                  k(  r)n t        d      t        j6                  }t9        |      }nt        d      t        |      }t        j:                         }||_        ||_        |
|_         ||_!        ||_"        ||_#        |	|_$        ||_%        ||_&        ||_'        ||_(        ||_)        ||_*        ||_+        ||_        ||_,        t[        |       5  t        j\                  | |       d d d        ||fS # 1 sw Y   ||fS xY w)NTFz$matrix should be row or column-majorz'xq must be float32, float16 or bfloat16rj   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    rm   rk   rS   r(   IndicesDataType_I64r*   r#   IndicesDataType_I32r%   GpuDistanceParamsr   ro   dimsvectorsvectorsRowMajor
vectorType
numVectorsqueriesqueriesRowMajor	queryType
numQueriesoutDistances
outIndicesoutIndicesTypeuse_cuvsr8   bfKnn)r3   r   r   ro   rx   ry   r   rk   r   r   rT   xb_row_majorxb_typer   r   r   xq_row_majorxq_typer   I_typer{   rz   argss                          r   torch_replacement_knn_gpur  i  s   Bx2::""3B1a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Abiiu}}Eww2q'!!!5==()(yKKAbiiu{{Cww2q'!!!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 a4K a4Ks   Q33Q?knn_gpuc                 &   t        |      t        j                  u rt        j                  | ||||      S |j                         \  }}|j                         rd}n<|j                         j                         r|j                         }d}nt        d      |j                  t        j                  k(  rt        j                  }	t        |      }
nD|j                  t        j                  k(  rt        j                  }	t!        |      }
nt        d      |j                         \  }}||k(  sJ |j                         rd}n<|j                         j                         r|j                         }d}nt        d      |j                  t        j                  k(  rt        j                  }t        |      }nD|j                  t        j                  k(  rt        j                  }t!        |      }nt        d      |2t        j"                  |||j$                  t        j                        }n2|j&                  ||fk(  sJ |j                  t        j                  k(  sJ t        |      }t        j(                         }||_        d|_        ||_        |
|_        ||_        |	|_        ||_        ||_        ||_        ||_        ||_        ||_         ||_        tC        |       5  t        jD                  | |       d d d        |S # 1 sw Y   |S xY w)	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 float16rj   r   )#rN   rO   rP   r	   pairwise_distance_gpu_numpyr   r   r   r   r   r   r   r   r   r   r   r   rm   rk   rS   r   r   ro   r   r   r   r   r   r   r   r   r   r   r8   r   )r3   r   r   rx   r   rk   r   rT   r   r  r   r   r   r  r  r   rz   r  s                     r   'torch_replacement_pairwise_distance_gpur
    su   Bx2::00b"a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BryyFww2r("""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     sF  $     
 =AAAAA 6 64 ?D**hNT {{7# , *F
,
'Cws	i-y)* -2OO 'T \5*?t L 15U__]_jo \| \9.Gt T <@`b EN \#:<ceiko pr   