U
    fª/e3H  ã                   @   sx  d dl m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mZ d dlmZ edd„ ƒZdd„ Zej d	ejejfejejfejejfejejfejejfejejfej ej!fej"ej#fej$ej%fej&ej'fej(ej)fej*ej+fej,ej-fg¡G d
d„ dƒƒZ.G dd„ dƒZ/dd„ Z0dd„ Z1dd„ Z2dd„ Z3dd„ Z4ej d	ejejfej$ej%fejejfejejfg¡G dd„ dƒƒZ5dd„ Z6dd„ Z7dd„ Z8d d!„ Z9ej d"ejd#fejd$fejd%fejd&fejd'fejd(fej!d)fej#d*fej%d+fej'd,fej)d-fej+d.fej-d/fg¡G d0d1„ d1ƒƒZ:d2d3„ Z;ej d"ejd'fej%d+fejd$fejd(fg¡G d4d5„ d5ƒƒZ<d6d7„ Z=d8d9„ Z>dS ):é    )ÚcontextmanagerN)Ú	hashtable)Úisinc                   c   s"   t  ¡  z
d V  W 5 t  ¡  X d S ©N)ÚtracemallocÚstartÚstop© r	   r	   úD/tmp/pip-unpacked-wheel-tiezk1ph/pandas/tests/libs/test_hashtable.pyÚactivated_tracemalloc   s    
r   c                  C   s4   t  ¡ } |  t  dt ¡ ¡f¡} ttdd„ | jƒƒS )NTc                 S   s   | j S r   )Úsize)Úxr	   r	   r
   Ú<lambda>   ó    z,get_allocated_khash_memory.<locals>.<lambda>)	r   Ztake_snapshotZfilter_tracesZDomainFilterÚhtZget_hashtable_trace_domainÚsumÚmapZtraces)Zsnapshotr	   r	   r
   Úget_allocated_khash_memory   s
    ÿr   ztable_type, dtypec                   @   s\   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ ZdS )ÚTestHashTablec              	   C   sp  d}|dƒ}t |ƒdkst‚||ks(t‚| |d¡ t |ƒdksDt‚||ksPt‚| |¡dksbt‚| |d d¡ ||ks~t‚|d |ksŽt‚t |ƒdksžt‚| |¡dks°t‚| |d ¡dksÆt‚| |d¡ ||ksÞt‚|d |ksît‚t |ƒdksþt‚| |¡dkst‚| |d ¡dks*t‚|d |ks<t‚tjtt|d ƒd	 | |d ¡ W 5 Q R X d S )
Né   é7   r   é*   é   é)   é   é   ©Úmatch)ÚlenÚAssertionErrorÚset_itemÚget_itemÚpytestÚraisesÚKeyErrorÚstr©ÚselfÚ
table_typeÚdtypeÚindexÚtabler	   r	   r
   Útest_get_set_contains_len2   s.    z'TestHashTable.test_get_set_contains_lenc           	      C   s‚   |t jkr~d}|ƒ }t |¡ |¡}t |¡ tj¡| }||j_||j_| ||¡ t	|ƒD ]}| 
|| ¡|| ks^t‚q^d S )NéM   )r   ÚPyObjectHashTableÚnpÚarangeÚastypeÚint64ÚflagsÚ	writeabler   Úranger!   r   )	r'   r(   r)   ÚwritableÚNr+   ÚkeysÚvalsÚir	   r	   r
   Útest_mapO   s    
zTestHashTable.test_mapc                 C   sX   d}|ƒ }t  |¡|  |¡}||j_| |¡ t|ƒD ]}| || ¡|ks8t‚q8d S )Né   )	r/   r0   r1   r3   r4   Úmap_locationsr5   r!   r   )r'   r(   r)   r6   r7   r+   r8   r:   r	   r	   r
   Útest_map_locations\   s    
z TestHashTable.test_map_locationsc           	      C   sd   d}|ƒ }t  |¡|  |¡}||j_| |¡ | |¡}t  |¡}t | t j	¡| t j	¡¡ d S )Né   )
r/   r0   r1   r3   r4   r=   ÚlookupÚtmÚassert_numpy_array_equalr2   )	r'   r(   r)   r6   r7   r+   r8   ÚresultÚexpectedr	   r	   r
   Útest_lookupe   s    


zTestHashTable.test_lookupc                 C   sn   |t jt jfkrd}nd}|ƒ }t  |¡|  |¡}| |¡ t  |¡ |¡}| |¡}t  |dk¡sjt‚d S )Néd   i   éÿÿÿÿ)	r/   Úint8Úuint8r0   r1   r=   r@   Úallr   )r'   r(   r)   r7   r+   r8   Z
wrong_keysrC   r	   r	   r
   Útest_lookup_wrongo   s    

zTestHashTable.test_lookup_wrongc           	      C   sb   |t jt jfkrd}nd}|ƒ }t  |¡|  |¡}t  |d¡}||j_| |¡}t	 
||¡ d S )NéX   éè  r   )r/   rH   rI   r0   r1   Úrepeatr3   r4   ÚuniquerA   rB   )	r'   r(   r)   r6   r7   r+   rD   r8   rO   r	   r	   r
   Útest_unique{   s    
zTestHashTable.test_uniquec              	   C   sz   |t jt jfkrd}nd}t  |¡ |¡}tƒ @ |ƒ }| |¡ tƒ }| ¡ }||ks\t	‚~tƒ dkslt	‚W 5 Q R X d S )Né   i0u  r   )
r/   rH   rI   r0   r1   r   r=   r   Úsizeofr   )r'   r(   r)   r7   r8   r+   ÚusedÚmy_sizer	   r	   r
   Útest_tracemalloc_works‡   s    
z$TestHashTable.test_tracemalloc_worksc              	   C   sF   t ƒ 6 |ƒ }tƒ }| ¡ }||ks(t‚~tƒ dks8t‚W 5 Q R X d S ©Nr   )r   r   rR   r   )r'   r(   r)   r+   rS   rT   r	   r	   r
   Útest_tracemalloc_for_empty–   s    z(TestHashTable.test_tracemalloc_for_emptyc                 C   sL   |dƒ}|  ¡ }|d dks t‚|d dks0t‚d|ks<t‚d|ksHt‚d S )NrM   r   r   Z
n_occupiedÚ	n_bucketsZupper_bound)Ú	get_stater   )r'   r(   r)   r+   Ústater	   r	   r
   Útest_get_stateŸ   s    zTestHashTable.test_get_statec           	      C   s~   t ddƒD ]n}t |¡ |¡}||ƒ}| ¡ d }| |¡ | ¡ d }||ksTt‚|ƒ }| |¡ || ¡ d ks
t‚q
d S ©Nr   én   rX   )r5   r/   r0   r1   rY   r=   r   )	r'   r(   r)   r7   r8   Úpreallocated_tableÚn_buckets_startÚn_buckets_endÚclean_tabler	   r	   r
   Útest_no_reallocation§   s    

z"TestHashTable.test_no_reallocationN)Ú__name__Ú
__module__Ú__qualname__r,   r;   r>   rE   rK   rP   rU   rW   r[   rb   r	   r	   r	   r
   r      s   	
	r   c                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚTestPyObjectHashTableWithNansc                 C   sF   t dƒ}t dƒ}||k	st‚t ¡ }| |d¡ | |¡dksBt‚d S ©NÚnanr   ©Úfloatr   r   r.   r    r!   ©r'   Únan1Únan2r+   r	   r	   r
   Útest_nan_float·   s    z,TestPyObjectHashTableWithNans.test_nan_floatc                 C   sZ   t tdƒtdƒƒ}t tdƒtdƒƒ}||k	s0t‚t ¡ }| |d¡ | |¡dksVt‚d S rg   )Úcomplexrj   r   r   r.   r    r!   rk   r	   r	   r
   Útest_nan_complex_both¿   s    z3TestPyObjectHashTableWithNans.test_nan_complex_bothc              	   C   sš   t tdƒdƒ}t tdƒdƒ}t tdƒdƒ}||k	s6t‚t ¡ }| |d¡ | |¡dks\t‚tjt	d d}| |¡ W 5 Q R X t
|jƒt
|ƒks–t‚d S )Nrh   r   r   r   r   ©ro   rj   r   r   r.   r    r!   r"   r#   r$   r%   Úvalue©r'   rl   rm   Úotherr+   Úerrorr	   r	   r
   Útest_nan_complex_realÇ   s    z3TestPyObjectHashTableWithNans.test_nan_complex_realc              	   C   sš   t dtdƒƒ}t dtdƒƒ}t dtdƒƒ}||k	s6t‚t ¡ }| |d¡ | |¡dks\t‚tjt	d d}| |¡ W 5 Q R X t
|jƒt
|ƒks–t‚d S )Nr   rh   r   r   r   rq   rs   r	   r	   r
   Útest_nan_complex_imagÓ   s    z3TestPyObjectHashTableWithNans.test_nan_complex_imagc                 C   sR   t dƒf}t dƒf}|d |d k	s(t‚t ¡ }| |d¡ | |¡dksNt‚d S )Nrh   r   r   ri   rk   r	   r	   r
   Útest_nan_in_tupleß   s    

z/TestPyObjectHashTableWithNans.test_nan_in_tuplec              	   C   sŒ   ddt dƒfff}ddt dƒfff}d}t ¡ }| |d¡ | |¡dksNt‚tjtd d}| |¡ W 5 Q R X t	|j
ƒt	|ƒksˆt‚d S )Nr   r   rh   )r   r   r   r   )rj   r   r.   r    r!   r   r"   r#   r$   r%   rr   rs   r	   r	   r
   Útest_nan_in_nested_tupleç   s    z6TestPyObjectHashTableWithNans.test_nan_in_nested_tupleN)	rc   rd   re   rn   rp   rv   rw   rx   ry   r	   r	   r	   r
   rf   ¶   s   rf   c                  C   s\   t dƒt dƒt dƒff} t dƒt dƒt dƒff}t | ¡t |¡ksHt‚t | |¡sXt‚d S )Nrh   )rj   r   Zobject_hashr   Zobjects_are_equal)ÚaÚbr	   r	   r
   Útest_hash_equal_tuple_with_nansó   s    r|   c                 C   sŽ   t  ¡ }tjddddddgtjd}| |j_| |¡\}}tjddddddgtjd}tjddgtjd}t 	| 
tj¡|¡ t 	||¡ d S )Nr   r   rG   ©r)   r   )r   ÚInt64HashTabler/   Úarrayr2   r3   r4   Zget_labels_groupbyrA   rB   r1   )r6   r+   r9   ÚarrrO   Zexpected_arrZexpected_uniquer	   r	   r
   Ú!test_get_labels_groupby_for_Int64ú   s    r   c               	   C   sr   d} t  | ¡ t jj¡ t j¡}tƒ B t ¡ }| 	|¡ t
ƒ }| ¡ }||ksTt‚~t
ƒ dksdt‚W 5 Q R X d S )NrM   r   )r/   r0   r1   ÚcompatÚunicodeÚobject_r   r   ÚStringHashTabler=   r   rR   r   )r7   r8   r+   rS   rT   r	   r	   r
   Ú*test_tracemalloc_works_for_StringHashTable  s    
r†   c               	   C   sH   t ƒ 8 t ¡ } tƒ }|  ¡ }||ks*t‚~ tƒ dks:t‚W 5 Q R X d S rV   )r   r   r…   r   rR   r   )r+   rS   rT   r	   r	   r
   Ú*test_tracemalloc_for_empty_StringHashTable  s    r‡   c                  C   sŽ   t ddƒD ]~} t | ¡ tjj¡ tj¡}t | ¡}| 	¡ d }| 
|¡ | 	¡ d }||ksbt‚t ¡ }| 
|¡ || 	¡ d ks
t‚q
d S r\   )r5   r/   r0   r1   r‚   rƒ   r„   r   r…   rY   r=   r   )r7   r8   r^   r_   r`   ra   r	   r	   r
   Ú$test_no_reallocation_StringHashTable  s    


rˆ   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚTestHashTableWithNansc                 C   s’   t dƒ}|ƒ }||kst‚| |d¡ t|ƒdks6t‚||ksBt‚| |¡dksTt‚| |d¡ t|ƒdkspt‚||ks|t‚| |¡dksŽt‚d S )Nrh   r   r   r   )rj   r   r    r   r!   r&   r	   r	   r
   r,   5  s    z/TestHashTableWithNans.test_get_set_contains_lenc                 C   sn   d}|ƒ }t j|t j|d}t  |¡|  t j¡}| ||¡ t|ƒdksNt‚| 	t j¡d| d ksjt‚d S )NiL  r}   r   r   )
r/   Úfullrh   r0   r1   r2   r   r   r   r!   )r'   r(   r)   r7   r+   r8   r9   r	   r	   r
   r;   D  s    zTestHashTableWithNans.test_mapc                 C   sR   d}|ƒ }t j|t j|d}| |¡ t|ƒdks6t‚| t j¡|d ksNt‚d S )Né
   r}   r   )r/   rŠ   rh   r=   r   r   r!   )r'   r(   r)   r7   r+   r8   r	   r	   r
   r>   M  s    
z(TestHashTableWithNans.test_map_locationsc                 C   sJ   d}|ƒ }t j|t j|d}| |¡}t  t  |¡¡rBt|ƒdksFt‚d S )Niü  r}   r   )r/   rŠ   rh   rO   rJ   Úisnanr   r   )r'   r(   r)   r7   r+   r8   rO   r	   r	   r
   rP   U  s
    
z!TestHashTableWithNans.test_uniqueN)rc   rd   re   r,   r;   r>   rP   r	   r	   r	   r
   r‰   +  s   
	r‰   c                  C   sD   t  ¡ } tjdd„ tdƒD ƒtjd}|  |¡}t|ƒdks@t‚d S )Nc                 S   s   g | ]}t d ƒ‘qS )rh   ©rj   ©Ú.0r:   r	   r	   r
   Ú
<listcomp>_  s     z6test_unique_for_nan_objects_floats.<locals>.<listcomp>é2   r}   r   ©	r   r.   r/   r   r5   r„   rO   r   r   ©r+   r8   rO   r	   r	   r
   Ú"test_unique_for_nan_objects_floats]  s    
r”   c                  C   sD   t  ¡ } tjdd„ tdƒD ƒtjd}|  |¡}t|ƒdks@t‚d S )Nc                 S   s   g | ]}t td ƒdƒ‘qS )rh   ç      ð?)ro   rj   rŽ   r	   r	   r
   r   f  s     z7test_unique_for_nan_objects_complex.<locals>.<listcomp>r‘   r}   r   r’   r“   r	   r	   r
   Ú#test_unique_for_nan_objects_complexd  s    
r–   c                  C   sJ   t  ¡ } tjdgdd„ tdƒD ƒ tjd}|  |¡}t|ƒdksFt‚d S )Nr   c                 S   s   g | ]}d t dƒd ff‘qS )r•   rh   r   rŽ   r	   r	   r
   r   n  s     z5test_unique_for_nan_objects_tuple.<locals>.<listcomp>r‘   r}   r   r’   r“   r	   r	   r
   Ú!test_unique_for_nan_objects_tuplek  s     ÿ
r—   c                 C   s
   t t| ƒS r   )Úgetattrr   )Zfun_nameÚtype_suffixr	   r	   r
   Úget_ht_functiont  s    rš   zdtype, type_suffixÚobjectÚ
complex128r2   Úuint64Úfloat64Ú	complex64Úint32Úuint32Úfloat32Úint16Úuint16rH   rI   c                   @   sD   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dS )ÚTestHelpFunctionsc           
      C   sl   d}t d|ƒ}t |¡|  |¡}t |d¡}||j_||dƒ\}}	t t 	|¡|¡ t 
|	dk¡sht‚d S )Né+   Úvalue_countr   F)rš   r/   r0   r1   rN   r3   r4   rA   rB   ÚsortrJ   r   )
r'   r)   r™   r6   r7   r§   rD   Úvaluesr8   Úcountsr	   r	   r
   Útest_value_count‹  s    
z"TestHelpFunctions.test_value_countc              	   C   s`   t d|ƒ}t dddddddg¡ |¡}||j_||d	ƒ\}}t ||¡ t |dk¡s\t	‚d S )
Nr§   r   r   r   é   r?   rG   r<   F)
rš   r/   r   r1   r3   r4   rA   rB   rJ   r   )r'   r)   r™   r6   r§   r©   r8   rª   r	   r	   r
   Útest_value_count_stable•  s    
z)TestHelpFunctions.test_value_count_stablec           	      C   sd   d}t d|ƒ}t t |¡ |¡d¡}||j_||ƒ}tj|tjd}d|d d d…< t	 
||¡ d S )NrF   Ú
duplicatedr   r}   F)rš   r/   rN   r0   r1   r3   r4   Ú	ones_likeÚbool_rA   rB   )	r'   r)   r™   r6   r7   r®   r©   rC   rD   r	   r	   r
   Útest_duplicated_firstž  s    
z'TestHelpFunctions.test_duplicated_firstc           
      C   sh   d}t d|ƒ}t |¡ |¡}t |¡ |¡}||j_||j_|||ƒ}tj|tjd}	t 	||	¡ d S )Né   Úismemberr}   )
rš   r/   r0   r1   r3   r4   r¯   r°   rA   rB   )
r'   r)   r™   r6   r7   r³   r€   r©   rC   rD   r	   r	   r
   Útest_ismember_yes¨  s    

z#TestHelpFunctions.test_ismember_yesc           	      C   s\   d}t d|ƒ}t |¡ |¡}t |¡|  |¡}|||ƒ}tj|tjd}t ||¡ d S )Né   r³   r}   )rš   r/   r0   r1   Z
zeros_liker°   rA   rB   )	r'   r)   r™   r7   r³   r€   r©   rC   rD   r	   r	   r
   Útest_ismember_no³  s    

z"TestHelpFunctions.test_ismember_noc                 C   sf   |t jt jfkrd}nd}td|ƒ}t  t  |¡ |¡d¡}d|d< ||j_||dƒ}|dksbt	‚d S )Né5   ig+  Úmoder   r   r   F)
r/   rH   rI   rš   rN   r0   r1   r3   r4   r   )r'   r)   r™   r6   r7   r¸   r©   rC   r	   r	   r
   Ú	test_mode¼  s    

zTestHelpFunctions.test_modec              	   C   sJ   t d|ƒ}t dddddddg¡ |¡}||j_||d	ƒ}t ||¡ d S )
Nr¸   r   r   r   r¬   r?   rG   r<   F)rš   r/   r   r1   r3   r4   rA   rB   )r'   r)   r™   r6   r¸   r©   r8   r	   r	   r
   Útest_mode_stableÈ  s
    

z"TestHelpFunctions.test_mode_stableN)
rc   rd   re   r«   r­   r±   r´   r¶   r¹   rº   r	   r	   r	   r
   r¥   x  s   
	
	r¥   c                  C   sJ   t jdtjt jgt jd} t | d¡}|jdks4t	‚t  
|d ¡sFt	‚d S )NTr}   Fr   r   )r/   r   ÚpdZNArh   r„   r   r¸   r   r   rŒ   )r©   Úmodesr	   r	   r
   Útest_modes_with_nansÐ  s    r½   c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚTestHelpFunctionsWithNansc                 C   s„   t d|ƒ}tjtjtjtjg|d}||dƒ\}}t|ƒdksBt‚||dƒ\}}t|ƒdkrlt t |¡¡spt‚|d dks€t‚d S )Nr§   r}   Tr   Fr   r?   )rš   r/   r   rh   r   r   rJ   rŒ   )r'   r)   r™   r§   r©   r8   rª   r	   r	   r
   r«   ä  s    
 z*TestHelpFunctionsWithNans.test_value_countc                 C   sL   t d|ƒ}tjtjtjtjg|d}||ƒ}t dddg¡}t ||¡ d S )Nr®   r}   FT)rš   r/   r   rh   rA   rB   )r'   r)   r™   r®   r©   rC   rD   r	   r	   r
   r±   í  s
    
z/TestHelpFunctionsWithNans.test_duplicated_firstc                 C   sj   t d|ƒ}tjtjtjtjg|d}tjtjtjg|d}|||ƒ}tjdddgtjd}t ||¡ d S )Nr³   r}   T©rš   r/   r   rh   r°   rA   rB   ©r'   r)   r™   r³   r€   r©   rC   rD   r	   r	   r
   r´   ô  s    

z+TestHelpFunctionsWithNans.test_ismember_yesc                 C   sd   t d|ƒ}tjtjtjtjg|d}tjdg|d}|||ƒ}tjdddgtjd}t ||¡ d S )Nr³   r}   r   Fr¿   rÀ   r	   r	   r
   r¶   ü  s    

z*TestHelpFunctionsWithNans.test_ismember_noc                 C   sP   t d|ƒ}tjdtjtjtjg|d}||dƒdks8t‚t ||dƒ¡sLt‚d S )Nr¸   r   r}   TF)rš   r/   r   rh   r   rŒ   )r'   r)   r™   r¸   r©   r	   r	   r
   r¹     s    
z#TestHelpFunctionsWithNans.test_modeN)rc   rd   re   r«   r±   r´   r¶   r¹   r	   r	   r	   r
   r¾   Ú  s
   
	r¾   c                  C   sL   dt dƒfdg} dt dƒfg}t| |ƒ}tjddgtjd}t ||¡ d S )Nrz   rh   )r{   r   TFr}   )rj   r   r/   r   r°   rA   rB   ©r©   ÚcompsrC   rD   r	   r	   r
   Útest_ismember_tuple_with_nans  s
    
rÃ   c                  C   sJ   ddddg} t tdƒƒ}t| |ƒ}tjddddgtjd}t ||¡ d S )	Nrz   r   g      @y      @        é   FTr}   )Úlistr5   r   r/   r   r°   rA   rB   rÁ   r	   r	   r
   Ú+test_float_complex_int_are_equal_as_objects  s
    
rÆ   )?Ú
contextlibr   r   Znumpyr/   r"   Zpandas._libsr   r   Zpandasr»   Zpandas._testingZ_testingrA   Zpandas.core.algorithmsr   r   r   ÚmarkZparametrizer.   r„   ZComplex128HashTablerœ   r~   r2   ZUInt64HashTabler   ZFloat64HashTablerž   ZComplex64HashTablerŸ   ZInt32HashTabler    ZUInt32HashTabler¡   ZFloat32HashTabler¢   ZInt16HashTabler£   ZUInt16HashTabler¤   ZInt8HashTablerH   ZUInt8HashTablerI   r   rf   r|   r   r†   r‡   rˆ   r‰   r”   r–   r—   rš   r¥   r½   r¾   rÃ   rÆ   r	   r	   r	   r
   Ú<module>   sœ   













óþ =




üþ	)	óþF
üþ	(	