U
    hâËd‘  ã                   @   sÜ   d dl Zd dlmZ d dlmZmZmZ d dlm	Z	 d dl
mZmZ d dlmZmZ dd„ Zd	d
„ Zdd„ ZedƒG dd„ deƒƒZdZdd„ ZedƒG dd„ dejƒƒZeD ]Zeede eeƒƒ q®edkrØe ¡  dS )é    N)Útypes)Úskip_on_cudasimÚunittestÚCUDATestCase)Úcuda)Ú	libdeviceÚcompile_ptx)Ú	functionsÚcreate_signaturec                 C   s<   t  d¡}|t|ƒk r8t || ¡\}}|| |< |||< d S ©Né   )r   ÚgridÚlenr   Zsincos)ÚsÚcÚxÚiÚsrÚcr© r   ú_/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/numba/cuda/tests/cudapy/test_libdevice.pyÚ
use_sincos	   s
    
r   c                 C   s<   t  d¡}|t|ƒk r8t || ¡\}}|| |< |||< d S r   )r   r   r   r   Úfrexp)ÚfracÚexpr   r   ZfracrÚexprr   r   r   Ú	use_frexp   s
    
r   c                 C   s8   t  d¡}|t|ƒk r4t || || || ¡| |< d S r   )r   r   r   r   Zsad)Úrr   ÚyÚzr   r   r   r   Úuse_sad   s    
r    z0Libdevice functions are not supported on cudasimc                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚTestLibdevicea(  
    Some tests of libdevice function wrappers that check the returned values.

    These are mainly to check that the generation of the implementations
    results in correct typing and lowering for each type of function return
    (e.g. scalar return, UniTuple return, Tuple return, etc.).
    c                 C   sj   t jdt jd�}t  |¡}t  |¡}t t¡}|d |||ƒ t j t  	|¡|¡ t j t  
|¡|¡ d S )Néd   )Údtype©é   é    )ÚnpÚarangeÚfloat64Ú
zeros_liker   Újitr   ÚtestingZassert_allcloseÚcosÚsin)ÚselfÚarrÚsresZcresÚcufuncr   r   r   Útest_sincos,   s    


zTestLibdevice.test_sincosc                 C   sx   t jdddt jd�}t  |¡}t j|jt jd�}t t	¡}|d |||ƒ t  
|¡\}}t j ||¡ t j ||¡ d S )Ng      ð?g      $@r"   )ÚstartÚstopÚnumr#   )Úshaper#   r$   )r'   Zlinspacer)   r*   Zzerosr7   Zint32r   r+   r   r   r,   Úassert_array_equal)r/   r0   ZfracresZexpresr2   Zfrac_expectZ
exp_expectr   r   r   Ú
test_frexp8   s    

zTestLibdevice.test_frexpc                 C   sl   t  ddd¡}t  dd¡}t  dd¡}t  |¡}t t¡}|d ||||ƒ t j t  || ¡| |¡ d S )	Nr   éÈ   é   é2   é–   é   és   r$   )	r'   r(   r*   r   r+   r    r,   r8   Úabs)r/   r   r   r   r   r2   r   r   r   Útest_sadF   s    

zTestLibdevice.test_sadN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r3   r9   rA   r   r   r   r   r!   "   s   r!   z{from numba.cuda import libdevice

def pyfunc(%(pyargs)s):
    ret = libdevice.%(func)s(%(funcargs)s)
    %(retvars)s = ret
c                    s   ‡ fdd„}|S )z@
    Generates a test function for each libdevice function.
    c                    sf  ˆ dd … }t t|ƒ}tˆ  \}}t||ƒ}d dd„ t|ƒD ƒ¡}t|jtj	tj
fƒr¢d dd„ tt|jƒƒD ƒ¡}|d| 7 }d dd„ tt|jƒƒD ƒ¡}nd| }d}||||d	œ}	t|	 }
i }t|
tƒ |ƒ |d
 }dd„ |D ƒ}t|jtj	tj
fƒ�rdd„ |jD ƒ}|| }n| d|jd d d… ¡ t|ƒ}t||ƒ\}}|  d|¡ |  d|¡ d S )Né   z, c                 S   s   g | ]\}}|j sd | ‘qS )za%d)Úis_ptr)Ú.0r   Úargr   r   r   Ú
<listcomp>o   s    ÿz@make_test_call.<locals>._test_call_functions.<locals>.<listcomp>c                 S   s   g | ]}d | ‘qS )zr%dr   ©rH   r   r   r   r   rJ   y   s     c                 S   s   g | ]}d | ‘qS )zr%d[0]r   rK   r   r   r   rJ   €   s     zr0, zr0[0])ÚfuncÚpyargsÚfuncargsÚretvarsÚpyfuncc                 S   s   g | ]}|j s|j‘qS r   )rG   Úty)rH   rI   r   r   r   rJ   •   s      c                 S   s   g | ]}|d d d… ‘qS r   r   )rH   Úretr   r   r   rJ   —   s     r   r   zld.paramz	st.global)Úgetattrr   r	   r
   ÚjoinÚ	enumerateÚ
isinstanceÚreturn_typer   ÚTupleZUniTupleÚranger   Úfunction_templateÚexecÚglobalsÚinsertÚtupler   ZassertIn)r/   ZapinameZapifuncZrettyÚargsÚsigrN   rM   rO   ÚdÚcodeÚlocalsrP   Z	pyreturnsZptxZresty©Úlibnamer   r   Ú_test_call_functionsf   sB    


ÿ
ÿ
ý
z,make_test_call.<locals>._test_call_functionsr   )re   rf   r   rd   r   Úmake_test_calla   s    Brg   z.Compilation to PTX is not supported on cudasimc                   @   s   e Zd ZdZdS )ÚTestLibdeviceCompilationa:  
    Class for holding all tests of compiling calls to libdevice functions. We
    generate the actual tests in this class (as opposed to using subTest and
    one test within this class) because there are a lot of tests, and it makes
    the test suite appear frozen to test them all as subTests in one test.
    N)rB   rC   rD   rE   r   r   r   r   rh   «   s   rh   ztest_%sÚ__main__)Únumpyr'   Z
numba.corer   Znumba.cuda.testingr   r   r   Znumbar   Z
numba.cudar   r   Znumba.cuda.libdevicefuncsr	   r
   r   r   r    r!   rZ   rg   ZTestCaserh   re   ÚsetattrrB   Úmainr   r   r   r   Ú<module>   s(   		5	J	
ÿ