Ë
    °ŒjÙ0  ã                   óÞ   — d dl Z d dlZd dlZd dlZ ej
                  e«      Ze j                  ddfd„Z	e j                  Z
dd„Ze j                  ddfd„Zdd„Zdd„Zdd	„Z	 	 	 	 	 dd
„Zdd„Zy)é    NFéÿÿÿÿc                 óÂ  — t         j                  d| j                  |fz  «       t        j                  «       }| j                  \  }}t	        j
                  |«      }	t	        j                  |||	¬«      }
t	        j                  ||«      }|dk(  rt	        j                  «       }|rKt         j                  d|z  «       t	        j                  «       }||_
        t	        j                  |||¬«      }d}|D ]’  }|j                  d   }|j                  |«       |j                  | |«      \  }}||z  }|
j                  ||«       |j                  «        ||z  }t         j                  d|t        j                  «       |z
  fz  «       Œ” |
j!                  «        t         j                  dt        j                  «       |z
  |fz  «       |
j"                  |
j$                  fS )	z¤Computes the exact KNN search results for a dataset that possibly
    does not fit in RAM but for which we have an iterator that
    returns it block by block.
    z%knn_ground_truth queries size %s k=%d©Úkeep_maxr   úrunning on %d GPUs©ÚcoÚngpur   ú%d db elements, %.3f szGT time: %.3f s (%d vectors))ÚLOGÚinfoÚshapeÚtimeÚfaissÚis_similarity_metricÚ
ResultHeapÚ	IndexFlatÚget_num_gpusÚGpuMultipleClonerOptionsÚshardÚindex_cpu_to_all_gpusÚaddÚsearchÚ
add_resultÚresetÚfinalizeÚDÚI)ÚxqÚdb_iteratorÚkÚmetric_typer   r
   Út0ÚnqÚdr   ÚrhÚindexr	   Úi0ÚxbiÚnir   r   s                     úi/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/faiss/contrib/exhaustive_search.pyÚknn_ground_truthr,      s„  € ô ‡H�HÐ4¸¿¹À!°}ÑDÔEÜ	�‰‹€BØ�H‰H�E€BˆÜ×)Ñ)¨+Ó6€HÜ	×	Ñ	˜"˜a¨(Ô	3€Bä�O‰O˜A˜{Ó+€EØˆr‚zÜ×!Ñ!Ó#ˆáÜ�‰Ð%¨Ñ,Ô-Ü×+Ñ+Ó-ˆØˆŒÜ×+Ñ+¨E°b¸tÔDˆð 
€BÛˆØ�Y‰Y�q‰\ˆØ�	‰	�#ŒØ�|‰|˜B Ó"‰ˆˆ1Ø	ˆR‰ˆØ
�‰�a˜ÔØ�‰ŒØ
ˆb‰ˆÜ�‰Ð)¨R´·±³¸rÑ1AÐ,BÑBÕCð ð ‡K�K„MÜ‡H�HÐ+¬t¯y©y«{¸RÑ/?ÀÐ.DÑDÔEà�4‰4�—‘ˆ:Ðó    c                 óP  — | j                   \  }}t        |t        j                  «      }t        j                  |j
                  «      }|rt        |«      n
t        |«      }t        |j                  |«      }	t        j                  d|› d|	� ›d|� ›d|� ›�«       t        j                  «       }
|j                  | |	«      \  }}t        j                  «       |
z
  }|r|dz  dk  sJ ‚|j                  d«      }d}d	}|��|s|d	d	…|	d
z
  f   |k  }n|d	d	…|	d
z
  f   |kD  }|j                  «       dkD  råt        j                  d|j                  «       z  «       t        j                  «       }
t        |t         j"                  «      rN|}|rt        j$                  |dz  «      }n t        j&                  ||j
                  «      }|j)                  |«       |j+                  | |   |«      \  }}}|r|j                  d«      }t        j                  «       |
z
  }t        j                  d«       t        j                  «       }
|rt        j,                  nt        j.                  } |||	||«      }	 t        j0                  } ||«      |_         ||«      |_        |�C |«      |_         |«      |_         ||j;                  d«      «      |_         |«      |_        t!        j@                  |d
z   d¬«      }|jC                   ||«      «       |d   }t!        j@                  ||jD                  ¬«      }t!        j@                  |d¬«      }|jG                   ||«       ||«      «       t        j                  «       |
z
  }!t        j                  d|d›d|d›d|!d›d�«       |||fS )aA  GPU does not support range search, so we emulate it with
    knn search + fallback to CPU index.

    The index_cpu can either be:
    - a CPU index that supports range search
    - a numpy table, that will be used to construct a Flat index if needed.
    - None. In that case, at most gpu_k results will be returned
    zGPU search z queries with k=z is_binary_index=z
 keep_max=é   i €  Úint16r   Né   zCPU search remain %dÚcombineÚint64©Údtyper   ztimes z.3fzs Ús)*r   Ú
isinstancer   ÚIndexBinaryr   r"   ÚintÚfloatÚminÚntotalr   Údebugr   r   ÚastypeÚsumÚnpÚndarrayÚIndexBinaryFlatr   r   Úrange_searchÚCombinerRangeKNNint16ÚCombinerRangeKNNfloatÚswig_ptrr   r   ÚmaskÚD_remainÚviewÚ
lim_remainÚI_remainÚemptyÚcompute_sizesr5   Úwrite_resultÚrangeÚ	METRIC_L2ÚappendÚcumsumÚlenÚhstack)"r   Úr2Ú	index_gpuÚ	index_cpuÚgpu_kr$   r%   Úis_binary_indexr   r!   r#   r   r   Út1Út2rJ   rG   ÚxbrH   rK   ÚCombinerRangeKNNÚcombinerÚspÚL_resÚnresÚD_resÚI_resÚnrÚiÚnvÚl0Úl1ÚdiÚt3s"                                     r+   Úrange_search_gpurk   <   s:  € ð �H‰H�E€BˆÜ  ¬E×,=Ñ,=Ó>€OÜ×)Ñ)¨)×*?Ñ*?Ó@€HÙ#ŒˆRŒ¬¨r«€BÜˆI×Ñ˜eÓ$€AÜ‡I�IØ
�b�TÐ*¨¨! uÐ,>¨o¸aÐ-@ÀÀ(È1ÀÐNôô 
�‰‹€BØ×Ñ˜B Ó"�D€A€qÜ	�‰‹�rÑ	€BÙØ�1‰u�uŠ}Ðˆ}Ø�H‰H�WÓˆØ	
€BØ€JØÑÙØ’Q˜˜A™�X‘; Ñ#‰Dà’Q˜˜A™�X‘; Ñ#ˆDØ�8‰8‹:˜Š>Ü�I‰IÐ,¨t¯x©x«zÑ9Ô:Ü—‘“ˆBÜ˜)¤R§Z¡ZÔ0à�Ù"Ü %× 5Ñ 5°a¸!±eÓ <‘Iä %§¡°°9×3HÑ3HÓ I�IØ—‘˜bÔ!Ø-6×-CÑ-CØ�4‘˜"ó.Ñ*ˆJ˜ (ñ Ø#Ÿ?™?¨7Ó3�Ü—‘“˜rÑ!ˆBÜ‡I�IˆiÔÜ	�‰‹€Bñ ô 	×#Ò#ä×(Ñ(ð ñ    A r¨8Ó4€HØÜ�^‰^ˆÙ˜“UˆŒ
Ù˜“UˆŒ
àÐ!Ù˜t›HˆHŒMÙ " 8£ˆHÔÙ"$ Z§_¡_°WÓ%=Ó">ˆHÔÙ " 8£ˆHÔô —‘˜˜a™ wÔ/ˆØ×Ñ™r %›yÔ)Ø�R‰yˆÜ—‘˜ Q§W¡WÔ-ˆÜ—‘˜ WÔ-ˆØ×Ñ™b ›i©¨E«Ô3ô( 
�‰‹�rÑ	€BÜ‡I�I��r˜#�h˜b  C ¨¨2¨c¨(°!Ð4Ô5Ø�%˜ÐÐr-   c                 ó2  — | j                   \  }}t        j                  «       }t        j                  | d¬«      } t	        j
                  ||«      }	|dk(  rt	        j                  «       }|rKt        j                  d|z  «       t	        j                  «       }
||
_
        t	        j                  |	|
|¬«      }d}t        |«      D �cg c]  }g ‘Œ }}t        |«      D �cg c]  }g ‘Œ }}|D �]  }|j                   d   }|dkD  r4j                  |«       t        | |||«      \  }}}|j                  «        n7|	j                  |«       |	j!                  | |«      \  }}}|	j                  «        ||z  }t        |«      D ]C  }||   ||dz      }}||kD  sŒ||   j#                  ||| «       ||   j#                  ||| «       ŒE ||z  }t        j                  d|t        j                  «       |z
  fz  «       �Œ t        j$                  dd	¬«      }t        j$                  dd¬«      }|D �cg c]  }|g k7  rt        j&                  |«      n|‘Œ  }}|D �cg c]  }|g k7  rt        j&                  |«      n|‘Œ  }}|D �cg c]  }t)        |«      ‘Œ }}t)        |«      |k(  sJ ‚t        j$                  |dz   d
¬«      }t        j*                  |«      |dd |t        j&                  |«      t        j&                  |«      fS c c}w c c}w c c}w c c}w c c}w )z§Computes the range-search search results for a dataset that possibly
    does not fit in RAM but for which we have an iterator that
    returns it block by block.
    Úfloat32r4   r   r   r   r   r1   r   r3   Úuint64N)r   r   r@   Úascontiguousarrayr   r   r   r   r   r   r   r   rO   r   rk   r   rC   rQ   ÚzerosrT   rS   rR   )r   r    Ú	thresholdr"   r   r
   r$   r%   r#   r'   r	   rV   r(   Ú_ir   r   r)   r*   Úlims_iÚDiÚIiÚjrg   rh   Úempty_IÚempty_Dre   ÚsizesÚlimss                                r+   Úrange_ground_truthr{   Ÿ   s¼  € ð �H‰H�E€BˆÜ	�‰‹€BÜ	×	Ñ	˜b¨	Ô	2€Bä�O‰O˜A˜{Ó+€EØˆr‚zÜ×!Ñ!Ó#ˆÙÜ�‰Ð%¨Ñ,Ô-Ü×+Ñ+Ó-ˆØˆŒÜ×/Ñ/°¸"À4ÔHˆ	ð 
€BÜ˜B”iÓ ‘i�Š�i€AÐ Ü˜B”iÓ ‘i�Š�i€AÐ ÜˆØ�Y‰Y�q‰\ˆØ�!Š8Ø�M‰M˜#ÔÜ-¨b°)¸YÈÓL‰NˆF�B˜Ø�O‰OÕà�I‰I�cŒNØ"×/Ñ/°°IÓ>‰NˆF�B˜Ø�K‰KŒMØ
ˆb‰ˆÜ�r–ˆAØ˜A‘Y  q¨1¡u¡�ˆBØ�B‹wØ�!‘—‘˜B˜r "˜IÔ&Ø�!‘—‘˜B˜r "˜IÕ&ð	 ð
 	ˆb‰ˆÜ�‰Ð)¨R´·±³¸rÑ1AÐ,BÑBÖCð# ô& �h‰h�q Ô(€GÜ�h‰h�q 	Ô*€Gá9:Ó;¹°A˜!˜rš'Œ"�)‰)�AŒ, wÑ
.¸€AÐ;Ù9:Ó;¹°A˜!˜rš'Œ"�)‰)�AŒ, wÑ
.¸€AÐ;ÙÓ™Q˜ŒS��V˜Q€EÐÜˆu‹:˜ÒÐÐÜ�8‰8�B˜‘F (Ô+€DÜ�y‰y˜Ó€Dˆˆ€HØ”—‘˜1“œrŸy™y¨›|Ð+Ð+ùò= 	!ùÚ ùò. 	<ùÚ;ùÚs   Ã	L Ã	LÈ-#L
É#LÉ?Lc                 óØ   — |r||kD  }n||k  }t        j                  | «      }d}t        | «      D ].  \  }}	t        |	«      }	||||	z    j	                  «       ||<   ||	z  }Œ0 |||   ||   fS )zselect a set of resultsr   )r@   Ú
zeros_likeÚ	enumerater9   r?   )
ra   ÚdisÚidsÚthreshr   rG   Únew_nresÚore   rd   s
             r+   Úthreshold_radius_nresr„   Û   s‚   € áØ�V‰|‰à�V‰|ˆÜ�}‰}˜TÓ"€HØ	€AÜ˜4–‰ˆˆ2Ü�‹WˆØ˜1˜q 2™vÐ&×*Ñ*Ó,ˆ�‰Ø	ˆR‰‰ð !ð �S˜‘Y  D¡	Ð)Ð)r-   c                 óð   — |r||kD  }n||k  }t        j                  | «      }t        | «      dz
  }t        |«      D ].  }| |   | |dz      }
}	||   ||	|
 j	                  «       z   ||dz   <   Œ0 |||   ||   fS )z;restrict range-search results to those below a given radiusr1   )r@   r}   rS   rO   r?   )rz   r   r€   r�   r   rG   Únew_limsÚnre   rg   rh   s              r+   Úthreshold_radiusrˆ   ê   s�   € áØ�V‰|‰à�V‰|ˆÜ�}‰}˜TÓ"€HÜˆD‹	�A‰€AÜ�1ŽXˆØ�a‘˜$˜q 1™u™+ˆBˆØ" 1™+¨¨R°¨¯©Ó(9Ñ9ˆ��Q‘Šð ð �S˜‘Y  D¡	Ð)Ð)r-   c           	      ó<  — t        j                  | D ��cg c]  \  }}}|‘Œ
 c}}«      }t        |«      |kD  sJ ‚|r)|j                  t        |«      |z
  dz
  «       |d|z
     }n|j                  |«       ||   }|j                  dk(  rt        |«      }nt        |«      }t        j                  d|z  «       d}t        | «      D ]3  \  }\  }	}}
t        |	||
||¬«      \  }	}}
|t        |«      z  }|	||
f| |<   Œ5 t        j                  d|z  «       ||fS c c}}w )z‘find radius that reduces number of results to target_nres, and
    applies it in-place to the result batches used in
    range_search_max_resultsr1   r   rm   z   setting radius to %sr   r   z.   updated previous results, new nb results %d)r@   rT   rS   Ú	partitionr5   r:   r9   r   r=   r~   r„   )Úres_batchesÚtarget_nresr   Ú_r   ÚalldisÚradiusÚtotresre   ra   r€   s              r+   Úapply_maxresr‘   ø   s,  € ô �Y‰Y©[Ô9©[¡	  3¨š¨[Ò9Ó:€FÜˆv‹;˜Ò$Ð$Ð$ÙØ×Ñœ˜V› {Ñ2°QÑ6Ô7Ø˜˜[Ñ(Ñ)‰à×Ñ˜Ô%Ø˜Ñ$ˆà‡|�|�yÒ Ü�v“‰ä�V“ˆÜ‡I�IÐ'¨&Ñ0Ô1Ø€FÜ(¨Ö5ÑˆÑˆD�#�sÜ.Ø�#�s˜F¨Xô
‰ˆˆc�3ð 	”#�c“(ÑˆØ˜s C˜ˆ�AŠð  6ô ‡I�IÐ>ÀÑGÔHØ�6ˆ>Ðùó- :s   •D
c           
      óÚ  — t        | t        j                  «      }|€|€J ‚t        d|z  «      }|€|€J ‚t        |dz  «      }|dk(  rt        j                  «       }|rLt
        j                  d|z  «       t        j                  «       }	||	_        t        j                  | |	|¬«      }
nd}
t        j                  «       }dx}}dx}x}}g }|D �]u  }t        j                  «       }t
        j                  dt        |«      › d	�«       |
rt        |||
| «      \  }}}n| j                  ||«      \  }}}|d
d |dd z
  }|t        |«      z  }|t        |«      z  }t        j                  «       }|r|j                  d«      }|t        |«      z  }|j!                  |||f«       |�K||kD  rFt
        j                  d||fz  «       t#        ||| j$                  t        j&                  k(  ¬«      \  }}t        j                  «       }|||z
  z  }|||z
  z  }t
        j                  dt        j                  «       |z
  ||fz  «       �Œx t
        j                  d||||fz  «       |r1||kD  r,t#        ||| j$                  t        j&                  k(  ¬«      \  }}t)        j*                  |D ���cg c]  \  }}}|‘Œ
 c}}}«      }t)        j*                  |D ���cg c]  \  }}}|‘Œ
 c}}}«      }t)        j*                  |D ���cg c]  \  }}}|‘Œ
 c}}}«      }t)        j,                  t        |«      d
z   d¬«      }t)        j.                  |«      |d
d ||||fS c c}}}w c c}}}w c c}}}w )a  Performs a range search with many queries (given by an iterator)
    and adjusts the threshold on-the-fly so that the total results
    table does not grow larger than max_results.

    If ngpu != 0, the function moves the index to this many GPUs to
    speed up search.
    Ngš™™™™™é?g      ø?r   r   r   r   z
searching z vectorsr1   r0   z-too many results %d > %d, scaling back radiusr   z'   [%.3f s] %d queries done, %d resultszBsearch done in %.3f s + %.3f s, total %d results, end threshold %grn   r4   )r7   r   r8   r9   r   r   r   r   r   r   r   r=   rS   rk   rC   r>   rQ   r‘   r"   ÚMETRIC_INNER_PRODUCTr@   rT   rp   rR   ) r'   Úquery_iteratorr�   Úmax_resultsÚmin_resultsr   r
   Úclip_to_minrY   r	   rV   Út_startÚt_searchÚt_post_processÚqtotr�   Ú
raw_totresr‹   Úxqir#   rs   rt   ru   Únres_irZ   r[   Údis_iÚids_ira   r   r€   rz   s                                    r+   Úrange_search_max_resultsr¡     sZ  € ô& ! ¬×(9Ñ(9Ó:€OàÐØÐ&Ð&Ð&Ü˜# Ñ+Ó,ˆàÐØÐ&Ð&Ð&Ü˜+¨Ñ+Ó,ˆàˆr‚zÜ×!Ñ!Ó#ˆáÜ�‰Ð%¨Ñ,Ô-Ü×+Ñ+Ó-ˆØˆŒÜ×/Ñ/°¸"À4ÔH‰	àˆ	ä�i‰i‹k€GØ !Ð!€Hˆ~Ø!"Ð"€DÐ"ˆ6�JØ€KäˆÜ�Y‰Y‹[ˆÜ�	‰	�Jœs 3›x˜j¨Ð1Ô2ÙÜ-¨c°6¸9ÀeÓL‰NˆF�B™à"×/Ñ/°°VÓ<‰NˆF�B˜à˜˜�˜f S b˜kÑ)ˆØ”c˜"“gÑˆ
Ø”�C“Ñˆä�Y‰Y‹[ˆÙà—‘˜7Ó#ˆBà”#�b“'ÑˆØ×Ñ˜F B¨Ð+Ô,àÐ" v°Ò';Ü�H‰HØ?Ø˜;Ð'ñ(ôô *ØØØ×*Ñ*¬e×.HÑ.HÑHô‰NˆF�Fô
 �Y‰Y‹[ˆØ�B˜‘GÑˆØ˜"˜r™'Ñ!ˆÜ�	‰	Ø5Ü�y‰y‹{˜WÑ$ d¨FÐ3ñ4ö	
ðC ôL ‡H�HØLØ�^ V¨VÐ
4ñ	5ôñ
 �v Ò+Ü%ØØØ×&Ñ&¬%×*DÑ*DÑDô
‰ˆ�ô �9‰9¹ÕE¹Ñ!5 ¨°’f¸ÓEÓF€DÜ
�)‰)±{ÕC±{Ñ3˜v u¨e’U°{ÓCÓ
D€CÜ
�)‰)±{ÕC±{Ñ3˜v u¨e’U°{ÓCÓ
D€Cä�8‰8”C˜“I ‘M¨Ô2€DÜ�y‰y˜‹€Dˆˆ€Hà�4˜˜cÐ!Ð!ùô FùÜCùÜCs   Ê+MËMÌM&c              #   óŠ   K  — t        | «      }|}d}||k  r+| |||z    }|–— ||k  r|dz  }|t        |«      z  }||k  rŒ*yy­w)z¢produces batches of progressively increasing sizes. This is useful to
    adjust the search radius progressively without overflowing with
    intermediate resultsr   é   N)rS   )r   Ústart_bsÚmax_bsr$   Úbsre   r�   s          r+   Úexponential_query_iteratorr§   ~  s\   è ø€ ô 
ˆR‹€BØ	€BØ	€AØ
ˆbŠ&Ø��Q˜‘VˆnˆØŠ	Ø�Š;Ø�!‰GˆBØ	ŒS�‹X‰ˆð ˆb�&ùs   ‚>AÁA)i   )F)NNFr   F)é    i N  )r   r   Únumpyr@   ÚloggingÚ	getLoggerÚ__name__r   rP   r,   Úknnrk   r{   r„   rˆ   r‘   r¡   r§   © r-   r+   Ú<module>r¯      sŒ   ðó Û Û ã à€g×Ñ˜Ó!€ð %*§O¡O¸5Àró&ðT ‡i�i€ó`ðN —‘Ø
Ø	ó9,óx*ó*óðB ØØ
Ø	
Øóf"ôRr-   