U
    iâËdb[  ã                   @   sÞ   d dl mZmZm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mZmZmZmZmZmZ d dlmZ d dlmZ d dlmZmZmZ d dlmZ G dd	„ d	eƒZG d
d„ deeƒZe ¡  e dkrÚe !¡  dS )é    )Úprint_functionÚabsolute_importÚdivisionN)ÚnjitÚset_num_threadsÚget_num_threadsÚprangeÚconfigÚthreading_layerÚguvectorize)Úget_thread_id)ÚTypingError)ÚTestCaseÚskip_parfors_unsupportedÚtag)ÚTestInSubprocessc                   @   s¾  e Zd ZdZdd„ Zdd„ Zedd„ ƒZee 	e
jdk d	¡d
d„ ƒƒZee 	e
jdk d	¡dd„ ƒƒZee 	e
jdk d	¡dd„ ƒƒZee 	e
jdk d	¡dd„ ƒƒZee 	e
jdk d	¡dd„ ƒƒZee 	e
jdk d	¡dd„ ƒƒZee 	e
jdk d	¡dd„ ƒƒZee 	e
jdk d	¡dd„ ƒƒZee 	e
jdk d	¡dd„ ƒƒZee 	e
jdk d	¡dd„ ƒƒZee 	e
jdk d	¡dd „ ƒƒZee 	e
jdk d	¡e 	ej d!¡ d"¡d#d$„ ƒƒƒZd%d&„ Zed'd(„ ƒZd)S )*ÚTestNumThreadsFc                 C   s   t tjƒ d S ©N©r   r	   ÚNUMBA_NUM_THREADS©Úself© r   úU/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/numba/tests/test_num_threads.pyÚsetUp   s    zTestNumThreads.setUpc                 C   sJ   t ƒ dkr |  t ||k¡¡ n&t ƒ dkr:tj ||¡ ndsFtdƒ‚d S )NZtbb)ZompÚ	workqueuer   Zunreachable)r
   Ú
assertTrueÚnpÚallÚtestingÚassert_equalÚAssertionError)r   ÚexpectedÚresultr   r   r   Ú
check_mask   s
    

zTestNumThreads.check_maskc              
   C   s^   t dd„ ƒ}d}|tf|jtffD ]6\}}|  |¡�}|ƒ  W 5 Q R X |  |t|jƒ¡ q"d S )Nc                   S   s   t dƒ d S )NZ
wrong_type)r   r   r   r   r   Úfoo)   s    z5TestNumThreads.test_set_num_threads_type.<locals>.fooz2The number of threads specified must be an integer)r   r   Úpy_funcÚ	TypeErrorÚassertRaisesÚassertInÚstrÚ	exception)r   r%   r"   ÚfnZerrtyZraisesr   r   r   Útest_set_num_threads_type&   s    
z(TestNumThreads.test_set_num_threads_typeé   zNot enough CPU coresc              	   C   s„   t j}|  tƒ |¡ tdƒ |  tƒ d¡ t|ƒ |  tƒ |¡ |  t¡� tdƒ W 5 Q R X |  t¡� t|d ƒ W 5 Q R X d S )Nr.   r   é   )r	   r   ÚassertEqualr   r   r(   Ú
ValueError)r   Úmax_threadsr   r   r   Ú_test_set_num_threads_basic3   s    z*TestNumThreads._test_set_num_threads_basicc                 C   s|   t j}tdd„ ƒ}|  |ƒ |¡ tdƒ |  |ƒ d¡ t|ƒ |  |ƒ |¡ tdd„ ƒ}|  |dƒd¡ |  ||ƒ|¡ d S )Nc                   S   s   t ƒ S r   ©r   r   r   r   r   Úget_nI   s    z=TestNumThreads._test_set_num_threads_basic_jit.<locals>.get_nr.   c                 S   s   t | ƒ tƒ S r   ©r   r   ©Únr   r   r   Ú	set_get_nS   s    zATestNumThreads._test_set_num_threads_basic_jit.<locals>.set_get_n)r	   r   r   r0   r   )r   r2   r5   r9   r   r   r   Ú_test_set_num_threads_basic_jitD   s    

z.TestNumThreads._test_set_num_threads_basic_jitc                 C   s  t j}tdgdddd�dd„ ƒ}tjdtjd	�}||ƒ tj ||¡ td
ƒ tjdtjd	�}||ƒ tj |d
¡ t|ƒ tjdtjd	�}||ƒ tj ||¡ tdgdddd�dd„ ƒ}tjdtjd	�}d
|d< ||ƒ tj |d
¡ tjdtjd	�}||d< ||ƒ tj ||¡ d S )Núvoid(int64[:])ú(n)TÚparallel©ZnopythonÚtargetc                 S   s   t ƒ | d d …< d S r   r4   ©Úxr   r   r   r5   `   s    zETestNumThreads._test_set_num_threads_basic_guvectorize.<locals>.get_n©é@KL ©Zdtyper.   c                 S   s   t | d ƒ tƒ | d d …< d S ©Nr   r6   r7   r   r   r   r9   s   s    zITestNumThreads._test_set_num_threads_basic_guvectorize.<locals>.set_get_nr   )	r	   r   r   r   ÚzerosÚint64r   r    r   )r   r2   r5   rA   r9   r   r   r   Ú'_test_set_num_threads_basic_guvectorize[   s@    ý
ý
z6TestNumThreads._test_set_num_threads_basic_guvectorizec                 C   sr   t dƒ tdd�dd„ ƒ}tdgdddd	�d
d„ ƒ}|ƒ }tj |d¡ tjdtjd�}||ƒ tj |d¡ d S )Nr.   T©r=   c                  S   s,   d} t  | f¡}t| ƒD ]}tƒ ||< q|S ©Né   )r   Úemptyr   r   ©rA   ÚbufÚir   r   r   Ú	test_func‹   s
    zCTestNumThreads._test_set_num_threads_outside_jit.<locals>.test_funcr;   r<   r=   r>   c                 S   s   t ƒ | d d …< d S r   r4   r@   r   r   r   Útest_gufunc“   s    zETestNumThreads._test_set_num_threads_outside_jit.<locals>.test_gufuncrB   rD   )r   r   r   r   r   r    rF   rG   )r   rP   rQ   ÚoutrA   r   r   r   Ú!_test_set_num_threads_outside_jit„   s    
ý
z0TestNumThreads._test_set_num_threads_outside_jitc                 C   s0   t dd�dd„ ƒ}d}||ƒ}tj ||¡ d S )NTrI   c                 S   s4   d}t  |f¡}t| ƒ t|ƒD ]}tƒ ||< q |S rJ   )r   rL   r   r   r   )ÚnthreadsrA   rN   rO   r   r   r   rP   ¥   s    zBTestNumThreads._test_set_num_threads_inside_jit.<locals>.test_funcr.   )r   r   r   r    )r   rP   ÚmaskrR   r   r   r   Ú _test_set_num_threads_inside_jit¡   s
    
z/TestNumThreads._test_set_num_threads_inside_jitc                 C   sP   t dgdddd�dd„ ƒ}tjdtjd	�}d
}||d< ||ƒ tj ||¡ d S )Nr;   r<   Tr=   r>   c                 S   s   t | d ƒ tƒ | d d …< d S rE   r6   r@   r   r   r   rP   ¶   s    zJTestNumThreads._test_set_num_threads_inside_guvectorize.<locals>.test_funcrB   rD   r.   r   )r   r   rF   rG   r   r    )r   rP   rA   rU   r   r   r   Ú(_test_set_num_threads_inside_guvectorize²   s    ý
z7TestNumThreads._test_set_num_threads_inside_guvectorizec                 C   s¾   t dtdtjd ƒƒD ]¢}t|ƒ tdd�dd„ ƒ}|ƒ }|  ||f|¡ tdgd	dd
d�dd„ ƒ}tj	ddtj
d� d¡}tjdtj
d�}|||ƒ |  ||¡ |  |tt |¡ƒ¡ qd S )Nr.   é   r/   TrI   c                  S   s<   d} t  | f¡}t| ƒD ]}tƒ ||< qtt  |¡ƒtƒ fS ©NrC   )r   rL   r   r   ÚlenÚuniquer   rM   r   r   r   rP   Í   s
    zITestNumThreads._test_get_num_threads_truth_outside_jit.<locals>.test_funcúvoid(int64[:], int64[:])ú(n), (m)r=   r>   c                 S   s   t ƒ | d d …< tƒ |d< d S rE   )r   r   ©rA   rR   r   r   r   rQ   Ø   s    zKTestNumThreads._test_get_num_threads_truth_outside_jit.<locals>.test_gufuncrB   éÿÿÿÿrD   ©éd   iPÃ  ©r/   )ÚrangeÚminr	   r   r   r   r$   r   r   ÚfullrG   ÚreshaperF   rZ   r[   )r   rU   rP   rR   rQ   rA   r   r   r   Ú'_test_get_num_threads_truth_outside_jitÄ   s"    
ý

z6TestNumThreads._test_get_num_threads_truth_outside_jitc                    s¾   t dtdtjd ƒƒD ]¢‰ tdd�‡ fdd„ƒ}|ƒ }|  ˆ ˆ f|¡ tdgd	dd
d�‡ fdd„ƒ}tjddtj	d� 
d¡}tjdtj	d�}|||ƒ |  ˆ |¡ |  ˆ tt |¡ƒ¡ qd S )Nr.   rX   r/   TrI   c                     sD   t ˆ ƒ d} t | f¡}t| ƒD ]}tƒ ||< q tt |¡ƒtƒ fS rY   )r   r   rL   r   r   rZ   r[   r   rM   ©rU   r   r   rP   ï   s    zHTestNumThreads._test_get_num_threads_truth_inside_jit.<locals>.test_funcr\   r]   r=   r>   c                    s$   t ˆ ƒ tƒ | d d …< tƒ |d< d S rE   )r   r   r   r^   rh   r   r   rQ   û   s    zJTestNumThreads._test_get_num_threads_truth_inside_jit.<locals>.test_gufuncrB   r_   rD   r`   rb   )rc   rd   r	   r   r   r$   r   r   re   rG   rf   rF   rZ   r[   )r   rP   rR   rQ   rA   r   rh   r   Ú&_test_get_num_threads_truth_inside_jitç   s     ý
z5TestNumThreads._test_get_num_threads_truth_inside_jitc                    s  t ƒ dkr|  d¡ tjd ‰tj‰dtj ‰ tdd�dd„ ƒ‰‡ ‡‡‡fd	d
„}dD ]Â}||ƒ}|ˆƒ\}}|ˆdd�\}}tj ||¡ tj ||¡ dt ˆ ¡ˆ  }|dkrÄ| 	ˆ df¡}	n
t 
|¡}	tj |	|¡ t ˆ ˆf¡}
tdˆƒD ]}||
|d d …f< qôtj |
|¡ qVd S )Nr   úworkqueue is not threadsafer/   r.   TrI   c                 S   s*   | j \}}t|ƒD ]}tƒ | ||f< qd S r   )Úshaper   r   ©rN   ÚfidÚMÚNrO   r   r   r   Ú
child_func  s    
z=TestNumThreads._test_nested_parallelism_1.<locals>.child_funcc                    s>   | dkrd‡ ‡‡‡fdd„	}n| dkr:d‡ ‡‡‡fdd„	}|S )	Nr   Fc                    s6   t dd�‡ ‡‡‡fdd„ƒ}|r*| | ¡S || ƒS d S )NTrI   c                    s`   d}t  ˆ ˆf¡}t| ƒ tˆ ƒD ]4}d|ˆ  }t|ƒ |ˆk rLˆ||ƒ |tƒ 7 }q"||fS ©Nr   r/   )r   rF   r   r   r   )rT   ÚaccrN   rO   Ú
local_mask©rn   ro   rp   rU   r   r   Ú
_test_func"  s    
úbTestNumThreads._test_nested_parallelism_1.<locals>.get_test.<locals>.test_func.<locals>._test_func)r   r&   )rT   r&   ru   rt   r   r   rP   !  s
    
zNTestNumThreads._test_nested_parallelism_1.<locals>.get_test.<locals>.test_funcr   c                    sž   ‡‡‡ fdd„}t jˆˆft jd�}t jˆdft jd�}dt  ˆ¡ˆ   ˆdf¡}dg}d}|sxt||ddd	�|ƒ}nt||dd
�|ƒ}||||ƒ ||fS )Nc                    sD   t ˆƒ t |d ƒ |d ˆ k r.ˆ||d ƒ | d  tƒ 7  < d S rE   r6   )rr   rN   rs   )ro   rp   rT   r   r   ru   6  s
    rv   rD   r/   z%void(int64[:], int64[:, :], int64[:])z(p), (n, m), (p)Tr=   r>   ©Zforceobj)r   rF   rG   Úarangerf   r   )rT   r&   ru   rN   rr   rs   ÚsigZlayoutrt   ©rT   r   rP   5  s&    ÿÿÿÿ)F)Fr   )Ú	test_typerP   rt   r   r   Úget_test  s
    z;TestNumThreads._test_nested_parallelism_1.<locals>.get_test©r   r   )r&   r   )r
   ÚskipTestr	   r   r   r   r   r    rx   rf   ÚsumrF   rc   )r   r|   r{   rP   Úgot_accZgot_arrZexp_accZexp_arrZmath_acc_expZmath_accÚmath_arrrO   r   rt   r   Ú_test_nested_parallelism_1  s.    




/
z)TestNumThreads._test_nested_parallelism_1c           	         sô   t ƒ dkr|  d¡ tjd ‰dtj d ‰ ‡ ‡‡fdd„}tjd ‰i }dD ]>}dD ]4}|d	krl|d	krlqVtˆƒ |||ƒˆƒ|||f< qVqN|d
 }| ¡ D ]}tj ||¡ qžt 	ˆ ˆf¡}t
dtjƒD ]}|||d d …f< qÌtj ||¡ d S )Nr   rj   r/   é   c                    sè   | dkrt dd�}n$| dkr(t dd�}n| dkr8dd„ }|d	d
„ ƒ‰ |dkrœ|dkr`t dd�‰n$|dkrtt dd�‰n|dkr„dd„ ‰ˆ‡‡‡ ‡fdd„ƒ}nH|dkr¸tdgdddd�‰n|dkrÐtdgddd�‰‡‡‡ ‡‡fdd„}|S )Nr=   TrI   r   FÚnonec                 S   s   | S r   r   r@   r   r   r   Ú	child_decx  s    zNTestNumThreads._test_nested_parallelism_2.<locals>.get_impl.<locals>.child_decc                 S   s2   | j \}}t|ƒ t|ƒD ]}tƒ | ||f< qd S r   )rk   r   r   r   rl   r   r   r   Úchild{  s    
zJTestNumThreads._test_nested_parallelism_2.<locals>.get_impl.<locals>.child©r=   r   r„   c                 S   s   | S r   r   r@   r   r   r   Útest_decˆ  s    zMTestNumThreads._test_nested_parallelism_2.<locals>.get_impl.<locals>.test_decc                    sV   t  ˆ ˆf¡}t| ƒ tˆ ƒD ]2}d|ˆ  }|tjk rˆ||ƒ tƒ |kst‚q|S )Nr/   )r   rF   r   r   r	   r   r   r!   )rT   rN   rO   rs   )rn   ro   r†   rU   r   r   rP   ‹  s    

zNTestNumThreads._test_nested_parallelism_2.<locals>.get_impl.<locals>.test_funcr   zint64[:,:], int64[:]z(n, m), (k)r>   úguvectorize-objrw   c                    sP   ˆ‡‡ fdd„ƒ}t jˆˆft jd�}dt  ˆ¡ˆ   ˆdf¡}|||ƒ |S )Nc                    s:   t ˆƒ |d tjk r6ˆ | |d ƒ tƒ |d ks6t‚d S rE   )r   r	   r   r   r!   )rN   rs   )r†   rT   r   r   ru   ¢  s    zbTestNumThreads._test_nested_parallelism_2.<locals>.get_impl.<locals>.test_func.<locals>._test_funcrD   r/   )r   rF   rG   rx   rf   )rT   ru   rN   rs   )rn   ro   r†   rU   rˆ   rz   r   rP   ¡  s    	
r}   )Ú
child_typer{   r…   rP   ©rn   ro   rU   )r†   rˆ   r   Úget_implq  s<    
 þ ÿz;TestNumThreads._test_nested_parallelism_2.<locals>.get_impl)r=   r   r„   r   r‰   r‡   r„   )r„   r„   )r
   r~   r	   r   r   Úvaluesr   r   r    rF   rc   )	r   rŒ   Z
res_arraysr{   rŠ   Zpy_arrZarrr�   rO   r   r‹   r   Ú_test_nested_parallelism_2f  s2    


B
 ÿÿz)TestNumThreads._test_nested_parallelism_2é   c                    s°   t ƒ dkr|  d¡ d‰ tdd�‡ fdd„ƒ‰tdd�‡fdd	„ƒ}d
}ˆ | }|d }||ƒ\}}|  ||¡ |  ||¡ ‡fdd„}||ƒ\}}|  ||¡ |  ||¡ d S )Nr   rj   i@B TrI   c                    sD   t  ˆ ¡}d}t| ƒ tˆ ƒD ]}|d7 }tƒ ||< q|t  |¡fS rq   )r   rF   r   r   r   r[   )Zlocal_ntÚtidrr   rO   )ÚBIGr   r   ÚworkÙ  s    
z7TestNumThreads._test_nested_parallelism_3.<locals>.workc                    sV   t | ƒ t | ¡}d}t| ƒD ](}ˆ | d ƒ\}}t|ƒ||< ||7 }q|t |¡fS rq   )r   r   rF   r   rZ   r[   )rT   ÚlensÚtotalrO   Úmy_accÚtids©r’   r   r   Útest_func_jitã  s    

z@TestNumThreads._test_nested_parallelism_3.<locals>.test_func_jitr.   r/   c                    sj   t dgdddd�‡ ‡fdd„ƒ}tjˆ dftjd	�}tjˆ tjd	� ˆ df¡}|||ƒ | ¡ t |¡fS )
Nzint64[:], int64[:]z(n), (n)Tr=   r>   c                    s0   ˆˆ d ƒ\}}t |ƒ|d< | d  |7  < d S )Nr/   r   )rZ   )r”   r“   r•   r–   )rT   r’   r   r   Útest_func_guvectorize÷  s    zbTestNumThreads._test_nested_parallelism_3.<locals>.test_guvectorize.<locals>.test_func_guvectorizer/   rD   )r   r   rF   rG   rf   r   r[   )rT   r™   r”   r“   r—   rz   r   Útest_guvectorizeö  s    ý
zCTestNumThreads._test_nested_parallelism_3.<locals>.test_guvectorize)r
   r~   r   r0   r$   )r   r˜   ZNTZexpected_accZexpected_thread_countr€   Zgot_tcrš   r   )r‘   r’   r   Ú_test_nested_parallelism_3Ï  s"    

	
z)TestNumThreads._test_nested_parallelism_3Úlinuxz
Linux onlyc                    sˆ   t  d¡}tdd„ ƒ‰ ‡ fdd„}d}|  ˆ ƒ tj¡ t|ƒ |  ˆ ƒ |¡ | ¡ }|j||fd�}| 	¡  | 
¡  |  | ¡ |¡ d S )NÚforkc                   S   s   t ƒ S r   r4   r   r   r   r   r%     s    z8TestNumThreads._test_threadmask_across_fork.<locals>.fooc                    s   |   ˆ ƒ ¡ d S r   )Úput)Úqueue©r%   r   r   Úwrap  s    z9TestNumThreads._test_threadmask_across_fork.<locals>.wrapr/   )r?   Úargs)ÚmultiprocessingZget_contextr   r0   r	   r   r   ÚQueueÚProcessÚstartÚjoinÚget)r   Zforkctxr¡   rU   Zshared_queueÚpr   r    r   Ú_test_threadmask_across_fork  s    

z+TestNumThreads._test_threadmask_across_forkc                 C   s   t tjƒ d S r   r   r   r   r   r   ÚtearDown$  s    zTestNumThreads.tearDownc           	      C   sŠ   t ƒ }d}tdd�dd„ ƒ}tdd�dd„ ƒ}|  |d	¡ ||ƒ\}}|  |d	¡ tj |d	¡ ||ƒ\}}|  |d	¡ tj |d	¡ d S )
Né   FrI   c                 S   s0   t ƒ }t | ¡}t| ƒD ]}t ƒ ||< q||fS r   )r   r   Úonesr   )ÚsizeÚnjit_par_false_tidÚresrO   r   r   r   Ú	par_false,  s
    
zBTestNumThreads._test_get_thread_id_not_parallel.<locals>.par_falseTc                 S   s0   t ƒ }t | ¡}t| ƒD ]}t ƒ ||< q||fS r   )r   r   r­   rc   )r®   Únjit_par_true_tidr°   rO   r   r   r   Úpar_true4  s
    
zATestNumThreads._test_get_thread_id_not_parallel.<locals>.par_truer   )r   r   r0   r   r   r    )	r   Zpython_get_thread_idZcheck_array_sizer±   r³   r¯   Znjit_par_false_arrr²   Znjit_par_true_arrr   r   r   Ú _test_get_thread_id_not_parallel'  s    

z/TestNumThreads._test_get_thread_id_not_parallelN)Ú__name__Ú
__module__Ú__qualname__Z_numba_parallel_test_r   r$   r   r-   ÚunittestZskipIfr	   r   r3   r:   rH   rS   rV   rW   rg   ri   r‚   rŽ   r›   ÚsysÚplatformÚ
startswithrª   r«   r´   r   r   r   r   r      sZ   

'!$Wg;r   c                   @   sB   e Zd ZeZdZdd„ dD ƒZdd„ Zedd„ ƒZ	ed	d
„ ƒZ
dS )ÚTestNumThreadsBackendsFc                 C   s   g | ]}|t jkr|‘qS r   )r	   r   )Ú.0rO   r   r   r   Ú
<listcomp>J  s     
 z!TestNumThreadsBackends.<listcomp>)r/   r.   rƒ   r¬   é   c                 C   s>   t j ¡ }t|ƒ|d< t|ƒ|d< tjddd|g}|  ||¡S )NZNUMBA_THREADING_LAYERr   z-mznumba.runtestsz-v)ÚosÚenvironÚcopyr*   r¹   Ú
executableZrun_cmd)r   Útestr
   Únum_threadsZenv_copyZcmdliner   r   r   Úrun_test_in_separate_processL  s
    
z3TestNumThreadsBackends.run_test_in_separate_processc           	         s^   | j }| jj}d|||f ‰‡ ‡‡fdd„}d|dd … ˆ ˆf }t| |tdƒ||ƒƒƒ d S )Nz%s.%s.%sc                    st   |   ˆˆ ˆ¡\}}| jr(td||f ƒ |  d|¡ |  d|k¡ |  d|k¡ t d|¡}|rp|  | d¡¡ d S )Nzstdout:
 "%s"
 stderr:
 "%s"ÚOKÚFAILÚERRORz\.\.\. skipped '(.*?)'r/   )	rÆ   Ú_DEBUGÚprintr)   r   ÚreÚsearchr~   Úgroup)r   ÚoÚeÚm©ÚbackendZinjected_methodrÅ   r   r   Útest_templateY  s    ÿz5TestNumThreadsBackends._inject.<locals>.test_templatez%s_%s_%s_threadsr/   Zlong_running)r¶   Ú_classrµ   Úsetattrr   )	ÚclsÚnamerÓ   Úbackend_guardrÅ   ZthemodZtheclsrÔ   Zinjected_testr   rÒ   r   Ú_injectS  s    ÿzTestNumThreadsBackends._injectc              	   C   sR   | j j ¡ D ]@}| j ¡ D ]0\}}| jD ] }| d¡s8q(|  ||||¡ q(qqd S )NZ_test_)rÕ   Ú__dict__rÂ   ÚbackendsÚitemsrÅ   r»   rÚ   )r×   rØ   rÓ   rÙ   rÅ   r   r   r   Úgeneratei  s    

zTestNumThreadsBackends.generateN)rµ   r¶   r·   r   rÕ   rÊ   rÅ   rÆ   ÚclassmethodrÚ   rÞ   r   r   r   r   r¼   E  s   
r¼   Ú__main__)"Ú
__future__r   r   r   r¹   rÀ   rÌ   r£   r¸   Únumpyr   Znumbar   r   r   r   r	   r
   r   Znumba.np.ufunc.parallelr   Znumba.core.errorsr   Znumba.tests.supportr   r   r   Z!numba.tests.test_parallel_backendr   r   r¼   rÞ   rµ   Úmainr   r   r   r   Ú<module>   s(   $    5.