§
    ÐÁ³gèD  ã                   óæ   — 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dS )é    N)Ú
ThreadPool)ÚQueue)Úget_invlistc                   óf   — 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dS )Ú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)
    r   Fc                 ó$  — || _         g | _        || _        || _        || _        t          j        |j        ¦  «        }t          j        t          |¦  «        ||¬¦  «        | _
        dgdz  | _        t          j        ¦   «         x| _        | _        d S )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          ú\/var/www/html/mpstechhub/venv/lib/python3.11/site-packages/faiss/contrib/big_batch_search.pyÚ__init__zBigBatchSearcher.__init__   s   € ð ˆŒØˆŒàˆŒØˆŒ
Ø&ˆÔÝÔ-¨eÔ.?Ñ@Ô@ˆÝÔ"¥3 r¡7¤7¨A¸ÐAÑAÔAˆŒØ�c˜A‘gˆŒÝ#'¤9¡;¤;Ð.ˆŒ˜œ˜˜ó    c                 ó6   — t          j         ¦   «         | _        d S ©N)r   Ú	t_accu_t0©r   s    r   Ústart_t_accuzBigBatchSearcher.start_t_accu0   s   € Ýœ™œˆŒˆˆr   c                 ób   — | j         |xx         t          j        ¦   «         | j        z
  z  cc<   d S r    )r   r   r!   )r   Úns     r   Ústop_t_accuzBigBatchSearcher.stop_t_accu3   s+   € ØŒ�AˆˆŒ�$œ)™+œ+¨¬Ñ6Ñ6ˆˆ‰ˆˆr   c                 óx   — |t          j         ¦   «         f| _        | j        dk    rt          |dd¬¦  «         d S d S )Nr   úT©ÚendÚflush)r   r   r   Úprint)r   Únames     r   ÚticzBigBatchSearcher.tic6   sD   € Ø�TœY™[œ[Ð)ˆŒØŒ<˜!ÒÐÝ�$˜D¨Ð-Ñ-Ô-Ð-Ð-Ð-ð Ðr   c                 óˆ   — | j         \  }}t          j        ¦   «         |z
  }| j        dk    rt          |› d|d›d�¦  «         |S )Nr   z: ú.3fz s)r   r   r   r,   )r   r-   r   Údts       r   ÚtoczBigBatchSearcher.toc;   sQ   € Ø”;‰ˆˆbÝŒY‰[Œ[˜2ÑˆØŒ<˜!ÒÐÝ�TÐ'Ð'˜RÐ'Ð'Ð'Ð'Ñ(Ô(Ð(Øˆ	r   c                 ó€  — | j         dk    s0| j         dk    r'|dk    r!t          j        ¦   «         | j        dz   k     rd S 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        ¦   «         | _        d S )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.reportB   s�  € ØŒ<˜1ÒÐØŒL˜AÒÐØ�D’��TœY™[œ[¨4¬>¸CÑ+?Ò?Ð?ð ˆFÝŒI‰KŒK˜$œ'Ñ!ˆÝð.�Ð7ð .ð . ð .ð . D¤JÔ$4ð .ð .Ø œK¨œNÐMð.ð .Ø8<¼ÀA¼ÐMð.ð .à”K ”NÐBð.ð .à-1¬[¸¬^ÐBð.ð .ð ”{ 1”~Ð,ð.ð .ð œ AœÐ-ð	.ð .õ
 Ô%¨a°´
Ô0@Ñ.@À!ÀAÁ#Ñ.FÀqÑ.HÐIÑIÔIð.ð .õ Ô)Ñ+Ô+ð.ð .ð œ¨Ò*Ð*��°Øð
	
ñ 
	
ô 
	
ð 
	
õ œ™œˆŒˆˆr   c                 ó¦  — |                       d¦  «         d}t          | j        ¦  «        }t          j        || j        j        fd¬¦  «        }t          d||¦  «        D ]V}t          |||z   ¦  «        }| j        j	         
                    | j        ||…         | j        j        ¦  «        \  }}||||…<   ŒW|                      ¦   «          || _        d S )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_quantizationW   sÏ   € Ø�ŠÐ&Ñ'Ô'Ð'ØˆÝ�”‰\Œ\ˆÝ”8˜R ¤Ô!2Ð3¸7ÐCÑCÔCˆÝ˜˜2˜rÑ"Ô"ð 	)ð 	)ˆBÝ�R˜˜b™Ñ!Ô!ˆBØ"&¤*Ô"6×"=Ò"=Ø”˜˜2˜” ¤
Ô 1ñ#3ô #3ÑˆG�Zð )ˆH�R˜�U‰OˆOØ�Š‰
Œ
ˆ
Ø ˆŒˆˆr   c                 ó€  — |                       d¦  «         | j        }|dz  }t          j        | j        | j        j        dz   d¬¦  «        | _        | j                             ¦   «         | _        | j	        dk    rt          d| j        d         ¦  «         | j        dd …         | _        | `|                      ¦   «          d S )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_assigne   s¹   € Ø�Š�ÑÔÐØ”=ˆØ�A‰ˆÝ Ô;ØŒM 4¤:Ô#3°aÑ#7¸Bð@ñ @ô @ˆÔàœ×,Ò,Ñ.Ô.ˆŒØŒ<˜!ÒÐÝÐ$ dÔ&6°qÔ&9Ñ:Ô:Ð:ØÔ+¨A¨B¨BÔ/ˆÔØˆMØ�Š‰
Œ
ˆ
ˆ
ˆ
r   c                 óœ  — t          j         ¦   «         }| j        }| j        |         | j        |dz            }}| j        ||…         }| j        |         }| j        r||j                             |¦  «        z
  }t          j         ¦   «         }t          |j	        |¦  «        \  }	}
| j
        €|
                     ¦   «         }
n|  
                    |
¦  «        }
| j        r*|
                     d¦  «        }
|                     d¦  «        }t          j         ¦   «         }| j        dxx         ||z
  z  cc<   | j        dxx         ||z
  z  cc<   |||	|
fS )z4 prepare the queries and database items for bucket lr4   NÚ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_bucketr   s<  € åŒY‰[Œ[ˆØ”
ˆàÔ! !Ô$ dÔ&6°q¸1±uÔ&=ˆBˆØ”> " R %Ô(ˆØŒw�xÔ ˆØÔð 	9Ø˜%œ/×5Ò5°aÑ8Ô8Ñ8ˆDÝŒY‰[Œ[ˆå$ U¤^°QÑ7Ô7‰ˆ�$àÔÐ#Ø—:’:‘<”<ˆDˆDà×#Ò# DÑ)Ô)ˆDàÔð 	*Ø—;’;˜yÑ)Ô)ˆDØ—;’;˜yÑ)Ô)ˆDåŒY‰[Œ[ˆØŒ�AˆˆŒ˜"˜r™'Ñ!ˆˆ‰ØŒ�AˆˆŒ˜"˜r™'Ñ!ˆˆ‰Ø˜˜x¨Ð-Ð-r   c                 óØ   — |€dS t          j         ¦   «         }|€|}n||         }| j                             |||¦  «         | j        dxx         t          j         ¦   «         |z
  z  cc<   dS )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Ž   sm   € àˆ9ØˆFÝŒY‰[Œ[ˆØˆ9ØˆAˆAà˜”ˆAØŒ×!Ò! (¨A¨qÑ1Ô1Ð1ØŒ�AˆˆŒ�$œ)™+œ+¨Ñ*Ñ*ˆˆ‰ˆˆr   c                 óH   — | 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Ô0°$´*Ô2BÐCÐCr   c                 ó  — |dz   }t          |d¦  «        5 }t          j        |                      ¦   «         || j        j        | j        j        fdœ|d¦  «         d d d ¦  «         n# 1 swxY w Y   t          j        ||¦  «         d S )Nz.tmpÚwb)ÚsizesÚ	completedr   éÿÿÿÿ)	ÚopenÚpickleÚdumprt   r   ro   rp   ÚosÚreplace)r   Úfnamerx   ÚtmpnameÚfs        r   Úwrite_checkpointz!BigBatchSearcher.write_checkpoint�   sÎ   € à˜&‘.ˆÝ�'˜4Ñ Ô ð 	 AÝŒKà!×5Ò5Ñ7Ô7Ø!*Øœ7œ9 d¤g¤iÐ0ðð ð �bñô ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	õ 	Œ
�7˜EÑ"Ô"Ð"Ð"Ð"s   –AA%Á%A)Á,A)c                 ó>  — t          |d¦  «        5 }t          j        |¦  «        }d d d ¦  «         n# 1 swxY w Y   |d         |                      ¦   «         k    sJ ‚|d         d         | j        j        d d …<   |d         d         | j        j        d d …<   |d         S )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Ð9Ð9Ø˜4”y ”|ˆŒŒ	�!�!�!‰Ø˜4”y ”|ˆŒŒ	�!�!�!‰Ø�;ÔÐs   ‘2²6¹6N)r   F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r#   r&   r.   r2   rC   rU   r^   rl   rq   rt   r‚   r‡   © r   r   r   r      sñ   € € € € € ðð ð Øð	/ð /ð /ð /ð$%ð %ð %ð7ð 7ð 7ð.ð .ð .ð
ð ð ð%ð %ð %ð*!ð !ð !ðð ð ð.ð .ð .ð8
+ð 
+ð 
+ðDð Dð Dð
#ð 
#ð 
#ð ð  ð  ð  ð  r   r   c                   ó:   — e Zd ZdZdej        ej        fd„Zd„ ZdS )ÚBlockComputerz computation within one bucket Úknn_functionc                 óÊ  — || _         |j        t          j        k    r%t          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    rQt          j        |j        |j        j        |j        ¦  «        }|j        |_        |j        j        }d|_        |j        }nt'          d|j        › d�¦  «        ‚|| _        |dk    rd n|| _        || _        || _        || _        || _        d S )Nc                 ó,   — |                       d¦  «        S )NÚfloat32)Úview)Úxs    r   ú<lambda>z(BlockComputer.__init__.<locals>.<lambda>¿   s   €  A§F¢F¨9Ñ$5Ô$5€ r   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__µ   sP  € ð ˆŒ
ØŒ?�eÔ0Ò0Ð0Ýœ¨¬°%Ô2CÑDÔDˆJØ5Ð5ˆKØˆKˆKØŒ_¥Ô 0Ò0Ð0ÝœØ”˜œœ U¤X¤^°UÔ5FñHô HˆJà!œHˆJŒMØ$œ-Ô.ˆKØ$(ˆJÔ!ØÔ+ˆKˆKØŒ_¥Ô =Ò=Ð=ÝÔ3Ø”˜œœ¨Ô):ñ<ô <ˆJà!œHˆJŒMØ$œ-Ô.ˆKØ$(ˆJÔ!ØÔ+ˆKˆKåÐL¨U¬_ÐLÐLÐLÑMÔMÐMØ$ˆŒØ#)¨WÒ#4Ð#4˜4˜4¸+ˆÔØ&ˆÔØˆŒØ"4ˆÔØˆŒˆˆr   c                 ó¨  — | j         j        }|j        dk    s|j        dk    rd x}}n¨| j        dk    rWt	          j        || j        j        ¦  «         t          |¦  «        | j        _	        | j         
                    ||¦  «        \  }}nF| j        dk    r|                      |||¬¦  «        }d }n | 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Ô,ˆØŒ9˜Š>ˆ>˜TœY¨!š^˜^ØˆLˆA��ØŒ[˜GÒ#Ð#ÝÔ& t¨T¬_Ô-BÑCÔCÐCÝ%(¨¡]¤]ˆDŒOÔ"Ø”?×)Ò)¨$°Ñ2Ô2‰DˆAˆqˆqØŒ[Ð0Ò0Ð0à×'Ò'¨¨d¸;Ð'ÑGÔGˆAØˆAˆAØŒ[˜NÒ*Ð*Ø�4”8˜D $¨ÐLÐL°+ÐLÀÐLÐL‰DˆAˆqà�!ˆtˆr   N)	rˆ   r‰   rŠ   r‹   r   r¨   r©   r   r±   rŒ   r   r   rŽ   rŽ   ²   sN   € € € € € Ø)Ð)ð
 "Ø$Ô7Ø”	ð!ð !ð !ð !ðFð ð ð ð 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k    r(t          j        d|› d|› d|› d	|› d
|dz  d›d�¦  «         t          ‰ |‰||¬¦  «        Š1t          ‰ |||¬¦  «        Š2‰2j
        ‰1_
        ‰2j        ‰1_        |€‰1                     ¦   «          n|‰1_        ‰1                     ¦   «          |€‰ j        }t!          ¦   «         }|�•||fd‰ j        fk    sJ ‚t"          j                             |¦  «        rQt          j        d|› �¦  «         ‰1                     |¦  «        }t          j        dt          |¦  «        › �¦  «         nt          j        d¦  «         |dk    r³t+          ||¦  «        D ] }‰1                     |¦  «         ‰1                     |¦  «        \  }}}}t1          j        ¦   «         }‰2                     |||‰¦  «        \  }}‰1j        dxx         t1          j        ¦   «         |z
  z  cc<   ‰1                     ||||¦  «         Œ¡�n|dk    �rˆ1ˆ fd„}‰1                     |¦  «        } d}!t9          d¦  «        }"t+          ||¦  «        D ]À}‰1                     |¦  «         |"                     ||!|dz   f¦  «        }#| \  }}}}‰1                     ¦   «          ‰2                     |||‰¦  «        \  }}‰1                     d¦  «         ||||f}!‰1                     ¦   «          |#                      ¦   «         } ‰1                     d¦  «         ŒÁ ‰1j        |!Ž  |" !                    ¦   «          �néd„ Š3ˆ3fd„}$d#ˆ1fd„	}%ˆ2ˆ
ˆfd„}&tE          d¦  «        }'tE          d¦  «        }( |$|&‰
d‰
t!          ¦   «         |(|'¦  «        }) |$|%|	||||'d¦  «        }*t1          j        ¦   «         }+	 t          j        d¦  «         |(                      ¦   «         },|,s�n |,\  }-}.}/}0}}}}|-|k    rddz   ‰1j        dxx         |0z  cc<   ‰1j        dxx         |.z  cc<   ‰1j        dxx         |/z  cc<   t          j        d|-› �¦  «         ‰1                     ||||¦  «         t          j        d |-› �¦  «         | #                    |-¦  «         ‰1                     |-¦  «         |�Wt1          j        ¦   «         |+z
  |k    r=t          j        d!¦  «         ‰1 $                    ||¦  «         t1          j        ¦   «         }+�ŒL|* %                    ¦   «          |) %                    ¦   «          ‰1 &                    d"¦  «         ‰1j'         (                    ¦   «          ‰1 )                    ¦   «          ‰1j'        j*        ‰1j'        j+        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 perparation 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 checkpoinging. 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                 ó`   •— | �
 ‰j         | Ž  |‰j        k     r‰                     |¦  «        S dS )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_prefetcha  sA   ø€ ð Ð!Ø'�Ô'¨Ð0Ð0Ø�5”;ŠˆØ×)Ò)¨!Ñ,Ô,Ð,ð ˆr   r9   c                 ó¤  ‡ ‡‡‡‡	— 	 t          |¦  «        5 Š	ˆˆˆˆ	ˆ fd„t          ||¦  «        D ¦   «         }|D ]}|                     ¦   «          Œ‰	                     ¦   «          ‰	                     ¦   «          d d d ¦  «         n# 1 swxY w Y   ‰                     d ¦  «         d S #  t          j        ¦   «          t          j	        ¦   «          ‚ xY w)Nc                 óL   •— g | ] }|‰v¯‰                      ‰|‰‰f¬ ¦  «        ‘Œ!S ))Úargs)Úapply_async)Ú.0Úirx   Úinput_queueÚoutput_queueÚpoolÚtasks     €€€€€r   ú
<listcomp>zAbig_batch_search.<locals>.task_manager_thread.<locals>.<listcomp>‰  sT   ø€ ð /ð /ð /ð Ø IÐ-Ð-ð	  ×+Ò+ØØ ¨{Ð;ð ,ñ =ô =ð .Ð-Ð-r   )
r   rJ   ÚgetÚcloseÚjoinÚputÚ	tracebackÚ	print_excÚ_threadÚinterrupt_main)
rÁ   Ú	pool_sizeÚ
start_taskÚend_taskrx   r¿   r¾   ÚresÚrrÀ   s
   `   ```  @r   Útask_manager_threadz-big_batch_search.<locals>.task_manager_thread~  s4  øøøøø€ ðÝ 	Ñ*Ô*ð 	 ¨dð/ð /ð /ð /ð /ð /ð /ð /õ "' z°8Ñ!<Ô!<ð/ñ /ô /�Cð
 !ð  ð  ˜ØŸš™œ˜˜Ø—J’J‘L”L�LØ—I’I‘K”K�Kð	 ð 	 ð 	 ñ 	 ô 	 ð 	 ð 	 ð 	 ð 	 ð 	 ð 	 øøøð 	 ð 	 ð 	 ð 	 ð × Ò  Ñ&Ô&Ð&Ð&Ð&øðÝÔ#Ñ%Ô%Ð%ÝÔ&Ñ(Ô(Ð(Øøøøs/   ‡B& –A"BÁ8B& ÂBÂB& ÂBÂB& Â&)Cc                  ój   •— t          j        ‰| ¬¦  «        }d|_        |                     ¦   «          |S )N)Útargetrº   T)Ú	threadingÚThreadÚdaemonÚstart)rº   Útask_managerrÐ   s     €r   r×   z&big_batch_search.<locals>.task_manager˜  sB   ø€ Ý$Ô+Ø*Øðñ ô ˆLð #'ˆLÔØ×ÒÑ Ô Ð ØÐr   c                 ó&  •— 	 t          j        d| › �¦  «         ‰                     | ¦  «        \  }}}}|                     | ||||f¦  «         t          j        d| › �¦  «         d S #  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¥   ø€ ðÝ”Ð8¨wÐ8Ð8Ñ9Ô9Ð9Ø14×1CÒ1CÀGÑ1LÔ1LÑ.�˜$ ¨$Ø× Ò  '¨8°T¸8ÀTÐ!JÑKÔKÐKÝ”Ð6¨WÐ6Ð6Ñ7Ô7Ð7Ð7Ð7øðÝÔ#Ñ%Ô%Ð%ÝÔ&Ñ(Ô(Ð(Øøøøs   ƒA"A' Á')Bc           
      ót  •— 	 t          j        d| › �¦  «         d}	 t          j        ¦   «         }t          j        d| › �¦  «         |                     ¦   «         }t          j        ¦   «         |z
  }|€|                     d ¦  «         nì|\  }}}	}
}t          j        d| › d|› �¦  «         t          j        ¦   «         }‰dk    r‰                     |	||
‰| ¬¦  «        \  }}n‰                     |	||
‰¦  «        \  }}t          j        ¦   «         |z
  }t          j        d	| › d|› �¦  «         t          j        ¦   «         }|                     |||||||
|f¦  «         t          j        ¦   «         |z
  }�ŒXt          j        d
| › �¦  «         d S #  t          j        ¦   «          t          j	        ¦   «          ‚ xY w)NzCompute start: r   Tz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æ  ø€ ð Ý”Ð8¨wÐ8Ð8Ñ9Ô9Ð9Ø�
ð2Ýœ™œ�BÝ”LÐ!A¸Ð!AÐ!AÑBÔBÐBØ"-§/¢/Ñ"3Ô"3�KÝ $¤	¡¤¨bÑ 0�IØ"Ð*à#Ÿš¨Ñ-Ô-Ð-ØØ?JÑ<�H˜h¨¨h¸Ý”LÐ!U°wÐ!UÐ!UÈ8Ð!UÐ!UÑVÔVÐVÝœ™œ�BØ*¨QÒ.Ð.Ø#×0Ò0Ø  $¨°!¸wð  1ñ  ô  ™˜˜1˜1ð  $×0Ò0°°t¸XÀqÑIÔI™˜˜1Ý $¤	¡¤¨bÑ 0�IÝ”LÐ!W¸Ð!WÐ!WÈXÐ!WÐ!WÑXÔXÐXÝœ™œ�BØ ×$Ò$Ø! 9¨j¸)ÀXÈqÐRZÐ\]Ð^ñô ð õ "&¤¡¤¨rÑ!1�Jñ12õ2 ”Ð6¨WÐ6Ð6Ñ7Ô7Ð7Ð7Ð7øðÝÔ#Ñ%Ô%Ð%ÝÔ&Ñ(Ô(Ð(Øøøøs   ƒF	F Æ)F7Tz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  ê   s  øøøøøø€ ðh Œ\€FàÐDÐDÐDÐDÐDà”)€KÝ�R‘”˜6Ñ!¥B¤H¨WÑ$5Ô$5Ô$>Ñ>€JÝ�"‰gŒg˜‰kÝ
Œ�ÑÔÔ"Ý
Œ(�9Ñ
Ô
Ô
&ñ	'ñ€Gð ˜JÑ&¨Ñ0€GØ�‚{€{ÝŒðN˜{ð Nð N°Jð Nð NØðNð NØ&-ðNð NØ29¸UÑ2CÐMðNð Nð Nñ	
ô 	
ð 	
õ
 Øˆr�1ØØðñ ô €Cõ ØØØ-Øð	ñ ô €Dð Ô&€C„OàÔ&€C„OØÐØ×ÒÑ!Ô!Ð!Ð!àˆŒØ×ÒÑÔÐàÐØ”;ˆå‘”€IØÐØ˜HÐ%¨!¨U¬[Ð)9Ò9Ð9Ð9Ð9ÝŒ7�>Š>˜*Ñ%Ô%ð 	AÝŒLÐ?°:Ð?Ð?Ñ@Ô@Ð@Ø×+Ò+¨JÑ7Ô7ˆIÝŒLÐBµ#°i±.´.ÐBÐBÑCÔCÐCÐCåŒLÐ?Ñ@Ô@Ð@à�1‚}€}õ �z 8Ñ,Ô,ð 	>ð 	>ˆAØ�JŠJ�q‰MŒMˆMØ-0×-?Ò-?ÀÑ-BÔ-BÑ*ˆH�d˜H dÝ”)‘+”+ˆCØ×$Ò$ T¨4°¸1Ñ=Ô=‰DˆAˆqØŒJ�qˆMˆMŒM�TœY™[œ[¨3Ñ.Ñ.ˆMˆM‰MØ×#Ò# H¨a°¸1Ñ=Ô=Ð=Ð=ñ	>ð 
�QŠ‰ð	-ð 	-ð 	-ð 	-ð 	-ð 	-ð  ×.Ò.¨zÑ:Ô:ÐØˆÝ˜!‰}Œ}ˆå�z 8Ñ,Ô,ð 	ð 	ˆAØ�JŠJ�q‰MŒMˆ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Ô 9ÐØ�OŠO˜AÑÔÐÐàˆÔ Ð(Ð(Ø�
Š
‰Œˆ‰ð	ð 	ð 	ð4	 ð 	 ð 	 ð 	 ð 	 ð		ð 		ð 		ð 		ð 		ð 		ð!	ð !	ð !	ð !	ð !	ð !	ð !	õF $)¨¡8¤8Ð Ý % a¡¤ÐØ+˜|ØØØØÝ‰EŒEØ!Ø$ñ 
ô  
Ðð  ,˜|ØØØØØØ$Øñ 
ô  
Ðõ ”y‘{”{ˆð	/ÝŒLÐ-Ñ.Ô.Ð.Ø)×-Ò-Ñ/Ô/ˆEØð ÙØSXÑPˆH�i ¨Y¸À!ÀXÈqà˜8Ò#Ð#Ø�A‘�ØŒJ�qˆMˆMŒM˜YÑ&ˆMˆM‰MØŒJ�qˆMˆMŒM˜YÑ&ˆMˆM‰MØŒJ�qˆMˆMŒM˜ZÑ'ˆMˆM‰MÝŒLÐE¸8ÐEÐEÑFÔFÐFØ×#Ò# H¨a°¸1Ñ=Ô=Ð=ÝŒLÐC¸ÐCÐCÑDÔDÐDØ�MŠM˜(Ñ#Ô#Ð#Ø�JŠJ�xÑ Ô Ð ØÐ%Ý”9‘;”; Ñ-°Ò?Ð?Ý”LÐ!5Ñ6Ô6Ð6Ø×(Ò(¨°YÑ?Ô?Ð?Ý#'¤9¡;¤;�Lñ+	/ð. 	×!Ò!Ñ#Ô#Ð#Ø×!Ò!Ñ#Ô#Ð#à‡G‚GˆOÑÔÐØ„F‡O‚OÑÔÐØ‡G‚G�I„I€IàŒ6Œ8�S”V”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     sO  ðð €€€Ø €€€Ø 	€	€	€	Ø €€€Ø +Ð +Ð +Ð +Ð +Ð +Ø Ð Ð Ð Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ø €€€à Ð Ð Ð Ø €€€à 3Ð 3Ð 3Ð 3Ð 3Ð 3ðX ð X ð X ð X ð X ñ X ô X ð X ðv5ð 5ð 5ð 5ð 5ñ 5ô 5ð 5ðt Ø Ô3ØŒIØØØØØØØØØØØðYð Yð Yð Yð Yð Yr   