o
    i[                     @   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roe!  dS 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      t tj d S Nr   r	   NUMBA_NUM_THREADSself r   Y/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/numba/tests/test_num_threads.pysetUp   s   zTestNumThreads.setUpc                 C   sF   t  dkr| t||k d S t  dv rtj|| d S J d)Ntbb)omp	workqueuer   unreachable)r
   
assertTruenpalltestingassert_equal)r   expectedresultr   r   r   
check_mask   s
   

zTestNumThreads.check_maskc              	   C   sr   t dd }d}|tf|jtffD ]%\}}| |}|  W d    n1 s(w   Y  | |t|j qd S )Nc                   S   s   t d d S )N
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%   fnerrty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 d    n1 s4w   Y  | t t|d  W d    d S 1 sPw   Y  d S )Nr4   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      t  S r   r   r   r   r   r   get_nI      z=TestNumThreads._test_set_num_threads_basic_jit.<locals>.get_nr4   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   r6   r   )r   r8   r<   rA   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nopythontargetc                 S      t  | d d < d S r   r;   xr   r   r   r<   `      zETestNumThreads._test_set_num_threads_basic_guvectorize.<locals>.get_n@KL dtyper4   c                 S      t | d  t | d d < d S Nr   r>   r?   r   r   r   rA   s      zITestNumThreads._test_set_num_threads_basic_guvectorize.<locals>.set_get_nr   )	r	   r   r   r!   zerosint64r#   r$   r   )r   r8   r<   rK   rA   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 )Nr4   TrE   c                  S   s,   d} t | f}t| D ]}t ||< q|S N   )r!   emptyr   r   rK   bufir   r   r   	test_func   s
   zCTestNumThreads._test_set_num_threads_outside_jit.<locals>.test_funcrC   rD   rE   rF   c                 S   rI   r   r;   rJ   r   r   r   test_gufunc   rL   zETestNumThreads._test_set_num_threads_outside_jit.<locals>.test_gufuncrM   rO   )r   r   r   r!   r#   r$   rT   rU   )r   r^   r_   outrK   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 )NTrW   c                 S   s4   d}t |f}t|  t|D ]}t ||< q|S rX   )r!   rZ   r   r   r   )nthreadsrK   r\   r]   r   r   r   r^      s   zBTestNumThreads._test_set_num_threads_inside_jit.<locals>.test_funcr4   )r   r!   r#   r$   )r   r^   maskr`   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 )NrC   rD   TrE   rF   c                 S   rQ   rR   r>   rJ   r   r   r   r^      rS   zJTestNumThreads._test_set_num_threads_inside_guvectorize.<locals>.test_funcrM   rO   r4   r   )r   r!   rT   rU   r#   r$   )r   r^   rK   rc   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 ]Q}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 )Nr4      r5   TrW   c                  S   s<   d} t | f}t| D ]}t ||< qtt |t fS NrN   )r!   rZ   r   r   lenuniquer   r[   r   r   r   r^      s
   zITestNumThreads._test_get_num_threads_truth_outside_jit.<locals>.test_funcvoid(int64[:], int64[:])(n), (m)rE   rF   c                 S   s   t  | d d < t |d< d S rR   )r   r   rK   r`   r   r   r   r_      s   zKTestNumThreads._test_get_num_threads_truth_outside_jit.<locals>.test_gufuncrM   rO   d   iP  r5   )rangeminr	   r   r   r   r'   r   r!   fullrU   reshaperT   rh   ri   )r   rc   r^   r`   r_   rK   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 ]Q 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 )Nr4   rf   r5   TrW   c                     sD   t   d} t| f}t| D ]}t ||< qtt|t fS rg   )r   r!   rZ   r   r   rh   ri   r   r[   rc   r   r   r^      s   zHTestNumThreads._test_get_num_threads_truth_inside_jit.<locals>.test_funcrj   rk   rE   rF   c                    s$   t   t | d d < t |d< d S rR   )r   r   r   rl   rv   r   r   r_      s   zJTestNumThreads._test_get_num_threads_truth_inside_jit.<locals>.test_gufuncrM   rm   rO   rn   rp   )rq   rr   r	   r   r   r'   r   r!   rs   rU   rt   rT   rh   ri   )r   r^   r`   r_   rK   r   rv   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 ]a}||}|\}}|dd\}}tj|| tj|| dt   }|dkrb|	 df}	nt
|}	tj|	| t f}
tdD ]
}||
|d d f< qztj|
| q+d S )Nr   workqueue is not threadsafer5   r4   TrW   c                 S   s*   | j \}}t|D ]	}t | ||f< q	d S r   )shaper   r   r\   fidMNr]   r   r   r   
child_func  s   
z=TestNumThreads._test_nested_parallelism_1.<locals>.child_funcc                    s@   | dkrd fdd	}|S | dkrd fdd	}|S )Nr   Fc                    s2   t dd fdd}|r|| S || S )NTrW   c                    s`   d}t  f}t|  t D ]}d|  }t| |k r&|| |t 7 }q||fS Nr   r5   )r!   rT   r   r   r   )rb   accr\   r]   
local_maskr|   r}   r~   rc   r   r   
_test_func"  s   
bTestNumThreads._test_nested_parallelism_1.<locals>.get_test.<locals>.test_func.<locals>._test_func)r   r*   )rb   r*   r   r   r   r   r^   !  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}|s<t||ddd	|}n	t||dd
|}|||| ||fS )Nc                    sD   t  t |d  |d  k r||d  | d  t 7  < d S rR   r>   )r   r\   r   )r}   r~   rb   r   r   r   6  s
   r   rO   r5   z%void(int64[:], int64[:, :], int64[:])z(p), (n, m), (p)TrE   rF   forceobj)r!   rT   rU   arangert   r   )rb   r*   r   r\   r   r   siglayoutr   rb   r   r^   5  s&   )Fr   )	test_typer^   r   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$   r   rt   sumrT   rq   )r   r   r   r^   got_accgot_arrexp_accexp_arrmath_acc_expmath_accmath_arrr]   r   r   r   _test_nested_parallelism_1  s0   




/
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 ]}|d	kr6|d	kr6q+t ||||||f< q+q'|d
 }| D ]	}tj|| qOt	 f}t
dtjD ]
}|||d d f< qftj|| d S )Nr   rx   r5      c                    s   | dkr
t dd}n| dkrt dd}n| dkrdd }|d	d
  |dv rO|dkr0t ddn|dkr:t ddn|dkrBdd  fdd}|S |dkr]tdgddddn|dkritdgddd fdd}|S )NrE   TrW   r   Fnonec                 S      | S r   r   rJ   r   r   r   	child_decx     zNTestNumThreads._test_nested_parallelism_2.<locals>.get_impl.<locals>.child_decc                 S   s2   | j \}}t| t|D ]	}t | ||f< qd S r   )ry   r   r   r   rz   r   r   r   child{  s
   
zJTestNumThreads._test_nested_parallelism_2.<locals>.get_impl.<locals>.childrE   r   r   c                 S   r   r   r   rJ   r   r   r   test_dec  r   zMTestNumThreads._test_nested_parallelism_2.<locals>.get_impl.<locals>.test_decc                    sV   t  f}t|  t D ]}d|  }|tjk r(|| t |ks(J q|S )Nr5   )r!   rT   r   r   r	   r   r   )rb   r\   r]   r   )r|   r}   r   rc   r   r   r^     s   

zNTestNumThreads._test_nested_parallelism_2.<locals>.get_impl.<locals>.test_funcr   zint64[:,:], int64[:]z(n, m), (k)rF   guvectorize-objr   c                    sP    fdd}t jft jd}dt   df}||| |S )Nc                    s>   t  |d tjk r | |d  t |d ksJ d S d S rR   )r   r	   r   r   )r\   r   )r   rb   r   r   r     s   zbTestNumThreads._test_nested_parallelism_2.<locals>.get_impl.<locals>.test_func.<locals>._test_funcrO   r5   )r!   rT   rU   r   rt   )rb   r   r\   r   )r|   r}   r   rc   r   r   r   r^     s   	
r   )
child_typer   r   r^   r|   r}   rc   )r   r   r   get_implq  s:   
%z;TestNumThreads._test_nested_parallelism_2.<locals>.get_impl)rE   r   r   r   r   r   r   )r   r   )r
   r   r	   r   r   valuesr!   r#   r$   rT   rq   )	r   r   
res_arraysr   r   py_arrarrr   r]   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   rx   i@B TrW   c                    sD   t  }d}t|  t D ]}|d7 }t ||< q|t |fS r   )r!   rT   r   r   r   ri   )local_nttidr   r]   )BIGr   r   work  s   
z7TestNumThreads._test_nested_parallelism_3.<locals>.workc                    sV   t |  t| }d}t| D ]} | d \}}t|||< ||7 }q|t|fS r   )r   r!   rT   r   rh   ri   )rb   lenstotalr]   my_acctidsr   r   r   test_func_jit  s   

z@TestNumThreads._test_nested_parallelism_3.<locals>.test_func_jitr4   r5   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)TrE   rF   c                    s0    d \}}t ||d< | d  |7  < d S )Nr5   r   )rh   )r   r   r   r   )rb   r   r   r   test_func_guvectorize  s   zbTestNumThreads._test_nested_parallelism_3.<locals>.test_guvectorize.<locals>.test_func_guvectorizer5   rO   )r   r!   rT   rU   rt   r   ri   )rb   r   r   r   r   r   r   test_guvectorize  s   
zCTestNumThreads._test_nested_parallelism_3.<locals>.test_guvectorize)r
   r   r   r6   r'   )r   r   NTexpected_accexpected_thread_countr   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   r:   r   r;   r   r   r   r   r)     r=   z8TestNumThreads._test_threadmask_across_fork.<locals>.fooc                    s   |     d S r   )put)queuer)   r   r   wrap  s   z9TestNumThreads._test_threadmask_across_fork.<locals>.wrapr5   )rH   args)multiprocessingget_contextr   r6   r	   r   r   QueueProcessstartjoinget)r   forkctxr   rc   shared_queuepr   r   r   _test_threadmask_across_fork  s   

z+TestNumThreads._test_threadmask_across_forkc                 C   r   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   FrW   c                 S   0   t  }t| }t| D ]}t  ||< q||fS r   )r   r!   onesr   )sizenjit_par_false_tidresr]   r   r   r   	par_false,  
   
zBTestNumThreads._test_get_thread_id_not_parallel.<locals>.par_falseTc                 S   r   r   )r   r!   r   rq   )r   njit_par_true_tidr   r]   r   r   r   par_true4  r   zATestNumThreads._test_get_thread_id_not_parallel.<locals>.par_truer   )r   r   r6   r!   r#   r$   )	r   python_get_thread_idcheck_array_sizer   r   r   njit_par_false_arrr   njit_par_true_arrr   r   r    _test_get_thread_id_not_parallel'  s   

z/TestNumThreads._test_get_thread_id_not_parallelN)__name__
__module____qualname___numba_parallel_test_r   r'   r   r3   unittestskipIfr	   r   r9   rB   rV   ra   rd   re   ru   rw   r   r   r   sysplatform
startswithr   r   r   r   r   r   r   r      s\    

'!$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   ).0r]   r   r   r   
<listcomp>J  s    z!TestNumThreadsBackends.<listcomp>)r5   r4   r   r      c                 C   s>   t j }t||d< t||d< tjddd|g}| ||S )NNUMBA_THREADING_LAYERr   z-mznumba.runtestsz-v)osenvironcopyr.   r   
executablerun_cmd)r   testr
   num_threadsenv_copy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                    sx   |   \}}| jrtd||f  td|}|d ur&| |d | d| | d|v | d|v d S )Nzstdout:
 "%s"
 stderr:
 "%s"z\.\.\. skipped '(.*?)'r5   OKFAILERROR)	r   _DEBUGprintresearchr   groupr-   r    )r   oembackendinjected_methodr   r   r   test_templateY  s   z5TestNumThreadsBackends._inject.<locals>.test_templatez%s_%s_%s_threadsr5   long_running)r   _classr   setattrr   )	clsnamer  backend_guardr   themodtheclsr  injected_testr   r   r   _injectS  s   zTestNumThreadsBackends._injectc              	   C   sR   | j j D ] }| j D ]\}}| jD ]}|dsq| |||| qqqd S )N_test_)r  __dict__r   backendsitemsr   r   r  )r  r  r  r	  r   r   r   r   generatek  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!   numbar   r   r   r   r	   r
   r   numba.np.ufunc.parallelr   numba.core.errorsr   numba.tests.supportr   r   r   !numba.tests.test_parallel_backendr   r   r   r  r   mainr   r   r   r   <module>   s,   $    50