o
    ib[                     @   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   k/var/www/html/eduruby.in/lip-sync/lip-sync-env/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)NZtbb)Zomp	workqueuer   Z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 )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 d    n1 s4w   Y  | t t|d  W d    d S 1 sPw   Y  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      t  S r   r   r   r   r   r   get_nI      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   r6   r;   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      t  | d d < d S r   r5   xr   r   r   r6   `      zETestNumThreads._test_set_num_threads_basic_guvectorize.<locals>.get_n@KL Zdtyper.   c                 S      t | d  t | d d < d S Nr   r8   r9   r   r   r   r;   s      zITestNumThreads._test_set_num_threads_basic_guvectorize.<locals>.set_get_nr   )	r	   r   r   r   zerosint64r    r!   r   )r   r2   r6   rD   r;   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   rD   bufir   r   r   	test_func   s
   zCTestNumThreads._test_set_num_threads_outside_jit.<locals>.test_funcr=   r>   r?   r@   c                 S   rB   r   r5   rC   r   r   r   test_gufunc   rE   zETestNumThreads._test_set_num_threads_outside_jit.<locals>.test_gufuncrF   rH   )r   r   r   r   r    r!   rL   rM   )r   rV   rW   outrD   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 )NTrO   c                 S   s4   d}t |f}t|  t|D ]}t ||< q|S rP   )r   rR   r   r   r   )nthreadsrD   rT   rU   r   r   r   rV      s   zBTestNumThreads._test_set_num_threads_inside_jit.<locals>.test_funcr.   )r   r   r    r!   )r   rV   maskrX   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   rI   rJ   r8   rC   r   r   r   rV      rK   zJTestNumThreads._test_set_num_threads_inside_guvectorize.<locals>.test_funcrF   rH   r.   r   )r   r   rL   rM   r    r!   )r   rV   rD   r[   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 )Nr.      r/   TrO   c                  S   s<   d} t | f}t| D ]}t ||< qtt |t fS NrG   )r   rR   r   r   lenuniquer   rS   r   r   r   rV      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 rJ   )r   r   rD   rX   r   r   r   rW      s   zKTestNumThreads._test_get_num_threads_truth_outside_jit.<locals>.test_gufuncrF   rH   d   iP  r/   )rangeminr	   r   r   r   r$   r   r   fullrM   reshaperL   r`   ra   )r   r[   rV   rX   rW   rD   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 )Nr.   r^   r/   TrO   c                     sD   t   d} t| f}t| D ]}t ||< qtt|t fS r_   )r   r   rR   r   r   r`   ra   r   rS   r[   r   r   rV      s   zHTestNumThreads._test_get_num_threads_truth_inside_jit.<locals>.test_funcrb   rc   r?   r@   c                    s$   t   t | d d < t |d< d S rJ   )r   r   r   rd   rn   r   r   rW      s   zJTestNumThreads._test_get_num_threads_truth_inside_jit.<locals>.test_gufuncrF   re   rH   rf   rh   )ri   rj   r	   r   r   r$   r   r   rk   rM   rl   rL   r`   ra   )r   rV   rX   rW   rD   r   rn   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 threadsafer/   r.   TrO   c                 S   s*   | j \}}t|D ]	}t | ||f< q	d S r   )shaper   r   rT   ZfidMNrU   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 )NTrO   c                    s`   d}t  f}t|  t D ]}d|  }t| |k r&|| |t 7 }q||fS Nr   r/   )r   rL   r   r   r   )rZ   accrT   rU   
local_maskrs   rt   ru   r[   r   r   
_test_func"  s   
bTestNumThreads._test_nested_parallelism_1.<locals>.get_test.<locals>.test_func.<locals>._test_func)r   r&   )rZ   r&   rz   ry   r   r   rV   !  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 rJ   r8   )rw   rT   rx   )rt   ru   rZ   r   r   rz   6  s
   r{   rH   r/   z%void(int64[:], int64[:, :], int64[:])z(p), (n, m), (p)Tr?   r@   Zforceobj)r   rL   rM   arangerl   r   )rZ   r&   rz   rT   rw   rx   sigZlayoutry   rZ   r   rV   5  s&   )Fr   )	test_typerV   ry   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}   rl   sumrL   ri   )r   r   r   rV   got_accZgot_arrZexp_accZexp_arrZmath_acc_expZmath_accmath_arrrU   r   ry   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   rp   r/      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 )Nr?   TrO   r   Fnonec                 S      | S r   r   rC   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   )rq   r   r   r   rr   r   r   r   child{  s
   
zJTestNumThreads._test_nested_parallelism_2.<locals>.get_impl.<locals>.childr?   r   r   c                 S   r   r   r   rC   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 )Nr/   )r   rL   r   r   r	   r   r   )rZ   rT   rU   rx   )rs   rt   r   r[   r   r   rV     s   

zNTestNumThreads._test_nested_parallelism_2.<locals>.get_impl.<locals>.test_funcr   zint64[:,:], int64[:]z(n, m), (k)r@   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 rJ   )r   r	   r   r   )rT   rx   )r   rZ   r   r   rz     s   zbTestNumThreads._test_nested_parallelism_2.<locals>.get_impl.<locals>.test_func.<locals>._test_funcrH   r/   )r   rL   rM   r}   rl   )rZ   rz   rT   rx   )rs   rt   r   r[   r   r   r   rV     s   	
r   )
child_typer   r   rV   rs   rt   r[   )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!   rL   ri   )	r   r   Z
res_arraysr   r   Zpy_arrZarrr   rU   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   rp   i@B TrO   c                    sD   t  }d}t|  t D ]}|d7 }t ||< q|t |fS rv   )r   rL   r   r   r   ra   )Zlocal_nttidrw   rU   )BIGr   r   work  s   
z7TestNumThreads._test_nested_parallelism_3.<locals>.workc                    sV   t |  t| }d}t| D ]} | d \}}t|||< ||7 }q|t|fS rv   )r   r   rL   r   r`   ra   )rZ   lenstotalrU   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   )r`   )r   r   r   r   )rZ   r   r   r   test_func_guvectorize  s   zbTestNumThreads._test_nested_parallelism_3.<locals>.test_guvectorize.<locals>.test_func_guvectorizer/   rH   )r   r   rL   rM   rl   r   ra   )rZ   r   r   r   r   r   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   r4   r   r5   r   r   r   r   r%     r7   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/   )rA   args)multiprocessingZget_contextr   r0   r	   r   r   QueueProcessstartjoinget)r   Zforkctxr   r[   Z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   FrO   c                 S   0   t  }t| }t| D ]}t  ||< q||fS r   )r   r   onesr   )sizenjit_par_false_tidresrU   r   r   r   	par_false,  
   
zBTestNumThreads._test_get_thread_id_not_parallel.<locals>.par_falseTc                 S   r   r   )r   r   r   ri   )r   njit_par_true_tidr   rU   r   r   r   par_true4  r   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<   rN   rY   r\   r]   rm   ro   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   ).0rU   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                    sx   |   \}}| jrtd||f  | d| | d|v | d|v td|}|r:| |d d S 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 ]\}}| jD ]}|dsq| |||| 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.