U
    -e:                     @   s   d dl Zd dlmZ d dl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 d dlZd dlZd dlmZ d dlmZ efd	d
ZedG dd deZedG dd deZedkre  dS )    N)
namedtuple)voidint32float32float64)guvectorize)cuda)skip_on_cudasimCUDATestCase)NumbaPerformanceWarning)override_configc                 C   sT   t t| d d d d f | d d d d f | d d d d f gddddd }|S )Nz(m,n),(n,p)->(m,p)r   targetc           	   
   S   sv   | j \}}|j \}}t|D ]T}t|D ]F}d|||f< t|D ],}|||f  | ||f |||f  7  < q@q(qd S Nr   shaperange)	ABCmnpijk r   d/var/www/html/Darija-Ai-Train/env/lib/python3.8/site-packages/numba/cuda/tests/cudapy/test_gufunc.py
matmulcore   s    

z*_get_matmulcore_gufunc.<locals>.matmulcore)r   r   )dtyper   r   r   r   _get_matmulcore_gufunc   s    >
	r    z&ufunc API unsupported in the simulatorc                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-S ).TestCUDAGufuncc                 C   sz   t  }d}tj|d d tjd|dd}tj|d d tjd|dd}|||}t||}| t|| d S N      r      r    nparanger   reshapematmul
assertTrueallcloseselfgufunc	matrix_ctr   r   r   Goldr   r   r   test_gufunc_small!   s    
z TestCUDAGufunc.test_gufunc_smallc                 C   s   t  }d}tj|d d tjd|dd}tj|d d tjd|dd}t|}||| }t||}| 	t
|| d S r"   )r    r(   r)   r   r*   r   	to_devicecopy_to_hostr+   r,   r-   )r/   r0   r1   r   r   dBr   r2   r   r   r   test_gufunc_auto_transfer/   s    
z(TestCUDAGufunc.test_gufunc_auto_transferc                 C   sz   t  }d}tj|d d tjd|dd}tj|d d tjd|dd}|||}t||}| t|| d S )N  r#   r$   r%   r&   r'   r.   r   r   r   test_gufunc?   s    
zTestCUDAGufunc.test_gufuncc                 C   s~   t  }d}tj|d d tjddddd}tj|d d tjddddd}|||}t||}| t|| d S )Nd   r#   r$   r%      r&   r'   r.   r   r   r   test_gufunc_hidimM   s    $$
z TestCUDAGufunc.test_gufunc_hidimc                 C   sp   t td}tjddd}tjdd}t||}|||}tj|| ||t|d}tj|| d S )Nr%   
      )r=      r?   )	r    r   r(   randomZrandnr+   testingassert_allcloseZtile)r/   r0   XYZgoldZres1Zres2r   r   r   test_gufunc_new_axisY   s    

z#TestCUDAGufunc.test_gufunc_new_axisc                 C   s   t  }d}tj|d d tjd|dd}tj|d d tjd|dd}t }t||}t||}tjd|j	|d}|||||d}|j
|d	}	|  t||}
| t|	|
 d S )
Nr8   r#   r$   r%   r&   )r8   r#   r&   )r   r   stream)outrF   )rF   )r    r(   r)   r   r*   r   rF   r4   Zdevice_arrayr   r5   Zsynchronizer+   r,   r-   )r/   r0   r1   r   r   rF   ZdAr6   ZdCr   r2   r   r   r   test_gufunc_streamh   s"    z!TestCUDAGufunc.test_gufunc_streamc                 C   sj   t ttd d  td d  gddddd }tjdtjdd }t|}|||d	 tj|| d S )
N(x)->(x)r   r   c                 S   s    t |jD ]}| | ||< q
d S Nr   sizer   r   r   r   r   r   copy   s    z&TestCUDAGufunc.test_copy.<locals>.copyr=   r%   r?   rG   r   r   r   r(   r)   
zeros_likerA   rB   r/   rN   r   r   r   r   r   	test_copy   s    

zTestCUDAGufunc.test_copyc                 C   sl   t td d  td d  fgddddd }tjdtjdd }t|}|||d	 | t|| d S )
NrI   r   r   c                 S   s    t |jD ]}| | ||< q
d S rJ   rK   rM   r   r   r   rN      s    z9TestCUDAGufunc.test_copy_unspecified_return.<locals>.copyr=   r%   r?   rO   )r   r   r(   r)   rQ   r,   r-   rR   r   r   r   test_copy_unspecified_return   s    

z+TestCUDAGufunc.test_copy_unspecified_returnc                 C   sn   t ttd d  td d  gddddd }tjdtjdd }t|}|||d	 | t|| d S )
NrI   r   r   c                 S   s    t |jD ]}| | ||< q
d S rJ   rK   rM   r   r   r   rN      s    z*TestCUDAGufunc.test_copy_odd.<locals>.copy   r%   r?   rO   )r   r   r   r(   r)   rQ   r,   r-   rR   r   r   r   test_copy_odd   s    

zTestCUDAGufunc.test_copy_oddc                 C   s   t ttd d d d f td d d d f gddddd }tjdtjddd	d
 }t|}|||d | t|| d S )Nz(x, y)->(x, y)r   r   c                 S   s@   t |jd D ],}t |jd D ]}| ||f |||f< q qd S )Nr   r?   )r   r   )r   r   xyr   r   r   copy2d   s    z*TestCUDAGufunc.test_copy2d.<locals>.copy2d   r%   r&      r?   rO   )	r   r   r   r(   r)   r*   rQ   r,   r-   )r/   rY   r   r   r   r   r   test_copy2d   s    ,

zTestCUDAGufunc.test_copy2dc              
   C   s   t dgddddd }tjdd}tjdd}t|jd	 d}td
dh tj	ddP}|||| | 
|d	 jt | dt|d	 j | dt|d	 j W 5 Q R X W 5 Q R X d S )N(void(float32[:], float32[:], float32[:])(n),(n)->(n)r   r   c                 S   s0   | j d }t|D ]}| | ||  ||< qd S r   r   abdistlenr   r   r   r   numba_dist_cuda   s    
zMTestCUDAGufunc.test_inefficient_launch_configuration.<locals>.numba_dist_cudai   r   r   CUDA_LOW_OCCUPANCY_WARNINGSr?   Trecordz	Grid sizezlow occupancy)r   r(   r@   randastypezerosr   r   warningscatch_warningsassertEqualcategoryr   assertInstrmessage)r/   rd   r`   ra   rb   wr   r   r   %test_inefficient_launch_configuration   s     
z4TestCUDAGufunc.test_inefficient_launch_configurationc              
   C   s   t dgdddddd }tjdd	d
}tjdd	d
}t|}tdd: tj	dd"}|||| | 
t|d W 5 Q R X W 5 Q R X d S )Nr]   r^   Tr   )nopythonr   c                 S   s0   | j d }t|D ]}| | ||  ||< qd S r   r   r_   r   r   r   numba_dist_cuda2   s    
zLTestCUDAGufunc.test_efficient_launch_configuration.<locals>.numba_dist_cuda2i   r   )i   r#   re   r?   rf   r   )r   r(   r@   rh   ri   r*   rQ   r   rk   rl   rm   rc   )r/   ru   r`   ra   rb   rr   r   r   r   #test_efficient_launch_configuration   s"      

z2TestCUDAGufunc.test_efficient_launch_configurationc              	   C   s   dd }t ttd d  td d  gdddd| | t2}t ttd d  td d  gdddd| W 5 Q R X | dt|j d S )	Nc                 S   s   d S rJ   r   r   r   r   r   r   foo   s    z.TestCUDAGufunc.test_nopython_flag.<locals>.foorI   r   T)r   rt   Fznopython flag must be True)r   r   r   assertRaises	TypeErrorrm   rp   	exception)r/   rx   raisesr   r   r   test_nopython_flag   s      z!TestCUDAGufunc.test_nopython_flagc              	   C   s   dd }|  t4}tttd d  td d  gddddd| W 5 Q R X d}t|j}| |d t| | |t|d  	 
d	}d
d |D }| tddgt| d S )Nc                 S   s   d S rJ   r   rw   r   r   r   rx      s    z.TestCUDAGufunc.test_invalid_flags.<locals>.foorI   r   TF)r   what1ever2z/The following target options are not supported:,c                 S   s   g | ]}| d qS )z'" )strip).0r   r   r   r   
<listcomp>   s     z5TestCUDAGufunc.test_invalid_flags.<locals>.<listcomp>r~   r   )ry   rz   r   r   r   rp   r{   rm   rc   r   splitset)r/   rx   r|   headmsgitemsr   r   r   test_invalid_flags   s      
z!TestCUDAGufunc.test_invalid_flagsc              	   C   s   t ttd d  td d  gddddd }tjdtjd }}| t}||||d W 5 Q R X d	}| t|j	| d S )
NrI   r   r   c                 S   s   d S rJ   r   )inprG   r   r   r   rx     s    z2TestCUDAGufunc.test_duplicated_output.<locals>.foor=   r%   rO   z<cannot specify argument 'out' as both positional and keyword)
r   r   r   r(   rj   ry   
ValueErrorrm   rp   r{   )r/   rx   r   rG   r|   r   r   r   r   test_duplicated_output   s    $
z%TestCUDAGufunc.test_duplicated_outputc                 C   sp   t td d  td d  td d  fgddddd }|||}tjt|t| dd}tj|| d S )Nz(n),(n)->()r   r   c                 S   s6   d}t t| D ]}|| | ||  7 }q||d< d S r   )r   rc   )rW   rX   rsr   r   r   r   	gu_reduce  s    z1TestCUDAGufunc.check_tuple_arg.<locals>.gu_reducer?   )Zaxis)r   r   r(   sumasarrayrA   Zassert_equal)r/   r`   ra   r   r   expectedr   r   r   check_tuple_arg  s    &

zTestCUDAGufunc.check_tuple_argc                 C   s   d}d}|  || d S )N)      ?       @      @      @      @      @)      ?      @      @      @      @      @)r   r/   r`   ra   r   r   r   test_tuple_of_tuple_arg  s    z&TestCUDAGufunc.test_tuple_of_tuple_argc                 C   sR   t dd}|dddd|ddddf}|d	d
dd|ddddf}| || d S )NPointrW   rX   zr   r   r   r   r   r   r   r   r   r   r   r   )r   r   )r/   r   r`   ra   r   r   r   test_tuple_of_namedtuple_arg   s    
z+TestCUDAGufunc.test_tuple_of_namedtuple_argc                 C   s8   t dt df}t dt df}| || d S )Nr   r   r   r   )r(   r   r   r   r   r   r   test_tuple_of_array_arg(  s    z&TestCUDAGufunc.test_tuple_of_array_argc                 C   s   t  }| |jd d S )Nr   )r    rm   __name__)r/   r0   r   r   r   test_gufunc_name/  s    zTestCUDAGufunc.test_gufunc_namec              	   C   sj   |  t4}tttd d  td d  gddddd }W 5 Q R X t|j}| d| | d| d S )Nz(m)->(m)r   r   c                 S   s   d S rJ   r   )rW   rX   r   r   r   f5  s    z.TestCUDAGufunc.test_bad_return_type.<locals>.fz+guvectorized functions cannot return valueszspecifies int32 return type)ry   rz   r   r   rp   r{   ro   )r/   ter   r   r   r   r   test_bad_return_type3  s    $
z#TestCUDAGufunc.test_bad_return_typec              	   C   s   t td d  td d  td d  fgddddd }td}| t}|| W 5 Q R X t|j}| d| | d| | d	| | t}||||| W 5 Q R X t|j}| d| | d| | d
| d S )Nz(m),(m)->(m)r   r   c                 S   s   d S rJ   r   r   r   r   r   r   >  s    z;TestCUDAGufunc.test_incorrect_number_of_pos_args.<locals>.fr&   %gufunc accepts 2 positional argumentszor 3 positional argumentsGot 1 positional argument.zGot 4 positional arguments.	r   r   r(   r)   ry   rz   rp   r{   ro   r/   r   Zarrr   r   r   r   r   !test_incorrect_number_of_pos_args=  s$    $ 



z0TestCUDAGufunc.test_incorrect_number_of_pos_argsN)r   
__module____qualname__r3   r7   r9   r<   rE   rH   rS   rT   rV   r\   rs   rv   r}   r   r   r   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 )TestMultipleOutputsc                 C   s   t ttd d  td d  td d  gddddd }tjdtjdd }t|}t|}|||| tj|| tj|| d S )	N(x)->(x),(x)r   r   c                 S   s,   t |jD ]}| | ||< | | ||< q
d S rJ   rK   r   r   r   r   r   r   r   rN   [  s    zKTestMultipleOutputs.test_multiple_outputs_same_type_passed_in.<locals>.copyr=   r%   r?   rP   )r/   rN   r   r   r   r   r   r   )test_multiple_outputs_same_type_passed_inZ  s    &


z=TestMultipleOutputs.test_multiple_outputs_same_type_passed_inc                 C   s   t ttd d  td d  td d  gddddd }tjdtjdd }t|}t|}|||| tj|| tj|d	 | d S )
Nr   r   r   c                 S   s0   t |jD ] }| | ||< | | d ||< q
d S Nr#   rK   r   r   r   r   copy_and_doublel  s    zRTestMultipleOutputs.test_multiple_outputs_distinct_values.<locals>.copy_and_doubler=   r%   r?   r#   rP   r/   r   r   r   r   r   r   r   %test_multiple_outputs_distinct_valuesj  s    &


z9TestMultipleOutputs.test_multiple_outputs_distinct_valuesc                 C   s|   t ttd d  td d  td d  gddddd }tjdtjdd }||\}}tj|| tj|d	 | d S )
Nr   r   r   c                 S   s0   t |jD ] }| | ||< | | d ||< q
d S r   rK   r   r   r   r   r   |  s    zLTestMultipleOutputs.test_multiple_output_allocation.<locals>.copy_and_doubler=   r%   r?   r#   )r   r   r   r(   r)   rA   rB   r   r   r   r   test_multiple_output_allocation{  s    &
z3TestMultipleOutputs.test_multiple_output_allocationc                 C   s   t ttd d  td d  td d  gddddd }tjdtjdd }t|}tj|tjd}|||| tj|| tj|td	 | d S )
Nr   r   r   c                 S   s0   t |jD ] }| | ||< | | d ||< q
d S )Nr   rK   r   r   r   r   copy_and_multiply  s    zJTestMultipleOutputs.test_multiple_output_dtypes.<locals>.copy_and_multiplyr=   r%   r?   r   )	r   r   r   r   r(   r)   rQ   rA   rB   )r/   r   r   r   r   r   r   r   test_multiple_output_dtypes  s    &

z/TestMultipleOutputs.test_multiple_output_dtypesc              	   C   s   t td d  td d  td d  td d  fgddddd }td}| t}|| W 5 Q R X t|j}| d| | d| | d	| | t}|||||| W 5 Q R X t|j}| d| | d| | d
| d S )Nz(m),(m)->(m),(m)r   r   c                 S   s   d S rJ   r   )rW   rX   r   rr   r   r   r   r     s    z@TestMultipleOutputs.test_incorrect_number_of_pos_args.<locals>.fr&   r   zor 4 positional argumentsr   zGot 5 positional arguments.r   r   r   r   r   r     s$    . 



z5TestMultipleOutputs.test_incorrect_number_of_pos_argsN)r   r   r   r   r   r   r   r   r   r   r   r   r   X  s
   r   __main__)numpyr(   collectionsr   Znumbar   r   r   r   r   r   Znumba.cuda.testingr	   r
   Zunittestrk   Znumba.core.errorsr   Znumba.tests.supportr   r    r!   r   r   mainr   r   r   r   <module>   s$     ;\