U
    ,d                    @   s<  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Zd dlZd dl	Z	d dl
mZmZmZ d dlmZmZ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mZ d dlmZm Z m!Z!m"Z" d d	l#m$Z$m%Z% d d
l&m'Z' d dl(m)Z) d dl*m+Z+ d dl&m,Z, e-j.dkZ/ej01dZ2e Z3de3_4de3_5e Z6de6_5e Z7de7_8de7_5dd Z9dd Z:dd Z;dd Z<dd Z=dd Z>G dd de!Z?G dd  d e?eZ@G d!d" d"e?eZAG d#d$ d$eZBG d%d& d&eBZCG d'd( d(eZDG d)d* d*eZEG d+d, d,eEZFeFG  G d-d. d.eEZHeHG  G d/d0 d0eEZIeIG  G d1d2 d2eEZJeJG  G d3d4 d4eEZKeKG  G d5d6 d6eEZLeLG  G d7d8 d8eEZMeMG  G d9d: d:eEZNeNG  G d;d< d<eEZOeOG  G d=d> d>eEZPePG  G d?d@ d@eZQG dAdB dBeZRG dCdD dDeZSG dEdF dFeZTeUdGkr8e	V  dS )H    N)typeofnjitguvectorize)typestypingutils)compile_isolatedFlagsDEFAULT_FLAGS)
from_dtype)jit	vectorize)LoweringErrorTypingErrorNumbaTypeError)TestCaseCompilationCacheMemoryLeakMixintag)supported_ufuncs
all_ufuncs)numpy_support)
cpu_target)BaseContext)ufunc_db   win32Tc                    s   t   fdd}dS )zAn 'expectedFailure' like decorator that only expects compilation errors
    caused by unimplemented functions that fail in no-python modec                     s<   z | | W n" t k
r0   tt Y nX tjd S N)r   unittestZ_ExpectedFailuresysexc_infoZ_UnexpectedSuccess)argskwargsfunc ;/tmp/pip-unpacked-wheel-eu7e0c37/numba/tests/test_ufuncs.pywrapper.   s
    z_unimplemented.<locals>.wrapperN)	functoolswraps)r$   r'   r%   r#   r&   _unimplemented+   s    r*   c                 C   sT   i }d dd t| jD }d|| j}t|t | |d }d| j|_|S )N,c                 S   s   g | ]}d  |qS )za{0})format.0ir%   r%   r&   
<listcomp>8   s     z'_make_ufunc_usecase.<locals>.<listcomp>zdef fn({0}):
    np.{1}({0})fnz{0}_usecase)joinrangenargsr,   __name__execglobals)ufuncldictZarg_strZfunc_strr1   r%   r%   r&   _make_ufunc_usecase6   s    r:   c                 C   s4   i }t d| t | |d }dt| |_|S )Nzdef fn(x):
    return {0}(x)r1   usecase_{0}r6   r,   r7   hashr5   ufunc_opr9   r1   r%   r%   r&   _make_unary_ufunc_op_usecase?   s
    r@   c                 C   s4   i }t d| t | |d }dt| |_|S )Nzdef fn(x,y):
    return x{0}yr1   r;   r<   r>   r%   r%   r&   _make_binary_ufunc_op_usecaseF   s
    rA   c                    sP   t  tr<i }td t | |d }dt |_n fdd}|}|S )zGenerates a function to be compiled that performs an inplace operation

    ufunc_op can be a string like '+=' or a function like operator.iadd
    zdef fn(x,y):
    x{0}yr1   r;   c                    s    | | d S r   r%   xyr?   r%   r&   
inplace_opY   s    z2_make_inplace_ufunc_op_usecase.<locals>.inplace_op)
isinstancestrr6   r,   r7   r=   r5   )r?   r9   r1   rF   r%   rE   r&   _make_inplace_ufunc_op_usecaseN   s    
rI   c                 C   s   dd t | |D S )z5Convert python values into numpy scalar objects.
    c                 S   s$   g | ]\}}t t||qS r%   )npdtyperH   type)r.   tyvalr%   r%   r&   r0   b   s     z#_as_dtype_value.<locals>.<listcomp>)zip)tyargsr!   r%   r%   r&   _as_dtype_value_   s    rQ   c                       s&   e Zd Z fddZdddZ  ZS )BaseUFuncTestc                    sP  t t|   tdtjftdtjftdtjftdtjftdtjftdtjftdtjftdtjftdtjftdtjft	dtj	ft	dtj	ft	dtj	ft
dtj
ft
dtj
ft
dtj
ftjddgddttjdd	ftjddgd
dttjdd	ftjdddgddttjdd	ftjdddgddttjdd	ftjdddgddttj	dd	ftjdddgddttj
dd	ftjddgtjdttjdd	ftjddgtjdttjdd	ftjddgtjdttjdd	ftjddgtjdttjdd	fg| _t | _d S )Nr                          ?u4rK   Cu8i4i8f4f8)superrR   setUprJ   uint32r   int32uint64int64float32float64arrayArrayint8int16Zuint8Zuint16inputsr   cacheself	__class__r%   r&   ra   h   s:      """""""" zBaseUFuncTest.setUpNc                 C   s   |}t |tjr|j}|tjkrD|r4t|dd}qt|dd}nP|tjkrr|rbt|dd}qt|dd}n"|rt|dd}nt|dd}|S )NrS   rZ   )rG   r   ri   rK   Zsigned_domainZunsigned_domain)ro   
input_typeint_output_typefloat_output_typerM   output_typer%   r%   r&   _determine_output_type   s    

z$BaseUFuncTest._determine_output_type)NN)r5   
__module____qualname__ra   rv   __classcell__r%   r%   rp   r&   rR   f   s   $  rR   c                   @   s^  e Zd Zeg g ddddfddZdefddZefdd	Zefd
dZefddZefddZ	dd Z
dd ZefddZdd ZefddZefddZefddZefddZefd d!Zefd"d#Zefd$d%Zefd&d'Zefd(d)Zeejfd*d+Zefd,d-Zefd.d/Zefd0d1Zefd2d3Zefd4d5Zefd6d7Zefd8d9Z efd:d;Z!efd<d=Z"efd>d?Z#efd@dAZ$efdBdCZ%efdDdEZ&efdFdGZ'efdHdIZ(efdJdKZ)efdLdMZ*efdNdOZ+efdPdQZ,efdRdSZ-efdTdUZ.efdVdWZ/efdXdYZ0efdZd[Z1efd\d]Z2efd^d_Z3efd`daZ4efdbdcZ5efdddeZ6efdfdgZ7efdhdiZ8efdjdkZ9efdldmZ:efdndoZ;efdpdqZ<efdrdsZ=efdtduZ>efdvdwZ?efdxdyZ@efdzd{ZAefd|d}ZBefd~dZCefddZDefddZEefddZFefddZGefddZHefddZIefddZJefddZKefddZLefddZMefddZNefddZOdd ZPefddZQefddZRefddZSefddZTefddZUefddZVeWefddZXeWefddZYefddZZefddZ[efddZ\efddZ]efddZ^dd Z_dd Z`dd Zadd Zbdd ZcdS )
TestUFuncsNZifcFc	                    s(  |  t t|}	t| j| }
|
D ]}|d }|d }t|t}|rN| n|f|j  ||krdq$|r|t	 d dk r|q$ d j
j|krq$| |||}|f|j }|f|j }| jj|	|| |d}|j}t d tjr fdd|D } fdd|D }ndd |D }dd |D }d	}tjd
dP}td |	 |  d}|D ]*}t|jtrTt|j|rTd
}qTW 5 Q R X | |  t||D ]\}}ddddddddg|j|||||j
|}ztjj||d|d W n. t k
r   |rt!d||| n Y nX qq$d S )Nr   rS   flagsc                    s$   g | ]}t j d  j|jjdqS r   rY   rJ   zerossizerK   namer.   Zout_tyr!   r%   r&   r0      s   z/TestUFuncs.basic_ufunc_test.<locals>.<listcomp>c                    s$   g | ]}t j d  j|jjdqS r}   r~   r   r   r%   r&   r0      s   c                 S   s   g | ]}t jd |jjdqS rS   rY   rJ   r   rK   r   r   r%   r%   r&   r0      s   c                 S   s   g | ]}t jd |jjdqS r   r   r   r%   r%   r&   r0      s   FT)recordalwayszinvalid value encountered
zufunc '{0}' failedzinputs ({1}):z{2}zgot({3})z{4}zexpected ({5}):z{6}   )decimalerr_msgz!Output mismatch for invalid input)"Zreset_module_warningsr5   r:   listrl   rG   tupleninrJ   anyrK   kindrv   noutrm   compileentry_pointndarraywarningscatch_warningssimplefilter
issubclasscategoryRuntimeWarningrH   message
startswithrO   r2   r,   testingassert_array_almost_equalAssertionErrorprint)ro   r8   r|   skip_inputsadditional_inputsrs   rt   kindspositive_onlypyfuncrl   input_tupleinput_operandrr   Zis_tupleru   Zinput_typesoutput_typescrcfuncresultsexpectedZinvalid_flagZwarnlistZwarnmsgZthiswarnZ
expected_iZresult_imsgr%   r   r&   basic_ufunc_test   s    


  


       
  zTestUFuncs.basic_ufunc_testc                 C   s8   | j ||tjtjttjddttjddgd d S )NrS   rZ   )r|   r   )r   r   rf   rg   ri   )ro   r   r|   r%   r%   r&   basic_int_ufunc_test  s    zTestUFuncs.basic_int_ufunc_testc                 C   s   | j tj|d d S Nr{   )r   rJ   addro   r|   r%   r%   r&   test_add_ufunc  s    zTestUFuncs.test_add_ufuncc                 C   s   | j tj|d d S r   )r   rJ   subtractr   r%   r%   r&   test_subtract_ufunc  s    zTestUFuncs.test_subtract_ufuncc                 C   s   | j tj|d d S r   )r   rJ   multiplyr   r%   r%   r&   test_multiply_ufunc  s    zTestUFuncs.test_multiply_ufuncc                 C   s    d }t j}| jtj||d d S N)r|   rs   )r   rg   r   rJ   divide)ro   r|   int_out_typer%   r%   r&   test_divide_ufunc  s    zTestUFuncs.test_divide_ufuncc                 C   s   | j tjdd d S Nf)r   )r   rJ   Z	logaddexprn   r%   r%   r&   test_logaddexp_ufunc"  s    zTestUFuncs.test_logaddexp_ufuncc                 C   s   | j tjdd d S r   )r   rJ   Z
logaddexp2rn   r%   r%   r&   test_logaddexp2_ufunc%  s    z TestUFuncs.test_logaddexp2_ufuncc                 C   s   | j tj|tjd d S r   )r   rJ   true_divider   rg   r   r%   r%   r&   test_true_divide_ufunc(  s    z!TestUFuncs.test_true_divide_ufuncc                 C   s   |  tj d S r   )r   rJ   floor_dividern   r%   r%   r&   test_floor_divide_ufunc+  s    z"TestUFuncs.test_floor_divide_ufuncc                 C   s,   | j tjtjttjddtjg|d d S )NrS   rZ   )rs   r   r|   )r   rJ   negativer   re   ri   rb   r   r%   r%   r&   test_negative_ufunc.  s    zTestUFuncs.test_negative_ufuncc                 C   s   | j tj|d d S r   )r   rJ   Zpositiver   r%   r%   r&   test_positive_ufunc5  s    zTestUFuncs.test_positive_ufuncc                 C   s   | j tj|dd d S )NT)r|   r   )r   rJ   powerr   r%   r%   r&   test_power_ufunc8  s    
zTestUFuncs.test_power_ufuncc                 C   s   | j tj|dd d S )NZfcr|   r   )r   rJ   Zfloat_powerr   r%   r%   r&   test_float_power_ufunc<  s    z!TestUFuncs.test_float_power_ufuncc                 C   s   | j tj|dd d S Niur   )r   rJ   gcdr   r%   r%   r&   test_gcd_ufunc?  s    zTestUFuncs.test_gcd_ufuncc                 C   s   | j tj|dd d S r   )r   rJ   Zlcmr   r%   r%   r&   test_lcm_ufuncB  s    zTestUFuncs.test_lcm_ufuncc                 C   s   | j tj|d d S r   )r   rJ   	remainderr   r%   r%   r&   test_remainder_ufuncE  s    zTestUFuncs.test_remainder_ufuncc              	   C   s:   | j tj|dtttjjtdftjfgd d S )NZifcu   r|   r   r   )r   rJ   modrd   iinfomaxr   r   r%   r%   r&   test_mod_ufuncH  s    "zTestUFuncs.test_mod_ufuncc                 C   s   | j tj|d d S r   )r   rJ   fmodr   r%   r%   r&   test_fmod_ufuncN  s    zTestUFuncs.test_fmod_ufuncc                 C   st   | j ||tttjjtjftttjjtjftttjj	tjft
ttj
j	tj
fgd d S )N)r|   r   )r   rJ   rb   r   r   r   rd   rf   Zfinfominrg   )ro   r|   r8   r%   r%   r&   test_abs_ufuncQ  s    zTestUFuncs.test_abs_ufuncc                 C   s   | j |tjd d S )N)r|   r8   )r   rJ   absoluter   r%   r%   r&   test_absolute_ufuncZ  s    zTestUFuncs.test_absolute_ufuncc                 C   s   | j tj|dd d S Nr   r   )r   rJ   fabsr   r%   r%   r&   test_fabs_ufunc]  s    zTestUFuncs.test_fabs_ufuncc                 C   s   | j tj|dd d S Ncfr   )r   rJ   Zrintr   r%   r%   r&   test_rint_ufunc`  s    zTestUFuncs.test_rint_ufuncc                 C   s   | j tj|d d S r   )r   rJ   signr   r%   r%   r&   test_sign_ufuncc  s    zTestUFuncs.test_sign_ufuncc                 C   s   | j tj|d d S r   )r   rJ   Zconjr   r%   r%   r&   test_conj_ufuncf  s    zTestUFuncs.test_conj_ufuncc                 C   s   | j tj|dd d S r   )r   rJ   expr   r%   r%   r&   test_exp_ufunci  s    zTestUFuncs.test_exp_ufuncc                 C   s   | j tj|dd d S r   )r   rJ   Zexp2r   r%   r%   r&   test_exp2_ufuncl  s    zTestUFuncs.test_exp2_ufuncc                 C   s   | j tj|dd d S r   )r   rJ   logr   r%   r%   r&   test_log_ufunco  s    zTestUFuncs.test_log_ufuncc                 C   s   | j tj|dd d S r   )r   rJ   log2r   r%   r%   r&   test_log2_ufuncr  s    zTestUFuncs.test_log2_ufuncc                 C   s   | j tj|dd d S r   )r   rJ   log10r   r%   r%   r&   test_log10_ufuncu  s    zTestUFuncs.test_log10_ufuncc                 C   s   | j tj|dd d S r   )r   rJ   expm1r   r%   r%   r&   test_expm1_ufuncx  s    zTestUFuncs.test_expm1_ufuncc                 C   s   | j tj|dd d S r   )r   rJ   log1pr   r%   r%   r&   test_log1p_ufunc{  s    zTestUFuncs.test_log1p_ufuncc                 C   s   | j tj|dd d S r   )r   rJ   sqrtr   r%   r%   r&   test_sqrt_ufunc~  s    zTestUFuncs.test_sqrt_ufuncc                 C   s   | j tj|d d S r   )r   rJ   Zsquarer   r%   r%   r&   test_square_ufunc  s    zTestUFuncs.test_square_ufuncc                 C   s   | j tj|dd d S r   )r   rJ   cbrtr   r%   r%   r&   test_cbrt_ufunc  s    zTestUFuncs.test_cbrt_ufuncc                 C   sb   t t jddt jt t jddt jt t jddt jt t jddt jg}| jtj||d d S )NrS   rZ   )r   r|   )	r   ri   rb   rc   rd   re   r   rJ   
reciprocalro   r|   Zto_skipr%   r%   r&   test_reciprocal_ufunc  s       z TestUFuncs.test_reciprocal_ufuncc                 C   s   | j tj|d d S r   )r   rJ   	conjugater   r%   r%   r&   test_conjugate_ufunc  s    zTestUFuncs.test_conjugate_ufuncc                 C   s   | j tj|dd d S r   )r   rJ   sinr   r%   r%   r&   test_sin_ufunc  s    zTestUFuncs.test_sin_ufuncc                 C   s   | j tj|dd d S r   )r   rJ   cosr   r%   r%   r&   test_cos_ufunc  s    zTestUFuncs.test_cos_ufuncc                 C   s   | j tj|dd d S r   )r   rJ   tanr   r%   r%   r&   test_tan_ufunc  s    zTestUFuncs.test_tan_ufuncc                 C   s   | j tj|dd d S r   )r   rJ   arcsinr   r%   r%   r&   test_arcsin_ufunc  s    zTestUFuncs.test_arcsin_ufuncc                 C   s   | j tj|dd d S r   )r   rJ   arccosr   r%   r%   r&   test_arccos_ufunc  s    zTestUFuncs.test_arccos_ufuncc                 C   s   | j tj|dd d S r   )r   rJ   Zarctanr   r%   r%   r&   test_arctan_ufunc  s    zTestUFuncs.test_arctan_ufuncc                 C   s   | j tj|dd d S r   )r   rJ   Zarctan2r   r%   r%   r&   test_arctan2_ufunc  s    zTestUFuncs.test_arctan2_ufuncc                 C   s   | j tjdd d S r   )r   rJ   hypotr   r%   r%   r&   test_hypot_ufunc  s    zTestUFuncs.test_hypot_ufuncc                 C   s   | j tj|dd d S r   )r   rJ   sinhr   r%   r%   r&   test_sinh_ufunc  s    zTestUFuncs.test_sinh_ufuncc                 C   s   | j tj|dd d S r   )r   rJ   coshr   r%   r%   r&   test_cosh_ufunc  s    zTestUFuncs.test_cosh_ufuncc                 C   s   | j tj|dd d S r   )r   rJ   tanhr   r%   r%   r&   test_tanh_ufunc  s    zTestUFuncs.test_tanh_ufuncc                 C   s   | j tj|dd d S r   )r   rJ   Zarcsinhr   r%   r%   r&   test_arcsinh_ufunc  s    zTestUFuncs.test_arcsinh_ufuncc                 C   s   | j tj|dd d S r   )r   rJ   Zarccoshr   r%   r%   r&   test_arccosh_ufunc  s    zTestUFuncs.test_arccosh_ufuncc                 C   sd   t t jddt jt t jddt jt t jddt jt t jddt jg}| jtj||dd d S )NrS   rZ   r   )r   r|   r   )	r   ri   rb   rc   rd   re   r   rJ   Zarctanhr   r%   r%   r&   test_arctanh_ufunc  s    	   zTestUFuncs.test_arctanh_ufuncc                 C   s   | j tj|dd d S r   )r   rJ   Zdeg2radr   r%   r%   r&   test_deg2rad_ufunc  s    zTestUFuncs.test_deg2rad_ufuncc                 C   s   | j tj|dd d S r   )r   rJ   Zrad2degr   r%   r%   r&   test_rad2deg_ufunc  s    zTestUFuncs.test_rad2deg_ufuncc                 C   s   | j tj|dd d S r   )r   rJ   degreesr   r%   r%   r&   test_degrees_ufunc  s    zTestUFuncs.test_degrees_ufuncc                 C   s   | j tj|dd d S r   )r   rJ   radiansr   r%   r%   r&   test_radians_ufunc  s    zTestUFuncs.test_radians_ufuncc                 C   s   | j tj|d d S r   )r   rJ   Zbitwise_andr   r%   r%   r&   test_bitwise_and_ufunc  s    z!TestUFuncs.test_bitwise_and_ufuncc                 C   s   | j tj|d d S r   )r   rJ   Z
bitwise_orr   r%   r%   r&   test_bitwise_or_ufunc  s    z TestUFuncs.test_bitwise_or_ufuncc                 C   s   | j tj|d d S r   )r   rJ   Zbitwise_xorr   r%   r%   r&   test_bitwise_xor_ufunc  s    z!TestUFuncs.test_bitwise_xor_ufuncc                 C   s   | j tj|d d S r   )r   rJ   invertr   r%   r%   r&   test_invert_ufunc  s    zTestUFuncs.test_invert_ufuncc                 C   s   | j tj|d d S r   )r   rJ   Zbitwise_notr   r%   r%   r&   test_bitwise_not_ufunc  s    z!TestUFuncs.test_bitwise_not_ufuncc                 C   s   | j tj|d d S r   )r   rJ   greaterr   r%   r%   r&   test_greater_ufunc  s    zTestUFuncs.test_greater_ufuncc                 C   s   | j tj|d d S r   )r   rJ   greater_equalr   r%   r%   r&   test_greater_equal_ufunc  s    z#TestUFuncs.test_greater_equal_ufuncc                 C   s   | j tj|d d S r   )r   rJ   lessr   r%   r%   r&   test_less_ufunc   s    zTestUFuncs.test_less_ufuncc                 C   s   | j tj|d d S r   )r   rJ   
less_equalr   r%   r%   r&   test_less_equal_ufunc  s    z TestUFuncs.test_less_equal_ufuncc                 C   s   | j tj|d d S r   )r   rJ   	not_equalr   r%   r%   r&   test_not_equal_ufunc  s    zTestUFuncs.test_not_equal_ufuncc                 C   s   | j tj|d d S r   )r   rJ   equalr   r%   r%   r&   test_equal_ufunc	  s    zTestUFuncs.test_equal_ufuncc                 C   s   | j tj|d d S r   )r   rJ   logical_andr   r%   r%   r&   test_logical_and_ufunc  s    z!TestUFuncs.test_logical_and_ufuncc                 C   s   | j tj|d d S r   )r   rJ   
logical_orr   r%   r%   r&   test_logical_or_ufunc  s    z TestUFuncs.test_logical_or_ufuncc                 C   s   | j tj|d d S r   )r   rJ   logical_xorr   r%   r%   r&   test_logical_xor_ufunc  s    z!TestUFuncs.test_logical_xor_ufuncc                 C   s   | j tj|d d S r   )r   rJ   Zlogical_notr   r%   r%   r&   test_logical_not_ufunc  s    z!TestUFuncs.test_logical_not_ufuncc                 C   s   | j tj|d d S r   )r   rJ   maximumr   r%   r%   r&   test_maximum_ufunc  s    zTestUFuncs.test_maximum_ufuncc                 C   s   | j tj|d d S r   )r   rJ   Zminimumr   r%   r%   r&   test_minimum_ufunc  s    zTestUFuncs.test_minimum_ufuncc                 C   s   | j tj|d d S r   )r   rJ   Zfmaxr   r%   r%   r&   test_fmax_ufunc  s    zTestUFuncs.test_fmax_ufuncc                 C   s   | j tj|d d S r   )r   rJ   Zfminr   r%   r%   r&   test_fmin_ufunc!  s    zTestUFuncs.test_fmin_ufuncc                 C   s&   t jddgt jdttjddfgS )NTFrY   rS   rZ   )rJ   rh   bool_r   ri   rn   r%   r%   r&   bool_additional_inputs(  s    z!TestUFuncs.bool_additional_inputsc                 C   s   | j tj|d|  d d S NZifcbr   )r   rJ   isfiniter:  r   r%   r%   r&   test_isfinite_ufunc.  s      zTestUFuncs.test_isfinite_ufuncc                 C   s   | j tj|d|  d d S r;  )r   rJ   isinfr:  r   r%   r%   r&   test_isinf_ufunc4  s      zTestUFuncs.test_isinf_ufuncc                 C   s   | j tj|d|  d d S r;  )r   rJ   isnanr:  r   r%   r%   r&   test_isnan_ufunc:  s      zTestUFuncs.test_isnan_ufuncc                 C   s   | j tj|d d S r   )r   rJ   signbitr   r%   r%   r&   test_signbit_ufunc@  s    zTestUFuncs.test_signbit_ufuncc                 C   s   | j tj|dd d S r   )r   rJ   copysignr   r%   r%   r&   test_copysign_ufuncC  s    zTestUFuncs.test_copysign_ufuncc                 C   s   | j tj|dd d S r   )r   rJ   Z	nextafterr   r%   r%   r&   test_nextafter_ufuncF  s    zTestUFuncs.test_nextafter_ufuncc                 C   s   | j tj|dd d S r   )r   rJ   modfr   r%   r%   r&   test_modf_ufuncI  s    zTestUFuncs.test_modf_ufuncc                 C   s   | j tj|dd d S r   )r   rJ   frexpr   r%   r%   r&   test_frexp_ufuncQ  s    zTestUFuncs.test_frexp_ufuncc                 C   s   | j tj|dd d S r   )r   rJ   floorr   r%   r%   r&   test_floor_ufuncU  s    zTestUFuncs.test_floor_ufuncc                 C   s   | j tj|dd d S r   )r   rJ   ceilr   r%   r%   r&   test_ceil_ufuncX  s    zTestUFuncs.test_ceil_ufuncc                 C   s   | j tj|dd d S r   )r   rJ   truncr   r%   r%   r&   test_trunc_ufunc[  s    zTestUFuncs.test_trunc_ufuncc                 C   s   | j tj|dd d S r   )r   rJ   spacingr   r%   r%   r&   test_spacing_ufunc^  s    zTestUFuncs.test_spacing_ufuncc                 C   s  |j }t|}dtjfdtjfdtjftjddgddttjddftjddgddttjddftjd	dgd
dttjddfg}|}ttjddttjddg}|}t	
|||D ]\}}	}
|d }|d }|	d }|	d }|dkr"|ttjddks|ttjddkr"q|dkrb|ttjddkrb|tjkrbttjddrbq|dkr|ttjddkr|tjkrttjddrqt|tjst|tjrt|
tjsq| jj||||
f|d}|j}t|tjr$tj|j|
jjd}tj|j|
jjd}n\t|tjr\tj|j|
jjd}tj|j|
jjd}n$tjd|
jjd}tjd|
jjd}|||| |||| t|
d|
}|tjtjfkrdnd}| j|||d qd S )NrS   rT   rW   r   r[   rY   rZ   r]   rU   r_   r   r   r{   rK   singledouble)prec)r5   r:   r   rd   re   rg   rJ   rh   ri   	itertoolsproductrb   rG   rm   r   r   r   r   r   rK   r   getattrrf   	complex64assertPreciseEqual)ro   r8   r|   Z
ufunc_nameZinputs1Zinputs2r   r   Zinput1Zinput2ru   Zinput1_operandinput1_typeZinput2_operandinput2_typer   r   resultr   Zscalar_typerU  r%   r%   r&   binary_ufunc_mixed_types_testd  s       	  

z(TestUFuncs.binary_ufunc_mixed_types_testc                 C   s  t tj}tjdddtjdddddtjdddddtjdddddtjdddddtjdddddg}tjdddddtjdddddtjdddddtjddddddtjddddddtjddddddg}t||D ]~\}}ttj	|j
d}ttj|j
d}| jj|||ftd}|j}	tj|j|jd}
t||
 |	|| | ||
 q
t tj}tjdd	dtjdd	dddtjdd	ddddtjdd	dddtjdd	dddtjdd	ddddtjdd	ddddtjdd	ddddtjdd	ddddg	}|}t||D ]\}}ttj	|j
d}ttj	|j
d}ttj	t|j
|j
d}| jj||||ftd}|j}	t||}
tj|
jd	d}|	||| | ||
 q^d S )
N   r]   rY   rS   	      rZ   r{   r[   )r:   rJ   r   arangereshaper   rO   r   ri   rd   ndimre   rm   r   no_pyobj_flagsr   shaperK   rZ  r   rV  rW  r   )ro   r   Zinput_operandsZoutput_operandsrC   r]  rr   ru   r   r   r   input1_operandsinput2_operandsrD   r[  r\  r%   r%   r&   test_broadcasting  sd    
	

zTestUFuncs.test_broadcastingc              	   C   sD   |  t0 dd }ttjdd}t|||ftd}W 5 Q R X d S )Nc                 S   s   t | |S r   rJ   r   a0a1r%   r%   r&   myadd  s    z2TestUFuncs.test_implicit_output_npm.<locals>.myaddrS   rZ   r{   )assertRaisesr   r   ri   rd   r   re  )ro   rn  Zarr_tyr   r%   r%   r&   test_implicit_output_npm  s    
z#TestUFuncs.test_implicit_output_npmc                 C   sD  dd }t jdddt jdddddt jddddddt jdddddt jdddddt jddddddt jddddddt jddddddt jddddddg	}|}t||D ]l\}}ttj|jd	}ttj|jd	}| j	j
|||ftd
}|j}	t ||}
|	||}t j|
| qd S )Nc                 S   s   t | |S r   rj  rk  r%   r%   r&   r     s    zATestUFuncs.test_broadcast_implicit_output_npm_nrt.<locals>.pyfuncr_  r[   rY   r`  ra  rS   rZ   r{   )rJ   rb  rc  rV  rW  r   ri   rd   rd  rm   r   enable_nrt_flagsr   r   r   assert_array_equal)ro   r   rg  rh  rC   rD   r[  r\  r   r   r   r]  r%   r%   r&   &test_broadcast_implicit_output_npm_nrt  s,    
z1TestUFuncs.test_broadcast_implicit_output_npm_nrtc                 C   sd  dd }t ddddd}t j|dd	}|ddjd }t|}|jjrX|jd
ks\t	t|}|jj
rv|jdkszt	t|}|jdkst	|jjrt	|jj
rt	tt|||gd}|||fg7 }|||fg7 }|||fg7 }|D ]r\}	}
| jj|t|	t|
ftd}||	|
}||	|
}| |jj|jj | |jj
|jj
 t j|| qd S )Nc                 S   s   t | |S r   rj  rk  r%   r%   r&   r     s    z=TestUFuncs.test_implicit_output_layout_binary.<locals>.pyfuncr   rS      r   r   ForderrZ   A   r{   )rJ   linspacerc  rh   Tr   r|   c_contiguouslayoutr   f_contiguousr   rV  permutationsrm   r   rq  r   assertEqualr   rr  )ro   r   XYZXtyYtyZtyZ	testcasesarg0Zarg1r   r   r]  r%   r%   r&   "test_implicit_output_layout_binary  s:    


z-TestUFuncs.test_implicit_output_layout_binaryc                 C   s  dd }t ddddd}t j|dd	}|ddjd }t|}|jjrX|jd
ks\t	t|}|jj
rv|jdkszt	t|}|jdkst	|jjrt	|jj
rt	|||fD ]d}| jj|t|ftd}	||}
|	|}| |
jj|jj | |
jj
|jj
 t j|
| qd S )Nc                 S   s
   t | S r   rJ   r   )rl  r%   r%   r&   r   =  s    z<TestUFuncs.test_implicit_output_layout_unary.<locals>.pyfuncr   rS   rt  r   r   ru  rv  rZ   rx  r{   )rJ   rz  rc  rh   r{  r   r|   r|  r}  r   r~  rm   r   rq  r   r  r   rr  )ro   r   r  r  r  r  r  r  r  r   r   r]  r%   r%   r&   !test_implicit_output_layout_unary<  s2    


z,TestUFuncs.test_implicit_output_layout_unary)dr5   rw   rx   re  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rJ   absr   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  r  r  r  r  r  r  r  r  r  r   r"  r$  r&  r(  r*  r,  r.  r0  r2  r3  r5  r6  r7  r8  r:  r=  r?  rA  rC  rE  rF  r*   rH  rJ  rL  rN  rP  rR  r^  ri  rp  rs  r  r  r%   r%   r%   r&   rz      s      
b		
ID%rz   c                   @   s  e Zd Zdd Zeg g ddfddZeg g dddf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/d0 Zd1d2 Zd3d4 Zd5d Zd6d7 Zd8d9 Zd:d; Zd<d= Z d>d? Z!d@dA Z"dBdC Z#dDdE Z$dFdG Z%dHdI Z&dJdK Z'dLdM Z(dNdO Z)dPdQ Z*dRdS Z+dTdU Z,dVdW Z-dXdY Z.dS )ZTestArrayOperatorsc                 C   s&   |  |jj|jj tj|| d S r   )r  rK   r   rJ   r   r   )ro   r   gotr%   r%   r&   _check_results`  s    z!TestArrayOperators._check_resultsNc                 C   s   t |}t| j}|| |}	|D ]X}
|
\}}||ks$t|tjsFq$| jj|	|f|d}|j	}|	|}||}| 
|| q$d S r   )r@   r   rl   extendrG   r   ri   rm   r   r   r  )ro   operatorr|   r   r   rs   rt   operator_funcrl   r   r   r   rr   r   r   r   r  r%   r%   r&   unary_op_testd  s"    


z TestArrayOperators.unary_op_testFc                 C   s  t |}t| j}	|	| |}
tjd}|	D ]}|\}}tt	|d|}|}||kr\q0|rrtj
d|dd }t|tjr|}|}|rt||k rq0n*|ddd|}t|}|r||k rq0| jj|
||f|d}|j}|
||}|||}| || q0d S )NrS   rK   rY   r   d   
   r{   )rA   r   rl   r  rJ   randomZRandomStater   Zas_dtyperX  r   rG   r   ri   r   uniformZastyper   rm   r   r   r  )ro   r  r|   r   r   rs   rt   positive_rhsr  rl   r   Zrandom_stater   Zinput_operand1rr   Zinput_dtypeZinput_type1ZzeroZinput_operand0Zinput_type0r   r   r   r  r%   r%   r&   binary_op_testy  sB    




z!TestArrayOperators.binary_op_testc                 C   s0   dt jfdt jftddgt t jddfgS )NTFrS   rZ   )r   booleanrJ   rh   ri   rn   r%   r%   r&   bitwise_additional_inputs  s    z,TestArrayOperators.bitwise_additional_inputsc              	   O   sD   | dg }|tjtjttjddttjddg7 }| j||S )Nr   rS   rZ   )
setdefaultr   rf   rg   ri   r  )ro   r!   kwsr   r%   r%   r&   binary_int_op_test  s     z%TestArrayOperators.binary_int_op_testc                 O   s$   | dg }||  7 }| j||S )Nr   )r  r  r  )ro   r!   r  r   r%   r%   r&   binary_bitwise_op_test  s    z)TestArrayOperators.binary_bitwise_op_testc                    s   t |}|} fdd|D }fddD }	fddD }
|	|
 }t||D ]d\}}t|}t|}| jj|||ftd}|j}| }||| | }||| | 	|| qVd S )Nc                    s   g | ]}t j |d qS rY   rJ   rh   r.   rK   )
lhs_valuesr%   r&   r0     s   z6TestArrayOperators.inplace_op_test.<locals>.<listcomp>c                    s   g | ]}t j |d qS r  r  r  )
rhs_valuesr%   r&   r0     s   c                    s   g | ]} D ]}||qqS r%   r%   )r.   vrK   )
rhs_dtypesr%   r&   r0     s       r{   )
rI   rV  rW  r   rm   r   re  r   copyrZ  )ro   r  r  r  Z
lhs_dtypesr  r  r   Z
lhs_inputsZ
rhs_arraysZrhs_scalarsZ
rhs_inputslhsrhsZlhs_typeZrhs_typer   r   r   r  r%   )r  r  r  r&   inplace_op_test  s,    



z"TestArrayOperators.inplace_op_testc              	   C   s&   |  |||tjtjftjtjtjfS r   )r  rJ   rf   rg   re   ro   r  r  r  r%   r%   r&   inplace_float_op_test  s    

z(TestArrayOperators.inplace_float_op_testc                 C   s*   |  |||tjtjtjftjtjf d S r   )r  rJ   rk   rc   re   rb   r  r%   r%   r&   inplace_int_op_test  s    

z&TestArrayOperators.inplace_int_op_testc                 C   s0   |  ||| | |||tjftjtjf d S r   )r  r  rJ   r9  r  r%   r%   r&   inplace_bitwise_op_test  s
    
 
z*TestArrayOperators.inplace_bitwise_op_testc                 C   s   |  d d S N+r  rn   r%   r%   r&   test_unary_positive_array_op  s    z/TestArrayOperators.test_unary_positive_array_opc                 C   s   |  d d S N-r  rn   r%   r%   r&   test_unary_negative_array_op  s    z/TestArrayOperators.test_unary_negative_array_opc              
   C   s<   | j dtjtjttjddttjddg|  d d S )N~rS   rZ   )r   r   )r  r   rf   rg   ri   r  rn   r%   r%   r&   test_unary_invert_array_op  s    z-TestArrayOperators.test_unary_invert_array_opc                 C   s:   |  ddddgdddg |  tjdddgdddg d S )Nz+=rT         ?r_  r         @)r  r  iaddrn   r%   r%   r&   test_inplace_add  s    z#TestArrayOperators.test_inplace_addc                 C   s:   |  ddddgdddg |  tjdddgdddg d S )Nz-=rT   r  r_  r  r   r  )r  r  isubrn   r%   r%   r&   test_inplace_sub  s    z#TestArrayOperators.test_inplace_subc                 C   s:   |  ddddgdddg |  tjdddgdddg d S )Nz*=rT   r  r_  r  r   r  )r  r  imulrn   r%   r%   r&   test_inplace_mul  s    z#TestArrayOperators.test_inplace_mulc                 C   s:   |  ddddgdddg |  tjdddgdddg d S )Nz//=rT   r  r_  r        ?r  )r  r  	ifloordivrn   r%   r%   r&   test_inplace_floordiv  s    z(TestArrayOperators.test_inplace_floordivc                 C   s:   |  ddddgdddg |  tjdddgdddg d S )	Nz/=rT   r  r_  r  r   r  r  )r  r  itruedivrn   r%   r%   r&   test_inplace_div
  s    z#TestArrayOperators.test_inplace_divc                 C   s:   |  ddddgdddg |  tjdddgdddg d S )Nz%=rT   r  r_  r  ry  r  )r  r  imodrn   r%   r%   r&   test_inplace_remainder  s    z)TestArrayOperators.test_inplace_remainderc                 C   s:   |  ddddgdddg |  tjdddgdddg d S )Nz**=rT   r  r_  r  ry  r  )r  r  ipowrn   r%   r%   r&   test_inplace_pow  s    z#TestArrayOperators.test_inplace_powc              	   C   sJ   |  ddddddgdddd	d
g |  tjdddddgdddd	d
g d S )Nz&=r   rS   ry  r_  3      r   *      )r  r  iandrn   r%   r%   r&   test_inplace_and  s    "z#TestArrayOperators.test_inplace_andc              	   C   sJ   |  ddddddgdddd	d
g |  tjdddddgdddd	d
g d S )Nz|=r   rS   ry  r_  r  r  r   r  r  )r  r  iorrn   r%   r%   r&   test_inplace_or  s    "z"TestArrayOperators.test_inplace_orc              	   C   sJ   |  ddddddgdddd	d
g |  tjdddddgdddd	d
g d S )Nz^=r   rS   ry  r_  r  r  r   r  r  )r  r  ixorrn   r%   r%   r&   test_inplace_xor  s    "z#TestArrayOperators.test_inplace_xorc                 C   sB   |  dddddgddddg |  tjddddgddddg d S )	Nz<<=r   r   rS   r      )r  r  ilshiftrn   r%   r%   r&   test_inplace_lshift"  s    z&TestArrayOperators.test_inplace_lshiftc                 C   sB   |  dddddgddddg |  tjddddgddddg d S )	Nz>>=r   r   r  r  rS   r   r  )r  r  irshiftrn   r%   r%   r&   test_inplace_rshift&  s    z&TestArrayOperators.test_inplace_rshiftc                 C   s   dd }t d}||}| |d |d ko<|d |d k t d}t||}| |d |d kox|d |d k t j|| t j|| dS )z
        Verify that the unary positive operator copies values, and doesn't
        just alias to the input array (mirrors normal Numpy/Python
        interaction behavior).
        c                 S   s   | 
 }d| d< d|d< |S )Nr_  r   r   rS   r%   )rm  a2r%   r%   r&   r   1  s    z:TestArrayOperators.test_unary_positive_array_op.<locals>.fr  r   rS   N)rJ   r   
assertTruer   r   rr  )ro   r   rm  r  a3Za4r%   r%   r&   r  *  s    
&
&c                 C   s   |  d d S r  r  rn   r%   r%   r&   test_add_array_opC  s    z$TestArrayOperators.test_add_array_opc                 C   s   |  d d S r  r  rn   r%   r%   r&   test_subtract_array_opF  s    z)TestArrayOperators.test_subtract_array_opc                 C   s   |  d d S )N*r  rn   r%   r%   r&   test_multiply_array_opI  s    z)TestArrayOperators.test_multiply_array_opc                 C   s   d }t j}| jd|d d S )N/)rs   )r   rg   r  )ro   r   r%   r%   r&   test_divide_array_opL  s    z'TestArrayOperators.test_divide_array_opc                 C   sd  t dtjft dtjft dtjft dtjft dtjft dtjft dtjft dtjft dtjft d	tjft jdd
gddt	tjddft jddgddt	tjddft jdddgddt	tjddft jdddgddt	tjddft jddgddt	tjddft jdd	gddt	tjddfg| _
| d d S )NrS   r   r   r  rU   r  g      g      @ry  rX   rY   rZ   r_  r[   rT   r   r\      r]   r^   r_   z//)rJ   rb   r   rc   rd   re   rf   rg   rh   ri   rl   r  rn   r%   r%   r&   test_floor_divide_array_opQ  s$      ""  z-TestArrayOperators.test_floor_divide_array_opc                 C   s   |  d d S )N%r  rn   r%   r%   r&   test_remainder_array_opk  s    z*TestArrayOperators.test_remainder_array_opc                 C   s   | j ddd d S )Nz**Tr  r  rn   r%   r%   r&   test_power_array_opn  s    z&TestArrayOperators.test_power_array_opc                 C   s   | j ddd d S )Nz<<Tr  r  rn   r%   r%   r&   test_left_shift_array_opq  s    z+TestArrayOperators.test_left_shift_array_opc                 C   s   | j ddd d S )Nz>>Tr  r  rn   r%   r%   r&   test_right_shift_array_opt  s    z,TestArrayOperators.test_right_shift_array_opc                 C   s   |  d d S )N&r  rn   r%   r%   r&   test_bitwise_and_array_opw  s    z,TestArrayOperators.test_bitwise_and_array_opc                 C   s   |  d d S )N|r  rn   r%   r%   r&   test_bitwise_or_array_opz  s    z+TestArrayOperators.test_bitwise_or_array_opc                 C   s   |  d d S )N^r  rn   r%   r%   r&   test_bitwise_xor_array_op}  s    z,TestArrayOperators.test_bitwise_xor_array_opc                 C   s   |  d d S )Nz==r  rn   r%   r%   r&   test_equal_array_op  s    z&TestArrayOperators.test_equal_array_opc                 C   s   |  d d S )N>r  rn   r%   r%   r&   test_greater_array_op  s    z(TestArrayOperators.test_greater_array_opc                 C   s   |  d d S )Nz>=r  rn   r%   r%   r&   test_greater_equal_array_op  s    z.TestArrayOperators.test_greater_equal_array_opc                 C   s   |  d d S )N<r  rn   r%   r%   r&   test_less_array_op  s    z%TestArrayOperators.test_less_array_opc                 C   s   |  d d S )Nz<=r  rn   r%   r%   r&   test_less_equal_array_op  s    z+TestArrayOperators.test_less_equal_array_opc                 C   s   |  d d S )Nz!=r  rn   r%   r%   r&   test_not_equal_array_op  s    z*TestArrayOperators.test_not_equal_array_op)/r5   rw   rx   r  rq  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  r  r  r  r  r  r  r  r  r  r  r  r  r%   r%   r%   r&   r  ^  sn     
  
+		
r  c                   @   s8   e Zd ZdZeZdd Zdd Zdd Zefdd	Z	d
S )TestScalarUFuncsai  check the machinery of ufuncs works when the result is an scalar.
    These are not exhaustive because:
    - the machinery to support this case is the same for all the functions of a
      given arity.
    - the result of the inner function itself is already tested in TestUFuncs

    This class tests regular uses. A subclass tests the no python backend.
    c                 C   s<  t ||D ]*\}}t||| jd}|j}|| }|t|| }	d||}
ttjtj	ftj	tjftj
tj	ftj	tj
fg}||krt|	}	nLt|	jtjrt|	}	n2t|	jtjrt|	}	nt|	jtjrt|	}	|jj|jjf }tdd |D rd}ntdd |D r d}nd}| j||	|
|d	 q
d S )
Nr{   zfor args {0} typed {1}c                 S   s   g | ]}|t jkqS r%   )r   rf   r.   tr%   r%   r&   r0     s     z.TestScalarUFuncs.run_ufunc.<locals>.<listcomp>rS  c                 S   s   g | ]}|t jkqS r%   )r   rg   r  r%   r%   r&   r0     s     rT  exact)r   rU  )rO   r   _compile_flagsr   rQ   r,   setr   rc   rd   re   floatrJ   Z
issubdtyperK   Zinexactintegerintr9  bool	signaturer!   return_typer   rZ  )ro   r   Z	arg_typesZ
arg_valuesrP   r!   r   r   r  r   r   specialZalltypesrU  r%   r%   r&   	run_ufunc  s2    
 



zTestScalarUFuncs.run_ufuncc                 C   sR   dd }ddddddg}t jft jft jft jft jft jfg}| ||| d S )Nc                 S   s
   t | S r   r  rC   r%   r%   r&   _func  s    z7TestScalarUFuncs.test_scalar_unary_ufunc.<locals>._func)ry  )rS   )皙?)皙?)r   rc   rb   re   rd   rf   rg   r
  ro   r  valstysr%   r%   r&   test_scalar_unary_ufunc  s      z(TestScalarUFuncs.test_scalar_unary_ufuncc                 C   sR   dd }ddddddg}t jt jt jt jt jt jg}| |t||t|| d S )Nc                 S   s   t | |S r   rj  rB   r%   r%   r&   r    s    z@TestScalarUFuncs.test_scalar_binary_uniform_ufunc.<locals>._funcry  rS   r  r  )	r   rc   rb   re   rd   rf   rg   r
  rO   r  r%   r%   r&    test_scalar_binary_uniform_ufunc  s       z1TestScalarUFuncs.test_scalar_binary_uniform_ufuncc                 C   sV   dd }ddddddg}t jt jt jt jt jt jg}| |t	||t	|| d S )Nc                 S   s   t | |S r   rj  rB   r%   r%   r&   r    s    z>TestScalarUFuncs.test_scalar_binary_mixed_ufunc.<locals>._funcry  rS   r  r  )
r   rc   rb   re   rd   rf   rg   r
  rV  rW  )ro   r|   r  r  r  r%   r%   r&   test_scalar_binary_mixed_ufunc  s      
z/TestScalarUFuncs.test_scalar_binary_mixed_ufuncN)
r5   rw   rx   __doc__enable_pyobj_flagsr  r
  r  r  r  r%   r%   r%   r&   r    s   	/
r  c                   @   s   e Zd ZdZeZdS )TestScalarUFuncsNoPythonz:Same tests as TestScalarUFuncs, but forcing no python modeN)r5   rw   rx   r  re  r  r%   r%   r%   r&   r    s   r  c                   @   s6   e Zd Zdd Zeejdkddd Zdd Z	d	S )
TestUfuncIssuesc                 C   sP   t dgdd }tjddd}tjddd}| ||||| ||   d S )Nz(float64,float64)c                 S   s   t | |t | | S r   rj  )x1Zx2r%   r%   r&   foo  s    z+TestUfuncIssues.test_issue_651.<locals>.foor  r_   rY   )r   rJ   rb  rZ  )ro   r  abr%   r%   r&   test_issue_651  s
    
zTestUfuncIssues.test_issue_651)rS      z4Complex floor division support removed in NumPy 1.22c                 C   s8   dd }t |tjtjg}| |dd|dd d S )Nc                 S   s   t | |S r   )rJ   r   rB   r%   r%   r&   r    s    z+TestUfuncIssues.test_issue_713.<locals>.foo              ?)r   r   Z
complex128r  r   )ro   r  r   r%   r%   r&   test_issue_713   s    zTestUfuncIssues.test_issue_713c                    s   dd }|t dd  fdd}tddd	gtd
ddgg}|D ]4}||d	 ||td	 ||tddd	g qNdS )zF
        <float32 ** int> should return float32, not float64.
        c                 S   s   t | |S r   )rJ   r   rB   r%   r%   r&   r    s    z,TestUfuncIssues.test_issue_2006.<locals>.fooTZnopythonc                    s2    | |}t j|| | |j| j d S r   )rJ   r   r   r  rK   )rC   rD   r  r   r   ro   r%   r&   check  s    
z.TestUfuncIssues.test_issue_2006.<locals>.checkrS   ry  r_  r  y      @      N)r   rJ   rf   rY  rd   re   )ro   r  r#  xsrC   r%   r"  r&   test_issue_2006	  s     
zTestUfuncIssues.test_issue_2006N)
r5   rw   rx   r  r   ZskipIfr   Znumpy_versionr   r%  r%   r%   r%   r&   r    s   

r  c                   @   sl   e Zd ZdZdZdddddddZddd	Zd
d Zdd Zdd Z	e
dd Ze
dd Ze
dd ZdS )_LoopTypesTestera  Test code generation for the different loop types defined by ufunc.

    This test relies on class variables to configure the test. Subclasses
    of this class can just override some of these variables to check other
    ufuncs in a different compilation context. The variables supported are:

    _funcs: the ufuncs to test
    _compile_flags: compilation flags to use (to force nopython mode)
    _skip_types: letter types that force skipping the loop when testing
                 if present in the NumPy ufunc signature.
    _supported_types: only test loops where all the types in the loop
                      signature are in this collection. If unset, all.

    Note that both, _skip_types and _supported_types must be met for a loop
    to be tested.

    The NumPy ufunc signature has a form like 'ff->f' (for a binary ufunc
    loop taking 2 floats and resulting in a float). In a NumPy ufunc object
    you can get a list of supported signatures by accessing the attribute
    'types'.
    ZOegGry  r   r   ))r  ru  )r  D)r  ru  )r   r'  )r  ru  )r   dr   c                 C   s0  |dkrt jddddg|dS |dkr<t jddddg|dS |d	krZt jd
ddd
g|dS |d dkrt|dkrvd}t jddddg|dS |d dkrt|dkrd}t jddddg|dS |dkrt jdddtdg|dS |dkrtjdk rd}nd}t j|ddtd dg|dS td |f d!S )"z<return a suitable array argument for testing the letter typeZbhilqrS   r   r   r  rY   ZBHILQry  ?TFmzm8[D]ZNaTMzM8[D]ZNat   fdr  g      rV   nanFDr   y             y              y      ?      ?r  y                ztype %r not understoodN)rJ   rh   lenr  r   platformRuntimeError)ro   a_letter_typeindexZnegzeror%   r%   r&   _arg_for_typeB  s4    
z_LoopTypesTester._arg_for_typec                    s   |d |j  ||j d    t| dg rHtfdd D rHd S t| dg tfdd D rnd S t| dg }|rt fdd|D sd S | ||  d S )NZ_supported_typesc                 3   s   | ]}| kV  qd S r   r%   r.   l)supported_typesr%   r&   	<genexpr>s  s     z/_LoopTypesTester._check_loop.<locals>.<genexpr>_skip_typesc                 3   s   | ]}| kV  qd S r   r%   r7  )
skip_typesr%   r&   r:  v  s     _required_typesc                 3   s   | ]}| kV  qd S r   r%   r7  )letter_typesr%   r&   r:  {  s   )r   r   rX  r   _check_ufunc_with_dtypes)ro   r1   r8   loopZrequired_typesr%   )r>  r<  r9  r&   _check_loopj  s    z_LoopTypesTester._check_loopc                    s  dd |D }dd |D }t || jd} fddt|D }|D ]} j| qFdd |D }	|j|  ||	  t||	|D ]\}
}} |
||\}}|jj	} j
|j|fd}|dkrd	nd
}|dkrdn|}dddddg}||j||||} j|||||d qd S )Nc                 S   s   g | ]}t |qS r%   )rJ   rK   r  r%   r%   r&   r0     s     z=_LoopTypesTester._check_ufunc_with_dtypes.<locals>.<listcomp>c                 S   s   g | ]}t t|d dqS )rS   rZ   )r   ri   r   r  r%   r%   r&   r0     s     r{   c                    s$   g | ]\}} j ||d dqS )r5  ry  )r6  repeat)r.   r5  r  rn   r%   r&   r0     s   c                 S   s   g | ]}|  qS r%   )r  )r.   r  r%   r%   r&   r0     s     rS   ZfFrS  r   ZdDrT  r   z ufunc '{0}' arrays differ ({1}):z	args: {2}zexpected {3}zgot {4})rU  r   ulps)r   r  	enumerater  shuffler   rO   _fixup_resultsrK   char_ulpsgetr5   r2   r,   rZ  )ro   r1   r8   ZdtypesZarg_dtyZarg_nbtyr   Zc_argsZarrZpy_argsrK   py_argc_argZtypecharrD  rU  r   r%   rn   r&   r?    s4    

  z)_LoopTypesTester._check_ufunc_with_dtypesc                 C   s   ||fS r   r%   )ro   rK   rK  rL  r%   r%   r&   rG    s    z_LoopTypesTester._fixup_resultsc                 C   s   |j D ]}| || qd S r   )r   _inject_test)clsr8   r@  r%   r%   r&   _check_ufunc_loops  s    
z#_LoopTypesTester._check_ufunc_loopsc              	      s0    fdd}t | dj dd| d S )Nc                    s   t }| |  d S r   )r:   rA  )ro   r1   r@  r8   r%   r&   test_template  s    z4_LoopTypesTester._inject_test.<locals>.test_templateztest_{0}_{1}z->_)setattrr,   r5   replace)rN  r8   r@  rQ  r%   rP  r&   rM    s    
z_LoopTypesTester._inject_testc                 C   s   | j D ]}| | qd S r   )_ufuncsrO  )rN  r8   r%   r%   r&   autogenerate  s    
z_LoopTypesTester.autogenerateN)r   )r5   rw   rx   r  r;  rI  r6  rA  r?  rG  classmethodrO  rM  rV  r%   r%   r%   r&   r&  !  s&   
(

r&  c                   @   sr   e Zd ZeZedd Zeej	 eej
 eej eej eej eej dZdej ZdS )TestLoopTypesIntNoPythonNz?bBhHiIlLqQfdFDmMO)r5   rw   rx   re  r  r   rU  removerJ   r   r   
left_shiftright_shiftr   r   r=  r&  r;  r%   r%   r%   r&   rX    s   rX  c                   @   s.   e Zd ZeZejejgZdZ	de
j d ZdS )(TestLoopTypesSubtractAndNegativeNoPythonz?bBhHiIlLqQfdFDmMOr)  N)r5   rw   rx   re  r  rJ   r   r   rU  r=  r&  r;  r%   r%   r%   r&   r]    s   r]  c                       s8   e Zd ZeZejgZdZde	j
 Z
d fdd	Z  ZS )TestLoopTypesReciprocalNoPythonbBhHiIlLqQfdFDr^  r   c                    s.   t | j| j||d}|dkr*d||dk< |S )NrB  
bBhHiIlLqQr  r   r`   rq   r6  ro   r4  r5  resrp   r%   r&   r6    s    z-TestLoopTypesReciprocalNoPython._arg_for_type)r   )r5   rw   rx   re  r  rJ   r   rU  r=  r&  r;  r6  ry   r%   r%   rp   r&   r_    s
   
r_  c                       s8   e Zd ZeZejgZdZde	j
 Z
d fdd	Z  ZS )TestLoopTypesPowerNoPythonr`  r^  r   c                    s6   t | j| j||d}|dkr2|dkr2d||dk < |S )NrB  ra  rS   r_  r   rb  rc  rp   r%   r&   r6    s    z(TestLoopTypesPowerNoPython._arg_for_type)r   )r5   rw   rx   re  r  rJ   r   rU  r=  r&  r;  r6  ry   r%   r%   rp   r&   re    s
   
re  c                       s8   e Zd ZeZejgZdZde	j
 Z
d fdd	Z  ZS )!TestLoopTypesIntLeftShiftNoPythonra  rY  r   c                    s@   t | j| j||d}|dkr<|jjd }t|d|d }|S NrB  rS      r   )r`   rq   r6  rK   itemsizerJ   clipro   r4  r5  rd  Z	bit_countrp   r%   r&   r6    s    z/TestLoopTypesIntLeftShiftNoPython._arg_for_type)r   )r5   rw   rx   re  r  rJ   r[  rU  r=  r&  r;  r6  ry   r%   r%   rp   r&   rf    s
   
rf  c                       s8   e Zd ZeZejgZdZde	j
 Z
d fdd	Z  ZS )"TestLoopTypesIntRightShiftNoPythonra  rY  r   c                    sR   t | j| j||d}|dkr<|jjd }t|d|d }|dkrNt|}|S rg  )r`   rq   r6  rK   ri  rJ   rj  r  rk  rp   r%   r&   r6    s    

z0TestLoopTypesIntRightShiftNoPython._arg_for_type)r   )r5   rw   rx   re  r  rJ   r\  rU  r=  r&  r;  r6  ry   r%   r%   rp   r&   rl    s
   
rl  c                   @   s6   e Zd ZeZejejejgZ	dZ
dej Zdd ZdS ) TestLoopTypesFloorDivideNoPythonr`  r^  c                 C   sF   |j dkr>t|t|@ }||dk|dk@ O }|| ||< ||fS )Nr   rV   )r   rJ   r>  r@  )ro   rK   rK  rL  predr%   r%   r&   rG  4  s
    
z/TestLoopTypesFloorDivideNoPython._fixup_resultsN)r5   rw   rx   re  r  rJ   r   r   divmodrU  r=  r&  r;  rG  r%   r%   r%   r&   rm  .  s
   
rm  c                   @   sj   e Zd ZeZedd Zer(ee	j
 ee	j ee	j ee	j ee	j dZdej ZdS )TestLoopTypesFloatNoPythonNr.  ZFDmMO)r5   rw   rx   re  r  r   rU  	iswindowsrZ  rJ   rB  r   r   ro  r   r=  r&  r;  r%   r%   r%   r&   rp  A  s   rp  c                   @   s*   e Zd ZeZedd ZdZdej	 Z	dS )TestLoopTypesComplexNoPythonNr0  r^  )
r5   rw   rx   re  r  r   rU  r=  r&  r;  r%   r%   r%   r&   rr  P  s   rr  c                   @   sd   e Zd ZeZedd Zeej	 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 )TestLoopTypesDatetimeNoPythonNZmMc              	   C   s   t j}t|}| ||dddg | ||dddg | ||dddg | ||dddg | t | ||dddg W 5 Q R X d S )Nm8[s]m8[m]m8[ms])rJ   r   r:   r?  ro  r   ro   r8   r1   r%   r%   r&   test_addo  s    z&TestLoopTypesDatetimeNoPython.test_addc              	   C   s   t j}t|}| ||dddg | ||dddg | ||dddg | ||dddg | t | ||dddg W 5 Q R X d S )NM8[s]M8[m]rt  rv  ru  )rJ   r   r:   r?  ro  r   rw  r%   r%   r&   test_subtract|  s    z+TestLoopTypesDatetimeNoPython.test_subtractc              	   C   sd   t j}t|}| ||dddg | ||dddg | t | ||dddg W 5 Q R X d S )Nrt  qzm8[us]ru  )rJ   r   r:   r?  ro  r   rw  r%   r%   r&   test_multiply  s    z+TestLoopTypesDatetimeNoPython.test_multiplyc              	   C   s   t j}t|}| ||dddg | ||dddg | ||dddg | ||dddg | t | ||dddg W 5 Q R X d S )Nru  rt  r(  r|  )rJ   r   r:   r?  ro  r   rw  r%   r%   r&   test_true_divide  s    z.TestLoopTypesDatetimeNoPython.test_true_dividec              	   C   sd   t j}t|}| ||dddg | ||dddg | t | ||dddg W 5 Q R X d S )Nru  r|  rt  r(  )rJ   r   r:   r?  ro  r   rw  r%   r%   r&   test_floor_divide  s    z/TestLoopTypesDatetimeNoPython.test_floor_dividec                 C   s\   t |}| ||dddg | ||dddg | ||dddg | ||dddg d S )Nru  rt  r)  rz  ry  )r:   r?  rw  r%   r%   r&   _check_comparison  s
    z/TestLoopTypesDatetimeNoPython._check_comparisonc                 C   s0   t jt jt jt jt jt jfD ]}| | qd S r   )rJ   r+  r)  r%  r'  r!  r#  r  )ro   r8   r%   r%   r&   test_comparisons  s
     z.TestLoopTypesDatetimeNoPython.test_comparisons)r5   rw   rx   re  r  r   rU  rZ  rJ   ro  r=  rx  r{  r}  r~  r  r  r  r%   r%   r%   r&   rs  \  s   


	rs  c                   @   s(   e Zd ZeZdd Zdd Zdd ZdS )TestUFuncBadArgsNoPythonc                 C   s*   dd }| j tt|tjgtj| jd d S )Nc                 S   s   t | }|S )zerror: np.add requires two argsrj  )rC   r]  r%   r%   r&   r$     s    
z8TestUFuncBadArgsNoPython.test_missing_args.<locals>.funcr  r|   ro  r   r   r   rg   r  ro   r$   r%   r%   r&   test_missing_args  s
     z*TestUFuncBadArgsNoPython.test_missing_argsc                 C   s:   dd }t t jdd}| jtt||gd || jd d S )Nc                 S   s   t | | ||}|S )zerror: too many argsrj  )rC   outZout2r]  r%   r%   r&   r$     s    z9TestUFuncBadArgsNoPython.test_too_many_args.<locals>.funcrS   rZ   r_  r  )r   ri   rg   ro  r   r   r  )ro   r$   Z
array_typer%   r%   r&   test_too_many_args  s     z+TestUFuncBadArgsNoPython.test_too_many_argsc                 C   s*   dd }| j tt|tjgtj| jd d S )Nc                 S   s   d}t | | | dS )z0error: scalar as a return value is not supportedr   Nrj  rB   r%   r%   r&   r$     s    zITestUFuncBadArgsNoPython.test_no_scalar_result_by_reference.<locals>.funcr  r  r  r%   r%   r&   "test_no_scalar_result_by_reference  s
     z;TestUFuncBadArgsNoPython.test_no_scalar_result_by_referenceN)r5   rw   rx   re  r  r  r  r  r%   r%   r%   r&   r    s   

r  c                   @   s   e Zd Zdd ZdS ) TestUFuncCompilationThreadSafetyc                    sf   g  t dd  fddfddtdD }|D ]}|  q8|D ]}|  qJ|   dS )	z{
        Test that (lazy) compiling from several threads at once doesn't
        produce errors (see issue #2403).
        c                 S   s   | d S )NrS   r%   r  r%   r%   r&   r    s    z7TestUFuncCompilationThreadSafety.test_lock.<locals>.fooc               
      sl   z:t jdt jd} t jdt jdd }t j| | W n, tk
rf } z | W 5 d }~X Y nX d S )N)r  rY   g      ?)rJ   Zonesrg   r   rr  	Exceptionappend)r  r   e)errorsr  r%   r&   r'     s    z;TestUFuncCompilationThreadSafety.test_lock.<locals>.wrapperc                    s   g | ]}t j d qS ))target)	threadingThreadr-   )r'   r%   r&   r0     s     z>TestUFuncCompilationThreadSafety.test_lock.<locals>.<listcomp>r   N)r   r3   startr2   ZassertFalse)ro   threadsr  r%   )r  r  r'   r&   	test_lock  s    


z*TestUFuncCompilationThreadSafety.test_lockN)r5   rw   rx   r  r%   r%   r%   r&   r    s   r  c                   @   s   e Zd Zdd Zdd ZdS )TestUfuncOnContextc              	   C   sr   t j}|tj}| |t ttj}| || t	 }| 
t}t| W 5 Q R X | |jj|f d S r   )r   Ztarget_contextget_ufunc_inforJ   r   ZassertIsInstancedictr   r  objectro  KeyError	exceptionr!   )ro   	targetctxZadd_infor   Zbadkeyraisesr%   r%   r&   test_cpu_get_ufunc_info  s    z*TestUfuncOnContext.test_cpu_get_ufunc_infoc              	   C   sD   t tjd}| t}|tj W 5 Q R X | t	|j
d d S )Ncpuz<<numba\..*\.BaseContext object at .*> does not support ufunc)r   r   Ztyping_contextro  NotImplementedErrorr  rJ   r   assertRegexrH   r  )ro   r  r  r%   r%   r&   test_base_get_ufunc_info  s    z+TestUfuncOnContext.test_base_get_ufunc_infoN)r5   rw   rx   r  r  r%   r%   r%   r&   r    s   r  c                   @   s   e Zd Zdd ZdS )TestUfuncWriteInputc                 C   sp   t dgddddd }tjdd}tj|tjd	}||| tjtjdd
d
d
dgtj	d	|j
dd d S )Nzvoid(float64[:], uint8[:])z(n)->(n)Tr!  c                 S   s(   t | jD ]}|d dkr
d||< q
d S )Nr   r   rS   )r3   r   )rC   r  r/   r%   r%   r&   r$     s    z6TestUfuncWriteInput.test_write_input_arg.<locals>.funcr  r   rY   Fr   )Zaxis)r   rJ   r  ZrandZ
zeros_likerj   r   rr  rh   r9  r   )ro   r$   rC   r  r%   r%   r&   test_write_input_arg  s    


z(TestUfuncWriteInput.test_write_input_argN)r5   rw   rx   r  r%   r%   r%   r&   r    s   r  __main__)Wr(   rV  rer   r   r  r  ZnumpyrJ   r   Znumbar   r   r   Z
numba.corer   r   r   Znumba.core.compilerr   r	   r
   Znumba.np.numpy_supportr   r   r   Znumba.core.errorsr   r   r   Znumba.tests.supportr   r   r   r   Znumba.core.typing.npydeclr   r   Znumba.npr   Znumba.core.registryr   Znumba.core.baser   r   r   __itemsize__Zis32bitsr2  r   rq  r  Zenable_pyobjectZno_rewritesre  rq  Znrtr*   r:   r@   rA   rI   rQ   rR   rz   r  r  r  r  r&  rX  rV  r]  r_  re  rf  rl  rm  rp  rr  rs  r  r  r  r  r5   mainr%   r%   r%   r&   <module>   s   
	>     ?  7\- 	\
