U
    hâË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s�t‚t t	|ƒ¡|ƒ‰‡ ‡‡fdd„}|S )Nc                 s   s   | ]}t |tjƒV  qd S ©N)Ú
isinstancer   ÚArray©Ú.0Útp© r'   ú]/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/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ÚvZinpÚargs)ÚargtypesÚkernelÚrestyper=   r(   Úkernel_wrapper2   s    
ÿ
z+compile_scalar_func.<locals>.kernel_wrapper)
ÚanyÚAssertionErrorr"   r   r#   r   ÚjitrF   r@   Útuple)ÚpyfuncrM   rO   Zkernel_typesr6   rP   r'   )rM   r5   rN   rO   r(   Úcompile_scalar_func   s    ÿrV   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 )	NrY   r*   rZ   r[   r\   r]   c                 S   s   g | ]\}}t ||ƒ‘qS r'   r^   r`   r'   r'   r(   r,   J   s     z/BaseComplexTest.more_values.<locals>.<listcomp>©rD   Úpirc   rd   re   rf   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 )	NrX   rY   r*   rZ   Úinfr[   c                 S   s   g | ]\}}t ||ƒ‘qS r'   r^   r`   r'   r'   r(   r,   O   s     z2BaseComplexTest.non_nan_values.<locals>.<listcomp>ri   rf   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� qòqd S )Nr   ZsingleÚdoublezmath domain errorzfor input %r with prec %r)ÚprecÚulpsÚignore_sign_on_zeroÚmsg)r"   r   ÚTyperT   rL   Zfloat32Ú	complex64rV   Úreturn_typerF   ÚappendÚ
ValueErrorZassertInÚstrrB   ZassertPreciseEqual)rg   rU   ZsigsrG   rp   rq   Úsigro   ZcudafuncZ	ok_valuesÚexpected_listrL   ÚeZgot_listÚgotÚexpectedrr   r'   r'   r(   Úrun_funcQ   s:    

ÿþ
ýzBaseComplexTest.run_funcN)r*   F)	Ú__name__Ú
__module__Ú__qualname__rh   rk   rm   r~   Ú	run_unaryÚ
run_binaryr'   r'   r'   r(   rW   @   s   
rW   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>)rh   r‚   r   rt   Ú
complex128©rg   rU   rG   r'   r'   r(   Úcheck_real_imageu   s    
ÿýzTestComplex.check_real_imagec                 C   s   |   t¡ d S r!   )r‰   r   ©rg   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   rh   r‚   r   rt   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‡   rt   rh   )rg   rU   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(   ry   ˜   s    z'TestCMath.check_unary_func.<locals>.sigc                 S   s   | | ƒS r!   r'   r‘   r'   r'   r(   ry   ›   s    ©rp   rq   )r‚   r   r‡   rk   rt   rh   )rg   rU   rp   rG   Úreturns_floatrq   ry   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‡   rk   rt   rh   )rg   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   ©rp   )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   rd   re   rk   r   r‡   rt   rƒ   r   )rg   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   )rp   rG   )r”   r   rm   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   rS   r:   ZarangeÚcopyÚtestingZassert_equal)rg   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¾   )rg   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   rd   Ú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    rV   rW   r„   rŽ   r¶   r   Úmainr'   r'   r'   r(   Ú<module>   s   p&3|!
