U
    ,d2(                     @   s  d dl Z d dlZd dlZd dlmZmZ d dlmZ d dl	m
Z
 d dlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z% d dl&m'Z' dd Z(G d	d
 d
eZ)G dd de)Z*G dd de)Z+G dd deZ,e-dkre.  dS )    N)unittestCUDATestCase)types)cuda)real_usecaseimag_usecaseconjugate_usecasephase_usecasepolar_as_complex_usecaserect_usecaseisnan_usecaseisinf_usecaseisfinite_usecaseexp_usecaselog_usecaselog_base_usecaselog10_usecasesqrt_usecaseasin_usecaseacos_usecaseatan_usecasecos_usecasesin_usecasetan_usecaseacosh_usecaseasinh_usecaseatanh_usecasecosh_usecasesinh_usecasetanh_usecase)numpy_supportc                    s   t dd  D rtttjr&ttj  dd| dd gt  D }t dkrnfdd	}n"t d
krfdd	}ndsttt	|| fdd}|S )Nc                 s   s   | ]}t |tjV  qd S N)
isinstancer   Array.0tp r'   H/tmp/pip-unpacked-wheel-eu7e0c37/numba/cuda/tests/cudapy/test_complex.py	<genexpr>   s     z&compile_scalar_func.<locals>.<genexpr>T)Zdevicec                 S   s   g | ]}t |d dqS )   C)r   r#   r$   r'   r'   r(   
<listcomp>    s   z'compile_scalar_func.<locals>.<listcomp>r*   c                    s,   t d}|| jd k r( || | |< d S Nr*   r   r   gridshape)outaidevice_funcr'   r(   kernel_func$   s    
z(compile_scalar_func.<locals>.kernel_func   c                    s2   t d}|| jd k r. || || | |< d S r-   r.   )r1   r2   br3   r4   r'   r(   r6   )   s    
r   c                    s   t |   fddD }tj td}t| D ]$\}}t||D ]\}}|||< qHq6|g| }tt	 d df |  t
|S )Nc                    s    g | ]}t j t|d qS )Zdtype)npemptyr    as_dtyper$   nr'   r(   r,   4   s   z?compile_scalar_func.<locals>.kernel_wrapper.<locals>.<listcomp>r9      )lenr:   r;   r    r<   	enumeratezipintmathceillist)valuesinputsoutputr3   vsvinpargs)argtypeskernelrestyper=   r(   kernel_wrapper2   s    

z+compile_scalar_func.<locals>.kernel_wrapper)
anyAssertionErrorr"   r   r#   r   jitrF   r@   tuple)pyfuncrN   rP   Zkernel_typesr6   rQ   r'   )rN   r5   rO   rP   r(   compile_scalar_func   s    rW   c                   @   s6   e Zd Zdd Zdd Zdd Zdd	d
ZeZeZdS )BaseComplexTestc              
   C   s8   ddddddt dt dt d	g	}d
d t||D S )N               r*   g      ?g      -inf+infnanc                 S   s   g | ]\}}t ||qS r'   complexr%   xyr'   r'   r(   r,   E   s     z0BaseComplexTest.basic_values.<locals>.<listcomp>)float	itertoolsproductselfZrealsr'   r'   r(   basic_valuesB   s      zBaseComplexTest.basic_valuesc              
   C   s@   ddddt j t j
 tdtdtdg	}dd t||D S )	NrZ   r*   r[   r\   r]   r^   c                 S   s   g | ]\}}t ||qS r'   r_   ra   r'   r'   r(   r,   J   s     z/BaseComplexTest.more_values.<locals>.<listcomp>rD   pird   re   rf   rg   r'   r'   r(   more_valuesG   s      zBaseComplexTest.more_valuesc              	   C   s:   ddddt j t j
 tdtdg}dd t||D S )	NrY   rZ   r*   r[   infr\   c                 S   s   g | ]\}}t ||qS r'   r_   ra   r'   r'   r(   r,   O   s     z2BaseComplexTest.non_nan_values.<locals>.<listcomp>rj   rg   r'   r'   r(   non_nan_valuesL   s
     zBaseComplexTest.non_nan_valuesr*   Fc                 C   s&  |D ]}t |tjr|f}t |tr2|d | }|jd tjtjfkrLdnd}t||j|j}g }	g }
|D ]p}t |t	tfs|f}z|

||  |	
| W ql tk
r } z| dt| W Y qlW 5 d }~X Y qlX ql||	}t||
|	D ],\}}}d||f }| j||||||d qqd S )Nr   Zsingledoublezmath domain errorzfor input %r with prec %r)preculpsignore_sign_on_zeromsg)r"   r   TyperU   rM   Zfloat32	complex64rW   return_typerF   append
ValueErrorZassertInstrrB   ZassertPreciseEqual)rh   rV   ZsigsrG   rq   rr   sigrp   ZcudafuncZ	ok_valuesexpected_listrM   eZgot_listgotexpectedrs   r'   r'   r(   run_funcQ   s:    


zBaseComplexTest.run_funcN)r*   F)	__name__
__module____qualname__ri   rl   rn   r   	run_unary
run_binaryr'   r'   r'   r(   rX   @   s   
rX   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TestComplexc                 C   s,   |   }| |dd tjtjfD | d S )Nc                 S   s   g | ]}| |qS r'   underlying_floatr$   r'   r'   r(   r,   x   s   z0TestComplex.check_real_image.<locals>.<listcomp>)ri   r   r   ru   
complex128rh   rV   rG   r'   r'   r(   check_real_imageu   s    
zTestComplex.check_real_imagec                 C   s   |  t d S r!   )r   r   rh   r'   r'   r(   	test_real|   s    zTestComplex.test_realc                 C   s   |  t d S r!   )r   r   r   r'   r'   r(   	test_imag   s    zTestComplex.test_imagc                 C   s&   t }|  }| |tjtjg| d S r!   )r   ri   r   r   ru   r   r   r'   r'   r(   test_conjugate   s    
zTestComplex.test_conjugateN)r   r   r   r   r   r   r   r'   r'   r'   r(   r   s   s   r   c                   @   s   e Zd ZdZdd Zd7d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/d0 Zd1d2 Zd3d4 Zd5d6 ZdS )8	TestCMathz)
    Tests for cmath module support.
    c                 C   s(   |  |dd tjtjfD |   d S )Nc                 S   s   g | ]}t |qS r'   )r   booleanr$   r'   r'   r(   r,      s   z2TestCMath.check_predicate_func.<locals>.<listcomp>)r   r   r   ru   ri   )rh   rV   r'   r'   r(   check_predicate_func   s    
zTestCMath.check_predicate_funcr*   NFc                 C   sb   |rdd }ndd }| j ||tjg|p0|  ||d | j ||tjg|pT|  ||d d S )Nc                 S   s
   |  | S r!   r   r&   r'   r'   r(   rz      s    z'TestCMath.check_unary_func.<locals>.sigc                 S   s   | | S r!   r'   r   r'   r'   r(   rz      s    rq   rr   )r   r   r   rl   ru   ri   )rh   rV   rq   rG   returns_floatrr   rz   r'   r'   r(   check_unary_func   s    

 
 zTestCMath.check_unary_funcc                 C   s   | j tdd d S )NT)r   )r   r	   r   r'   r'   r(   
test_phase   s    zTestCMath.test_phasec                 C   s   |  t d S r!   )r   r
   r   r'   r'   r(   
test_polar   s    zTestCMath.test_polarc                    s0    fdd}|t j   |t j   d S )Nc                    s.   dd |D }| j } t| ||g| d S )Nc                 S   s.   g | ]&}t |jr|jd kr|j|jfqS )r   )rD   isinfimagreal)r%   zr'   r'   r(   r,      s     
z8TestCMath.test_rect.<locals>.do_test.<locals>.<listcomp>)r   r   r   )r&   Zseed_valuesrG   Z
float_typer   r'   r(   do_test   s
    z$TestCMath.test_rect.<locals>.do_test)r   r   rl   ru   ri   )rh   r   r'   r   r(   	test_rect   s    zTestCMath.test_rectc                 C   s   |  t d S r!   )r   r   r   r'   r'   r(   
test_isnan   s    zTestCMath.test_isnanc                 C   s   |  t d S r!   )r   r   r   r'   r'   r(   
test_isinf   s    zTestCMath.test_isinfc                 C   s   |  t d S r!   )r   r   r   r'   r'   r(   test_isfinite   s    zTestCMath.test_isfinitec                 C   s   | j tdd d S Nr7   rq   )r   r   r   r'   r'   r(   test_exp   s    zTestCMath.test_expc                 C   s   |  t d S r!   )r   r   r   r'   r'   r(   test_log   s    zTestCMath.test_logc                 C   sF   t t|  |  }tjtjftjtjfg}| jt||dd d S )N   r   )	rF   re   rf   rl   r   r   ru   r   r   )rh   rG   Zvalue_typesr'   r'   r(   test_log_base   s    


zTestCMath.test_log_basec                 C   s   |  t d S r!   )r   r   r   r'   r'   r(   
test_log10   s    zTestCMath.test_log10c                 C   s   |  t d S r!   )r   r   r   r'   r'   r(   	test_sqrt   s    zTestCMath.test_sqrtc                 C   s   | j tdd d S r   )r   r   r   r'   r'   r(   	test_acos   s    zTestCMath.test_acosc                 C   s   | j tdd d S r   )r   r   r   r'   r'   r(   	test_asin   s    zTestCMath.test_asinc                 C   s   | j td|  d d S )Nr7   )rq   rG   )r   r   rn   r   r'   r'   r(   	test_atan   s    zTestCMath.test_atanc                 C   s   | j tdd d S r   )r   r   r   r'   r'   r(   test_cos   s    zTestCMath.test_cosc                 C   s   | j tdd d S r   )r   r   r   r'   r'   r(   test_sin   s    zTestCMath.test_sinc                 C   s   | j tddd d S Nr7   Tr   )r   r   r   r'   r'   r(   test_tan   s    zTestCMath.test_tanc                 C   s   |  t d S r!   )r   r   r   r'   r'   r(   
test_acosh   s    zTestCMath.test_acoshc                 C   s   | j tdd d S r   )r   r   r   r'   r'   r(   
test_asinh   s    zTestCMath.test_asinhc                 C   s   | j tddd d S r   )r   r   r   r'   r'   r(   
test_atanh   s    zTestCMath.test_atanhc                 C   s   | j tdd d S r   )r   r   r   r'   r'   r(   	test_cosh   s    zTestCMath.test_coshc                 C   s   | j tdd d S r   )r   r   r   r'   r'   r(   	test_sinh   s    zTestCMath.test_sinhc                 C   s   | j tddd d S r   )r   r   r   r'   r'   r(   	test_tanh  s    zTestCMath.test_tanh)r*   NFF)r   r   r   __doc__r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r'   r'   r'   r(   r      s:       
r   c                   @   s   e Zd Zdd Zdd ZdS )TestAtomicOnComplexComponentsc                 C   sX   t jdd }d}t|t|d  }| }|d|f | tj|d | d S )Nc                 S   s    t d}t j| j|d d S Nr*   )r   r/   atomicaddr   rG   r3   r'   r'   r(   atomic_add_one  s    
zITestAtomicOnComplexComponents.test_atomic_on_real.<locals>.atomic_add_one                  ?r*   r   rT   r:   ZarangecopyZtestingZassert_equal)rh   r   Narr1arr2r'   r'   r(   test_atomic_on_real  s    
z1TestAtomicOnComplexComponents.test_atomic_on_realc                 C   sX   t jdd }d}t|t|d  }| }|d|f | tj|d | d S )Nc                 S   s    t d}t j| j|d d S r   )r   r/   r   r   r   r   r'   r'   r(   atomic_add_one_j  s    
zKTestAtomicOnComplexComponents.test_atomic_on_imag.<locals>.atomic_add_one_jr   r   r*   r   )rh   r   r   r   r   r'   r'   r(   test_atomic_on_imag  s    
z1TestAtomicOnComplexComponents.test_atomic_on_imagN)r   r   r   r   r   r'   r'   r'   r(   r     s   r   __main__)/rD   re   Znumpyr:   Znumba.cuda.testingr   r   Z
numba.corer   Znumbar   Znumba.tests.complex_usecasesr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Znumba.npr    rW   rX   r   r   r   r   mainr'   r'   r'   r(   <module>   s   p&3|!
