§
    ÐÁ³g\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dS )é    NFéÿÿÿÿc                 óÒ  — t                                d| j        |fz  ¦  «         t          j        ¦   «         }| j        \  }}t	          j        |¦  «        }	t	          j        |||	¬¦  «        }
t	          j        ||¦  «        }|dk    rt	          j        ¦   «         }|rNt                                d|z  ¦  «         t	          j	        ¦   «         }||_
        t	          j        |||¬¦  «        }d}|D ]¤}|j        d         }|                     |¦  «         |                     | |¦  «        \  }}||z  }|
                     ||¦  «         |                     ¦   «          ||z  }t                                d|t          j        ¦   «         |z
  fz  ¦  «         Œ¥|
                     ¦   «          t                                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                     ú]/var/www/html/mpstechhub/venv/lib/python3.11/site-packages/faiss/contrib/exhaustive_search.pyÚknn_ground_truthr,      s¾  € õ
 ‡H‚HÐ4¸¼À!°}ÑDÑEÔEÐEÝ	Œ‰Œ€BØŒH�E€BˆÝÔ)¨+Ñ6Ô6€HÝ	Ô	˜"˜a¨(Ð	3Ñ	3Ô	3€BåŒO˜A˜{Ñ+Ô+€EØˆr‚z€zÝÔ!Ñ#Ô#ˆàð EÝ�ŠÐ%¨Ñ,Ñ-Ô-Ð-ÝÔ+Ñ-Ô-ˆØˆŒÝÔ+¨E°b¸tÐDÑDÔDˆð 
€BØð Dð DˆØŒY�qŒ\ˆØ�	Š	�#‰ŒˆØ�|Š|˜B Ñ"Ô"‰ˆˆ1Ø	ˆR‰ˆØ
�Š�a˜ÑÔÐØ�Š‰ŒˆØ
ˆb‰ˆÝ�ŠÐ)¨Rµ´±´¸rÑ1AÐ,BÑBÑCÔCÐCÐCà‡K‚K�M„M€MÝ‡H‚HÐ+­t¬y©{¬{¸RÑ/?ÀÐ.DÑDÑEÔEÐEàŒ4�”ˆ:Ðó    é   c                 óÚ  — | j         \  }}t          |t          j        ¦  «        }t          j        |j        ¦  «        }|rt          |¦  «        nt          |¦  «        }t          |j	        |¦  «        }	t                               d|› d|	� ›d|� ›d|� ›�¦  «         t          j        ¦   «         }
|                     | |	¦  «        \  }}t          j        ¦   «         |
z
  }|r |dz  dk     sJ ‚|                     d¦  «        }d}d	}|��5|s|d	d	…|	d
z
  f         |k     }n|d	d	…|	d
z
  f         |k    }|                     ¦   «         dk    rôt                               d|                     ¦   «         z  ¦  «         t          j        ¦   «         }
t          |t           j        ¦  «        rK|}|rt          j        |dz  ¦  «        }nt          j        ||j        ¦  «        }|                     |¦  «         |                     | |         |¦  «        \  }}}|r|                     d¦  «        }t          j        ¦   «         |
z
  }t                               d¦  «         t          j        ¦   «         }
|rt          j        nt          j        } |||	||¦  «        }	 t          j        } ||¦  «        |_         ||¦  «        |_        |�S ||¦  «        |_         ||¦  «        |_         ||                     d¦  «        ¦  «        |_         ||¦  «        |_        t!          j         |d
z   d¬¦  «        }| !                     ||¦  «        ¦  «         |d         }t!          j         ||j"        ¬¦  «        }t!          j         |d¬¦  «        }| #                     ||¦  «         ||¦  «        ¦  «         t          j        ¦   «         |
z
  } t                               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ÚcombineTÚint64©Údtyper   c                 ó,   — g | ]}t          |¦  «        ‘ŒS © ©Úlen)Ú.0Údis     r+   ú
<listcomp>z$range_search_gpu.<locals>.<listcomp>�   s   € Ð 9Ð 9Ð 9¨R¥ R¡¤Ð 9Ð 9Ð 9r-   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_sizesr6   Úwrite_resultÚrangeÚ	METRIC_L2ÚappendÚcumsumÚhstack)!r   Úr2Ú	index_gpuÚ	index_cpuÚgpu_kr$   r%   Úis_binary_indexr   r!   r#   r   r   Út1Út2rR   rO   ÚxbrP   rS   ÚCombinerRangeKNNÚcombinerÚspÚL_resÚnresÚD_resÚI_resÚnrÚiÚnvÚl0Úl1Út3s!                                    r+   Úrange_search_gpurq   :   sæ  € ð ŒH�E€BˆÝ  ­EÔ,=Ñ>Ô>€OÝÔ)¨)Ô*?Ñ@Ô@€HØ#Ð	2�ˆR‰Œˆ­¨r©¬€BÝˆIÔ˜eÑ$Ô$€AÝ‡I‚IØN�bÐNÐN¨ÐNÐNÐN¨oÐNÐNÐNÀ(ÐNÐNÐNñPô Pð På	Œ‰Œ€BØ×Ò˜B Ñ"Ô"�D€A€qÝ	Œ‰Œ�rÑ	€BØð Ø�1‰u�uŠ}ˆ}ˆ}ˆ}Ø�HŠH�WÑÔˆØ	
€BØ€JØÑØð 	$Ø�Q�Q�Q˜˜A™�X”; Ò#ˆDˆDà�Q�Q�Q˜˜A™�X”; Ò#ˆDØ�8Š8‰:Œ:˜Š>ˆ>Ý�IŠIÐ,¨t¯xªx©z¬zÑ9Ñ:Ô:Ð:Ý”‘”ˆBÝ˜)¥R¤ZÑ0Ô0ð "à�Ø"ð JÝ %Ô 5°a¸!±eÑ <Ô <�I�Iå %¤°°9Ô3HÑ IÔ I�IØ—’˜bÑ!Ô!Ð!Ø-6×-CÒ-CÀBÀtÄHÈbÑ-QÔ-QÑ*ˆJ˜ (Øð 4Ø#Ÿ?š?¨7Ñ3Ô3�Ý”‘”˜rÑ!ˆBÝ‡I‚IˆiÑÔÐÝ	Œ‰Œ€Bð (7ð 	$�Ô#Ð#ÝÔ#ð ð
  Ð  A r¨8Ñ4Ô4€Hð#!ÝŒ^ˆØ�R˜‘U”UˆŒ
Ø�R˜‘U”UˆŒ
àÐ!Ø˜B˜t™HœHˆHŒMØ "  8¡¤ˆHÔØ"$ " Z§_¢_°WÑ%=Ô%=Ñ">Ô">ˆHÔØ "  8¡¤ˆHÔå”˜˜a™ wÐ/Ñ/Ô/ˆØ×Ò˜r˜r %™yœyÑ)Ô)Ð)Ø�RŒyˆÝ”˜ Q¤WÐ-Ñ-Ô-ˆÝ”˜ WÐ-Ñ-Ô-ˆØ×Ò˜b˜b ™iœi¨¨¨E©¬Ñ3Ô3Ð3õ( 
Œ‰Œ�rÑ	€BÝ‡I‚IÐ4�rÐ4Ð4Ð4 Ð4Ð4Ð4¨2Ð4Ð4Ð4Ð4Ñ5Ô5Ð5Ø�%˜ÐÐr-   c                 óî  ‡‡— | j         \  }}t          j        ¦   «         }t          j        | d¬¦  «        } t	          j        ||¦  «        }	|dk    rt	          j        ¦   «         }|rNt                               d|z  ¦  «         t	          j	        ¦   «         }
||
_
        t	          j        |	|
|¬¦  «        }d}d„ t          |¦  «        D ¦   «         }d„ t          |¦  «        D ¦   «         }|D �]G}|j         d         }|dk    r@|                     |¦  «         t          | |||¦  «        \  }}}|                     ¦   «          nC|	                     |¦  «         |	                     | |¦  «        \  }}}|	                     ¦   «          ||z  }t          |¦  «        D ]a}||         ||d	z            }}||k    rF||                              |||…         ¦  «         ||                              |||…         ¦  «         Œb||z  }t                               d
|t          j        ¦   «         |z
  fz  ¦  «         �ŒIt          j        dd¬¦  «        Št          j        dd¬¦  «        Šˆfd„|D ¦   «         }ˆfd„|D ¦   «         }d„ |D ¦   «         }t'          |¦  «        |k    sJ ‚t          j        |d	z   d¬¦  «        }t          j        |¦  «        |d	d…<   |t          j        |¦  «        t          j        |¦  «        fS )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.
    Úfloat32r5   r   r   r   r   c                 ó   — g | ]}g ‘ŒS r8   r8   ©r;   Ú_is     r+   r=   z&range_ground_truth.<locals>.<listcomp>­   ó   € Ð Ð Ð �ˆÐ Ð Ð r-   c                 ó   — g | ]}g ‘ŒS r8   r8   ru   s     r+   r=   z&range_ground_truth.<locals>.<listcomp>®   rw   r-   r2   r   r4   c                 óH   •— g | ]}|g k    rt          j        |¦  «        n‰‘ŒS r8   ©rH   r[   )r;   rl   Úempty_Ds     €r+   r=   z&range_ground_truth.<locals>.<listcomp>Å   ó-   ø€ Ð;Ð;Ð;°A˜!˜rš'˜'�"Œ)�A‰,Œ,ˆ, wÐ;Ð;Ð;r-   c                 óH   •— g | ]}|g k    rt          j        |¦  «        n‰‘ŒS r8   rz   )r;   rl   Úempty_Is     €r+   r=   z&range_ground_truth.<locals>.<listcomp>Æ   r|   r-   c                 ó,   — g | ]}t          |¦  «        ‘ŒS r8   r9   )r;   rl   s     r+   r=   z&range_ground_truth.<locals>.<listcomp>Ç   s   € ÐÐÐ˜�S�‰VŒVÐÐÐr-   Úuint64N)r   r   rH   Úascontiguousarrayr   r   r   r   r   r   r   r   rW   r   rq   r   rK   rY   Úzerosr:   rZ   r[   )r   r    Ú	thresholdr"   r   r
   r$   r%   r#   r'   r	   r]   r(   r   r   r)   r*   Úlims_iÚDiÚIiÚjrn   ro   ÚsizesÚlimsr{   r~   s                            @@r+   Úrange_ground_truthrŠ   ˜   sö  øø€ ð ŒH�E€BˆÝ	Œ‰Œ€BÝ	Ô	˜b¨	Ð	2Ñ	2Ô	2€BåŒO˜A˜{Ñ+Ô+€EØˆr‚z€zÝÔ!Ñ#Ô#ˆØð IÝ�ŠÐ%¨Ñ,Ñ-Ô-Ð-ÝÔ+Ñ-Ô-ˆØˆŒÝÔ/°¸"À4ÐHÑHÔHˆ	ð 
€BØ Ð •e˜B‘i”iÐ Ñ Ô €AØ Ð •e˜B‘i”iÐ Ñ Ô €AØð Dñ DˆØŒY�qŒ\ˆØ�!Š8ˆ8Ø�MŠM˜#ÑÔÐÝ-¨b°)¸YÈÑLÔL‰NˆF�B˜Ø�OŠOÑÔÐÐà�IŠI�c‰NŒNˆNØ"×/Ò/°°IÑ>Ô>‰NˆF�B˜Ø�KŠK‰MŒMˆMØ
ˆb‰ˆÝ�r‘”ð 	'ð 	'ˆAØ˜A”Y  q¨1¡u¤�ˆBØ�BŠwˆwØ�!”—’˜B˜r "˜uœIÑ&Ô&Ð&Ø�!”—’˜B˜r "˜uœIÑ&Ô&Ð&øØ
ˆb‰ˆÝ�ŠÐ)¨Rµ´±´¸rÑ1AÐ,BÑBÑCÔCÐCÑCåŒh�q Ð(Ñ(Ô(€GÝŒh�q 	Ð*Ñ*Ô*€Gà;Ð;Ð;Ð;¸Ð;Ñ;Ô;€AØ;Ð;Ð;Ð;¸Ð;Ñ;Ô;€AØÐ˜QÐÑÔ€EÝˆu‰:Œ:˜ÒÐÐÐÝŒ8�B˜‘F (Ð+Ñ+Ô+€DÝŒy˜ÑÔ€Dˆˆˆ�HØ•”˜1‘”�rœy¨™|œ|Ð+Ð+r-   c                 ó  — |r||k    }n||k     }t          j        | ¦  «        }d}t          | ¦  «        D ];\  }}	t          |	¦  «        }	||||	z   …                              ¦   «         ||<   ||	z  }Œ<|||         ||         fS )z select a set of results r   )rH   Ú
zeros_likeÚ	enumeraterA   rG   )
rh   ÚdisÚidsÚthreshr   rO   Únew_nresÚorl   rk   s
             r+   Úthreshold_radius_nresr“   Î   s—   € àð Ø�VŠ|ˆˆà�VŠ|ˆÝŒ}˜TÑ"Ô"€HØ	€AÝ˜4‘”ð ð ‰ˆˆ2Ý�‰WŒWˆØ˜1˜Q ™V˜8”n×(Ò(Ñ*Ô*ˆ�‰Ø	ˆR‰ˆˆØ�S˜”Y  D¤	Ð)Ð)r-   c                 ó.  — |r||k    }n||k     }t          j        | ¦  «        }t          | ¦  «        dz
  }t          |¦  «        D ]@}| |         | |dz            }
}	||         ||	|
…                              ¦   «         z   ||dz   <   ŒA|||         ||         fS )z= restrict range-search results to those below a given radius r2   )rH   rŒ   r:   rW   rG   )r‰   rŽ   r�   r�   r   rO   Únew_limsÚnrl   rn   ro   s              r+   Úthreshold_radiusr—   Ý   s¥   € àð Ø�VŠ|ˆˆà�VŠ|ˆÝŒ}˜TÑ"Ô"€HÝˆD‰	Œ	�A‰€AÝ�1‰XŒXð :ð :ˆØ�a”˜$˜q 1™uœ+ˆBˆØ" 1œ+¨¨R°¨U¬¯ªÑ(9Ô(9Ñ9ˆ��Q‘‰ˆØ�S˜”Y  D¤	Ð)Ð)r-   c                 óx  — t          j        d„ | D ¦   «         ¦  «        }t          |¦  «        |k    sJ ‚|r4|                     t          |¦  «        |z
  dz
  ¦  «         |d|z
           }n|                     |¦  «         ||         }|j        dk    rt          |¦  «        }nt          |¦  «        }t                               d|z  ¦  «         d}t          | ¦  «        D ];\  }\  }}}	t          |||	||¬¦  «        \  }}}	|t          |¦  «        z  }|||	f| |<   Œ<t                               d|z  ¦  «         ||fS )	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_resultsc                 ó   — g | ]\  }}}|‘Œ	S r8   r8   )r;   Ú_rŽ   s      r+   r=   z apply_maxres.<locals>.<listcomp>ï   s   € Ð9Ð9Ð9¡	  3¨˜Ð9Ð9Ð9r-   r2   r   rs   z   setting radius to %sr   r   z.   updated previous results, new nb results %d)rH   r[   r:   Ú	partitionr6   rB   rA   r   rE   r�   r“   )
Úres_batchesÚtarget_nresr   ÚalldisÚradiusÚtotresrl   rh   rŽ   r�   s
             r+   Úapply_maxresr¡   ë   sa  € õ ŒYÐ9Ð9¨[Ð9Ñ9Ô9Ñ:Ô:€FÝˆv‰;Œ;˜Ò$Ð$Ð$Ð$Øð %Ø×Ò�˜V™œ {Ñ2°QÑ6Ñ7Ô7Ð7Ø˜˜[Ñ(Ô)ˆˆà×Ò˜Ñ%Ô%Ð%Ø˜Ô$ˆà„|�yÒ Ð Ý�v‘”ˆˆå�V‘”ˆÝ‡I‚IÐ'¨&Ñ0Ñ1Ô1Ð1Ø€FÝ(¨Ñ5Ô5ð (ð (ÑˆÑˆD�#�sÝ.Ø�#�s˜F¨Xð7ñ 7ô 7‰ˆˆc�3à•#�c‘(”(ÑˆØ˜s C˜ˆ�A‰ˆÝ‡I‚IÐ>ÀÑGÑHÔHÐHØ�6ˆ>Ðr-   c                 óâ  — t          | t          j        ¦  «        }|€|€J ‚t          d|z  ¦  «        }|€|€J ‚t          |dz  ¦  «        }|dk    rt          j        ¦   «         }|rOt
                               d|z  ¦  «         t          j        ¦   «         }	||	_        t          j	        | |	|¬¦  «        }
nd}
t          j
        ¦   «         }dx}}dx}x}}g }|D �]§}t          j
        ¦   «         }t
                               dt          |¦  «        › d	�¦  «         |
rt          |||
| ¦  «        \  }}}n|                      ||¦  «        \  }}}|d
d…         |dd…         z
  }|t          |¦  «        z  }|t          |¦  «        z  }t          j
        ¦   «         }|r|                     d¦  «        }|t          |¦  «        z  }|                     |||f¦  «         |�M||k    rGt
                               d||fz  ¦  «         t#          ||| j        t          j        k    ¬¦  «        \  }}t          j
        ¦   «         }|||z
  z  }|||z
  z  }t
                               dt          j
        ¦   «         |z
  ||fz  ¦  «         �Œ©t
                               d||||fz  ¦  «         |r.||k    r(t#          ||| j        t          j        k    ¬¦  «        \  }}t)          j        d„ |D ¦   «         ¦  «        }t)          j        d„ |D ¦   «         ¦  «        }t)          j        d„ |D ¦   «         ¦  «        }t)          j        t          |¦  «        d
z   d¬¦  «        }t)          j        |¦  «        |d
d…<   ||||fS )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 vectorsr2   r1   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 %gc                 ó   — g | ]\  }}}|‘Œ	S r8   r8   ©r;   Únres_iÚdis_iÚids_is       r+   r=   z,range_search_max_results.<locals>.<listcomp>Y  s   € ÐEÐEÐEÑ!5 ¨°�fÐEÐEÐEr-   c                 ó   — g | ]\  }}}|‘Œ	S r8   r8   r¤   s       r+   r=   z,range_search_max_results.<locals>.<listcomp>Z  ó   € ÐCÐCÐCÑ3˜v u¨e�UÐCÐCÐCr-   c                 ó   — g | ]\  }}}|‘Œ	S r8   r8   r¤   s       r+   r=   z,range_search_max_results.<locals>.<listcomp>[  r©   r-   r€   r5   )r?   r   r@   rA   r   r   r   r   r   r   r   rE   r:   rq   rK   rF   rY   r¡   r"   ÚMETRIC_INNER_PRODUCTrH   r[   r‚   rZ   )r'   Úquery_iteratorrŸ   Úmax_resultsÚmin_resultsr   r
   Úclip_to_minr`   r	   r]   Út_startÚt_searchÚt_post_processÚqtotr    Ú
raw_totresrœ   Úxqir#   r„   r…   r†   r¥   ra   rb   rh   rŽ   r�   r‰   s                                 r+   Úrange_search_max_resultsr¶     sÆ  € õ ! ­Ô(9Ñ:Ô:€OàÐØÐ&Ð&Ð&Ý˜# Ñ+Ñ,Ô,ˆàÐØÐ&Ð&Ð&Ý˜+¨Ñ+Ñ,Ô,ˆàˆr‚z€zÝÔ!Ñ#Ô#ˆàð Ý�ŠÐ%¨Ñ,Ñ-Ô-Ð-ÝÔ+Ñ-Ô-ˆØˆŒÝÔ/°¸"À4ÐHÑHÔHˆ	ˆ	àˆ	åŒi‰kŒk€GØ !Ð!€Hˆ~Ø!"Ð"€DÐ"ˆ6�JØ€Kàð 2ñ 2ˆÝŒY‰[Œ[ˆÝ�	Š	Ð1�s 3™xœxÐ1Ð1Ð1Ñ2Ô2Ð2Øð 	=Ý-¨c°6¸9ÀeÑLÔL‰NˆF�B˜˜à"×/Ò/°°VÑ<Ô<‰NˆF�B˜à˜˜˜”˜f S b SœkÑ)ˆØ•c˜"‘g”gÑˆ
Ø•�C‘”ÑˆåŒY‰[Œ[ˆØð 	$à—’˜7Ñ#Ô#ˆBà•#�b‘'”'ÑˆØ×Ò˜F B¨Ð+Ñ,Ô,Ð,àÐ" v°Ò';Ð';Ý�HŠHÐDØ˜kÐ*ñ+ñ ,ô ,ð ,å)Ø˜[ØÔ*­eÔ.HÒHðñ ô ‰NˆF�Fõ ŒY‰[Œ[ˆØ�B˜‘GÑˆØ˜"˜r™'Ñ!ˆÝ�	Š	Ð;ÝŒI‰KŒK˜'Ñ! 4¨ð?1ñ 1ñ 	2ô 	2ð 	2ñ 	2õ ‡H‚HØLØ�n f¨fðP6ñ 	6ñô ð ð
 ð 
�v Ò+Ð+Ý%Ø˜ØÔ&­%Ô*DÒDð
ñ 
ô 
‰ˆ�õ
 Œ9ÐEÐE¸ÐEÑEÔEÑFÔF€DÝ
Œ)ÐCÐC°{ÐCÑCÔCÑ
DÔ
D€CÝ
Œ)ÐCÐC°{ÐCÑCÔCÑ
DÔ
D€CåŒ8•C˜‘I”I ‘M¨Ð2Ñ2Ô2€DÝŒy˜‰Œ€Dˆˆˆ�Hà�4˜˜cÐ!Ð!r-   é    é N  c              #   ó¨   K  — t          | ¦  «        }|}d}||k     r6| |||z   …         }|V — ||k     r|dz  }|t          |¦  «        z  }||k     °4dS dS )z¤ produces batches of progressively increasing sizes. This is useful to
    adjust the search radius progressively without overflowing with
    intermediate results r   é   Nr9   )r   Ústart_bsÚmax_bsr$   Úbsrl   rµ   s          r+   Úexponential_query_iteratorr¾   c  st   è è € õ 
ˆR‰Œ€BØ	€BØ	€AØ
ˆbŠ&ˆ&Ø��1�r‘6�ŒlˆØˆ	ˆ	ˆ	Ø�Š;ˆ;Ø�!‰GˆBØ	�S�‰XŒX‰ˆð ˆbŠ&ˆ&ˆ&ˆ&ˆ&ˆ&r-   )r.   )F)NNFr   F)r·   r¸   )r   r   ÚnumpyrH   ÚloggingÚ	getLoggerÚ__name__r   rX   r,   Úknnrq   rŠ   r“   r—   r¡   r¶   r¾   r8   r-   r+   ú<module>rÄ      s   ðð €€€Ø €€€Ø Ð Ð Ð à €€€à€gÔ˜Ñ!Ô!€à5:´_ÈEÐXZð $ð $ð $ð $ðN „i€ð
[ð [ð [ð [ð| @E¼Ø"¨ð3,ð 3,ð 3,ð 3,ðl*ð *ð *ð *ð*ð *ð *ð *ðð ð ð ð: <@Ø>CðY"ð Y"ð Y"ð Y"ðxð ð ð ð ð r-   