U
    ºmœd¶>  ã                   @   sÈ  d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
mZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZmZmZmZ dd	lmZmZ d
d„ Zdd„ Zdd„ ZG dd„ deƒZ G dd„ deƒZ!dddddddddddgddgddiddiddidej"dgj#e$dƒe$dƒdddœddddid œgZ%ed!e%ƒed"e%ƒd#d$„ ƒƒZ&d%d&„ Z'ed'd(�ed)d*„ ƒƒZ(d+d,„ Z)d-d.„ Z*eed/d0d1gƒd2d3„ ƒƒZ+ed4d5„ ƒZ,eed6d7d8gƒd9d:„ ƒƒZ-eeej.d;kd<d=�d>d?„ ƒƒZ/d@dA„ Z0dBdC„ Z1edDdE„ ƒZ2edFdG„ ƒZ3dHdI„ Z4dJdK„ Z5dLdM„ Z6dNdO„ Z7edPdQ„ ƒZ8edRdSdTdUdVdW„ e9dXƒD ƒdYfdZd[dd\gd]œd^fgƒd_d`„ ƒZ:edadb„ ƒZ;edcdd„ ƒZ<ededf„ ƒZ=edgdh„ ƒZ>didj„ Z?dkdl„ Z@dS )mz
Test the hashing module.
é    N)ÚProcessPoolExecutor)ÚDecimal)Úhash)Úfilter_args)ÚMemory)ÚraisesÚskipifÚfixtureÚparametrize)ÚnpÚ
with_numpyc                 C   s   | S ©N© )Úsr   r   úQ/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/joblib/test/test_hashing.pyÚunicode   s    r   c                 G   s>   t ƒ }tdƒD ]&}t ¡ }| |Ž  | t ¡ | ¡ qt|ƒS )z" Time function func on *args.
    é   )ÚlistÚrangeÚtimeÚappendÚmin)ÚfuncÚargsÚtimesÚ_Út1r   r   r   Ú	time_func"   s    r   c                 G   s8   t | f|žŽ }t |f|žŽ }dt|| ƒ||   }|S )zP Return the relative time between func1 and func2 applied on
        *args.
    ç      à?)r   Úabs)Zfunc1Zfunc2r   Z
time_func1Z
time_func2Úrelative_diffr   r   r   Úrelative_time-   s    ÿr!   c                   @   s   e Zd Zdd„ ZdS )ÚKlassc                 C   s   |S r   r   ©ÚselfÚxr   r   r   Úf:   s    zKlass.fN)Ú__name__Ú
__module__Ú__qualname__r&   r   r   r   r   r"   8   s   r"   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚKlassWithCachedMethodc                 C   s   t |d�}| | j¡| _d S )N)Úlocation)r   Úcacher&   )r$   ZcachedirZmemr   r   r   Ú__init__@   s    
zKlassWithCachedMethod.__init__c                 C   s   |S r   r   r#   r   r   r   r&   D   s    zKlassWithCachedMethod.fN)r'   r(   r)   r-   r&   r   r   r   r   r*   >   s   r*   é   é   g      ð?ç       @y      ð?      ð?y       @      ð?ÚaÚb©r.   )r.   r.   ©r1   r.   )r1   r.   r4   )r1   r.   ÚdÚobj1Úobj2c                 C   s(   t | ƒt |ƒk}| |k}||ks$t‚dS )z!Smoke test hash on various types.N©r   ÚAssertionError)r6   r7   Úare_hashes_equalZare_objs_identicalr   r   r   Útest_trivial_hashZ   s    r;   c                  C   s^   t  tdƒ¡} t| jƒt| jƒks&t‚t tdƒ¡}t tdƒ¡}t|j	ƒt|j	ƒksZt‚d S )Nr1   é
   é	   )
ÚioÚStringIOr   r   Úflushr9   ÚcollectionsÚdequer   Úextend)r1   Za1Za2r   r   r   Útest_hash_methodsd   s
    rD   Úfunction)Úscopec                  C   s@   t j d¡} |  d¡}| ¡ }| ¡ }|d  d7  < |||fS )Nr   ©r<   r<   r.   )r   ÚrandomÚRandomStateÚrandom_sampleÚcopy)ÚrndÚarr1Úarr2Úarr3r   r   r   Úthree_np_arraysm   s    
rP   c                 C   sf   | \}}}t j| dd�D ]2\}}t|ƒt|ƒk}t ||k¡}||kst‚qt|ƒt|jƒksbt‚d S )Nr/   )Úrepeat)Ú	itertoolsÚproductr   r   Úallr9   ÚT)rP   rM   rN   rO   r6   r7   r:   Zare_arrays_equalr   r   r   Útest_hash_numpy_arraysx   s    
rV   c                 C   sT   | \}}}||dœ}||dœ}||dœ}t |ƒt |ƒks<t‚t |ƒt |ƒksPt‚d S )N)r.   r/   r8   )rP   rM   rN   rO   Zd1Zd2Zd3r   r   r   Útest_hash_numpy_dict_of_arraysƒ   s    



rW   Údtypezdatetime64[s]ztimedelta64[D]c                 C   s2   t t d¡ƒ}tjdd| d�}t |ƒ|ks.t‚d S )Nr<   r   ©rX   )r   r   Úaranger9   )rX   Za_hashÚarrayr   r   r   Útest_numpy_datetime_arrayŽ   s    r\   c                  C   sp   t jt  d¡ d¡dd�d d …d d…d d …f } t  | ¡}t| ƒt|ƒksNt‚t  | ¡}t| ƒt|ƒkslt‚d S )Nip  )éè  r/   r   ÚF)Úorderr.   )r   ÚasarrayrZ   ÚreshapeZascontiguousarrayr   r9   Úasfortranarray)r1   r2   Úcr   r   r   Útest_hash_numpy_noncontiguous˜   s    ÿÿ

rd   Úcoerce_mmapTFc                 C   sj   |   d¡j}zBtj|ddd�}t |¡}t||d�t||d�k}||ksLt	‚W 5 dtƒ krd~t ¡  X dS )zECheck that memmap and arrays hash identically if coerce_mmap is True.Zmemmap_tempÚmrG   zw+)ÚshapeÚmode)re   N)
ÚjoinÚstrpathÚlocalsÚgcÚcollectr   Zmemmapr`   r   r9   )Útmpdirre   Úfilenamerf   r1   r:   r   r   r   Útest_hash_memmap£   s    


ÿ
rp   Úwin32z5This test is not stable under windows for some reason)Úreasonc                  C   s|   t j d¡} |  d¡}dd„ }t|t|ƒ}|dk s6t‚dt||ƒ }tt|||fƒ}dt|| ƒ||   }|dk sxt‚dS )	a   Check the performance of hashing numpy arrays:

        In [22]: a = np.random.random(1000000)

        In [23]: %timeit hashlib.md5(a).hexdigest()
        100 loops, best of 3: 20.7 ms per loop

        In [24]: %timeit hashlib.md5(pickle.dumps(a, protocol=2)).hexdigest()
        1 loops, best of 3: 73.1 ms per loop

        In [25]: %timeit hashlib.md5(cPickle.dumps(a, protocol=2)).hexdigest()
        10 loops, best of 3: 53.9 ms per loop

        In [26]: %timeit hash(a)
        100 loops, best of 3: 20.8 ms per loop
    r   i@B c                 S   s   t  t| ƒ¡ ¡ S r   )ÚhashlibÚmd5Ú
memoryviewÚ	hexdigest)r%   r   r   r   Úmd5_hashÎ   s    z-test_hash_numpy_performance.<locals>.md5_hashg333333Ó?r   r   N)	r   rH   rI   rJ   r!   r   r9   r   r   )rL   r1   rw   r    Ztime_hashlibZ	time_hashr   r   r   Útest_hash_numpy_performance·   s    
ÿrx   c                  C   s8   t ƒ } t ƒ }tt| jg dƒƒtt|jg dƒƒks4t‚dS )z~ Make sure that calling the same method on two different instances
    of the same class does resolve to the same hashes.
    r3   N)r"   r   r   r&   r9   ©r1   r2   r   r   r   Útest_bound_methods_hashÝ   s
    ÿrz   c                 C   sD   t | jƒ}t | jƒ}tt|jjg dƒƒtt|jjg dƒƒks@t‚dS )z‡ Make sure that calling the same _cached_ method on two different
    instances of the same class does resolve to the same hashes.
    r3   N)r*   rj   r   r   r&   r   r9   )rn   r1   r2   r   r   r   Útest_bound_cached_methods_hashç   s
    

ÿr{   c                  C   sP   t jdd„ tdƒD ƒtd�} t jdd„ tdƒD ƒtd�}t| ƒt|ƒksLt‚dS )z< Make sure that ndarrays with dtype `object' hash correctly.c                 S   s   g | ]}t  |¡‘qS r   ©r   rZ   ©Ú.0Úir   r   r   Ú
<listcomp>õ   s     z*test_hash_object_dtype.<locals>.<listcomp>é   rY   c                 S   s   g | ]}t  |¡‘qS r   r|   r}   r   r   r   r€   ö   s     N)r   r[   r   Úobjectr   r9   ry   r   r   r   Útest_hash_object_dtypeñ   s    rƒ   c                  C   s,   t  d¡} t  d¡}t| ƒt|ƒks(t‚d S )Nr0   g      @)r   Úfloat64r   r9   ry   r   r   r   Útest_numpy_scalarû   s    

r…   c                 C   sp   t | jƒ}dgdgdgdgdgdgdgdgdgdgdgdgdgdœ}| |¡}| |¡}t|ƒt|ƒkslt‚d S )Né!   )ú#s12069__c_maps.nii.gzú#s12158__c_maps.nii.gzú#s12258__c_maps.nii.gzú#s12277__c_maps.nii.gzú#s12300__c_maps.nii.gzú#s12401__c_maps.nii.gzú#s12430__c_maps.nii.gzú#s13817__c_maps.nii.gzú#s13903__c_maps.nii.gzú#s13916__c_maps.nii.gzú#s13981__c_maps.nii.gzú#s13982__c_maps.nii.gzú#s13983__c_maps.nii.gz)r*   rj   r&   r   r9   )rn   Úkr5   r1   r2   r   r   r   Útest_dict_hash  s$    
ô

r•   c                 C   sX   t | jƒ}tddddddddd	d
dddgƒ}| |¡}| |¡}t|ƒt|ƒksTt‚d S )Nr‡   rˆ   r‰   rŠ   r‹   rŒ   r�   rŽ   r�   r�   r‘   r’   r“   )r*   rj   Úsetr&   r   r9   )rn   r”   r   r1   r2   r   r   r   Útest_set_hash  s$    
ô

r—   c                   C   s8   t ttdƒtdƒgƒƒt ttdƒtdƒgƒƒks4t‚d S )Nr   ÚNaN)r   r–   r   r9   r   r   r   r   Útest_set_decimal_hash6  s    ÿr™   c                  C   sD   d} | di}| di}t  t  |¡¡}t||gƒt||gƒks@t‚d S )NÚfooÚbar)ÚpickleÚloadsÚdumpsr   r9   )Ústringr1   r2   rc   r   r   r   Útest_string=  s
    r    c                  C   s`  t  d¡} t  d¡}| |ks t‚t| ƒt|ƒks4t‚t t | ¡¡}| |k	sPt‚t| ƒt|ƒksdt‚t| | gƒt||gƒks€t‚t| | gƒt| |gƒksœt‚t  dt jdfdt jdfg¡}t  dt jdfdt jdfg¡}t|ƒt|ƒksìt‚t t |¡¡}||k	�s
t‚t|ƒt|ƒk�s t‚t||gƒt||gƒk�s>t‚t||gƒt||gƒk�s\t‚d S )NZf4Únameé   Zgrades)r/   )	r   rX   r9   r   rœ   r�   rž   Zstr_r„   )Zdt1Zdt2Zdt1_roundtrippedZcomplex_dt1Zcomplex_dt2Zcomplex_dt1_roundtrippedr   r   r   Útest_numpy_dtype_picklingG  s2    	

ÿÿÿÿr£   zto_hash,expected)zThis is a string to hashZ 71b3f47df22cb19431d85d92d0b230b2)u   C'est lÃ©tÃ©Z 2d8d189e9b2b0b2e384d93c868c0e576))i@â i1Ô  i3~þÿZ e205227dd82250871fa25aa0ec690aa3c                 C   s   g | ]}t  d ¡  ¡ ‘qS )é*   )rH   ÚRandom©r~   r   r   r   r   r€   {  s     r€   é   Z a11ffad81f9682a7d901e6edc3d16c84é{   iñØÿÿr   )ZabcdeZsadfasZ aeda150553d4bb5c69f0e69d51b0e2efc                 C   s   t | ƒ|kst‚d S r   r8   )Zto_hashÚexpectedr   r   r   Útest_hashes_stay_the_samet  s    rª   c                  C   s8   t j d¡} |  d¡}t  |¡}t|ƒt|ƒks4t‚d S )Nr   rG   )r   rH   rI   rJ   rb   r   r9   )ÚrngZarr_cZarr_fr   r   r   ÚAtest_hashes_are_different_between_c_and_fortran_contiguous_arraysˆ  s    

r¬   c                   C   s   t t d¡ƒ d S ©Nr   )r   r   r[   r   r   r   r   Útest_0d_array’  s    r®   c                   C   s&   t t d¡ƒt t dg¡ƒks"t‚d S r­   )r   r   r[   r9   r   r   r   r   Ú)test_0d_and_1d_array_hashing_is_different—  s    r¯   c            
      C   s    dd„ } | ƒ }| ƒ }t dd�}t dd�}z`t||ƒD ]P\}}| t|¡ ¡ }| t|¡ ¡ }||ksht‚| t|¡ ¡ }	||	ks4t‚q4W 5 | ¡  | ¡  X d S )Nc                     sÖ   t j d¡‰ ˆ jdddd� d¡t‡ fdd„td	ƒD ƒƒ‡ fd
d„td	ƒD ƒˆ  dd	¡ d¡ˆ jddd� d¡ˆ  d¡ d¡gdœt jddd� 	d¡t  
t jddd� 	d¡¡t jddd� 	d¡d d …d d…f g} | S )Nr¤   iüÿÿr]   é2   )ÚhighÚsizez<i8c                 3   s   | ]}ˆ   d ¡ d¡V  qdS )r   ú<f4N©ÚrandnÚastyper¦   ©r«   r   r   Ú	<genexpr>¶  s     z_test_hashes_stay_the_same_with_numpy_objects.<locals>.create_objects_to_hash.<locals>.<genexpr>r§   c                    s   g | ]}ˆ   d ¡ d¡‘qS )r   r³   r´   r¦   r·   r   r   r€   ·  s     z`test_hashes_stay_the_same_with_numpy_objects.<locals>.create_objects_to_hash.<locals>.<listcomp>r   r³   r<   é   )r²   )iûòÿÿr   éd   rY   rG   r/   )r   rH   rI   Úrandintr¶   Útupler   rµ   rZ   ra   rb   )Zto_hash_listr   r·   r   Úcreate_objects_to_hash­  s    þþ	"ïzLtest_hashes_stay_the_same_with_numpy_objects.<locals>.create_objects_to_hashr.   )Úmax_workers)r   ÚshutdownÚzipÚsubmitr   Úresultr9   )
r½   Zto_hash_list_oneZto_hash_list_twoÚe1Úe2Zobj_1Zobj_2Zhash_1Zhash_2Zhash_3r   r   r   Ú,test_hashes_stay_the_same_with_numpy_objectsœ  s    

rÅ   c               	   C   s4   dd„ } t tjƒ�}t| ƒ W 5 Q R X | d¡ d S )Nc                   S   s   dS )Nr¤   r   r   r   r   r   Únon_picklableã  s    z2test_hashing_pickling_error.<locals>.non_picklablezPicklingError while hashing)r   rœ   ÚPicklingErrorr   Úmatch)rÆ   Úexcinfor   r   r   Útest_hashing_pickling_errorâ  s    rÊ   c               	   C   s4   d} t t| d�� ddi}t|dd� W 5 Q R X d S )Nz!Valid options for 'hash_name' are)rÈ   rš   r›   Úinvalid)Ú	hash_name)r   Ú
ValueErrorr   )ÚmsgÚdatar   r   r   Útest_wrong_hash_nameë  s    rÐ   )AÚ__doc__r   rs   Úsysrl   r>   rA   rR   rœ   rH   Úconcurrent.futuresr   Údecimalr   Zjoblib.hashingr   Zjoblib.func_inspectr   Zjoblib.memoryr   Zjoblib.testingr   r   r	   r
   Zjoblib.test.commonr   r   r   r   r!   r‚   r"   r*   rm   r   r–   Z
input_listr;   rD   rP   rV   rW   r\   rd   rp   Úplatformrx   rz   r{   rƒ   r…   r•   r—   r™   r    r£   r   rª   r¬   r®   r¯   rÅ   rÊ   rÐ   r   r   r   r   Ú<module>   s¼         ô		

#


	


,ÿÿøÿ
	
	


E	