o
    CiZ                     @   s  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d Zdd Z	dd Z
d	d
 Zdd ZejdddZ	dddZdd Zejd ZeeD ]ZeeeZeeraeZeeejraee qIddejdfddZeededd dejdfddZeededd dS )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                 C   s6   |   sJ | jtjksJ t|   |   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storagedata_ptrstorage_offsetx r   q/var/www/html/fyndo/python/python_agents/rag_suite/venv/lib/python3.10/site-packages/faiss/contrib/torch_utils.pyswig_ptr_from_UInt8Tensor   s
   r   c                 C   :   |   sJ | jtjksJ t|   |  d  S )r      )	r   r   r   float16r   cast_integer_to_void_ptrr	   r
   r   r   r   r   r   swig_ptr_from_HalfTensor&   s
   r   c                 C   r   )r      )	r   r   r   float32r   cast_integer_to_float_ptrr	   r
   r   r   r   r   r   swig_ptr_from_FloatTensor.   s
   r   c                 C   D   |   sJ | jtjksJ d| j t|   |  d  S )r   dtype=%sr   )	r   r   r   int32r   cast_integer_to_int_ptrr	   r
   r   r   r   r   r   swig_ptr_from_IntTensor5   
   r   c                 C   r   )r   r      )	r   r   r   int64r   cast_integer_to_idx_t_ptrr	   r
   r   r   r   r   r   swig_ptr_from_IndicesTensor<   r   r#   c              
   c   st    |du r
t j }t|j}t j }| t j }| t j | zdV  W | || dS | || 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_streamr   r   r   using_streamC   s   

r0   Fc                 C   sr   zt | |}W n ty   |rY d S  w |jd| krd S |s)|jd| ks)J t| |d | t| || d S )Ntorch_replacement_replacement__numpy)getattrAttributeError__name__setattr)	the_classnamereplacementignore_missingignore_no_baseorig_methodr   r   r   torch_replace_method]   s   r>   c                 C   s  dd }dd }d,dd}dd }d-d	d
}d.dd}dd }d,dd}d/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'd( t | d)|d'd( t | d*| t | d+| d S )0Nc                 S      t |tju r| |S t |tju sJ |j\}}|| jks!J t|}|j	rPt
| ds1J dt|   | || W d    d S 1 sIw   Y  d S | || d S N	getDevice#GPU tensor on CPU index not allowed)typenpndarray	add_numpyr   Tensorshapedr   is_cudahasattrr0   getResourcesadd_cselfr   nrI   x_ptrr   r   r   torch_replacement_addo      

"z1handle_torch_Index.<locals>.torch_replacement_addc                 S   s   t |tju r| ||S t |tju sJ |j\}}|| jks"J t|}t |tju s/J |j|fks9J dt	|}|j
rit| dsIJ dt|   | ||| W d    d S 1 sbw   Y  d S | ||| d S )Nz!not same number of vectors as idsrA   rB   )rC   rD   rE   add_with_ids_numpyr   rG   rH   rI   r   r#   rJ   rK   r0   rL   add_with_ids_c)rO   r   idsrP   rI   rQ   ids_ptrr   r   r   torch_replacement_add_with_ids   s   
"z:handle_torch_Index.<locals>.torch_replacement_add_with_idsc                 S   s  t |tju r| |||S t |tju sJ |j\}}|| jks#J t|}|d u r7tj	|||j
tjd}nt |tju s@J |j||fksIJ t|}|jrzt| dsYJ dt|   | |||| W d    |S 1 ssw   Y  |S | |||| |S )Ndevicer   rA   rB   )rC   rD   rE   assign_numpyr   rG   rH   rI   r   emptyrZ   r!   r#   rJ   rK   r0   rL   assign_c)rO   r   klabelsrP   rI   rQ   L_ptrr   r   r   torch_replacement_assign   s*   

z4handle_torch_Index.<locals>.torch_replacement_assignc                 S   r?   r@   )rC   rD   rE   train_numpyr   rG   rH   rI   r   rJ   rK   r0   rL   train_crN   r   r   r   torch_replacement_train   rS   z3handle_torch_Index.<locals>.torch_replacement_trainc           
      S   sh  t |tju r| j||||dS t |tju sJ |j\}}|| jks%J t|}|d u r9tj	|||j
tjd}nt |tju sBJ |j||fksKJ t|}|d u r_tj	|||j
tjd}nt |tju shJ |j||fksqJ t|}	|jrt| dsJ dt|   | |||||	 W d    ||fS 1 sw   Y  ||fS | |||||	 ||fS )N)DIrY   rA   rB   )rC   rD   rE   search_numpyr   rG   rH   rI   r   r\   rZ   r   r!   r#   rJ   rK   r0   rL   search_c)
rO   r   r^   re   rf   rP   rI   rQ   D_ptrI_ptrr   r   r   torch_replacement_search   s4   

z4handle_torch_Index.<locals>.torch_replacement_searchc              	   S   s  t |tju r| j|||||dS t |tju sJ |j\}}|| jks&J t|}|d u r:tj	|||j
tjd}nt |tju sCJ |j||fksLJ t|}	|d u r`tj	|||j
tjd}nt |tju siJ |j||fksrJ t|}
|d u rtj	||||j
tjd}nt |tju sJ |j|||fksJ t|}|jrt| dsJ dt|   | ||||	|
| W d    n1 sw   Y  n
| ||||	|
| |||fS )N)re   rf   RrY   rA   rB   )rC   rD   rE   search_and_reconstruct_numpyr   rG   rH   rI   r   r\   rZ   r   r!   r#   rJ   rK   r0   rL   search_and_reconstruct_c)rO   r   r^   re   rf   rl   rP   rI   rQ   ri   rj   R_ptrr   r   r   (torch_replacement_search_and_reconstruct   s:   

zDhandle_torch_Index.<locals>.torch_replacement_search_and_reconstructc                 S   s    t |tjusJ d| |S )Nz(remove_ids not yet implemented for torch)rC   r   rG   remove_ids_numpy)rO   r   r   r   r   torch_replacement_remove_ids  s   
z8handle_torch_Index.<locals>.torch_replacement_remove_idsc                 S   s   |d urt |tju r| ||S td}t| dr#td|  }|d u r2tj| j	|tj
d}nt |tju s;J |j| j	fksDJ t|}|jrst| dsTJ dt|   | || W d    |S 1 slw   Y  |S | || |S )NcpurA   r$   rY   rB   )rC   rD   rE   reconstruct_numpyr   rZ   rK   rA   r\   rI   r   rG   rH   r   rJ   r0   rL   reconstruct_c)rO   keyr   rZ   rQ   r   r   r   torch_replacement_reconstruct   s(   


z9handle_torch_Index.<locals>.torch_replacement_reconstructr   c                 S   s  |dkr| j }|d urt|tju r| |||S td}t| dr+td|  }|d u r;tj	|| j
|tjd}nt|tju sDJ |j|| j
fksNJ t|}|jr~t| ds^J dt|   | ||| W d    |S 1 sww   Y  |S | ||| |S )Nrx   rs   rA   r$   rY   rB   )ntotalrC   rD   rE   reconstruct_n_numpyr   rZ   rK   rA   r\   rI   r   rG   rH   r   rJ   r0   rL   reconstruct_n_c)rO   n0nir   rZ   rQ   r   r   r   torch_replacement_reconstruct_nB  s,   


z;handle_torch_Index.<locals>.torch_replacement_reconstruct_nc                 S   s   t |tju r| ||S t |tju sJ |j\}t|}t |tju s'J |j|| jfks1J t	|}|j
rat| dsAJ dt|   | ||| W d    d S 1 sZw   Y  d S | ||| d S r@   )rC   rD   rE   update_vectors_numpyr   rG   rH   r#   rI   r   rJ   rK   r0   rL   update_vectors_c)rO   keysr   rP   keys_ptrrQ   r   r   r    torch_replacement_update_vectorsg  s   "z<handle_torch_Index.<locals>.torch_replacement_update_vectorsc                 S   s   t |tju r| ||S t |tju sJ |j\}}|| jks"J t|}|j	r-J dt
| dr6J dt|}| |||| tt|j|d  d}t|d }tt|j| }	tt|j| }
||	|
fS )Nz1Range search using GPU tensor not yet implementedrA   z-Range search on GPU index not yet implemented   r!   rx   )rC   rD   rE   range_search_numpyr   rG   rH   rI   r   rJ   rK   r   RangeSearchResultrange_search_c
from_numpyrev_swig_ptrlimscopyastypeint	distancesr_   )rO   r   threshrP   rI   rQ   r+   r   ndre   rf   r   r   r   torch_replacement_range_search  s   

"
z:handle_torch_Index.<locals>.torch_replacement_range_searchc                 S   s   t |tju r| ||S t |tju sJ |j\}}|| jks"J t|}|d u r6tj	|| 
 tjd}n|j|| 
 fksAJ t|}|jrqt| dsQJ dt|   | ||| W d    |S 1 sjw   Y  |S | ||| |S N)r   rA   rB   )rC   rD   rE   sa_encode_numpyr   rG   rH   rI   r   r\   sa_code_sizer   r   rJ   rK   r0   rL   sa_encode_c)rO   r   codesrP   rI   rQ   	codes_ptrr   r   r   torch_replacement_sa_encode  s(   

z7handle_torch_Index.<locals>.torch_replacement_sa_encodec                 S   s  t |tju r| ||S t |tju sJ |j\}}||  ks#J t|}|d u r6tj	|| j
tjd}nt |tju s?J |j|| j
fksIJ t|}|jryt| dsYJ dt|   | ||| W d    |S 1 srw   Y  |S | ||| |S r   )rC   rD   rE   sa_decode_numpyr   rG   rH   r   r   r\   rI   r   r   rJ   rK   r0   rL   sa_decode_c)rO   r   r   rP   csr   rQ   r   r   r   torch_replacement_sa_decode  s*   

z7handle_torch_Index.<locals>.torch_replacement_sa_decodeaddadd_with_idsassigntrainsearch
remove_idsreconstructreconstruct_nrange_searchupdate_vectorsT)r;   search_and_reconstruct	sa_encode	sa_decodeN)NN)NNN)r   rx   N)r>   )r8   rR   rX   ra   rd   rk   rp   rr   rw   r~   r   r   r   r   r   r   r   handle_torch_Indexn   s<   


$+

"%

r   r   rx   c              
   C   s  t |tju rt| |||||||S | \}}	| r d}
n|  r-| }d}
ntd|j	t
jkr?tj}t|}n|j	t
jkrMtj}t|}ntd| \}}||	ks]J | rdd}n|  rq| }d}ntd|j	t
jkrtj}t|}n|j	t
jkrtj}t|}ntd|d u rt
j|||jt
jd}n|j||fksJ |j	t
jksJ |d u rt
j|||jt
jd}n	|j||fksJ |j	t
jkrtj}t|}n|j	|j	  krt
jkrn tdtj}t|}ntdt|}t }||_||_|	|_||_|
|_||_ ||_!||_"||_#||_$||_%||_&||_'||_(||_t)|  t*| | W d    ||fS 1 sIw   Y  ||fS )NTFz$matrix should be row or column-majorzxb must be f32 or f16zxq must be f32 or f16rY   zI must be i64 or i32)+rC   rD   rE   r   knn_gpu_numpysizer   t	TypeErrorr   r   r   DistanceDataType_F32r   r   DistanceDataType_F16r   r\   rZ   rH   r!   IndicesDataType_I64r#   r   IndicesDataType_I32r   GpuDistanceParamsmetricr^   dimsvectorsvectorsRowMajor
vectorType
numVectorsqueriesqueriesRowMajor	queryType
numQueriesoutDistances
outIndicesoutIndicesTyper0   bfKnn)r+   xqxbr^   re   rf   r   rZ   nbrI   xb_row_majorxb_typexb_ptrnqd2xq_row_majorxq_typexq_ptrI_typerj   ri   argsr   r   r   torch_replacement_knn_gpu  s   







r   knn_gpuTc                 C   s  t |tju rt| ||||S | \}}| rd}n|  r*| }d}ntd|j	t
jkr<tj}	t|}
n|j	t
jkrJtj}	t|}
ntd| \}}||ksZJ | rad}n|  rn| }d}ntd|j	t
jkrtj}t|}n|j	t
jkrtj}t|}ntd|d u rt
j|||jt
jd}n|j||fksJ |j	t
jksJ t|}t }||_d|_||_|
|_||_|	|_||_||_||_||_||_||_ ||_t!|  t"| | W d    |S 1 sw   Y  |S )	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 float16rY   rx   )#rC   rD   rE   r   pairwise_distance_gpu_numpyr   r   r   r   r   r   r   r   r   r   r   r   r\   rZ   rH   r   r   r^   r   r   r   r   r   r   r   r   r   r   r0   r   )r+   r   r   re   r   rZ   r   rI   r   r   r   r   r   r   r   r   ri   r   r   r   r   'torch_replacement_pairwise_distance_gpuJ  sp   





r   pairwise_distance_gpur   )FF)__doc__r   r   
contextlibinspectsysnumpyrD   r   r   r   r   r#   contextmanagerr0   r>   r   modulesfaiss_moduledirsymbolr4   objisclassr8   
issubclassIndex	METRIC_L2r   r   r   r   r   r   <module>   s>   
  
y

WG