U
    Nvf>                     @   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   </tmp/pip-unpacked-wheel-dylwa62s/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)Z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    
rO   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)rO   rL   rM   rN   r6   r7   r:   Zare_arrays_equalr   r   r   test_hash_numpy_arraysx   s    
rU   c                 C   sT   | \}}}||d}||d}||d}t |t |ks<tt |t |ksPtd S )N)r.   r/   r8   )rO   rL   rM   rN   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mrF   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   rG   rH   rI   r!   r   r9   r   r   )rK   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stt| | gt| |gkst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st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 )*   )rG   Randomr~   r   r   r   r   r   {  s     r      Z a11ffad81f9682a7d901e6edc3d16c84{   ir   )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   rF   )r   rG   rH   rI   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   )ir   d   rY   rF   r/   )r   rG   rH   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zipZ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   rQ   r   rG   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   rO   rU   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	