§
    ÐÁ³g“:  ã                   óâ   — d dl Zd dlZd dlZd dlZd dlmZ d„ Zd„ Zdd„Z	dd„Z
d„ Zd	„ Z	 dd„Zd„ Zdd„Zd„ Z G d„ d¦  «        Z G d„ de¦  «        Z G d„ d¦  «        Z G d„ d¦  «        ZdS )é    N)Ú
ThreadPoolc                 óž   ‡ ‡— ‰ j         \  }}‰j         ||fk    sJ ‚t          ˆ ˆfd„t          |¦  «        D ¦   «         ¦  «        }|‰ j        z  S )z< computes the intersection measure of two result tables
    c              3   ód   •K  — | ]*}t          j        ‰|         ‰|         ¦  «        j        V — Œ+d S ©N)ÚnpÚintersect1dÚsize)Ú.0ÚiÚI1ÚI2s     €€úV/var/www/html/mpstechhub/venv/lib/python3.11/site-packages/faiss/contrib/evaluation.pyú	<genexpr>z+knn_intersection_measure.<locals>.<genexpr>   sN   øè è € ð ð àõ 	Œ�r˜!”u˜b œeÑ$Ô$Ô)ðð ð ð ð ð ó    )ÚshapeÚsumÚranger	   )r   r   ÚnqÚrankÚninters   ``   r   Úknn_intersection_measurer      sw   øø€ ð Œx�H€BˆØŒ8˜˜D�zÒ!Ð!Ð!Ð!Ýð ð ð ð ð å�r‘”ðñ ô ñ ô €Fð �B”GÑÐr   c                 ó  — | j         dz
  }||k     }t          j        | ¦  «        }t          |¦  «        D ]<}||         || |         | |dz            …                              ¦   «         z   ||dz   <   Œ=|||         ||         fS )z select a set of results é   )r	   r   Ú
zeros_liker   r   )ÚlimsÚDÚIÚthreshr   ÚmaskÚnew_limsr   s           r   Úfilter_range_resultsr!      s‹   € à	Œ�Q‰€BØˆvŠ:€DÝŒ}˜TÑ"Ô"€HÝ�2‰YŒYð Jð JˆØ" 1œ+¨¨T°!¬W°t¸AÀ¹E´{Ð-BÔ(C×(GÒ(GÑ(IÔ(IÑIˆ��Q‘‰ˆØ�Q�t”W˜a œgÐ%Ð%r   Úoverallc                 ól  ‡ ‡‡‡‡‡	‡
— ˆˆ fd„Š
ˆˆfd„Š‰ j         dz
  }‰j         dz
  |k    sJ ‚t          j        |d¬¦  «        Š	ˆˆ	ˆ
fd„}t          d¦  «        }|                     |t          |¦  «        ¦  «         t          ‰ dd…         ‰ dd	…         z
  ‰dd…         ‰dd	…         z
  ‰	|¬
¦  «        S )zucompute the precision and recall of range search results. The
    function does not take the distances into account. c                 ó6   •— ‰‰|          ‰| dz            …         S ©Nr   © ©r   ÚIrefÚlims_refs    €€r   Úref_result_forz range_PR.<locals>.ref_result_for,   ó   ø€ Ø�H˜Q”K ¨¨Q©¤Ð/Ô0Ð0r   c                 ó6   •— ‰‰|          ‰| dz            …         S r%   r&   )r   ÚInewÚlims_news    €€r   Únew_result_forz range_PR.<locals>.new_result_for/   r+   r   r   Úint64©Údtypec                 ó‚   •—  ‰| ¦  «        } ‰| ¦  «        }t          j        ||¦  «        }t          |¦  «        ‰| <   d S r   )r   r   Úlen)ÚqÚgt_idsÚnew_idsÚinterr/   r   r*   s       €€€r   Úcompute_PR_forz range_PR.<locals>.compute_PR_for7   sK   ø€ ð  � Ñ"Ô"ˆð !�. Ñ#Ô#ˆõ ”˜v wÑ/Ô/ˆå˜‘J”Jˆˆq‰	ˆ	ˆ	r   é   Néÿÿÿÿ©Úmode)r	   r   Úzerosr   Úmapr   Úcounts_to_PR)r)   r(   r.   r-   r=   r   r9   Úpoolr/   r   r*   s   ````    @@@r   Úrange_PRrB   (   s  øøøøøøø€ ð1ð 1ð 1ð 1ð 1ð 1ð1ð 1ð 1ð 1ð 1ð 1ð 
Œ˜Ñ	€BØŒ=˜1Ñ Ò"Ð"Ð"Ð"åŒX�b Ð(Ñ(Ô(€Fðð ð ð ð ð ð õ �b‰>Œ>€DØ‡H‚Hˆ^�U 2™YœYÑ'Ô'Ð'åØ���Œ�x   ”}Ñ$Ø���Œ�x   ”}Ñ$ØØð	ñ ô ð r   c                 ó(  — |dk    re|                       ¦   «         |                      ¦   «         |                      ¦   «         }}} |dk    r||z  }nd}| dk    r|| z  }n|dk    rd}nd}||fS |dk    r”| dk    }d| |<   || z  }||         dk                         t          ¦  «        ||<   |dk    }t          j        ||         dk    ¦  «        sJ ‚d||<   d||<   ||z  }|                     ¦   «         |                     ¦   «         fS t          ¦   «         ‚)zÑ computes a  precision-recall for a ser of queries.
    ngt = nb of GT results per query
    nres = nb of found results per query
    ninter = nb of correct results per query (smaller than nres of course)
    r"   r   ç      ð?ç        Úaverager   )r   ÚastypeÚfloatr   ÚallÚmeanÚAssertionError)	ÚngtÚnresr   r=   Ú	precisionÚrecallr   ÚrecallsÚ
precisionss	            r   r@   r@   P   s8  € ð ˆyÒÐØŸGšG™IœI t§x¢x¡z¤z°6·:²:±<´<�6ˆTˆà�!Š8ˆ8Ø ™ˆIˆIàˆIà�Š7ˆ7Ø˜c‘\ˆFˆFØ�QŠYˆYØˆFˆFàˆFà˜&Ð Ð à	�Ò	Ð	ð �aŠxˆØˆˆD‰	à˜3‘,ˆØ˜dœ qš×0Ò0µÑ7Ô7ˆ�‰ð �qŠyˆÝŒv�f˜T”l aÒ'Ñ(Ô(Ð(Ð(Ð(Øˆˆt‰ØˆˆT‰
à˜d‘]ˆ
à�ŠÑ Ô  '§,¢,¡.¤.Ð0Ð0õ ÑÔÐr   c                 óL  — t          j        |¦  «        }t          j        |¦  «        }t          | ¦  «        dz
  }t          |¦  «        D ]W}| |         | |dz            }}|||…         }	|||…         }
|
                     ¦   «         }|	|         |||…<   |
|         |||…<   ŒX||fS )z& sort 2 arrays using the first as key r   )r   Ú
empty_liker4   r   Úargsort)r   r   r   r   ÚD2r   r   Úl0Úl1ÚiiÚdiÚos               r   Úsort_range_res_2r[   ~   s­   € å	Œ�qÑ	Ô	€BÝ	Œ�qÑ	Ô	€BÝ	ˆT‰Œ�Q‰€BÝ�2‰YŒYð ð ˆØ�a”˜$˜q 1™uœ+ˆBˆØˆr�"ˆuŒXˆØˆr�"ˆuŒXˆØ�JŠJ‰LŒLˆØ�q”Eˆˆ2ˆbˆ5‰	Ø�q”Eˆˆ2ˆbˆ5‰	ˆ	Øˆrˆ6€Mr   c                 óò   — t          j        |¦  «        }t          | ¦  «        dz
  }t          |¦  «        D ]@}| |         | |dz            }}|||…         |||…<   |||…                              ¦   «          ŒA|S r%   )r   rS   r4   r   Úsort)r   r   r   r   r   rV   rW   s          r   Úsort_range_res_1r^   �   s   € Ý	Œ�qÑ	Ô	€BÝ	ˆT‰Œ�Q‰€BÝ�2‰YŒYð ð ˆØ�a”˜$˜q 1™uœ+ˆBˆØ�b˜�e”Hˆˆ2ˆbˆ5‰	Ø
ˆ2ˆbˆ5Œ	�ŠÑÔÐÐØ€Ir   úref,newc           	      ó|  ‡ ‡‡‡‡‡‡‡‡— d|v rt          ‰ ‰¦  «        Šd|v rt          ‰‰‰¦  «        \  ŠŠˆˆ fd„Šˆˆˆfd„Š‰ j        dz
  }‰j        dz
  |k    sJ ‚t          ‰¦  «        }	t	          j        ||	dfd¬¦  «        Šˆˆˆˆfd	„}
t          d
¦  «        }|                     |
t          |¦  «        ¦  «         t	          j        |	¦  «        }t	          j        |	¦  «        }t          |	¦  «        D ]C}t          ‰dd…|df         ‰dd…|df         ‰dd…|df         |¬¦  «        \  }}|||<   |||<   ŒD||fS )z� compute precision-recall values for range search results
    for several thresholds on the "new" results.
    This is to plot PR curves
    ÚrefÚnewc                 ó6   •— ‰‰|          ‰| dz            …         S r%   r&   r'   s    €€r   r*   z4range_PR_multiple_thresholds.<locals>.ref_result_for©   r+   r   c                 óR   •— ‰|          ‰| dz            }}‰||…         ‰||…         fS r%   r&   )r   rV   rW   ÚDnewr-   r.   s      €€€r   r/   z4range_PR_multiple_thresholds.<locals>.new_result_for¬   s3   ø€ Ø˜!”˜h q¨1¡uœoˆBˆØ�B�r�EŒ{˜D  B œKÐ'Ð'r   r   é   r0   r1   c                 óº  •—  ‰	| ¦  «        } ‰| ¦  «        \  }}t          |¦  «        ‰| d d …df<   |j        dk    rd S t          j        |‰
¦  «        }|‰| d d …df<   |j        dk    rd S t          j        ||¦  «        }d||t          |¦  «        k    <   t          j        ||         |k    ¦  «        }t          j        dg|f¦  «        }||         ‰| d d …df<   d S )Nr   r   r;   é   )r4   r	   r   ÚsearchsortedÚcumsumÚhstack)r5   r6   Úres_idsÚres_disrM   rX   Ún_okÚcountsr/   r*   Ú
thresholdss          €€€€r   r9   z4range_PR_multiple_thresholds.<locals>.compute_PR_for¶   sû   ø€ Ø� Ñ"Ô"ˆØ)˜>¨!Ñ,Ô,Ñˆ�å˜f™+œ+ˆˆq�!�!�!�Qˆw‰àŒ<˜1ÒÐàˆFõ Œo˜g zÑ2Ô2ˆØˆˆq�!�!�!�Qˆw‰àŒ;˜!ÒÐØˆFõ Œ_˜V WÑ-Ô-ˆØ "ˆˆ2•�V‘”ÒÑÝŒy˜ œ wÒ.Ñ/Ô/ˆõ Œy˜1˜#˜t˜Ñ%Ô%ˆØ˜tœ*ˆˆq�!�!�!�Qˆw‰ˆˆr   r:   Nr   rh   r<   )
r^   r[   r	   r4   r   r>   r   r?   r   r@   )r)   r(   r.   re   r-   rp   r=   Údo_sortr   Úntr9   rA   rQ   rP   ÚtÚpÚrro   r/   r*   s   ``````           @@@r   Úrange_PR_multiple_thresholdsrv   —   sÂ  øøøøøøøøø€ ð �ÐÐÝ ¨$Ñ/Ô/ˆð �ÐÐÝ% h°°dÑ;Ô;‰
ˆˆdð1ð 1ð 1ð 1ð 1ð 1ð(ð (ð (ð (ð (ð (ð (ð 
Œ˜Ñ	€BØŒ=˜1Ñ Ò"Ð"Ð"Ð"å	ˆZ‰Œ€BÝŒX�r˜2˜q�k¨Ð1Ñ1Ô1€Fð%ð %ð %ð %ð %ð %ð %ð %õ4 �b‰>Œ>€DØ‡H‚Hˆ^�U 2™YœYÑ'Ô'Ð'õ ”˜"‘”€JÝŒh�r‰lŒl€GÝ�2‰YŒYð ð ˆÝØ�q�q�q˜!˜Q�w” ¨¨¨¨1¨a¨¤°&¸¸¸¸A¸q¸´/Øð
ñ 
ô 
‰ˆˆ1ð ˆ
�1‰Øˆ�‰
ˆ
à�wÐÐr   c                 óX  — t          j        | |g¦  «        }|                     ¦   «          t          |¦  «        }t          j        |¦  «        }|dd…         |dd…         z
  |dd…<   |||k             }t          j        || d¬¦  «        dz
  }t          j        ||d¬¦  «        dz
  }||fS )zt for two tables, cluster them by merging values closer than thr.
    Returns the cluster ids for each table element r   Nr;   Úright)Úside)r   rk   r]   r4   Úonesri   )	Útab1Útab2ÚthrÚtabÚnÚdiffsÚunique_valsÚidx1Úidx2s	            r   Ú_cluster_tables_with_tolerancer„   å   s¬   € õ Œ)�T˜4�LÑ
!Ô
!€CØ‡H‚H�J„J€JÝˆC‰Œ€AÝŒG�A‰JŒJ€EØ�A�B�B”˜#˜c˜r˜cœ(Ñ"€Eˆ!ˆ"ˆ"�IØ�e˜c’kÔ"€KÝŒ?˜;¨°7Ð;Ñ;Ô;¸aÑ?€DÝŒ?˜;¨°7Ð;Ñ;Ô;¸aÑ?€DØ�ˆ:Ðr   çñhãˆµøä>c           
      óF  — t           j                             | ||¬¦  «         t          j        ¦   «         }t          t          |¦  «        ¦  «        D ]Î}t          j        ||         ||         k    ¦  «        rŒ'|| |                              ¦   «         z  }t          | |         ||         |¦  «        \  }}	t          j
        |¦  «        D ]U}
|
|d         k    rŒ||
k    }|                     t          |||f         ¦  «        t          |||f         ¦  «        ¦  «         ŒVŒÏdS )zS test that knn search results are identical, with possible ties.
    Raise if not. )Úrtolr;   N)r   ÚtestingÚassert_allcloseÚunittestÚTestCaser   r4   rI   Úmaxr„   ÚuniqueÚassertEqualÚset)ÚDrefr(   re   r-   r‡   Útestcaser   ru   ÚDrefCÚDnewCÚdisr   s               r   Úcheck_ref_knn_with_drawsr•   ó   s&  € õ „J×Ò˜t T°ÐÑ5Ô5Ð5åÔ Ñ"Ô"€HÝ•3�t‘9”9ÑÔð Ið IˆÝŒ6�$�q”'˜T !œWÒ$Ñ%Ô%ð 	Øð �4˜”7—;’;‘=”=Ñ ˆå5°d¸1´g¸tÀA¼wÈÑJÔJ‰ˆˆuå”9˜UÑ#Ô#ð 	Ið 	IˆCØ�e˜B”iÒÐØØ˜C’<ˆDØ× Ò ¥ T¨!¨T¨'¤]Ñ!3Ô!3µS¸¸aÀ¸g¼Ñ5GÔ5GÑHÔHÐHÐHð		IðIð Ir   c                 óü  — t           j                             | |¦  «         t          | ¦  «        dz
  }t	          |¦  «        D ]¹}| |         | |dz            }	}|||	…         }
|||	…         }|||	…         }|||	…         }t          j        |
|k    ¦  «        rnAd„ } ||
|¦  «        \  }
} |||¦  «        \  }}t           j                             |
|¦  «         t           j                             ||d¬¦  «         ŒºdS )zM compare range search results wrt. a reference result,
    throw if it fails r   c                 óJ   — |                       ¦   «         }| |         ||         fS r   )rT   )r   r   rZ   s      r   Úsort_by_idsz,check_ref_range_results.<locals>.sort_by_ids  s!   € Ø—I’I‘K”K�Ø˜”t˜Q˜qœT�zÐ!r   é   )ÚdecimalN)r   rˆ   Úassert_array_equalr4   r   rI   Úassert_array_almost_equal)ÚLrefr�   r(   ÚLnewre   r-   r   r   rV   rW   ÚIi_refÚIi_newÚDi_refÚDi_newr˜   s                  r   Úcheck_ref_range_resultsr£   	  s&  € õ „J×!Ò! $¨Ñ-Ô-Ð-Ý	ˆT‰Œ�Q‰€BÝ�2‰YŒYð Hð HˆØ�a”˜$˜q 1™uœ+ˆBˆØ�b˜�e”ˆØ�b˜�e”ˆØ�b˜�e”ˆØ�b˜�e”ˆÝŒ6�&˜FÒ"Ñ#Ô#ð 		:Øð"ð "ð "ð  +˜{¨6°6Ñ:Ô:ÑˆV�VØ*˜{¨6°6Ñ:Ô:ÑˆV�VÝŒJ×)Ò)¨&°&Ñ9Ô9Ð9Ý
Œ
×,Ò,¨V°VÀQÐ,ÑGÔGÐGÐGð!Hð Hr   c                   ó<   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	S )
ÚOperatingPointszw
    Manages a set of search parameters with associated performance and time.
    Keeps the Pareto optimal points.
    c                 ó"   — g | _         g | _        d S r   )Úoperating_pointsÚsuboptimal_points©Úselfs    r   Ú__init__zOperatingPoints.__init__,  s   € ð!
ˆÔð "$ˆÔÐÐr   c                 ó   — t           ‚)z1 return -1 if k1 > k2, 1 if k2 > k1, 0 otherwise ©ÚNotImplemented©rª   Úk1Úk2s      r   Úcompare_keyszOperatingPoints.compare_keys3  ó   € åÐr   c                 ó   — t           ‚)zC parameters to say we do noting, takes 0 time and has 0 performancer­   r©   s    r   Údo_nothing_keyzOperatingPoints.do_nothing_key7  r³   r   c                 ó@   — | j         D ]\  }}}||k    r	||k    r dS ŒdS )NFT)r§   )rª   Úperf_newÚt_newÚ_Úperfrs   s         r   Úis_pareto_optimalz!OperatingPoints.is_pareto_optimal;  s:   € ØÔ/ð 	ð 	‰JˆAˆt�QØ�xÒÐ A¨¢J JØ�u�uøØˆtr   c                 ó¢   — d}d}| j         | j        z   D ]8\  }}}|                      ||¦  «        }|dk    r||k    r|}|dk     r||k     r|}Œ9||fS )z, predicts the bound on time and performance rE   rD   r   )r§   r¨   r²   )rª   ÚkeyÚmin_timeÚmax_perfÚkey2rº   rs   Úcmps           r   Úpredict_boundszOperatingPoints.predict_boundsA  s{   € àˆØˆØ!Ô2°TÔ5KÑKð 	$ð 	$‰MˆD�$˜Ø×#Ò# C¨Ñ.Ô.ˆCØ�QŠwˆwØ�x’<�<Ø �HØ�QŠwˆwØ˜(’?�?Ø#�HøØ˜Ð!Ð!r   c                 ó^   — |                       |¦  «        \  }}|                      ||¦  «        S r   )rÂ   r»   )rª   r½   r¿   r¾   s       r   Úshould_run_experimentz%OperatingPoints.should_run_experimentO  s0   € Ø#×2Ò2°3Ñ7Ô7Ñˆ�8Ø×%Ò% h°Ñ9Ô9Ð9r   c                 ó¸  — |                       ||¦  «        r¦d}|t          | j        ¦  «        k     rm| j        |         \  }}}||k    r9||k     r3| j                             | j                             |¦  «        ¦  «         n|dz  }|t          | j        ¦  «        k     °m| j                             |||f¦  «         dS | j                             |||f¦  «         dS )Nr   r   TF)r»   r4   r§   r¨   ÚappendÚpop)rª   r½   rº   rs   r   Úop_LsÚperf2Út2s           r   Úadd_operating_pointz#OperatingPoints.add_operating_pointS  s÷   € Ø×!Ò! $¨Ñ*Ô*ð 	ØˆAà•c˜$Ô/Ñ0Ô0Ò0Ð0Ø#'Ô#8¸Ô#;Ñ ��u˜bØ˜5’=�= Q¨¢V VØÔ*×1Ò1ØÔ-×1Ò1°!Ñ4Ô4ñ6ô 6ð 6ð 6ð ˜‘F�Að •c˜$Ô/Ñ0Ô0Ò0Ð0ð Ô!×(Ò(¨#¨t°Q¨Ñ8Ô8Ð8Ø�4àÔ"×)Ò)¨3°°a¨.Ñ9Ô9Ð9Ø�5r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r«   r²   rµ   r»   rÂ   rÄ   rË   r&   r   r   r¥   r¥   &  s‡   € € € € € ðð ð
$ð $ð $ðð ð ðð ð ðð ð ð"ð "ð "ð:ð :ð :ðð ð ð ð r   r¥   c                   óV   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Ze	j
        fd„Zd„ Zd	„ Zd
„ ZdS )ÚOperatingPointsWithRangeszõ
    Set of parameters that are each picked from a discrete range of values.
    An increase of each parameter is assumed to make the operation slower
    and more accurate.
    A key = int array of indices in the ordered set of parameters.
    c                 óH   — t                                | ¦  «         g | _        d S r   )r¥   r«   Úrangesr©   s    r   r«   z"OperatingPointsWithRanges.__init__m  s!   € Ý× Ò  Ñ&Ô&Ð&àˆŒˆˆr   c                 ó>   — | j                              ||f¦  «         d S r   )rÓ   rÆ   )rª   ÚnameÚvaluess      r   Ú	add_rangez#OperatingPointsWithRanges.add_ranger  s"   € ØŒ×Ò˜D &˜>Ñ*Ô*Ð*Ð*Ð*r   c                 ón   — t          j        ||k    ¦  «        rdS t          j        ||k    ¦  «        rdS dS )Nr   r;   r   )r   rI   r¯   s      r   r²   z&OperatingPointsWithRanges.compare_keysu  s=   € ÝŒ6�"˜’(ÑÔð 	Ø�1ÝŒ6�"˜’(ÑÔð 	Ø�2Øˆqr   c                 ó\   — t          j        t          | j        ¦  «        t          ¬¦  «        S )Nr1   )r   r>   r4   rÓ   Úintr©   s    r   rµ   z(OperatingPointsWithRanges.do_nothing_key|  s!   € ÝŒx�˜DœKÑ(Ô(µÐ4Ñ4Ô4Ð4r   c                 ób   — t          t          j        d„ | j        D ¦   «         ¦  «        ¦  «        S )Nc                 ó2   — g | ]\  }}t          |¦  «        ‘ŒS r&   )r4   )r
   rÕ   rÖ   s      r   ú
<listcomp>z=OperatingPointsWithRanges.num_experiments.<locals>.<listcomp>€  s"   € ÐHÐHÐH©L¨D°&�C ™KœKÐHÐHÐHr   )rÚ   r   ÚprodrÓ   r©   s    r   Únum_experimentsz)OperatingPointsWithRanges.num_experiments  s+   € Ý•2”7ÐHÐH¸D¼KÐHÑHÔHÑIÔIÑJÔJÐJr   c                 ó6  — |dk    s|dk    sJ ‚|                       ¦   «         }t          j                             d¦  «        }|dk    s||k     r|                     |dz
  ¦  «        }n|                     |dz
  |dz
  d¬¦  «        }d|dz
  gd„ |D ¦   «         z   }|S )z} sample a set of experiments of max size n_autotune
        (run all experiments in random order if n_autotune is 0)
        r   rh   é{   F)r	   Úreplacer   c                 ó2   — g | ]}t          |¦  «        d z   ‘ŒS )r   )rÚ   )r
   Úcnos     r   rÝ   z@OperatingPointsWithRanges.sample_experiments.<locals>.<listcomp>�  s"   € Ð'LÐ'LÐ'L¸­¨C©¬°1©Ð'LÐ'LÐ'Lr   )rß   r   ÚrandomÚRandomStateÚpermutationÚchoice)rª   Ú
n_autotuneÚrsÚtotexÚexperimentss        r   Úsample_experimentsz,OperatingPointsWithRanges.sample_experiments‚  s¹   € ð ˜QŠˆ *°¢/ / / /Ø×$Ò$Ñ&Ô&ˆÝŒY×"Ò" 3Ñ'Ô'ˆØ˜Š?ˆ?˜e jÒ0Ð0ØŸ.š.¨°©Ñ3Ô3ˆKˆKàŸ)š)Ø˜‘	 
¨Q¡¸ð $ñ ?ô ?ˆKð ˜% !™)�nÐ'LÐ'LÀÐ'LÑ'LÔ'LÑLˆØÐr   c                 óø   — t          j        t          | j        ¦  «        t          ¬¦  «        }t          | j        ¦  «        D ]/\  }\  }}|t          |¦  «        z  ||<   |t          |¦  «        z  }Œ0|dk    sJ ‚|S )z/Convert a sequential experiment number to a keyr1   r   )r   r>   r4   rÓ   rÚ   Ú	enumerate)rª   rä   Úkr   rÕ   rÖ   s         r   Ú
cno_to_keyz$OperatingPointsWithRanges.cno_to_key’  sz   € åŒH•S˜œÑ%Ô%­SÐ1Ñ1Ô1ˆÝ!*¨4¬;Ñ!7Ô!7ð 	 ð 	 ÑˆA‰~��fØ�˜V™œÑ$ˆAˆa‰DØ•C˜‘K”KÑˆCˆCØ�aŠxˆxˆxˆxØˆr   c                 óD   ‡— ˆfd„t          | j        ¦  «        D ¦   «         S )z3Convert a key to a dictionary with parameter valuesc                 ó:   •— i | ]\  }\  }}||‰|                  “ŒS r&   r&   )r
   r   rÕ   rÖ   rð   s       €r   ú
<dictcomp>z<OperatingPointsWithRanges.get_parameters.<locals>.<dictcomp>�  s;   ø€ ð 
ð 
ð 
á!�‘>�D˜&ð �&˜˜1œ”,ð
ð 
ð 
r   )rï   rÓ   )rª   rð   s    `r   Úget_parametersz(OperatingPointsWithRanges.get_parameters›  s8   ø€ ð
ð 
ð 
ð 
å%.¨t¬{Ñ%;Ô%;ð
ñ 
ô 
ð 	
r   c                 ó€   ‡— | j         D ]#\  }}||k    rˆfd„|D ¦   «         }||dd…<    dS Œ$t          d|› d�¦  «        ‚)z% remove too large values from a rangec                 ó    •— g | ]
}|‰k     ¯|‘ŒS r&   r&   )r
   ÚvÚmax_vals     €r   rÝ   z<OperatingPointsWithRanges.restrict_range.<locals>.<listcomp>¦  s   ø€ Ð9Ð9Ð9˜a¨Q°ª[¨[˜¨[¨[¨[r   Nz
parameter z
 not found)rÓ   ÚRuntimeError)rª   rÕ   rù   Úname2rÖ   Úval2s     `   r   Úrestrict_rangez(OperatingPointsWithRanges.restrict_range¢  so   ø€ à!œ[ð 	ð 	‰MˆE�6Ø�uŠ}ˆ}Ø9Ð9Ð9Ð9 6Ð9Ñ9Ô9�Ø ��q�q�q‘	Ø��ð õ Ð8¨Ð8Ð8Ð8Ñ9Ô9Ð9r   N)rÌ   rÍ   rÎ   rÏ   r«   r×   r²   rµ   rß   r   rå   rí   rñ   rõ   rý   r&   r   r   rÑ   rÑ   e  s´   € € € € € ðð ðð ð ð
+ð +ð +ðð ð ð5ð 5ð 5ðKð Kð Kð 13´	ð ð ð ð ð ð ð ð
ð 
ð 
ð:ð :ð :ð :ð :r   rÑ   c                   ó   — e Zd Zd„ Zd„ ZdS )Ú	TimerIterc                 ó†   — g | _         |j        | _        || _        |j        dk    rt	          j        |j        ¦  «         d S d S )Nr   )ÚtsÚrunsÚtimerrr   ÚfaissÚomp_set_num_threads)rª   r  s     r   r«   zTimerIter.__init__°  sD   € ØˆŒØ”JˆŒ	ØˆŒ
ØŒ8�qŠ=ˆ=ÝÔ% e¤hÑ/Ô/Ð/Ð/Ð/ð ˆ=r   c                 óJ  — | j         }| xj        dz  c_        | j                             t	          j        ¦   «         ¦  «         t          | j        ¦  «        dk    r| j        d         | j        d         z
  nd}| j        dk    s||j        k    r•|j        dk    rt          j	        |j
        ¦  «         t          j        | j        ¦  «        }|dd …         |d d…         z
  }t          |¦  «        |j        k    r||j        d …         |_        n|d d …         |_        t          ‚d S )Nr   rh   r;   r   )r  r  r  rÆ   Útimer4   Úmax_secsrr   r  r  Úremember_ntr   ÚarrayÚwarmupÚtimesÚStopIteration)rª   r  Ú
total_timer  r  s        r   Ú__next__zTimerIter.__next__·  s  € Ø”
ˆØˆ	Œ	�Q‰ˆ	Œ	ØŒ�Š•t”y‘{”{Ñ#Ô#Ð#Ý14°T´W±´ÀÒ1BÐ1B�T”W˜R”[ 4¤7¨1¤:Ñ-Ð-Èˆ
ØŒ9˜Š?ˆ?˜j¨5¬>Ò9Ð9ØŒx˜1Š}ˆ}ÝÔ)¨%Ô*;Ñ<Ô<Ð<Ý”˜$œ'Ñ"Ô"ˆBØ�q�r�r”F˜R   œWÑ$ˆEÝ�5‰zŒz˜UœZÒ'Ð'Ø# E¤L N NÔ3�”�ð $ A A Aœh�”ÝÐð :Ð9r   N)rÌ   rÍ   rÎ   r«   r  r&   r   r   rÿ   rÿ   ¯  s2   € € € € € ð0ð 0ð 0ð ð  ð  ð  ð  r   rÿ   c                   óD   — e Zd ZdZdddej        fd„Zd„ Zd„ Zd„ Z	d	„ Z
d
S )ÚRepeatTimeru!  
    This is yet another timer object. It is adapted to Faiss by
    taking a number of openmp threads to set on input. It should be called
    in an explicit loop as:

    timer = RepeatTimer(warmup=1, nt=1, runs=6)

    for _ in timer:
        # perform operation

    print(f"time={timer.get_ms():.1f} Â± {timer.get_ms_std():.1f} ms")

    the same timer can be re-used. In that case it is reset each time it
    enters a loop. It focuses on ms-scale times because for second scale
    it's usually less relevant to repeat the operation.
    r   r;   r   c                 ó~   — ||k     sJ ‚|| _         || _        || _        || _        t	          j        ¦   «         | _        d S r   )r  rr   r  r  r  Úomp_get_max_threadsr	  )rª   r  rr   r  r  s        r   r«   zRepeatTimer.__init__Ù  sB   € Ø˜Š}ˆ}ˆ}ˆ}ØˆŒØˆŒØˆŒ	Ø ˆŒÝ Ô4Ñ6Ô6ˆÔÐÐr   c                 ó    — t          | ¦  «        S r   )rÿ   r©   s    r   Ú__iter__zRepeatTimer.__iter__á  s   € Ý˜‰ŒÐr   c                 ó:   — t          j        | j        ¦  «        dz  S )Néè  )r   rJ   r  r©   s    r   ÚmszRepeatTimer.msä  s   € ÝŒw�t”zÑ"Ô" TÑ)Ð)r   c                 ón   — t          | j        ¦  «        dk    rt          j        | j        ¦  «        dz  ndS )Nr   r  rE   )r4   r  r   Ústdr©   s    r   Úms_stdzRepeatTimer.ms_stdç  s0   € Ý,/°´
©O¬O¸aÒ,?Ð,?�rŒv�d”jÑ!Ô! DÑ(Ð(ÀSÐHr   c                 ó*   — t          | j        ¦  «        S )zJ effective number of runs (may be lower than runs - warmup due to timeout))r4   r  r©   s    r   ÚnrunszRepeatTimer.nrunsê  s   € å�4”:‰ŒÐr   N)rÌ   rÍ   rÎ   rÏ   r   Úinfr«   r  r  r  r  r&   r   r   r  r  È  s~   € € € € € ðð ð    B¨Q¸¼ð 7ð 7ð 7ð 7ðð ð ð*ð *ð *ðIð Ið Iðð ð ð ð r   r  )r"   )r"   r_   )r…   )Únumpyr   rŠ   r  r  Úmultiprocessing.poolr   r   r!   rB   r@   r[   r^   rv   r„   r•   r£   r¥   rÑ   rÿ   r  r&   r   r   ú<module>r!     s³  ðð Ð Ð Ð Ø €€€Ø €€€Ø €€€à +Ð +Ð +Ð +Ð +Ð +ð
	ð 	ð 	ð&ð &ð &ð%ð %ð %ð %ðP,ð ,ð ,ð ,ð\ð ð ðð ð ð %.ð	Gð Gð Gð Gð\ð ð ðIð Ið Ið Ið,Hð Hð Hð:<ð <ð <ð <ð <ñ <ô <ð <ð~D:ð D:ð D:ð D:ð D: ñ D:ô D:ð D:ðT ð  ð  ð  ð  ñ  ô  ð  ð2$ð $ð $ð $ð $ñ $ô $ð $ð $ð $r   