Ë
    °ŒjÃF  ã                   óì   — d dl Z d dlZd dlZd dlZd dlmZ d dlZd dlZd dlm	Z	 d dl
Z
d dlZd dlZd dlZd dlmZ  G d„ d«      Z G d„ d«      Zd	ej&                  ej(                  d d d
dddddd ddfd„Zy)é    N)Ú
ThreadPool)ÚQueue)Úget_invlistc                   ó`   — e Zd ZdZdd„Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zy)ÚBigBatchSearcherz°
    Object that manages all the data related to the computation
    except the actual within-bucket matching and the organization of the
    computation (parallel or not)
    c                 ó*  — || _         g | _        || _        || _        || _        t        j                  |j                  «      }t        j                  t        |«      ||¬«      | _
        dgdz  | _        t        j                  «       x| _        | _        y )N)Úkeep_maxr   é   )ÚverboseÚtictocÚxqÚindexÚuse_float16ÚfaissÚis_similarity_metricÚmetric_typeÚ
ResultHeapÚlenÚrhÚt_accuÚtimeÚ	t_displayÚt0)Úselfr   r   Úkr   r   r	   s          úh/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/faiss/contrib/big_batch_search.pyÚ__init__zBigBatchSearcher.__init__   sy   € ð ˆŒØˆŒàˆŒØˆŒ
Ø&ˆÔÜ×-Ñ-¨e×.?Ñ.?Ó@ˆÜ×"Ñ"¤3 r£7¨A¸ÔAˆŒØ�c˜A‘gˆŒÜ#'§9¡9£;Ð.ˆŒ˜�ó    c                 ó6   — t        j                   «       | _        y ©N)r   Ú	t_accu_t0©r   s    r   Ústart_t_accuzBigBatchSearcher.start_t_accu,   s   € ÜŸ™›ˆ�r   c                 óp   — | j                   |xx   t        j                  «       | j                  z
  z  cc<   y r    )r   r   r!   )r   Úns     r   Ústop_t_accuzBigBatchSearcher.stop_t_accu/   s#   € Ø�‰�A‹œ$Ÿ)™)›+¨¯©Ñ6Ñ6Œr   c                 óv   — |t        j                   «       f| _        | j                  dkD  rt        |dd¬«       y y )Nr   ÚT©ÚendÚflush)r   r   r   Úprint)r   Únames     r   ÚticzBigBatchSearcher.tic2   s1   € ØœTŸY™Y›[Ð)ˆŒØ�<‰<˜!ÒÜ�$˜D¨Ö-ð r   c                 ó”   — | j                   \  }}t        j                  «       |z
  }| j                  dkD  rt        |› d|d›d�«       |S )Nr   z: ú.3fz s)r   r   r   r,   )r   r-   r   Údts       r   ÚtoczBigBatchSearcher.toc7   sG   € Ø—;‘;‰ˆˆbÜ�Y‰Y‹[˜2ÑˆØ�<‰<˜!ÒÜ�T�F˜"˜R ˜H BÐ'Ô(Øˆ	r   c                 óæ  — | j                   dk(  s8| j                   dk(  r*|dkD  r%t        j                  «       | j                  dz   k  ry t        j                  «       | j                  z
  }t	        d|d›d|› d| j
                  j                  › d	| j                  d
   d›d| j                  d   d›d| j                  d   d›d| j                  d   d›d| j                  d   d›d| j                  d   d›dt        j                  || j
                  j                  z  |dz   z  |z
  ¬«      › dt        j                  «       › �| j                   dk  rdndd¬«       t        j                  «       | _        y )Né   é   iè  g      ð?Ú[z.1fz	 s] list Ú/z times prep q r   r0   z prep b z comp z res é   z	 wait in é   z
 wait out é   z eta )Úsecondsz mem r(   Ú
Tr)   )r   r   r   r   r,   r   Únlistr   ÚdatetimeÚ	timedeltar   Úget_mem_usage_kb)r   ÚlÚts      r   ÚreportzBigBatchSearcher.report>   s_  € Ø�<‰<˜1ÒØ�L‰L˜AÒØ�T’œdŸi™i›k¨D¯N©N¸SÑ,@Ò@àÜ�I‰I‹K˜$Ÿ'™'Ñ!ˆÜØ��#ˆw�i ˜s ! D§J¡J×$4Ñ$4Ð#5ð 6Ø ŸK™K¨™N¨3Ð/¨x¸¿¹ÀA¹ÀsÐ7Kð LØ—K‘K ‘N 3Ð' u¨T¯[©[¸©^¸CÐ,@ð AØ—{‘{ 1‘~ cÐ*ð +ØŸ™ A™ sÐ+ð ,Ü×%Ñ%¨a°·
±
×0@Ñ0@Ñ.@À!ÀAÁ#Ñ.FÀqÑ.HÔIÐJð KÜ×)Ñ)Ó+Ð,ð.ð Ÿ™¨Ò)‘¨tØõ
	
ô Ÿ™›ˆ�r   c                 ó¼  — | j                  d«       d}t        | j                  «      }t        j                  || j
                  j                  fd¬«      }t        d||«      D ]`  }t        |||z   «      }| j
                  j                  j                  | j                  || | j
                  j                  «      \  }}|||| Œb | j                  «        || _        y )Nzcoarse quantizationi   Úint32)Údtyper   )r.   r   r   ÚnpÚemptyr   ÚnprobeÚrangeÚminÚ	quantizerÚsearchr2   Úq_assign)r   ÚbsÚnqrN   Úi0Úi1Úq_dis_iÚ
q_assign_is           r   Úcoarse_quantizationz$BigBatchSearcher.coarse_quantizationR   sº   € Ø�‰Ð&Ô'ØˆÜ�—‘‹\ˆÜ—8‘8˜R §¡×!2Ñ!2Ð3¸7ÔCˆÜ˜˜2˜rÖ"ˆBÜ�R˜˜b™Ó!ˆBØ"&§*¡*×"6Ñ"6×"=Ñ"=Ø—‘˜˜2� §
¡
× 1Ñ 1ó#ÑˆG�Zð )ˆH�R˜‰Oð #ð 	�‰Œ
Ø ˆ�r   c                 óž  — | j                  d«       | j                  }|dz  }t        j                  | j                  | j                  j
                  dz   d¬«      | _        | j                  j                  «       | _        | j                  dkD  rt        d| j                  d   «       | j                  dd  | _        | `| j                  «        y )Nzbucket sortr4   é   )ÚnbucketÚntr   z  number of -1s:)r.   rN   r   Úmatrix_bucket_sort_inplacer   r=   Úbucket_limsÚravelÚ	query_idsr   r,   r2   )r   rN   s     r   Úreorder_assignzBigBatchSearcher.reorder_assigna   s¨   € Ø�‰�ÔØ—=‘=ˆØ�A‰ˆÜ ×;Ñ;Ø�M‰M 4§:¡:×#3Ñ#3°aÑ#7¸Bô
ˆÔð Ÿ™×,Ñ,Ó.ˆŒØ�<‰<˜!ÒÜÐ$ d×&6Ñ&6°qÑ&9Ô:Ø×+Ñ+¨A¨BÐ/ˆÔØˆMØ�‰�
r   c                 óÂ  — t        j                   «       }| j                  }| j                  |   | j                  |dz      }}| j                  || }| j                  |   }| j
                  r||j                  j                  |«      z
  }t        j                   «       }t        |j                  |«      \  }	}
| j                  €|
j                  «       }
n| j                  |
«      }
| j                  r"|
j                  d«      }
|j                  d«      }t        j                   «       }| j                  dxx   ||z
  z  cc<   | j                  dxx   ||z
  z  cc<   |||	|
fS )z3prepare the queries and database items for bucket lr4   Úfloat16r   )r   r   r[   r]   r   Úby_residualrL   Úreconstructr   ÚinvlistsÚdecode_funcr\   r   Úastyper   )r   rA   r   r   rQ   rR   Úq_subsetÚxq_lÚt1Úlist_idsÚxb_lÚt2s               r   Úprepare_bucketzBigBatchSearcher.prepare_bucketo   s*  € ä�Y‰Y‹[ˆØ—
‘
ˆà×!Ñ! !Ñ$ d×&6Ñ&6°q¸1±uÑ&=ˆBˆØ—>‘> " RÐ(ˆØ�w‰w�xÑ ˆØ×ÒØ˜%Ÿ/™/×5Ñ5°aÓ8Ñ8ˆDÜ�Y‰Y‹[ˆä$ U§^¡^°QÓ7‰ˆ�$à×ÑÐ#Ø—:‘:“<‰Dà×#Ñ# DÓ)ˆDà×ÒØ—;‘;˜yÓ)ˆDØ—;‘;˜yÓ)ˆDä�Y‰Y‹[ˆØ�‰�A‹˜"˜r™'Ñ!‹Ø�‰�A‹˜"˜r™'Ñ!‹Ø˜˜x¨Ð-Ð-r   c                 óØ   — |€yt        j                   «       }|€|}n||   }| j                  j                  |||«       | j                  dxx   t        j                   «       |z
  z  cc<   y)z,add the bucket results to the heap structureNr8   )r   r   Úadd_result_subsetr   )r   rf   ÚDri   ÚIr   s         r   Úadd_results_to_heapz$BigBatchSearcher.add_results_to_heap‹   s[   € àˆ9ØÜ�Y‰Y‹[ˆØˆ9Ø‰Aà˜‘ˆAØ�‰×!Ñ! (¨A¨qÔ1Ø�‰�A‹œ$Ÿ)™)›+¨Ñ*Ñ*Œr   c                 ó„   — | j                   j                  | j                  j                  | j                  j                  fS r    )r   Úshaper   rI   r=   r"   s    r   Úsizes_in_checkpointz$BigBatchSearcher.sizes_in_checkpoint—   s+   € Ø—‘—‘˜tŸz™z×0Ñ0°$·*±*×2BÑ2BÐCÐCr   c                 ó"  — |dz   }t        |d«      5 }t        j                  | j                  «       || j                  j
                  | j                  j                  fdœ|d«       d d d «       t        j                  ||«       y # 1 sw Y   Œ xY w)Nz.tmpÚwb)ÚsizesÚ	completedr   éÿÿÿÿ)	ÚopenÚpickleÚdumprt   r   ro   rp   ÚosÚreplace)r   Úfnamerx   ÚtmpnameÚfs        r   Úwrite_checkpointz!BigBatchSearcher.write_checkpointš   su   € à˜&‘.ˆÜ�'˜4Ô  AÜ�K‰Kà!×5Ñ5Ó7Ø!*ØŸ7™7Ÿ9™9 d§g¡g§i¡iÐ0ñð
 Øô÷ !ô 	�
‰
�7˜EÕ"÷ !Ð ús   ’ABÂBc                 ó$  — t        |d«      5 }t        j                  |«      }d d d «       d   | j                  «       k(  sJ ‚|d   d   | j                  j
                  d d  |d   d   | j                  j                  d d  |d   S # 1 sw Y   ŒdxY w)NÚrbrw   r   r   r4   rx   )rz   r{   Úloadrt   r   ro   rp   )r   r   r�   Úckps       r   Úread_checkpointz BigBatchSearcher.read_checkpoint©   s�   € Ü�%˜Ô !Ü—+‘+˜a“.ˆC÷ à�7‰|˜t×7Ñ7Ó9Ò9Ð9Ð9Ø˜4‘y ‘|ˆ�‰�	‰	‘!ˆØ˜4‘y ‘|ˆ�‰�	‰	‘!ˆØ�;ÑÐ÷ Ðús   �BÂBN)r   F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r#   r&   r.   r2   rC   rU   r^   rl   rq   rt   r‚   r‡   © r   r   r   r      sI   „ ñó/ò%ò7ò.ò
ò%ò(!òò.ò8
+òDò#ó r   r   c                   óL   — e Zd ZdZdej
                  ej                  fd„Zd„ Zy)ÚBlockComputerzcomputation within one bucketÚknn_functionc                 óÈ  — || _         |j                  t        j                  k(  r1t        j                  |j
                  |j                  «      }d„ }d}�n\|j                  t        j                  k(  r�t        j                  |j
                  |j                  j                  |j                  j                  |j                  «      }|j                  |_	        |j                  j                  }d|_        |j                  }n°|j                  t        j                  k(  rzt        j                   |j
                  |j"                  j$                  |j                  «      }|j"                  |_        |j"                  j                  }d|_        |j                  }nt'        d|j                  › d�«      ‚|| _        |dk(  rd n|| _        || _        || _        || _        || _        y )Nc                 ó$   — | j                  d«      S )NÚfloat32)Úview)Úxs    r   Ú<lambda>z(BlockComputer.__init__.<locals>.<lambda>À   s   €  A§F¡F¨9Ô$5r   FTzindex type z not supportedr   )r   Ú	__class__r   ÚIndexIVFFlatÚ	IndexFlatÚdr   Ú
IndexIVFPQÚIndexPQÚpqÚMÚnbitsÚdecodeÚ
is_trainedra   ÚIndexIVFScalarQuantizerÚIndexScalarQuantizerÚsqÚqtypeÚRuntimeErrorÚ
index_helprd   ÚmethodÚpairwise_distancesÚknn)r   r   r§   r¨   r©   r¦   rd   ra   s           r   r   zBlockComputer.__init__µ   sl  € ð ˆŒ
Ø�?‰?œe×0Ñ0Ò0ÜŸ™¨¯©°%×2CÑ2CÓDˆJÙ5ˆKØŠKØ�_‰_¤× 0Ñ 0Ò0ÜŸ™Ø—‘˜Ÿ™Ÿ™ U§X¡X§^¡^°U×5FÑ5FóˆJð "ŸH™HˆJŒMØ$Ÿ-™-×.Ñ.ˆKØ$(ˆJÔ!Ø×+Ñ+‰KØ�_‰_¤× =Ñ =Ò=Ü×3Ñ3Ø—‘˜Ÿ™Ÿ™¨×):Ñ):óˆJð "ŸH™HˆJŒMØ$Ÿ-™-×.Ñ.ˆKØ$(ˆJÔ!Ø×+Ñ+‰Kä ¨U¯_©_Ð,=¸^ÐLÓMÐMØ$ˆŒØ#)¨WÒ#4™4¸+ˆÔØ&ˆÔØˆŒØ"4ˆÔØˆ�r   c                 ó  — | j                   j                  }|j                  dk(  s|j                  dk(  rd x}}||fS | j                  dk(  rgt	        j
                  || j                  j                  «       t        |«      | j                  _	        | j                  j                  ||«      \  }}||fS | j                  dk(  r| j                  |||¬«      }d }||fS | j                  dk(  r | j                  |||fd|i|¤Ž\  }}fS )Nr   r   r¨   )Úmetricr�   r«   )r   r   Úsizer§   r   Úcopy_array_to_vectorr¦   Úcodesr   ÚntotalrM   r¨   r©   )	r   rg   rj   ri   r   Ú
extra_argsr   ro   rp   s	            r   Úblock_searchzBlockComputer.block_searchÛ   s  € Ø—j‘j×,Ñ,ˆØ�9‰9˜Š>˜TŸY™Y¨!š^ØˆLˆA�ð �!ˆtˆð �[‰[˜GÒ#Ü×&Ñ& t¨T¯_©_×-BÑ-BÔCÜ%(¨£]ˆD�O‰OÔ"Ø—?‘?×)Ñ)¨$°Ó2‰DˆAˆqð �!ˆtˆð �[‰[Ð0Ò0à×'Ñ'¨¨d¸;Ð'ÓGˆAØˆAð �!ˆtˆð �[‰[˜NÒ*Ø�4—8‘8˜D $¨ÑL°+ÐLÀÑL‰DˆAˆqà�!ˆtˆr   N)	rˆ   r‰   rŠ   r‹   r   r¨   r©   r   r±   rŒ   r   r   rŽ   rŽ   ²   s%   „ Ù'ð
 Ø ×3Ñ3Ø�I‰Ió$óLr   rŽ   r�   Fr4   i   ry   c                 ó€  ‡ ‡‡
‡1‡2‡3— ‰ j                   }|dv sJ ‚|j                  }t        |«      |z  t        j                  d«      j
                  z  }t        |«      ‰z  t        j                  d«      j
                  t        j                  d«      j
                  z   z  }||z   |z   }|dkD  r)t        j                  d|› d|› d|› d	|› d
|dz  d›d�«       t        ‰ |‰||¬«      Š1t        ‰ |||¬«      Š2‰2j                  ‰1_
        ‰2j                  ‰1_        |€‰1j                  «        n|‰1_        ‰1j                  «        |€‰ j                  }t!        «       }|�”||fd‰ j                  fk(  sJ ‚t"        j$                  j'                  |«      rKt        j                  d|› �«       ‰1j)                  |«      }t        j                  dt        |«      › �«       nt        j                  d«       |dk(  r¥t+        ||«      D ]”  }‰1j-                  |«       ‰1j/                  |«      \  }}}}t1        j0                  «       }‰2j3                  |||‰«      \  }}‰1j4                  dxx   t1        j0                  «       |z
  z  cc<   ‰1j7                  ||||«       Œ– �n¿|dk(  rôˆ1ˆ fd„}‰1j/                  |«      } d}!t9        d«      }"t+        ||«      D ]   }‰1j-                  |«       |"j;                  ||!|dz   f«      }#| \  }}}}‰1j=                  «        ‰2j3                  |||‰«      \  }}‰1j?                  d«       ||||f}!‰1j=                  «        |#jA                  «       } ‰1j?                  d«       Œ¢  ‰1j6                  |!Ž  |"jC                  «        �nÆd„ Š3ˆ3fd„}$d"ˆ1fd„	}%ˆ2ˆ
ˆfd„}&tE        d«      }'tE        d«      }( |$|&‰
d‰
t!        «       |(|'«      }) |$|%|	||||'d«      }*t1        j0                  «       }+	 t        j                  d«       |(jA                  «       },|,s�n|,\  }-}.}/}0}}}}|-|k(  rddz   ‰1j4                  dxx   |0z  cc<   ‰1j4                  dxx   |.z  cc<   ‰1j4                  dxx   |/z  cc<   t        j                  d|-› �«       ‰1j7                  ||||«       t        j                  d|-› �«       |jG                  |-«       ‰1j-                  |-«       |�Ut1        j0                  «       |+z
  |kD  r;t        j                  d «       ‰1jI                  ||«       t1        j0                  «       }+�ŒB|*jK                  «        |)jK                  «        ‰1jM                  d!«       ‰1jN                  jQ                  «        ‰1jS                  «        ‰1jN                  jT                  ‰1jN                  jV                  fS )#a·  
    Search queries xq in the IVF index, with a search function that collects
    batches of query vectors per inverted list. This can be faster than the
    regular search indexes.
    Supports IVFFlat, IVFPQ and IVFScalarQuantizer.

    Supports three computation methods:
    method = "index":
        build a flat index and populate it separately for each index
    method = "pairwise_distances":
        decompress codes and compute all pairwise distances for the queries
        and index and add result to heap
    method = "knn_function":
        decompress codes and compute knn results for the queries

    threaded=0: sequential execution
    threaded=1: prefetch next bucket while computing the current one
    threaded=2: prefetch prefetch_threads buckets at a time.

    compute_threads>1: the knn function will get an additional thread_no that
        tells which worker should handle this.

    In threaded mode, the computation is tiled with the bucket preparation and
    the writeback of results (useful to maximize GPU utilization).

    use_float16: convert all matrices to float16 (faster for GPU gemm)

    q_assign: override coarse assignment, should be a matrix of size nq * nprobe

    checkpointing (only for threaded > 1):
    checkpoint: file where the checkpoints are stored
    checkpoint_freq: when to perform checkpointing. Should be a multiple of
        threaded

    start_list, end_list: process only a subset of invlists
    )r   r¨   r�   rE   Úint64r’   r   zmemory: queries z assign z result z total z = i   @r0   z GiB)r   r   )r§   r¨   r©   Nzrecovering checkpoint: z   already completed: z$no checkpoint: starting from scratchr5   r4   c                 óh   •— | � ‰j                   | Ž  |‰j                  k  r‰j                  |«      S y)z^perform the addition for the previous bucket and
            prefetch the next (if applicable)N)rq   r=   rl   )Úto_addrA   Úbbsr   s     €€r   Úadd_results_and_prefetchz2big_batch_search.<locals>.add_results_and_prefetchc  s<   ø€ ð Ð!Ø'�×'Ñ'¨Ñ0Ø�5—;‘;ŠØ×)Ñ)¨!Ó,Ð,ð r   r9   c           
      óž  — 	 t        |«      5 }t        ||«      D �cg c]  }||vr|j                  | |||f¬«      ‘Œ }	}|	D ]  }
|
j                  «        Œ |j	                  «        |j                  «        d d d «       |j                  d «       y c c}w # 1 sw Y   Œ xY w#  t        j                  «        t        j                  «        ‚ xY w)N)Úargs)r   rJ   Úapply_asyncÚgetÚcloseÚjoinÚputÚ	tracebackÚ	print_excÚ_threadÚinterrupt_main)ÚtaskÚ	pool_sizeÚ
start_taskÚend_taskrx   Úoutput_queueÚinput_queueÚpoolÚiÚresÚrs              r   Útask_manager_threadz-big_batch_search.<locals>.task_manager_thread�  sÍ   € ðÜ 	Ô*¨dô
 "' z°8Ô!<ó	ñ "=˜AØ IÑ-ð	 ×(Ñ(Ø ¨¨<¸Ð'Eð )õ ð "=ð	 ð ó !˜ØŸ™�ð !à—J‘J”LØ—I‘I”K÷ +ð × Ñ  Õ&ùò÷ +Ð*ûðÜ×#Ñ#Ô%Ü×&Ñ&Ô(Øús2   ‚B! �Bœ!B½9BÁ6B! ÂBÂBÂB! Â!+Cc                  ód   •— t        j                  ‰| ¬«      }d|_        |j                  «        |S )N)Útargetr¹   T)Ú	threadingÚThreadÚdaemonÚstart)r¹   Útask_managerrÍ   s     €r   rÔ   z&big_batch_search.<locals>.task_manager�  s5   ø€ Ü$×+Ñ+Ø*ØôˆLð #'ˆLÔØ×ÑÔ ØÐr   c                 ó  •— 	 t        j                  d| › �«       ‰j                  | «      \  }}}}|j                  | ||||f«       t        j                  d| › �«       y #  t	        j
                  «        t        j                  «        ‚ xY w)NzPrepare start: zPrepare end: )ÚloggingÚinforl   r¾   r¿   rÀ   rÁ   rÂ   )Útask_idrÇ   rÈ   rf   rg   ri   rj   r¶   s          €r   Úprepare_taskz&big_batch_search.<locals>.prepare_task¦  s‚   ø€ ðÜ—‘˜¨w¨iÐ8Ô9Ø14×1CÑ1CÀGÓ1LÑ.�˜$ ¨$Ø× Ñ  '¨8°T¸8ÀTÐ!JÔKÜ—‘˜}¨W¨IÐ6Õ7øðÜ×#Ñ#Ô%Ü×&Ñ&Ô(Øús   ƒAA  Á +Bc           
      ób  •— 	 t        j                  d| › �«       d}	 t        j                  «       }t        j                  d| › �«       |j                  «       }t        j                  «       |z
  }|€|j	                  d «       nå|\  }}}	}
}t        j                  d| › d|› �«       t        j                  «       }‰dkD  r‰j                  |	||
‰| ¬«      \  }}n‰j                  |	||
‰«      \  }}t        j                  «       |z
  }t        j                  d| › d|› �«       t        j                  «       }|j	                  |||||||
|f«       t        j                  «       |z
  }�ŒLt        j                  d	| › �«       y #  t        j                  «        t        j                  «        ‚ xY w)
NzCompute start: r   zCompute input: task zCompute work: task z, centroid r4   )Ú	thread_idzCompute output: task zCompute end: )
rÖ   r×   r   r»   r¾   r±   r¿   rÀ   rÁ   rÂ   )rØ   rÇ   rÈ   Ú
t_wait_outr   Úinput_valueÚ	t_wait_inÚcentroidrf   rg   ri   rj   ro   rp   Ú	t_computeÚcompÚcomputation_threadsr   s                  €€€r   Úcompute_taskz&big_batch_search.<locals>.compute_task±  s¨  ø€ ð-Ü—‘˜¨w¨iÐ8Ô9Ø�
ØÜŸ™›�BÜ—L‘LÐ#7¸°yÐ!AÔBØ"-§/¡/Ó"3�KÜ $§	¡	£¨bÑ 0�IØ"Ð*à#Ÿ™¨Ô-ØØ?JÑ<�H˜h¨¨h¸Ü—L‘LØ-¨g¨Y°kÀ(ÀÐLôô Ÿ™›�BØ*¨QÒ.Ø#×0Ñ0Ø  $¨°!¸wð  1ó  ™˜™1ð  $×0Ñ0°°t¸XÀqÓI™˜˜1Ü $§	¡	£¨bÑ 0�IÜ—L‘LØ/°¨y¸ÀHÀ:ÐNôô Ÿ™›�BØ ×$Ñ$à$Ø%Ø&Ø%Ø$ØØ$Øð	ôô "&§¡£¨rÑ!1�JñK ôL —‘˜}¨W¨IÐ6Õ7øðÜ×#Ñ#Ô%Ü×&Ñ&Ô(Øús   ƒE?F Æ+F.zWaiting for resultr:   zAdding to heap start: centroid zAdding to heap end: centroid zwriting checkpointzfinalize heapr    ),rI   Únbytesr   rG   rF   ÚitemsizerÖ   r×   r   rŽ   rd   ra   rU   rN   r^   r=   Úsetr}   ÚpathÚexistsr‡   rJ   rC   rl   r   r±   r   rq   r   rº   r#   r&   r»   r¼   r   Úaddr‚   r½   r.   r   Úfinalizer2   ro   rp   )4r   r   r   r§   r¨   r©   r   Úthreadedr   Úprefetch_threadsrâ   rN   Ú
checkpointÚcheckpoint_freqÚ
start_listÚend_listÚcrash_atrI   Úmem_queriesÚ
mem_assignÚmem_resÚmem_totrx   rA   rf   rg   ri   rj   Út0iro   rp   r·   Úprefetched_bucketrµ   rÉ   Úprefetched_bucket_arÔ   rÙ   rã   Úprepare_to_compute_queueÚcompute_to_main_queueÚcompute_task_managerÚprepare_task_managerÚt_checkpointÚvaluerß   rÞ   rÜ   rà   r¶   rá   rÍ   s4   ` `       `                                      @@@r   Úbig_batch_searchrÿ   í   sl  ý€ ðn �\‰\€FàÐDÑDÐDÐDà—)‘)€KÜ�R“˜6Ñ!¤B§H¡H¨WÓ$5×$>Ñ$>Ñ>€JäˆB‹Ø
ñ	ä�8‰8�GÓ×%Ñ%¬¯©°Ó(;×(DÑ(DÑDñ	Fð ð
 ˜JÑ&¨Ñ0€GØ�‚{Ü�‰Ø˜{˜m¨8°J°<ð @Ø�Y˜g g Y¨c°'¸UÑ2CÀCÐ1HÈðNô	
ô
 Øˆr�1˜g°;ô€Cô Ø�fÐ1CÈô€Dð ×&Ñ&€C„Oà×&Ñ&€C„OØÐØ×ÑÕ!àˆŒØ×ÑÔàÐØ—;‘;ˆä“€IØÐØ˜HÐ%¨!¨U¯[©[Ð)9Ò9Ð9Ð9Ü�7‰7�>‰>˜*Ô%Ü�L‰LÐ2°:°,Ð?Ô@Ø×+Ñ+¨JÓ7ˆIÜ�L‰LÐ1´#°i³.Ð1AÐBÕCä�L‰LÐ?Ô@à�1‚}ô �z 8Ö,ˆAØ�J‰J�qŒMØ-0×-?Ñ-?ÀÓ-BÑ*ˆH�d˜H dÜ—)‘)“+ˆCØ×$Ñ$ T¨4°¸1Ó=‰DˆAˆqØ�J‰J�q‹MœTŸY™Y›[¨3Ñ.Ñ.‹MØ×#Ñ# H¨a°¸1Õ=ò -ð 
�QŠõ	-ð  ×.Ñ.¨zÓ:ÐØˆÜ˜!‹}ˆä�z 8Ö,ˆAØ�J‰J�qŒMØ"&×"2Ñ"2Ø(¨6°1°q±5¨/ó#Ðð .?Ñ*ˆH�d˜H dØ×ÑÔØ×$Ñ$ T¨4°¸1Ó=‰DˆAˆqØ�O‰O˜AÔØ˜q (¨AÐ-ˆFØ×ÑÔØ 3× 7Ñ 7Ó 9ÐØ�O‰O˜AÕð -ð 	 ˆ×Ñ Ñ(Ø�
‰
Žò	ô8	 õ		ö.	ô` $)¨£8Ð Ü % a£ÐÙ+ØØØØÜ‹EØ!Ø$ó 
Ðñ  ,ØØØØØØ$Øó 
Ðô —y‘y“{ˆØÜ�L‰LÐ-Ô.Ø)×-Ñ-Ó/ˆEÙÙð ñ	ØØØØØØØØð ˜8Ò#Ø�A’Ø�J‰J�q‹M˜YÑ&‹MØ�J‰J�q‹M˜YÑ&‹MØ�J‰J�q‹M˜ZÑ'‹MÜ�L‰LÐ:¸8¸*ÐEÔFØ×#Ñ# H¨a°¸1Ô=Ü�L‰LÐ8¸¸
ÐCÔDØ�M‰M˜(Ô#Ø�J‰J�xÔ ØÐ%Ü—9‘9“; Ñ-°Ò?Ü—L‘LÐ!5Ô6Ø×(Ñ(¨°YÔ?Ü#'§9¡9£;�Lñ= ð@ 	×!Ñ!Ô#Ø×!Ñ!Ô#à‡G�GˆOÔØ‡F�F‡O�OÔØ‡G�G„Ià�6‰6�8‰8�S—V‘V—X‘XÐÐr   )r   r{   r}   rÖ   Úmultiprocessing.poolr   rÐ   rÁ   Úqueuer   r¿   r>   ÚnumpyrG   r   Úfaiss.contrib.inspect_toolsr   r   rŽ   r¨   r©   rÿ   rŒ   r   r   Ú<module>r     s‚   ðó Û Û 	Û Ý +Û Û Ý Û Û ã Û å 3÷X ñ X ÷v8ñ 8ð~ Ø×/Ñ/Ø�	‰	ØØØØØØØØØØØô#qr   