Ë
    °Œj³p  ã                   óî  — 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 )ú?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    úc/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/faiss/contrib/torch_utils.pyÚswig_ptr_from_UInt8Tensorr   $   s^   € à�?‰?ÔÐÐØ�7‰7”e—k‘kÒ!Ð!Ð!Ü×*Ñ*Ø	×ÑÓ×$Ñ$Ó&¨×)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   -   sc   € à�?‰?ÔÐÐØ�7‰7”e—m‘mÒ#Ð#Ð#ä×)Ñ)Ø	×ÑÓ×$Ñ$Ó&¨×)9Ñ)9Ó);¸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   7   sc   € à�?‰?ÔÐÐØ�7‰7”e—m‘mÒ#Ð#Ð#Ü×*Ñ*Ø	×ÑÓ×$Ñ$Ó&¨×)9Ñ)9Ó);¸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    @   sc   € à�?‰?ÔÐÐØ�7‰7”e—n‘nÒ$Ð$Ð$Ü×)Ñ)Ø	×ÑÓ×$Ñ$Ó&¨×)9Ñ)9Ó);¸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%   I   sq   € à�?‰?ÔÐÐØ�7‰7”e—k‘kÒ!Ð7 :°·±Ñ#7Ó7Ð!Ü×(Ñ(Ø	×ÑÓ×$Ñ$Ó&¨×)9Ñ)9Ó);¸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*   R   sq   € à�?‰?ÔÐÐØ�7‰7”e—k‘kÒ!Ð7 :°·±Ñ#7Ó7Ð!Ü×*Ñ*Ø	×ÑÓ×$Ñ$Ó&¨×)9Ñ)9Ó);¸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   `   s±   è ø€ ð ÐÜŸ™×2Ñ2Ó4ˆô ×6Ñ6Ø×"Ñ"ó€Mô
 —
‘
×)Ñ)Ó+€IØ×'Ñ'¬¯
©
×(AÑ(AÓ(CÓD€Là×ÑœŸ™×2Ñ2Ó4°mÔDð6Ûà×Ñ˜Y¨Õ5øˆ×Ñ˜Y¨Õ5üs   ‚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   }   s   € ðÜ˜i¨Ó.ˆð
 ×ÑÐ3°dÑ:Ò:àñ ˜k×2Ñ2°nÀtÑ6KÒKÐLÐLÜˆI�t˜h‘¨Ô4ÜˆI�t˜[Õ)øô ò ÙÙØðú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Úadd_ex©Úselfr   Únumeric_typeÚnrT   Úx_ptrs         r   Útorch_replacement_addz1handle_torch_Index.<locals>.torch_replacement_add–   sþ   € Ü�‹7”b—j‘jÑ à—>‘> !Ó$Ð$ä�A‹wœ%Ÿ,™,Ñ&Ð&Ð&Ø�w‰w‰ˆˆ1Ø�D—F‘FŠ{Ðˆ{Øœ5Ÿ=™=Ò(Ü-¨aÓ0‰EØœUŸ]™]Ò*Ü,¨QÓ/‰EäØLóð ð �9Š9ÜØ�kôð 5à4ó5ð ô
 ˜d×/Ñ/Ó1Õ2Ø—‘˜A˜u lÔ3÷ 3Ð2ð �K‰K˜˜5 ,Õ/÷	 3Ð2úó   Ã+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_ids_ex)r]   r   Úidsr^   r_   rT   r`   Úids_ptrs           r   Útorch_replacement_add_with_idsz:handle_torch_Index.<locals>.torch_replacement_add_with_ids³   sF  € ô �‹7”b—j‘jÑ à×*Ñ*¨1¨cÓ2Ð2ä�A‹wœ%Ÿ,™,Ñ&Ð&Ð&Ø�w‰w‰ˆˆ1Ø�D—F‘FŠ{Ðˆ{Øœ5Ÿ=™=Ò(Ü-¨aÓ0‰EØœUŸ]™]Ò*Ü,¨QÓ/‰EäØLóð ô �C‹yœEŸL™LÑ(Ð(Ð(Ø�y‰y˜Q˜DÒ ÐEÐ"EÓEÐ Ü-¨cÓ2ˆà�9Š9ÜØ�kôð 5à4ó5ð ô
 ˜d×/Ñ/Ó1Õ2Ø×$Ñ$ Q¨¨|¸WÔE÷ 3Ð2ð × Ñ   E¨<¸ÕA÷	 3Ð2ú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Ö   s8  € Ü�‹7”b—j‘jÑ à×$Ñ$ Q¨¨6Ó2Ð2ä�A‹wœ%Ÿ,™,Ñ&Ð&Ð&Ø�w‰w‰ˆˆ1Ø�D—F‘FŠ{Ðˆ{Ü)¨!Ó,ˆàˆ>Ü—[‘[  A¨a¯h©h¼e¿k¹kÔJ‰Fä˜“<¤5§<¡<Ñ/Ð/Ð/Ø—<‘< A q 6Ò)Ð)Ð)Ü+¨FÓ3ˆà�9Š9ÜØ�kôð 5à4ó5ð ô
 ˜d×/Ñ/Ó1Õ2Ø—‘˜a ¨¨qÔ1÷ 3ð ˆð �M‰M˜!˜U E¨1Ô-àˆ÷ 3ð ˆú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   Útrain_exr\   s         r   Útorch_replacement_trainz3handle_torch_Index.<locals>.torch_replacement_trainõ   s   € Ü�‹7”b—j‘jÑ à×#Ñ# AÓ&Ð&ä�A‹wœ%Ÿ,™,Ñ&Ð&Ð&Ø�w‰w‰ˆˆ1Ø�D—F‘FŠ{Ðˆ{Øœ5Ÿ=™=Ò(Ü-¨aÓ0‰EØœUŸ]™]Ò*Ü,¨QÓ/‰EäØLóð ð �9Š9ÜØ�kôð 5à4ó5ð ô
 ˜d×/Ñ/Ó1Õ2Ø—‘˜a ¨Ô5÷ 3Ð2ð �M‰M˜!˜U LÕ1÷	 3Ð2úrb   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  € Ø�w‰w‰ˆˆ1Øœ5Ÿ=™=Ò(Ü-¨aÓ0‰EØœUŸ]™]Ò*Ü,¨QÓ/‰EäØLóð ð ˆ9Ü—‘˜A˜q¨¯©¼¿¹ÔG‰Aä˜“7œeŸl™lÑ*Ð*Ð*Ø—7‘7˜q !˜fÒ$Ð$Ð$Ü)¨!Ó,ˆàˆ9Ü—‘˜A˜q¨¯©¼¿¹ÔE‰Aä˜“7œeŸl™lÑ*Ð*Ð*Ø—7‘7˜q !˜fÒ$Ð$Ð$Ü+¨AÓ.ˆà�e˜U A qÐ(Ð(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   Ú	search_ex)r]   r   ro   rx   ry   r^   r_   rT   r`   rz   r{   r|   s              €r   Útorch_replacement_searchz4handle_torch_Index.<locals>.torch_replacement_search-  s  ø€ ô �‹7”b—j‘jÑ à×$Ñ$ Q¨¨Q°!Ð$Ó4Ð4ä�A‹wœ%Ÿ,™,Ñ&Ð&Ð&Ø�w‰w‰ˆˆ1Ø�D—F‘FŠ{Ðˆ{á$9¸!¸QÀÀ1Ó$EÑ!ˆˆu�e˜Q à�9Š9ÜØ�kôð 5à4ó5ð ô
 ˜d×/Ñ/Ó1Õ2Ø—‘˜q %¨°q¸%ÀÔG÷ 3ð �!ˆtˆð �N‰N˜1˜e \°1°e¸UÔCà�!ˆtˆ÷ 3ð �!ˆ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_reconstructH  sa  ø€ ô �‹7”b—j‘jÑ à×4Ñ4°Q¸¸QÀ!ÀqÐ4ÓIÐIä�A‹wœ%Ÿ,™,Ñ&Ð&Ð&Ø�w‰w‰ˆˆ1Ø�D—F‘FŠ{Ðˆ{á$9¸!¸QÀÀ1Ó$EÑ!ˆˆu�e˜Q àˆ9Ü—‘˜A˜q !¨A¯H©H¼E¿M¹MÔJ‰Aä˜“7œeŸl™lÑ*Ð*Ð*Ø—7‘7˜q ! Q˜iÒ'Ð'Ð'Ü)¨!Ó,ˆà�9Š9ÜØ�kôð 5à4ó5ð ô
 ˜d×/Ñ/Ó1Õ2Ø×-Ñ-¨a°¸¸5À%ÈÔO÷ 3Ð2ð ×)Ñ)¨!¨U°A°u¸eÀUÔKà�!�Qˆwˆ÷ 3Ð2ú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_preassignedj  s‹  ø€ ô �‹7”b—j‘jÑ à×0Ñ0°°A°r¸2ÀÀaÐ0ÓHÐHä�A‹wœ%Ÿ,™,Ñ&Ð&Ð&Ø�w‰w‰ˆˆ1Ø�D—F‘FŠ{Ðˆ{á$9¸!¸QÀÀ1Ó$EÑ!ˆˆu�e˜Q à�x‰x˜A˜tŸ{™{Ð+Ò+Ð+Ð+Ø�]‰]‹_ˆÜ,¨RÓ0ˆàˆ>Ø—‘“ˆBØ—8‘8˜rŸx™xÒ'Ð'Ð'Ü.¨rÓ2‰FàˆFà�9Š9ÜØ�kôð 5à4ó5ð ô
 ˜d×/Ñ/Ó1Õ2Ø×)Ñ)Ø�u˜a ¨°¸¸uô÷ 3ð �!ˆtˆð	 ×%Ñ%Ø�5˜!˜V V¨U°E¸5ôð �!ˆtˆ÷ 3ð �!ˆ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_ids”  s5   € ô �‹Gœ5Ÿ<™<Ñ'ð	6à5ó	6Ø'à×$Ñ$ 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_reconstruct›  s,  € ð ˆM¤ Q£¬2¯:©:Ñ 5à×)Ñ)¨#¨qÓ1Ð1ô —‘˜eÓ$ˆÜ�4˜Ô%ä—\‘\ &¨$¯.©.Ó*:Ó;ˆFàˆ9Ü—‘˜DŸF™F¨6¼¿¹ÔG‰Aä˜“7œeŸl™lÑ*Ð*Ð*Ø—7‘7˜tŸv™v˜iÒ'Ð'Ð'Ü)¨!Ó,ˆà�9Š9ÜØ�kôð 5à4ó5ð ô
 ˜d×/Ñ/Ó1Õ2Ø×"Ñ" 3¨Ô.÷ 3ð ˆð ×Ñ˜s EÔ*àˆ÷ 3ð ˆú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)Néÿÿÿÿr–   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¿  sF  € Ø�Š8Ø—‘ˆBð
 ˆM¤ Q£¬2¯:©:Ñ 5à×+Ñ+¨B°°AÓ6Ð6ô —‘˜eÓ$ˆÜ�4˜Ô%ä—\‘\ &¨$¯.©.Ó*:Ó;ˆFàˆ9Ü—‘˜B §¡¨v¼U¿]¹]ÔK‰Aä˜“7œeŸl™lÑ*Ð*Ð*Ø—7‘7˜r 4§6¡6˜lÒ*Ð*Ð*Ü)¨!Ó,ˆà�9Š9ÜØ�kôð 5à4ó5ð ô
 ˜d×/Ñ/Ó1Õ2Ø×$Ñ$ R¨¨UÔ3÷ 3ð ˆð × Ñ   R¨Ô/àˆ÷ 3ð ˆú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ú   € Ü�‹:œŸ™Ñ#à×,Ñ,¨T°1Ó5Ð5ä�D‹zœUŸ\™\Ñ)Ð)Ð)Ø�z‰z‰ˆÜ.¨tÓ4ˆä�A‹wœ%Ÿ,™,Ñ&Ð&Ð&Ø�w‰w˜1˜dŸf™f˜+Ò%Ð%Ð%Ü)¨!Ó,ˆà�9Š9ÜØ�kôð 5à4ó5ð ô
 ˜d×/Ñ/Ó1Õ2Ø×%Ñ% a¨°5Ô9÷ 3Ð2ð ×!Ñ! ! X¨uÕ5÷	 3Ð2ú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  sm  € Ü�‹7”b—j‘jÑ à×*Ñ*¨1¨fÓ5Ð5ä�A‹wœ%Ÿ,™,Ñ&Ð&Ð&Ø�w‰w‰ˆˆ1Ø�D—F‘FŠ{Ðˆ{Ü)¨!Ó,ˆð —	’	ð	?à>ó	?ØäØ�+ô
ð 	;à:ó	;ð 
ô ×%Ñ% aÓ(ˆØ×Ñ˜A˜u f¨cÔ2ô ×ÑÜ×Ñ˜sŸx™x¨¨Q©Ó/×4Ñ4Ó6×=Ñ=¸gÓFó
ˆô ��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-  € Ü�‹7”b—j‘jÑ à×'Ñ'¨¨5Ó1Ð1ä�A‹wœ%Ÿ,™,Ñ&Ð&Ð&Ø�w‰w‰ˆˆ1Ø�D—F‘FŠ{Ðˆ{Ü)¨!Ó,ˆàˆ=Ü—K‘K  4×#4Ñ#4Ó#6¼e¿k¹kÔJ‰Eà—;‘; 1 d×&7Ñ&7Ó&9Ð":Ò:Ð:Ð:Ü-¨eÓ4ˆ	à�9Š9ÜØ�kôð 5à4ó5ð ô
 ˜d×/Ñ/Ó1Õ2Ø× Ñ   E¨9Ô5÷ 3ð ˆð ×Ñ˜Q  yÔ1àˆ÷ 3ð ˆú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‹{œeŸl™lÑ*Ð*Ð*Ø—‘‰ˆˆ2Ø�T×&Ñ&Ó(Ò(Ð(Ð(Ü-¨eÓ4ˆ	àˆ9Ü—‘˜A˜tŸv™v¬U¯]©]Ô;‰Aä˜“7œeŸl™lÑ*Ð*Ð*Ø—7‘7˜q $§&¡&˜kÒ)Ð)Ð)Ü)¨!Ó,ˆà�=Š=ÜØ�kôð 5à4ó5ð ô
 ˜d×/Ñ/Ó1Õ2Ø× Ñ   I¨uÔ5÷ 3ð ˆð ×Ñ˜Q 	¨5Ô1àˆ÷ 3ð ˆú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  ø€ Ü49·M±Mó 0ô< $)§=¡=ó!BóFô> 7<·m±mó 2ô: 8=·}±}ó )ð8 ˜d´·±õð8 '+õ ðF "&¨ö(òT(ó"óH%òN6ò6óBó<ô> ˜ EÐ+@ÔAÜØ�>Ð#Aôô ˜ HÐ.FÔGÜ˜ GÐ-DÔEÜ˜ HÐ.FÔGÜ˜ LÐ2NÔOÜØ�=Ð"?ôô Ø�?Ð$Côô Ø�>Ð#Aôô ØØØ(Øõ	ô ØØ Ø0Øõ	ô ØØØ,Øõ	ô ˜ KÐ1LÔMÜ˜ KÐ1LÕ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¾  € ÜˆBƒx”2—:‘:Ñä�‰˜r 2 q°ÀJÔOÐOà�G‰G‹I�E€BˆØ×ÑÔÐÐØ�8‰8”u—}‘}Ò$Ð$Ð$Ø�zŠzÐ8Ð8Ó8ˆ>à�W‰W‹Y�F€BˆØ�Š7€Nˆ7Ø×ÑÔÐÐØ�8‰8”u—}‘}Ò$Ð$Ð$Ø�zŠzÐ8Ð8Ó8ˆ>ä�‰�B˜ "§)¡)´5·=±=ÔA€AÜ�‰�B˜ "§)¡)´5·;±;Ô?€AÜ'¨Ó*€EÜ% aÓ(€EÜ& rÓ*€FÜ& rÓ*€Fà”—‘Ò Ü�‰˜ ¨¨2¨r°1°e¸UÔCð ˆaˆ4€Kð 
”5×-Ñ-Ò	-Ü×Ñ ¨°°2°r¸1¸eÀUÔKð ˆaˆ4€Kô	 	×ÑØ�F˜A˜r 2 v¨z¸1¸eÀUô	
ð ˆaˆ4€Kr   Ú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  ¹  s†  € ô ˆBƒx”2—:‘:Ñä×"Ñ" 3¨¨B°°1°a¸ÀÓHÐHà�G‰G‹I�E€BˆØ	×ÑÔØ‰Ø	�‰‹×	Ñ	Ô	Ø�T‰T‹VˆØ‰äÐ>Ó?Ð?à	‡x�x”5—=‘=Ò Ü×,Ñ,ˆÜ*¨2Ó.‰Ø	�‰”U—]‘]Ò	"Ü×,Ñ,ˆÜ)¨"Ó-‰Ø	�‰”U—^‘^Ò	#Ü×-Ñ-ˆÜ-¨bÓ1‰äÐAÓBÐBà�W‰W‹Y�F€BˆØ�Š7€Nˆ7Ø	×ÑÔØ‰Ø	�‰‹×	Ñ	Ô	Ø�T‰T‹VˆØ‰äÐ>Ó?Ð?à	‡x�x”5—=‘=Ò Ü×,Ñ,ˆÜ*¨2Ó.‰Ø	�‰”U—]‘]Ò	"Ü×,Ñ,ˆÜ)¨"Ó-‰Ø	�‰”U—^‘^Ò	#Ü×-Ñ-ˆÜ-¨bÓ1‰äÐAÓBÐBà€yÜ�K‰K˜˜A b§i¡i´u·}±}ÔE‰à�w‰w˜2˜q˜'Ò!Ð!Ð!à�w‰wœ%Ÿ-™-Ò'Ð'Ð'à€yÜ�K‰K˜˜A b§i¡i´u·{±{ÔC‰à�w‰w˜2˜q˜'Ò!Ð!Ð!à‡w�w”%—+‘+ÒÜ×*Ñ*ˆÜ+¨AÓ.‰Ø	
�‰�A—G‘GÔ	*œuŸ{™{Ô	*ô Ð.Ó/Ð/ô ×*Ñ*ˆÜ'¨Ó*‰äÐ.Ó/Ð/ä% aÓ(€Eä×"Ñ"Ó$€DØ€D„KØ€D„FØ€D„IØ€D„LØ'€DÔØ€D„OØ€D„OØ€D„LØ'€DÔØ€D„NØ€D„OØ€DÔØ€D„OØ €DÔØ€D„KØ€D„Mä	�cÕ	Ü�‰�C˜Ô÷ 
ð ˆaˆ4€K÷ 
ð ˆaˆ4€Kús   Ñ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
  (  sr  € ô ˆBƒx”2—:‘:Ñä×0Ñ0°°b¸"¸aÀÓHÐHà�G‰G‹I�E€BˆØ	×ÑÔØ‰Ø	�‰‹×	Ñ	Ô	Ø�T‰T‹VˆØ‰äÐAÓBÐBà	‡x�x”5—=‘=Ò Ü×,Ñ,ˆÜ*¨2Ó.‰Ø	�‰”U—]‘]Ò	"Ü×,Ñ,ˆÜ)¨"Ó-‰äÐ7Ó8Ð8à�W‰W‹Y�F€BˆØ�Š7€Nˆ7Ø	×ÑÔØ‰Ø	�‰‹×	Ñ	Ô	Ø�T‰T‹VˆØ‰äÐAÓBÐBà	‡x�x”5—=‘=Ò Ü×,Ñ,ˆÜ*¨2Ó.‰Ø	�‰”U—]‘]Ò	"Ü×,Ñ,ˆÜ)¨"Ó-‰äÐ7Ó8Ð8à€yÜ�K‰K˜˜B r§y¡y¼¿¹ÔF‰à�w‰w˜2˜r˜(Ò"Ð"Ð"à�w‰wœ%Ÿ-™-Ò'Ð'Ð'ä% aÓ(€Eä×"Ñ"Ó$€DØ€D„KØ€D„FØ€D„IØ€D„LØ'€DÔØ€D„OØ€D„OØ€D„LØ'€DÔØ€D„NØ€D„OØ€DÔØ€D„Kä	�cÕ	Ü�‰�C˜Ô÷ 
ð €H÷ 
ð €Hús   Ë%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     sC  ðñó$ Û Û Û Û 
Û òòòòòòð ×Ñò6ó ð6ð: HMó*ò0nNðb �{‰{˜7Ñ#€ñ �,Ö€FÙ
�, Ó
'€CØ€w‡��sÕØˆ	Ù�i §¡Õ-Ù˜yÕ)ð  ð -2¯O©OÈó  ñF �\ 5Ð*?ÀÀtÔ Lð Ø
Ø�?‰?ØØófñR Ø�)Ð6¸¸dôð  §¡¸óGñT ØØØ+ØØõr   