U
    ,d                     @   s  d dl mZm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 d dl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/d0 Z%d1d2 Z&d3d4 Z'd5d6 Z(d7d8 Z)d9d: Z*d;d< Z+d=d> Z,d?d@ Z-dAdB Z.dCdD Z/dEdF Z0dGdH Z1dIdJ Z2dKdL Z3dMdN Z4dOdP Z5dQdR Z6dSdT Z7dUdV Z8dWdX Z9dYdZ Z:d[d\ Z;d]d^ Z<d_d` Z=dadb Z>G dcdd ddeeZ?e?@  G dedf dfeeZAeAB  eCdgkreD  dS )h    )productcombinations_with_replacementN)jittypeof)compile_isolated)numpy_version)TestCaseMemoryLeakMixintagc                 C   s   |   S N)allarr r   E/tmp/pip-unpacked-wheel-eu7e0c37/numba/tests/test_array_reductions.py	array_all   s    r   c                 C   s
   t | S r   )npr   r   r   r   r   array_all_global   s    r   c                 C   s   |   S r   )anyr   r   r   r   	array_any   s    r   c                 C   s
   t | S r   )r   r   r   r   r   r   array_any_global   s    r   c                 C   s   |   S r   )cumprodr   r   r   r   array_cumprod   s    r   c                 C   s
   t | S r   )r   r   r   r   r   r   array_cumprod_global   s    r   c                 C   s
   t | S r   )r   Z
nancumprodr   r   r   r   array_nancumprod   s    r   c                 C   s   |   S r   )cumsumr   r   r   r   array_cumsum!   s    r   c                 C   s
   t | S r   )r   r   r   r   r   r   array_cumsum_global$   s    r   c                 C   s
   t | S r   )r   Z	nancumsumr   r   r   r   array_nancumsum'   s    r   c                 C   s   |   S r   )sumr   r   r   r   	array_sum*   s    r    c                 C   s
   t | S r   )r   r   r   r   r   r   array_sum_global-   s    r!   c                 C   s   |   S r   )prodr   r   r   r   
array_prod0   s    r#   c                 C   s
   t | S r   )r   r"   r   r   r   r   array_prod_global3   s    r$   c                 C   s   |   S r   )meanr   r   r   r   
array_mean6   s    r&   c                 C   s
   t | S r   )r   r%   r   r   r   r   array_mean_global9   s    r'   c                 C   s   |   S r   )varr   r   r   r   	array_var<   s    r)   c                 C   s
   t | S r   )r   r(   r   r   r   r   array_var_global?   s    r*   c                 C   s   |   S r   )stdr   r   r   r   	array_stdB   s    r,   c                 C   s
   t | S r   )r   r+   r   r   r   r   array_std_globalE   s    r-   c                 C   s   |   S r   )minr   r   r   r   	array_minH   s    r/   c                 C   s
   t | S r   )r   r.   r   r   r   r   array_min_globalK   s    r0   c                 C   s   |   S r   )maxr   r   r   r   	array_maxN   s    r2   c                 C   s
   t | S r   )r   r1   r   r   r   r   array_max_globalQ   s    r3   c                 C   s   |   S r   argminr   r   r   r   array_argminT   s    r6   c                 C   s
   t | S r   r   r5   r   r   r   r   array_argmin_globalW   s    r8   c                 C   s   |   S r   argmaxr   r   r   r   array_argmaxZ   s    r;   c                 C   s
   t | S r   r   r:   r   r   r   r   array_argmax_global]   s    r=   c                 C   s
   t | S r   )r   medianr   r   r   r   array_median_global`   s    r?   c                 C   s
   t | S r   )r   Znanminr   r   r   r   array_nanminc   s    r@   c                 C   s
   t | S r   )r   Znanmaxr   r   r   r   array_nanmaxf   s    rA   c                 C   s
   t | S r   )r   Znanmeanr   r   r   r   array_nanmeani   s    rB   c                 C   s
   t | S r   )r   Znansumr   r   r   r   array_nansuml   s    rC   c                 C   s
   t | S r   )r   Znanprodr   r   r   r   array_nanprodo   s    rD   c                 C   s
   t | S r   )r   Znanstdr   r   r   r   array_nanstdr   s    rE   c                 C   s
   t | S r   )r   Znanvarr   r   r   r   array_nanvaru   s    rF   c                 C   s
   t | S r   )r   Z	nanmedianr   r   r   r   array_nanmedian_globalx   s    rG   c                 C   s   t | |S r   )r   Z
percentiler   qr   r   r   array_percentile_global{   s    rJ   c                 C   s   t | |S r   )r   ZnanpercentilerH   r   r   r   array_nanpercentile_global~   s    rK   c                 C   s
   t | S r   )r   ptpar   r   r   array_ptp_global   s    rO   c                 C   s   |   S r   )rL   rM   r   r   r   	array_ptp   s    rP   c                 C   s   t | |S r   )r   ZquantilerH   r   r   r   array_quantile_global   s    rQ   c                 C   s   t | |S r   )r   ZnanquantilerH   r   r   r   array_nanquantile_global   s    rR   c                    sr    t jkrdd }n fdd}|d}|ddd}|dd d d jd	d
d}|jjsd|jjrht|||gS )Nc                 S   s&   | d dkst tddg| d  S )N   r      )AssertionErrorr   bool_nr   r   r   factory   s    z!base_test_arrays.<locals>.factoryc                    s   t j|  dd S )NdtyperT   )r   arangerW   rZ   r   r   rY      s    
   rS         )rS      rS   A)order)r   rV   reshapeflagsc_contiguousf_contiguousrU   )r[   rY   Za1Za2a3r   rZ   r   base_test_arrays   s    

ri   c                 C   s   t | }| tjkr$|dd |D 7 }| tjkrg }|D ]@}|d d| d  }t|d d d |d d d< || q6|| |D ]}|jt| kstq|S )Nc                 S   s   g | ]}|d  qS )r]   r   ).0rN   r   r   r   
<listcomp>   s     z$full_test_arrays.<locals>.<listcomp>r]                 ?   rS   )	ri   r   float32	complex64Zconjappendextendr[   rU   )r[   Z
array_listaccrN   tmpr   r   r   full_test_arrays   s    


rt   c                 C   s.   t |}t| |g}| |}||}||fS r   )r   r   entry_point)Zcompare_func
test_arrayarrtycresZnumpy_resultZnumba_resultr   r   r   run_comparative   s
    
ry   c                       s  e Zd ZdZ fddZdd ZefddZe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ed*d+ Zd,d- Zd.d/ Zdd1d2Zd3d4 Zd5d6 Z d7d8 Z!d9d: Z"d;d< Z#d=d> Z$d?d@ Z%dAdB Z&dCdD Z'dEdF Z(dGdH Z)dIdJ Z*dKdL Z+dMdN Z,dOdP Z-dQdR Z.ddTdUZ/dVdW Z0dXdY Z1dZd[ Z2d\d] Z3d^d_ Z4d`da Z5dbdc Z6ddde Z7dfdg Z8dhdi Z9djdk Z:dldm Z;dndo Z<dpdq Z=drds Z>dtdu Z?dvdw Z@dxdy ZAdzd{ ZBd|d} ZCd~d ZDdd ZEdd ZFdd ZGdd ZHdd ZIdd ZJdd ZKdd ZLdd ZMdd ZNdd ZOdd ZPdd ZQdd ZRdd ZSdd ZTdd ZUdd ZVdd ZWeXdd ZY  ZZS )TestArrayReductionszQ
    Test array reduction methods and functions such as .sum(), .max(), etc.
    c                    s   t t|   tjd d S )N*   )superrz   setUpr   randomseedself	__class__r   r   r}      s    zTestArrayReductions.setUpc              	      s  t dd  fdd}tdddddd	g}|| tdd	g}|| td	d
dg}|| td	d
dg}|| td	d
ddg}|| tdd	d
ddg}|| tdd	d
ddddg}|| tddd	dg}|| tddg}|| d S )NTZnopythonc                    s   j |  | f d S r   assertPreciseEqualr   cfunckwargspyfuncr   r   r   check   s    z8TestArrayReductions.check_reduction_basic.<locals>.check      ?       @               g      g      @infz-infnan      @g      @)r   r   float64)r   r   r   r   r   r   r   r   check_reduction_basic   s(    z)TestArrayReductions.check_reduction_basicc                    s   t dd  fdd}tddtdtdg}|| d	|d
< || d|d
< || |d}|| ||d d d  d S )NTr   c                    s    |  |  d S r   r   r   r   r   r   r   r   r      s    z1TestArrayReductions.test_all_basic.<locals>.checkr   r   r   r   r   rT         ?rS   rS   r`   r   r   r   floatrd   r   r   r   r   r   r   r   test_all_basic   s    
z"TestArrayReductions.test_all_basicc                    s   t dd  fdd}tddddg}|| td|d< || td	|d< || d
|d< || |d}|| ||d d d  d S )NTr   c                    s    |  |  d S r   r   r   r   r   r   r      s    z1TestArrayReductions.test_any_basic.<locals>.checkr   r   r   rS   r   r   r   r`   r   r   r   r   r   test_any_basic   s    
z"TestArrayReductions.test_any_basicc                 C   s   |  t d S r   )r   r    r   r   r   r   test_sum_basic   s    z"TestArrayReductions.test_sum_basicc                 C   s   |  t d S r   )r   r&   r   r   r   r   test_mean_basic  s    z#TestArrayReductions.test_mean_basicc                 C   s   | j tdd d S Ndouble)prec)r   r)   r   r   r   r   test_var_basic  s    z"TestArrayReductions.test_var_basicc                 C   s   |  t d S r   )r   r,   r   r   r   r   test_std_basic  s    z"TestArrayReductions.test_std_basicc                 C   s   |  t d S r   )r   r/   r   r   r   r   test_min_basic
  s    z"TestArrayReductions.test_min_basicc                 C   s   |  t d S r   )r   r2   r   r   r   r   test_max_basic  s    z"TestArrayReductions.test_max_basicc                 C   s   |  t d S r   )r   r6   r   r   r   r   test_argmin_basic  s    z%TestArrayReductions.test_argmin_basicc                 C   s   |  t d S r   )r   r;   r   r   r   r   test_argmax_basic  s    z%TestArrayReductions.test_argmax_basicc                 C   s   |  t d S r   )r   r@   r   r   r   r   test_nanmin_basic  s    z%TestArrayReductions.test_nanmin_basicc                 C   s   |  t d S r   )r   rA   r   r   r   r   test_nanmax_basic  s    z%TestArrayReductions.test_nanmax_basicc                 C   s   |  t d S r   )r   rB   r   r   r   r   test_nanmean_basic  s    z&TestArrayReductions.test_nanmean_basicc                 C   s   |  t d S r   )r   rC   r   r   r   r   test_nansum_basic  s    z%TestArrayReductions.test_nansum_basicc                 C   s   |  t d S r   )r   rD   r   r   r   r   test_nanprod_basic"  s    z&TestArrayReductions.test_nanprod_basicc                 C   s   |  t d S r   )r   rE   r   r   r   r   test_nanstd_basic%  s    z%TestArrayReductions.test_nanstd_basicc                 C   s   | j tdd d S r   )r   rF   r   r   r   r   test_nanvar_basic(  s    z%TestArrayReductions.test_nanvar_basicc                    sz   t dd  fddfdd}|tdd D ]}|| q<fd	d
}|tdd D ]}|| qhd S )NTr   c                    s    | } | } || d S r   r   )r   expectedgotr   r   r   r   -  s    z5TestArrayReductions.check_median_basic.<locals>.checkc                    s(    |  |  d}  |   | j d S )N)	      rd   TrM   r   r   r   	check_odd3  s    
z9TestArrayReductions.check_median_basic.<locals>.check_odd?   g      %@c                    s(    |  |  d}  |   | j d S )N)      r   rM   r   r   r   
check_even<  s    
z:TestArrayReductions.check_median_basic.<locals>.check_even@   )r   r   r\   )r   r   Zarray_variationsr   rN   r   r   )r   r   r   r   r   check_median_basic+  s    
z&TestArrayReductions.check_median_basicc                 c   sv   | V  | d d d   } | V  tj|  | V  d| | d dk< | V  tj| | d dk< | V  tj| d d < | V  d S )Nr`         @r   rT   rS   )copyr   r~   shuffler   rM   r   r   r   _array_variationsD  s    z%TestArrayReductions._array_variationsc                 C   s   t }dd }| || d S )Nc                 s   sJ   | V  | d d d   } | V  tj|  | V  d| | d dk< | V  d S )Nr`   r   r   rT   )r   r   r~   r   rM   r   r   r   
variationsV  s    z9TestArrayReductions.test_median_basic.<locals>.variations)r?   r   )r   r   r   r   r   r   test_median_basicS  s    
z%TestArrayReductions.test_median_basicc              	      s  t dd d  fdd	}jdddd}td|d	d d d
 }||| ||d |||d  ||| tjtj tjg}j|d|j	d d< j
| j
| ||| |  }|  }||| |t|t| jddddgd}td|d}||| tdd }tj |dd tj ||d tj ||d d tddd}td| }tj ||dddg tddddd}td| }tj ||jd td| }tj ||jd tddd}tj ||d d t ||d  tj dddgdd tddddg} ||d g tj|tddddg d S )!NTr   -q=c                    sV   | |} | |}t |}t |r:j|||d nj|| || |d d S N)abs_tolr   isfiniter   r   rN   rI   r   r   r   Zfiniter   r   r   r   e  s    



z@TestArrayReductions.check_percentile_and_quantile.<locals>.check   ra   r      r`   rS   r]   rT   r   r^            ?r   r   g      ?r_   )      ?r   r   g      @g      @g      &@ih     )r   r   rS   )r   r   g      ?)ra   )r   )r   r~   Zrandnrd   r   linspacer   r   choiceZflatr   flattentolisttupler\   testingZassert_equalarrayshape
assertTrueZisscalar)r   r   q_upper_boundr   rN   rI   Z
not_finitexr   r   r   check_percentile_and_quantileb  sN    





z1TestArrayReductions.check_percentile_and_quantiled   c           
         s   t dd d fdd	}d fdd	}dd	 }d
d| d| |f}ddtjtjtj f}||D ]}||| ql|dkr|}	n|}	td}td}|	|| tdk rd}d}|	|| tdddg}|}|	|| d}|d }|	|| d S )NTr   +=c                    sV   | |} | |}t |}t |r:j|||d nj|| || |d d S r   r   r   r   r   r   r     s    



z>TestArrayReductions.check_percentile_edge_cases.<locals>.checkc                    s0   | | tj} | |}j|||d d S r   )astyper   r   r   )rN   rI   r   r   r   r   r   r   convert_to_float_and_check  s    
zSTestArrayReductions.check_percentile_edge_cases.<locals>.convert_to_float_and_checkc                 s   s0   t ddD ] }t| |D ]}t|V  qq
d S )NrT   r]   )ranger   r   r   )elementsicombr   r   r   _array_combinations  s    zLTestArrayReductions.check_percentile_edge_cases.<locals>._array_combinationsr   皙?g?rT   r`   r^   )rT      FrS   )r   )r   )r   r   r   r   r   r   )
r   r   r   r   r   r   rI   Zelement_poolrN   _checkr   r   r   check_percentile_edge_cases  s0    




z/TestArrayReductions.check_percentile_edge_casesc              	      s   t dd|  fdd}  td}||d ||d ||dd	tjf  "}tdd
 }d} || W 5 Q R X dt|j d S )NTr   c              	      s6    t} | | W 5 Q R X dt|j d S )Nz)Percentiles must be in the range [0, 100]assertRaises
ValueErrorassertEqualstr	exceptionrN   rI   Zraisesr   r   r   r   	check_err  s    zBTestArrayReductions.check_percentile_exceptions.<locals>.check_errr^   )rT   r]   i   rT   r]   rl   r   Not supported for complex dtype	r   disable_leak_checkr   r\   r   assertTypingErrorassertInr   r   r   r   r   rN   erI   r   r   r   check_percentile_exceptions  s    	



z/TestArrayReductions.check_percentile_exceptionsc              	      s   t dd|  fdd}  td}||d ||d ||ddtjf  "}tdd	 }d} || W 5 Q R X d
t|j d S )NTr   c              	      s6    t} | | W 5 Q R X dt|j d S )Nz%Quantiles must be in the range [0, 1]r   r   r   r   r   r     s    z@TestArrayReductions.check_quantile_exceptions.<locals>.check_errr^   g      )r   r   g?r   rl   r   r   r   r   r   r   check_quantile_exceptions  s    	



z-TestArrayReductions.check_quantile_exceptionsc                 C   s.   t }| j|dd | j|dd | | d S Nr   r   )rJ   r   r   r   r   r   r   r   r   test_percentile_basic  s    z)TestArrayReductions.test_percentile_basicc                 C   s.   t }| j|dd | j|dd | | d S r   )rK   r   r   r   r   r   r   r   test_nanpercentile_basic  s    z,TestArrayReductions.test_nanpercentile_basicc                 C   s.   t }| j|dd | j|dd | | d S NrT   r   )rQ   r   r   r   r   r   r   r   test_quantile_basic  s    z'TestArrayReductions.test_quantile_basicc                 C   s.   t }| j|dd | j|dd | | d S r  )rR   r   r   r   r   r   r   r   test_nanquantile_basic"  s    z*TestArrayReductions.test_nanquantile_basicc                 C   s   t }| || j d S r   )rG   r   r   r   r   r   r   test_nanmedian_basic(  s    z(TestArrayReductions.test_nanmedian_basicc                 C   s`   t jdt jd}t|}| |jd | |jd tt|g}|j	}| t 
||| d S Nr]   rZ   rT   C)r   r\   int32r   r   ndimlayoutr   r!   ru   r   r   r   rw   rx   r   r   r   r   test_array_sum_global,  s    z)TestArrayReductions.test_array_sum_globalc                 C   sb   t jdt jdd }t|}| |jd | |jd tt|g}|j	}| |
 || d S r  )r   r\   r  r   r   r	  r
  r   r#   ru   r"   r  r   r   r   test_array_prod_int_1d7  s    z*TestArrayReductions.test_array_prod_int_1dc                 C   sd   t jdt jdd }t|}| |jd | |jd tt|g}|j	}t j
| || d S )Nr]   rZ   r   rT   r  )r   r\   rn   r   r   r	  r
  r   r#   ru   r   assert_allcloser"   r  r   r   r   test_array_prod_float_1dB  s    z,TestArrayReductions.test_array_prod_float_1dc                 C   sb   t jdt jd}t|}| |jd | |jd tt|g}|j	}t j
t ||| d S r  )r   r\   r  r   r   r	  r
  r   r$   ru   r   r  r"   r  r   r   r   test_array_prod_globalM  s    z*TestArrayReductions.test_array_prod_globalc                 C   s|   t jddt jd}t||\}}| || t ddd}t||\}}| || |d}t||\}}| || d S )NrS   r]   rZ   r   r   )ra   rS   )r   r\   int16ry   r   r   rd   )r   r   r   r   r   r   r   r   check_cumulativeX  s    
z$TestArrayReductions.check_cumulativec                 C   s   |  t d S r   )r  r   r   r   r   r   test_array_cumsumc  s    z%TestArrayReductions.test_array_cumsumc                 C   s   |  t d S r   )r  r   r   r   r   r   test_array_cumsum_globalf  s    z,TestArrayReductions.test_array_cumsum_globalc                 C   s   |  t d S r   )r  r   r   r   r   r   test_array_cumprodi  s    z&TestArrayReductions.test_array_cumprodc                 C   s   |  t d S r   )r  r   r   r   r   r   test_array_cumprod_globall  s    z-TestArrayReductions.test_array_cumprod_globalFc                 C   s   |rdnd}t |d d}t||\}}| || t dd d}t||\}}| || |d}t||\}}| || dS )	zH
        Check that integer overflows are avoided (issue #931).
        rS   r]   i@  r  l            Zint64Zuint64N)r   r\   r   ry   r   )r   r   is_prodZn_itemsr   nprnbrr   r   r   check_aggregation_magnitudeo  s    
z/TestArrayReductions.check_aggregation_magnitudec                 C   s   |  t |  t d S r   )r  r    r!   r   r   r   r   test_sum_magnitude  s    
z&TestArrayReductions.test_sum_magnitudec                 C   s   |  t |  t d S r   )r  r   r   r   r   r   r   test_cumsum_magnitude  s    
z)TestArrayReductions.test_cumsum_magnitudec                 C   s   | j tdd d S NT)r  )r  r   r   r   r   r   test_nancumsum_magnitude  s    z,TestArrayReductions.test_nancumsum_magnitudec                 C   s    | j tdd | j tdd d S r  )r  r#   r$   r   r   r   r   test_prod_magnitude  s    z'TestArrayReductions.test_prod_magnitudec                 C   s    | j tdd | j tdd d S r  )r  r   r   r   r   r   r   test_cumprod_magnitude  s    z*TestArrayReductions.test_cumprod_magnitudec                 C   s   | j tdd d S r  )r  r   r   r   r   r   test_nancumprod_magnitude  s    z-TestArrayReductions.test_nancumprod_magnitudec                 C   s   |  t |  t d S r   )r  r&   r'   r   r   r   r   test_mean_magnitude  s    
z'TestArrayReductions.test_mean_magnitudec                 C   s   |  t |  t d S r   )r  r)   r*   r   r   r   r   test_var_magnitude  s    
z&TestArrayReductions.test_var_magnitudec                 C   s   |  t |  t d S r   )r  r,   r-   r   r   r   r   test_std_magnitude  s    
z&TestArrayReductions.test_std_magnitudec                 C   s.  t |}tdd|}| |||| | ||d d ||d d  |d d d  }| |||| tj| | |||| tdkrd|jkrd||j	d < | |||| d|jkrt
dt|dD ]}d||< q| |||| ||d | |||| d S )	NTr   r`   )rT      r>   ZNaTrS   rT   )r   r   r   r   r   r~   r   r   __name__sizer   lenfillr[   )r   r   r   rw   r   r   r   r   r   _do_check_nptimedelta  s"    $
z)TestArrayReductions._do_check_nptimedeltac                 C   s"   t djdd}| || d S )Nr]   zM8[Y]rZ   r   r\   r   r*  r   r   r   r   r   r   check_npdatetime  s    z$TestArrayReductions.check_npdatetimec                 C   s"   t djdd}| || d S )Nr]   zm8[s]rZ   r+  r,  r   r   r   check_nptimedelta  s    z%TestArrayReductions.check_nptimedeltac                 C   s   |  t | t d S r   )r-  r/   r.  r   r   r   r   test_min_npdatetime  s    
z'TestArrayReductions.test_min_npdatetimec                 C   s   |  t | t d S r   )r-  r2   r.  r   r   r   r   test_max_npdatetime  s    
z'TestArrayReductions.test_max_npdatetimec                 C   s   |  t | t d S r   )r-  r6   r.  r   r   r   r   test_argmin_npdatetime  s    
z*TestArrayReductions.test_argmin_npdatetimec                 C   s   |  t | t d S r   )r-  r;   r.  r   r   r   r   test_argmax_npdatetime  s    
z*TestArrayReductions.test_argmax_npdatetimec                 C   s   |  t d S r   )r.  r?   r   r   r   r   test_median_npdatetime  s    z*TestArrayReductions.test_median_npdatetimec                 C   s   |  t d S r   )r.  r    r   r   r   r   test_sum_npdatetime  s    z'TestArrayReductions.test_sum_npdatetimec                 C   s   |  t d S r   )r.  r   r   r   r   r   test_cumsum_npdatetime  s    z*TestArrayReductions.test_cumsum_npdatetimec                 C   s   |  t d S r   )r.  r&   r   r   r   r   test_mean_npdatetime  s    z(TestArrayReductions.test_mean_npdatetimec                    s   t dd  fdd}dd }dd }| D ] }|| |||tj q4|tg  |td	tj ttjd
tjddddddg	}|d|d d d   }|dd}|| d S )NTr   c                    s    | } | } || d S r   r   rN   r   r   r   r   r   r     s    z7TestArrayReductions.check_nan_cumulative.<locals>.checkc                 S   s2   | j d }t| tjjt| j |ddtj | S )NrS   F)replace)r'  r   putr~   r   r   r   )rN   pr   r   r   _set_some_values_to_nan  s    
$zITestArrayReductions.check_nan_cumulative.<locals>._set_some_values_to_nanc                   s   s   t ddddddV  t t jddgV  t ddddgV  t dd	V  t t dd
d V  t jdd	t jdd d d V  d S )Nr`   ra   <   r   r^   TFrT   r]   r   gfffff@@rZ   )r   r   rd   r   r   r\   asfortranarrayrn   r   r   r   r   a_variations  s    z>TestArrayReductions.check_nan_cumulative.<locals>.a_variationsr]   rS   r   r^   r   r   r   r   rl   r`   ra   )r   r   r   r   r   fullr   rd   )r   r   r   r;  r>  rN   partsr   r   r   check_nan_cumulative  s    
 z(TestArrayReductions.check_nan_cumulativec                 C   s   |  t | t d S r   )r  r   rA  r   r   r   r   test_nancumprod_basic
  s    
z)TestArrayReductions.test_nancumprod_basicc                 C   s   |  t | t d S r   )r  r   rA  r   r   r   r   test_nancumsum_basic  s    
z(TestArrayReductions.test_nancumsum_basicc                    sB   t tdd  fdd}dd }| D ]}|| q0d S )NTr   c                    s    | } | } || d S r   r   r7  r   r   r   r     s    z1TestArrayReductions.test_ptp_basic.<locals>.checkc                  s   s$  t dV  t dt jdgV  t t j dgV  dV  dV  t ddV  dddgV  t d	dd
ddd} | V  t | V  | d d d V  t j	
d|  | V  dV  dV  t j V  dV  dt jgV  dt jgV  dV  t dt jV  dt jd  V  t jt jd  V  t jV  d S )Nr]   gg@r^   )r   rS   r^   rT   gffffffr   r   r   rS   r`   r   r   g      @y      ?      @))gffffff@r   gffffff)g333333@g@g@rT   rl   )r   r\   r   r   r   r?  r   rd   r=  r~   ZRandomStater   rM   r   r   r   r>    s0    
z8TestArrayReductions.test_ptp_basic.<locals>.a_variations)rO   r   )r   r   r>  rN   r   r   r   test_ptp_basic  s    
z"TestArrayReductions.test_ptp_basicc                 C   s<   t }tdd|}td}||}||}| || d S )NTr   r]   )rP   r   r   r\   r   )r   r   r   rN   r   r   r   r   r   test_ptp_method8  s    
z#TestArrayReductions.test_ptp_methodc                    s   t tdd  fdd}ddd}tddgdd	D ]\}}|||}|| q<td
}tdd}|d|  }|| |d|  }|| tjddd}|| d S )NTr   c                    s    | } | } || d S r   r   r7  r   r   r   r   G  s    z3TestArrayReductions.test_ptp_complex.<locals>.checkFc                 S   sT   t ddd}| r t j|dd< t ddd}|r@t j|dd< |d	|  ddS )
Nr      r   r   r^   r   r_   rl   )r   r   r   rd   )real_nanimag_nanrealimagr   r   r   
make_arrayL  s    z8TestArrayReductions.test_ptp_complex.<locals>.make_arrayrS   )repeatr   rH  r   rl   )r   r   y      ?      )Z
fill_value)FF)rO   r   r   r   Zonesr\   r?  )r   r   rN  rJ  rK  comprL  rM  r   r   r   test_ptp_complexC  s    
	


z$TestArrayReductions.test_ptp_complexc              	   C   s   t }tdd|}|   |  }|td W 5 Q R X d}| |t|j | 	t
}|tg  W 5 Q R X d}| |t|j d S )NTr   )TTFz+Boolean dtype is unsupported (as per NumPy)z&zero-size array reduction not possible)rO   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   msgr   r   r   test_ptp_exceptionsc  s    
z'TestArrayReductions.test_ptp_exceptionsc                    s   t tf}|D ]tdd  fdd}tddd}|d |d d	< |d
 }||d  }|| tdD ]Z}j| j| jtj	tj
g}||d  }|d |d d	< ||| qpqd S )NTr   c                    s    | } | } || d S r   r   r7  r   r   r   r   |  s    z=TestArrayReductions.test_min_max_complex_basic.<locals>.checkrE  r]   (   r`   r   rS   rl   )r0   r3   r   r   r   r   r~   r   r   ro   Z
complex128r   )r   pyfuncsr   rL  rM  rN   _r[   r   r   r   test_min_max_complex_basicv  s     z.TestArrayReductions.test_min_max_complex_basicc                    s   t tf}|D ]tdd  fdd}tddd}|d |d d	< tj|d
d< |d }tj|dd< ||d  }|| tdD ]@}j| j| ||d  }|d |d d	< || qqd S )NTr   c                    s    | } | } || d S r   r   r7  r   r   r   r     s    zCTestArrayReductions.test_nanmin_nanmax_complex_basic.<locals>.checkrE  r]   rT  r`   r   r^   r   rS   r   r_   rl   )	r@   rA   r   r   r   r   r   r~   r   )r   rU  r   rL  rM  rN   rV  r   r   r    test_nanmin_nanmax_complex_basic  s"    z4TestArrayReductions.test_nanmin_nanmax_complex_basicc                    sP   t tf} fdd}dd }|D ]&tdd | D ]}|| q<q$d S )Nc                    s    | } | } || d S r   r   r7  r   r   r   r     s    zFTestArrayReductions.test_nanmin_nanmax_non_array_inputs.<locals>.checkc                   s   sj   ddddgV  dV  t dV  dV  dV  d	V  t jdd
dfV  t jt jt j gV  t jdfdgV  d S )NrT   r   r   rS   ))rE  r   i)r^      ira   r   gA`"	@Fgr   g?)ggffffff!@)r   r   r   r   r   r   r   r   r>    s    zMTestArrayReductions.test_nanmin_nanmax_non_array_inputs.<locals>.a_variationsTr   )r@   rA   r   )r   rU  r   r>  rN   r   r   r   #test_nanmin_nanmax_non_array_inputs  s    
z7TestArrayReductions.test_nanmin_nanmax_non_array_inputsc           	      C   s   t ddddg}t ddd}|d  d7  < t d	dddd
d }|d  d7  < |d  d8  < |||fD ]b}tt|jdd t|jD  }dd |D }dd |D }|D ]}| |||| qqxd S )Nr   r   ra   r   r   rS   r   rT   r   x   r^   r]   r   rT   rT   rS   rT   r   r   r   3   c                 S   s   g | ]}|d   qS rD  r   rj   r   r   r   r   rk     s    zATestArrayReductions.test_argmax_axis_1d_2d_4d.<locals>.<listcomp>c                 S   s   g | ]}|fd dqS )c                 S   s   t j| |dS Naxisr<   rN   Z_axisr   r   r   <lambda>      zJTestArrayReductions.test_argmax_axis_1d_2d_4d.<locals>.<listcomp>.<lambda>r   rj   rc  r   r   r   rk     s   c                 S   s   g | ]}t d d|qS Tr   r   rj   r   r   r   r   rk     s    	r   r   r\   rd   listr   r	  r   py_func	r   arr1darr2dZarr4dr   ZaxesZpy_functionsZc_functionsr   r   r   r   test_argmax_axis_1d_2d_4d  s$    z-TestArrayReductions.test_argmax_axis_1d_2d_4dc                    sh   t d}t ddd}tdddd   fdd	}||d
 ||d ||d ||d d S )Nr   rS   ra   Tr   c                 S   s   t | |S r   r<   r   rc  r   r   r   	jitargmax  s    zDTestArrayReductions.test_argmax_axis_out_of_range.<locals>.jitargmaxc              	      sJ    td  | | W 5 Q R X  td  | | W 5 Q R X d S Nzaxis.*out of boundsassertRaisesRegexr   rm  rr  rs  r   r   r   assert_raises  s    zHTestArrayReductions.test_argmax_axis_out_of_range.<locals>.assert_raisesrT   r   r\   rd   r   r   ro  rp  rx  r   rw  r   test_argmax_axis_out_of_range  s    




z1TestArrayReductions.test_argmax_axis_out_of_rangec              	   C   sP   t d}tdddd }|  }||d W 5 Q R X | dt|j d S )Nr   Tr   c                 S   s   t | |S r   r<   rr  r   r   r   rs    s    zGTestArrayReductions.test_argmax_axis_must_be_integer.<locals>.jitargmaxfooaxis must be an integerr   r\   r   r   r   r   r   )r   r   rs  r   r   r   r    test_argmax_axis_must_be_integer  s    


z4TestArrayReductions.test_argmax_axis_must_be_integerc                    s@   t ddd  fdd}| | tdd|  d S )Nr   rS   ra   c                    s    j ddS Nr   rb  r9   r   rp  r   r   r:     s    z;TestArrayReductions.test_argmax_method_axis.<locals>.argmaxTr   r   r\   rd   r   r   r   r:   r   r  r   test_argmax_method_axis  s
    
z+TestArrayReductions.test_argmax_method_axisc                    sF   t jdt jddd  fdd}| | tdd|  d S )	Nr   rZ   rS   ra   c                    s    j ddS r  r9   r   r  r   r   r:     s    z;TestArrayReductions.test_argmax_return_type.<locals>.argmaxTr   r   r\   Zuint8rd   r   r   r  r   r  r   test_argmax_return_type   s
    
z+TestArrayReductions.test_argmax_return_typec           	      C   s   t ddddg}t ddd}|d  d7  < t d	dddd
d }|d  d7  < |d  d8  < |||fD ]b}tt|jdd t|jD  }dd |D }dd |D }|D ]}| |||| qqxd S )Nr   r   ra   r   r   rS   r[  r   r\  r^   r]   r]  r^  r_  c                 S   s   g | ]}|d   qS rD  r   r`  r   r   r   rk     s    zATestArrayReductions.test_argmin_axis_1d_2d_4d.<locals>.<listcomp>c                 S   s   g | ]}|fd dqS )c                 S   s   t j| |dS ra  r7   rd  r   r   r   re    rf  zJTestArrayReductions.test_argmin_axis_1d_2d_4d.<locals>.<listcomp>.<lambda>r   rg  r   r   r   rk     s   c                 S   s   g | ]}t d d|qS rh  ri  rj  r   r   r   rk     s    rk  rn  r   r   r   test_argmin_axis_1d_2d_4d
  s$    z-TestArrayReductions.test_argmin_axis_1d_2d_4dc                    sh   t d}t ddd}tdddd   fdd	}||d
 ||d ||d ||d d S )Nr   rS   ra   Tr   c                 S   s   t | |S r   r7   rr  r   r   r   	jitargmin%  s    zDTestArrayReductions.test_argmin_axis_out_of_range.<locals>.jitargminc              	      sJ    td  | | W 5 Q R X  td  | | W 5 Q R X d S rt  ru  rr  r  r   r   r   rx  )  s    zHTestArrayReductions.test_argmin_axis_out_of_range.<locals>.assert_raisesrT   ry  rz  r{  r|  r   r  r   test_argmin_axis_out_of_range!  s    




z1TestArrayReductions.test_argmin_axis_out_of_rangec              	   C   sP   t d}tdddd }|  }||d W 5 Q R X | dt|j d S )Nr   Tr   c                 S   s   t | |S r   r7   rr  r   r   r   r  7  s    zGTestArrayReductions.test_argmin_axis_must_be_integer.<locals>.jitargminr~  r  r  )r   r   r  r   r   r   r    test_argmin_axis_must_be_integer4  s    


z4TestArrayReductions.test_argmin_axis_must_be_integerc                    s@   t ddd  fdd}| | tdd|  d S )Nr   rS   ra   c                    s    j ddS r  r4   r   r  r   r   r5   B  s    z;TestArrayReductions.test_argmin_method_axis.<locals>.argminTr   r  r   r5   r   r  r   test_argmin_method_axis?  s
    
z+TestArrayReductions.test_argmin_method_axisc                    sF   t jdt jddd  fdd}| | tdd|  d S )	Nr   rZ   rS   ra   c                    s    j ddS r  r4   r   r  r   r   r5   L  s    z;TestArrayReductions.test_argmin_return_type.<locals>.argminTr   r  r  r   r  r   test_argmin_return_typeH  s
    
z+TestArrayReductions.test_argmin_return_typec                    s   t ttttttttt	t
ttttttttttg}ttttg}|tttg7 }|tg7 }tjtjtj tj!g} fdd}||d d | ||| d S )Nc                    sd   | D ]Z}t |}t||D ]B\ }d}| j|jj|j} ||f fdd	}t|| qqd S )Nztest_{0}_{1}_{2}dc                    sB   d}d j krt|rd}t||\}}| j|||d|d d S )NrT   r"   ra   Zsingle)rR  r   ulps)r&  r   Ziscomplexobjry   r   )r   ZredFuncZ	testArrayZtestNamer  r  r  Zred_funcr   r   new_test_functiony  s    

 z]TestArrayReductions.install_generated_tests.<locals>.install_tests.<locals>.new_test_function)rt   r   formatr&  r[   namer	  setattr)ZdtypesfuncsdtZtest_arraysrv   	test_namer  clsr  r   install_testsn  s    zBTestArrayReductions.install_generated_tests.<locals>.install_testsr`   )"r    r!   r#   r$   r&   r'   r)   r*   r,   r-   r   r   r   r   r/   r0   r2   r3   rA   r@   rC   r6   r8   r;   r=   rB   rE   rF   rD   r   r  rn   rV   ro   )r  Zreduction_funcsZreduction_funcs_rspaceZdtypes_to_testr  r   r  r   install_generated_testsR  s>              
z+TestArrayReductions.install_generated_tests)r   )F)[r&  
__module____qualname____doc__r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   staticmethodr   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  r1  r2  r3  r4  r5  r6  rA  rB  rC  rF  rG  rQ  rS  rW  rX  rZ  rq  r}  r  r  r  r  r  r  r  r  classmethodr  __classcell__r   r   r   r   rz      s   
A
9
#& 	
	
rz   c                   @   s*   e Zd ZedZdd Zedd ZdS )TestArrayReductionsExceptionsr   c              	   C   sd   t dd|}| t || j W 5 Q R X | t}|| j W 5 Q R X | |t|j d S )NTr   )r   r   BaseException	zero_sizer   r   r   r   )r   r   rR  r   r   r   r   r   check_exception  s    z-TestArrayReductionsExceptions.check_exceptionc                 C   s   t  }d}d}ttttfD ]}|||< qttttfD ]}|||< q4d}| D ]N\}}||j	}||j	}	|	
dd
dd}	||	fdd}
t| ||
 qNd S )	Nz'attempt to get {0} of an empty sequencez*zero-size array to reduction operation {0}ztest_zero_size_array_{0}Zarray_ Z_globalc                 S   s   |  || d S r   )r  )r   funcmessager   r   r   test_fn  s    z6TestArrayReductionsExceptions.install.<locals>.test_fn)dictr;   r=   r6   r8   r2   r/   itemsr  r&  r8  r  )r  Z	fn_to_msgZ	empty_seqZop_no_identr   Zname_templatefnrR  r  Zlmsgr  r   r   r   install  s     

z%TestArrayReductionsExceptions.installN)	r&  r  r  r   r\   r  r  r  r  r   r   r   r   r    s   

r  __main__)E	itertoolsr   r   Znumpyr   Znumbar   r   Znumba.core.compilerr   Znumba.np.numpy_supportr   Znumba.tests.supportr   r	   r
   Zunittestr   r   r   r   r   r   r   r   r   r   r    r!   r#   r$   r&   r'   r)   r*   r,   r-   r/   r0   r2   r3   r6   r8   r;   r=   r?   r@   rA   rB   rC   rD   rE   rF   rG   rJ   rK   rO   rP   rQ   rR   ri   rt   ry   rz   r  r  r  r&  mainr   r   r   r   <module>   s   	       \'
