U
    iâËdy!  ã                   @   sÀ   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ZG dd„ de
ƒZG dd„ deƒZG d	d
„ d
eƒZdd„ ZG dd„ deƒZG dd„ deƒZedkr¼e ¡  dS )é    N)Úcapture_cache_log)ÚBaseCacheTest)Úconfigc                   @   sr   e Zd ZdZdZej e¡Z	ej 
e	d¡ZdZe d¡Ze d¡Ze d¡Ze d¡Zd	d
„ Zdd„ Zdd„ ZdS )ÚUfuncCacheTestzg
    Since the cache stats is not exposed by ufunc, we test by looking at the
    cache debug log.
    Fzcache_usecases.pyZufunc_caching_test_fodderz\[cache\] data saved toz\[cache\] index saved toz\[cache\] data loaded fromz\[cache\] index loaded fromc                 C   s<   | j  |¡}| j |¡}|  t|ƒ|¡ |  t|ƒ|¡ dS )z8
        Check number of cache-save were issued
        N)Úregex_data_savedÚfindallÚregex_index_savedÚassertEqualÚlen)ÚselfÚcachelogÚcountZ
data_savedZindex_saved© r   úZ/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/numba/tests/npyufunc/test_caching.pyÚcheck_cache_saved   s    z UfuncCacheTest.check_cache_savedc                 C   s<   | j  |¡}| j |¡}|  t|ƒ|¡ |  t|ƒ|¡ dS )z8
        Check number of cache-load were issued
        N)Úregex_data_loadedr   Úregex_index_loadedr	   r
   )r   r   r   Zdata_loadedZindex_loadedr   r   r   Úcheck_cache_loaded(   s    z!UfuncCacheTest.check_cache_loadedc           
   	   K   s~   |   ¡ }t||ƒ}tƒ �}|f |Ž}W 5 Q R X | ¡ }| j||d� tƒ �}|f |Ž}	W 5 Q R X | ¡ }| j||d� ||	fS )zf
        Check number of cache load/save.
        There should be one per overloaded version.
        ©r   )Úimport_moduleÚgetattrr   Úgetvaluer   r   )
r   Úusecase_nameÚn_overloadsÚkwargsÚmodÚusecaseÚoutÚ	new_ufuncr   Úcached_ufuncr   r   r   Úcheck_ufunc_cache1   s    
z UfuncCacheTest.check_ufunc_cacheN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Z_numba_parallel_test_ÚosÚpathÚdirnameÚ__file__ÚhereÚjoinZusecases_fileÚmodnameÚreÚcompiler   r   r   r   r   r   r    r   r   r   r   r      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 )ÚTestUfuncCacheTestc                 K   sl   | j dddi|—Ž\}}tj d¡ tj¡}tj ||ƒ||ƒ¡ tjdtjd�}tj ||ƒ||ƒ¡ d S )NÚdirect_ufunc_cache_usecaser   é   é
   ©Zdtype)r/   ©	r    ÚnpÚrandomZastypeZfloat64ÚtestingZassert_equalÚarangeZintp©r   r   r   r   Zinpr   r   r   Útest_direct_ufunc_cacheI   s     ÿÿÿ
z*TestUfuncCacheTest.test_direct_ufunc_cachec                 C   s   | j dd� d S ©NT)Zforceobj©r9   ©r   r   r   r   Útest_direct_ufunc_cache_objmodeR   s    z2TestUfuncCacheTest.test_direct_ufunc_cache_objmodec                 C   s   | j dd� d S ©NÚparallel)Útargetr;   r<   r   r   r   Ú test_direct_ufunc_cache_parallelU   s    z3TestUfuncCacheTest.test_direct_ufunc_cache_parallelc                 K   sl   | j dddi|—Ž\}}tj d¡ tj¡}tj ||ƒ||ƒ¡ tjdtjd�}tj ||ƒ||ƒ¡ d S )NÚindirect_ufunc_cache_usecaser   é   r1   r2   )rB   r3   r8   r   r   r   Útest_indirect_ufunc_cacheX   s     ÿÿÿ
z,TestUfuncCacheTest.test_indirect_ufunc_cachec                 C   s   | j dd� d S r>   )rD   r<   r   r   r   Ú"test_indirect_ufunc_cache_parallela   s    z5TestUfuncCacheTest.test_indirect_ufunc_cache_parallelN)r!   r"   r#   r9   r=   rA   rD   rE   r   r   r   r   r.   G   s
   		r.   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚTestDUfuncCacheTestc              	   C   s¼   |   ¡ }t||ƒ}tƒ �}|ƒ }W 5 Q R X | j| ¡ dd� tƒ �}|t d¡ƒ W 5 Q R X | j| ¡ dd� | j| ¡ dd� tƒ �}|ƒ }|t d¡ƒ W 5 Q R X | j| ¡ dd� d S )Nr   r   r1   é   )r   r   r   r   r   r4   r7   r   )r   r   r   r   r   Zufuncr   r   r   Úcheck_dufunc_usecaseh   s    
z(TestDUfuncCacheTest.check_dufunc_usecasec                 C   s   |   d¡ d S )NZdirect_dufunc_cache_usecase©rH   r<   r   r   r   Útest_direct_dufunc_cachez   s    z,TestDUfuncCacheTest.test_direct_dufunc_cachec                 C   s   |   d¡ d S )NZindirect_dufunc_cache_usecaserI   r<   r   r   r   Útest_indirect_dufunc_cache~   s    z.TestDUfuncCacheTest.test_indirect_dufunc_cacheN)r!   r"   r#   rH   rJ   rK   r   r   r   r   rF   e   s   rF   c                 C   s   t jr|  dd¡} | S )Nú/z\\\\)r   ZIS_WIN32Úreplace)Zrstrr   r   r   Ú_fix_raw_path‚   s    rN   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 )ÚTestGUfuncCacheTestc           	   	   C   s’   |   ¡ }t|dƒ}tƒ �}|ƒ  W 5 Q R X | ¡ }tdƒ}t | | j¡|¡}tdƒ}t | | j¡|¡}|  	t
|ƒd¡ |  t
|ƒt
|ƒ¡ d S )NÚdirect_gufunc_cache_usecasez/__pycache__/guf-{}z/__pycache__/{}r0   )r   r   r   r   rN   r,   r   Úformatr+   ZassertGreaterr
   r	   )	r   r   r   r   r   Zfmt1ÚprefixedZfmt2Únormalr   r   r   Útest_filename_prefixŠ   s    
z(TestGUfuncCacheTest.test_filename_prefixc                 K   sl   | j dddi|—Ž\}}tj d¡ tj¡}tj ||ƒ||ƒ¡ tjdtjd�}tj ||ƒ||ƒ¡ d S )NrP   r   é   r1   r2   )rP   r3   r8   r   r   r   Útest_direct_gufunc_cacheš   s     ÿÿÿ
z,TestGUfuncCacheTest.test_direct_gufunc_cachec                 C   s   | j dd� d S r:   ©rV   r<   r   r   r   Ú test_direct_gufunc_cache_objmode¥   s    z4TestGUfuncCacheTest.test_direct_gufunc_cache_objmodec                 C   s   | j dd� d S r>   rW   r<   r   r   r   Ú!test_direct_gufunc_cache_parallel¨   s    z5TestGUfuncCacheTest.test_direct_gufunc_cache_parallelc                 K   sl   | j dddi|—Ž\}}tj d¡ tj¡}tj ||ƒ||ƒ¡ tjdtjd�}tj ||ƒ||ƒ¡ d S )NÚindirect_gufunc_cache_usecaser   rC   r1   r2   )rZ   r3   r8   r   r   r   Útest_indirect_gufunc_cache«   s     ÿÿÿ
z.TestGUfuncCacheTest.test_indirect_gufunc_cachec                 K   s   | j dd� d S r>   )r[   )r   r   r   r   r   Ú#test_indirect_gufunc_cache_parallel¶   s    z7TestGUfuncCacheTest.test_indirect_gufunc_cache_parallelN)	r!   r"   r#   rT   rV   rX   rY   r[   r\   r   r   r   r   rO   ˆ   s   rO   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚTestCacheSpecificIssuec                 C   sb   dt | j| j|d� }tjtjd|gtjtjd�}| ¡ \}}|j	dkr^t
d|j	| ¡ f ƒ‚d S )Nzœif 1:
            import sys

            sys.path.insert(0, %(tempdir)r)
            mod = __import__(%(modname)r)
            mod.%(runcode)s
            )Útempdirr+   Úruncodez-c)ÚstdoutÚstderrr   z/process failed with code %s: stderr follows
%s
)Údictr^   r+   Ú
subprocessÚPopenÚsysÚ
executableÚPIPEÚcommunicateÚ
returncodeÚAssertionErrorÚdecode)r   r_   ÚcodeÚpopenr   Úerrr   r   r   Úrun_in_separate_process¼   s    
ÿú	 ÿ
ÿz.TestCacheSpecificIssue.run_in_separate_processc                 C   s   |   d¡ |   d¡ d S )Nzdirect_ufunc_cache_usecase()©ro   r<   r   r   r   Útest_first_load_cached_ufuncÔ   s    
z3TestCacheSpecificIssue.test_first_load_cached_ufuncc                 C   s   |   d¡ |   d¡ d S )Nzdirect_gufunc_cache_usecase()rp   r<   r   r   r   Útest_first_load_cached_gufuncÛ   s    
z4TestCacheSpecificIssue.test_first_load_cached_gufuncN)r!   r"   r#   ro   rq   rr   r   r   r   r   r]   º   s   r]   Ú__main__)re   Úos.pathr%   r,   rc   Únumpyr4   Znumba.tests.supportr   Znumba.tests.test_cachingr   Z
numba.corer   Zunittestr   r.   rF   rN   rO   r]   r!   Úmainr   r   r   r   Ú<module>   s    92)