B
    <9\O                 @   sx  d dl Z d dlZd dlZd dlZd dlmZ d dlZd dlmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/ d dl0m1Z1m2Z2m3Z3m4Z4 d dlm5Z5m6Z6m7Z7m8Z8m9Z9m:Z: d dl;Z;d dl;m<Z<m=Z=m>Z>m?Z?m@Z@mAZA d dlBZBeBjCZCejDZDejEd  dkrdeFZGd dlHmIZI eId	ZJG d
d deCZKG dd deKZLG dd deCZMddddddddddddddddgfgZNg ZOxePd d!g D ]vZQeORd"eQ  eORd#eQ  eORd$eQ  eORd%eQ  eORd&eQ  eORd'eQ  eORd(eQ  eORd)eQ  qW eNRd*eOf g ZSxFd+D ]>ZQeSRd,eQ  eSRd-eQ  eSRd.eQ  eSRd/eQ  qvW eNRd0eSf g ZTxd1D ]ZUeTRd2eU  qW eNRd3eTf g ZVx8d4D ]0ZUeVRd5eU  eVRd6eU  eVRd7eU  q W eNRd8eVf g ZWxd9D ]ZXeWRd:eX  qLW eNRd;eWf d<d= ZYG d>d? d?eZZ[d@dA Z\G dBdC dCeCZ]G dDdE dEeCZ^G dFdG dGeCZ_G dHdI dIeCZ`G dJdK dKeCZaG dLdM dMeCZbedNdO ZcG dPdQ dQeCZdG dRdS dSeCZedbdTdUZfG dVdW dWeCZgdXdY Zhdcd[d\Zid]ei_jd^d_ Zkeld`krteh  eBjmd_da dS )d    N)contextmanager)(arrayarangeemptyzerosint32int64uint16complex_float64reccopy	ones_likewherealltruelinspacesumprodsqrtfmodfloorceilsincostanarcsinarccosarctanarctan2sinhcoshtanharcsinharccosharctanhloglog1plog10expexpm1conj)assert_equalassert_array_equalassert_array_almost_equalassert_allclose)shapeallclosearray_equalravelisnanisinf)ENumExprevaluatere_evaluatedisassembleuse_vml   )LooseVersionz1.7.0c               @   s   e Zd ZdZ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)d* Zd+d, Zd-d. Zd/S )0test_numexprzTesting with 1 thread   c             C   s   t | j d S )N)numexprset_num_threadsnthreads)self rC   9lib/python3.7/site-packages/numexpr/tests/test_numexpr.pysetUp1   s    ztest_numexpr.setUpc             C   s~   dt j dt j t j  }dtfdtfdtfg}t||d}|tddd	gtd
ddgtdddg}t|tdddg d S )Ng       @g      @abc)Z	signatureg      ?   r;   g      @      g      @   	   g     U@g      _@g      e@)r5   rF   rG   rH   doubler6   r   r,   )rB   exZsigfuncxrC   rC   rD   test_simple4   s
    *ztest_numexpr.test_simplec             C   s(   t tj}td}||}t|| d S )Ng      Y@)r6   r5   rF   r   r,   )rB   rP   rQ   yrC   rC   rD   test_simple_expr_small_array;   s    
z)test_numexpr.test_simple_expr_small_arrayc             C   s(   t tj}td}||}t|| d S )Ng    .A)r6   r5   rF   r   r,   )rB   rP   rQ   rS   rC   rC   rD   test_simple_exprA   s    
ztest_numexpr.test_simple_exprc             C   sz   t tjdtj  dtj dtj tj   }td}tdd }|d|  d| d| |   }|||}t|| d S )Ng       @r>      g    .Ag?rI   )r6   r5   rF   rG   r   r-   )rB   rP   rF   rG   rQ   rS   rC   rC   rD   test_rational_exprG   s    . 
ztest_numexpr.test_rational_exprc             C   sZ  t ttddtfgdddg t ttddtfgdddg t ttddtfgddd	g td
d }ttdt|d d d ttdt|d dd ttdt|dd ttdt	
| ttdt	j|dd t	ddd}ttdt|d d ttdt|dd ttdt|dd td}ttdt|d d dd ttdt|d d dd ttdt	j
|d d dd ttdt	j|d d dd td}ttdt|d d dd ttdt|d dd ttd t	j
|d dd ttd!t	j|d dd td"d#d$}ttdt|d d dd ttdt|d dd ttd t	j
|d dd ttd!t	j|d dd td%d&d&}ttd't|d dd ttd(t|d dd ttd)t|d d d ttd*t|d dd ttd+t|d dd ttd,t|d d d ttd-t	j
|d dd ttd.t	j
|d dd ttd/t	j
|d d d ttd0t	j|d dd ttd1t	j|d dd ttd2t	j|d d d td}|t}ttdt|d d dd ttdt|d d dd ttdt	j
|d d dd ttdt	j|d d dd |t}ttdt|d d dd ttdt|d d dd ttdt	j
|d d dd ttdt	j|d d dd |d3 }ttdt|d d dd ttdt|d dd d S )4Nzsum(x**2+2, axis=None)rQ   )s   mul_ddds   t3s   r1[x]s   r1[x])s   add_ddds   t3s   t3s   c2[2.0])s   sum_ddns   r0s   t3Nzsum(x**2+2, axis=1))s   sum_ddns   r0s   t3r>   zprod(x**2+2, axis=2))s   prod_ddns   r0s   t3rI   i g{Gz?zsum(x+2,axis=None)rI   )axiszsum(x+2,axis=0)r   zprod(x,axis=0)zmin(x)zmax(x,axis=0)
   r>   zsum(x,axis=None)zsum(x,axis=0)zsum(x,axis=1)g      $@zsum(x**2+2,axis=0)zprod(x**2+2,axis=0)zmin(x**2+2,axis=0)zmax(x**2+2,axis=0)g      Y@zprod(x-1,axis=0)zmin(x-1,axis=0)zmax(x-1,axis=0)g?g      ?i  g      "@r;   zsum(y**2, axis=1)zsum(y**2, axis=0)zsum(y**2, axis=None)zprod(y**2, axis=1)zprod(y**2, axis=0)zprod(y**2, axis=None)zmin(y**2, axis=1)zmin(y**2, axis=0)zmin(y**2, axis=None)zmax(y**2, axis=1)zmax(y**2, axis=0)zmax(y**2, axis=None)y        ?)r+   r9   r6   rN   r   r.   r7   r   r   npminmaxr   reshaper   Zastypeint)rB   rQ   rS   rC   rC   rD   test_reductionsO   s      
  
  ztest_numexpr.test_reductionsc             C   sp   t ddd}td|d t|t dddd  t d}td|d t|t dddt dd   d S )	Ng     @i  rY   zx + 3)outr;   z(x - 3) * y + (x - 3)r>   )r   r]   r7   r+   )rB   rQ   rS   rC   rC   rD   test_in_place   s    ztest_numexpr.test_in_placec             C   s   t ddd}ytd W n tk
r0   Y n
X tdytd W n tk
rZ   Y n
X tdytd W n tk
r   Y n
X tdd S )Ng      "@r;   zsum(y, axis=2)zshould raise exception!zsum(y, axis=-3)zsum(y, axis=-1))r   r]   r7   
ValueError)rB   rS   rC   rC   rD   	test_axis   s     ztest_numexpr.test_axisc             C   s"   t ttddtfgddg d S )Nz	x * x + 2rQ   )s   mul_ddds   r0s   r1[x]s   r1[x])s   add_ddds   r0s   r0s   c2[2.0])r+   r9   r6   rN   )rB   rC   rC   rD   test_r0_reuse   s    ztest_numexpr.test_r0_reusec             C   s   t d}t|d d S )Nzcontains(b"abc", b"ab")T)r7   r+   )rB   resrC   rC   rD   test_str_contains_basic0   s    z%test_numexpr.test_str_contains_basic0c             C   s2   t dddddg}td}t|dddddg d S )	Ns   abcs   defs   xyzs   x11s   zazcontains(haystack, b"ab")TF)r   r7   r+   )rB   haystackre   rC   rC   rD   test_str_contains_basic1   s    z%test_numexpr.test_str_contains_basic1c             C   s2   t dddddg}td}t|dddddg d S )	Ns   abcs   defs   xyzs   x11s   zazcontains(b"abcd", haystack)TF)r   r7   r+   )rB   rg   re   rC   rC   rD   test_str_contains_basic2   s    z%test_numexpr.test_str_contains_basic2c             C   sJ   t ddddddg}t dddd	d
dg}td}t|ddddddg d S )Ns   abckkks   adefs   xyzs   x11abcps   zas   abcs   defs   aterrs   oots   zus   abzcontains(haystacks, needles)TF)r   r7   r+   )rB   Z	haystacksneedlesre   rC   rC   rD   test_str_contains_basic3   s    z%test_numexpr.test_str_contains_basic3c          
   C   s>   t ddddddddg}td	}t|d
dddddd
d
g d S )Ns   abcs   defs   aterrs   oots   zus   ab cs    abcs   abc z#contains(b"test abc here", needles)TF)r   r7   r+   )rB   rj   re   rC   rC   rD   test_str_contains_basic4   s
    z%test_numexpr.test_str_contains_basic4c             C   s6   t ddddddg}td}t|dd	ddd	dg d S )
Ns   abcs   ab cs    abcs    abc s   	abcs   c hz#contains(b"test abc here", needles)TF)r   r7   r+   )rB   rj   re   rC   rC   rD   test_str_contains_basic5   s    z%test_numexpr.test_str_contains_basic5c       	      C   s  ddl m} ddddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d>d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`d dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdwd{d|d}d~ddddddddddddddYddddddddddg}dddd\dddddddddddddddddddddddddddddddddddddddddddddddddddddddddd?dddddddkddddddwdddddddddddddddddddddddeddddddddddddddddddddd ddddddddd	d
dddddddddddddg}t|||}dd |D }dd |D }dd |D }dd tdD }t|| d S (  Nr   )productzIt wzas thze Whitze Rabzbit,z troZttingz slZowlyz back zagain,z andz loZokinzg aZnxiouszly aZbouzt azs it wzent,z as izf itz had lZostz someZthizng; aznd zshe zheard zit mutZterinzg to Zitszelf z'Thez Duchzess! Tzhe ZDucheszs! Oh zmy deazr pawsz! Oh zmy fzur zand Zwhiskezrs! ZShez'll gzet mez exZecuzted, zas suzre azs fZerretsz are fz! Whzere ZCANz I havze dZroppezd tzhem,z I woznder?z' AZlicez guZessedz in az momzent Zthazt it wzas Zlookizng fzor zthe fazn and Zthez paizr of wZhitze kidz gloZvesz, and zvery gZoodz-naZturedlzy bezgan hZuntZingz aboutz for tZhemz, butz they Zwerze nowhzere toz bez sezen--ZeverZythinzg seemzed zto zhave cZhangZsincez hezr swimz inz thez pool,z the gzreat Zhalzl, wZithz thze glzass tZablze and z liZttlez doozr, hazd vZanizshed cZompZletezly.zIt wazs thez Wze ZRaZbbzit, tZroztting sZlowlyZagaizn, andz lZookinzg ZanZxiouslyz about zas it wzent, asz if zit hadz loszt ZsoZmethingz; andz she hzeard zit Zmutterizng toz itselfz 'The ZDuchessz! ZThz! Oh mzy dezar pawszOh my Zfuzr and wZhiskersz! She'zll getz me Zexecutezd,z azs Zsuzre as ZfeZrretszerrets!z Wherze CANz I hazve drozpped tz, I Zwonzder?' Azlice gZuesszin a mZomenzt thatz izt was lZookzing fzor thzfan andze pzair ozf whitze kizd glovezs, and zshe vzery zgood-naZtuZredlzgan hunZtizng abouzt for tZhezm, buzt tzhey zwere nZowherez to bze szeen-z-eveZrythizng seemezd zto haZvez cZhangedz sincze her szwim zin the zpool,z anzd the gZreazt hzall, wizth the Zglaszs tzable anzd thze littlze door,z had vaZnizshed coZmpletelzy.c             S   s   g | ]}|d  |d kqS )r   r>   rC   ).0rQ   rC   rC   rD   
<listcomp>  s    z>test_numexpr.test_str_contains_listproduct.<locals>.<listcomp>c             S   s   g | ]}|d    qS )r   )encode)rq   rQ   rC   rC   rD   rr     s    c             S   s   g | ]}|d    qS )r>   )rs   )rq   rQ   rC   rC   rD   rr     s    c             S   s   g | ]}t |qS rC   )bool)rq   rQ   rC   rC   rD   rr     s    zcontains(b, a))	itertoolsrn   listr7   r+   )	rB   rn   ZsmallZbigpZ	python_inrF   rG   re   rC   rC   rD   test_str_contains_listproduct   s^    z*test_numexpr.test_str_contains_listproductc             C   s*   t dddg}td}t|dddg d S )Ns   abcs   def    zcontains(b"abcd", withemptystr)TF)r   r7   r+   )rB   withemptystrre   rC   rC   rD   test_str_contains_withemptystr1  s    z,test_numexpr.test_str_contains_withemptystr1c             C   s*   t dddg}td}t|dddg d S )Ns   abcs   defry   zcontains(withemptystr, b"")T)r   r7   r+   )rB   rz   re   rC   rC   rD   test_str_contains_withemptystr2!  s    z,test_numexpr.test_str_contains_withemptystr2c             C   s   d}d}t d}t|d d S )Ns)   1aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaas(   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazcontains(a, b)T)r7   r+   )rB   rF   rG   re   rC   rC   rD   test_str_contains_long_needle&  s    z*test_numexpr.test_str_contains_long_needlec             C   sH   d}t ddg}t ddg}td}t|| d}td}t|| d S )NTr>   rI   r;   rV   zwhere(a, b, c)F)r   r7   r,   )rB   rF   rG   rH   re   rC   rC   rD   test_where_scalar_bool,  s    
z#test_numexpr.test_where_scalar_boolc             C   s:   t dg}t|dksttd t|dks6td S )Nr>   rI   1)r   sysgetrefcountAssertionErrorr7   )rB   rF   rC   rC   rD   test_refcount7  s    
ztest_numexpr.test_refcountc             C   sB   dd l }dddddddddd	dg
}|jd
tj|dd}d S )Nr   ;zimport numexpr as neza=10zne.evaluate('1')za += 1zne.evaluate('2', local_dict={})z ne.evaluate('3', global_dict={})z/ne.evaluate('4', local_dict={}, global_dict={})z{0} -c "{1}"T)shell)
subprocessjoinZ
check_callformatr   
executable)rB   r   ZscriptZcheckrC   rC   rD   test_locals_clears_globals>  s    z'test_numexpr.test_locals_clears_globalsN)__name__
__module____qualname____doc__rA   rE   rR   rT   rU   rW   r_   ra   rc   rd   rf   rh   ri   rk   rl   rm   rx   r{   r|   r}   r~   r   r   rC   rC   rC   rD   r=   -   s0   P	4r=   c               @   s   e Zd ZdZdZdS )test_numexpr2zTesting with 2 threadsrI   N)r   r   r   r   rA   rC   rC   rC   rD   r   V  s   r   c               @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zej	d dk rFd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)e krd*d+ Zd,d- Zd.S )/test_evaluatec             C   sJ   t dddg}t dddg}t ddd	g}td
}t|t dddg d S )Ng      ?g       @g      @g      @g      @g      @g      @g       @g      "@z2*a + 3*b*cg     U@g      _@g      e@)r   r7   r,   )rB   rF   rG   rH   rQ   rC   rC   rD   rR   \  s
    ztest_evaluate.test_simplec             C   s   t d}td}t|| d S )Ng      Y@rQ   )r   r7   r,   )rB   rQ   rS   rC   rC   rD   rT   c  s    z*test_evaluate.test_simple_expr_small_arrayc             C   s   t d}td}t|| d S )Ng    .ArQ   )r   r7   r,   )rB   rQ   rS   rC   rC   rD   rU   h  s    ztest_evaluate.test_simple_exprc             C   sP   t dddg}t dddg}t ddd	g}td
}t }t|t dddg d S )Ng      ?g       @g      @g      @g      @g      @g      @g       @g      "@z2*a + 3*b*cg     U@g      _@g      e@)r   r7   r8   r,   )rB   rF   rG   rH   rQ   rC   rC   rD   test_re_evaluatem  s    ztest_evaluate.test_re_evaluatec             C   s\   t dddg}t dddg}t ddd	g}td
|||dd}t }t|t dddg d S )Ng      ?g       @g      @g      @g      @g      @g      @g       @g      "@z2*a + 3*b*c)rF   rG   rH   )
local_dictg     U@g      _@g      e@)r   r7   r8   r,   )rB   rF   rG   rH   rQ   rC   rC   rD   test_re_evaluate_dictu  s    z#test_evaluate.test_re_evaluate_dictr   r;   c             C   s6   t ddd}td}tddd}d|d< t|| d S )Nd   i4)dtypez1/xr>   )r   r7   r   r,   )rB   rQ   rS   Zx2rC   rC   rD   test_zero_div  s
    ztest_evaluate.test_zero_divc             C   sd   t ddd}ttd|d  ttddd|d  ttddd|d  ttdd	d|d
  d S )NrY   r   )r   zx/2rI   F)truedivautoTg       @)r   r,   r7   )rB   rQ   rC   rC   rD   test_true_div  s
    ztest_evaluate.test_true_divc             C   s"   t ddd}ttd|d>  d S )NrY   r   )r   zx<<2rI   )r   r,   r7   )rB   rQ   rC   rC   rD   test_left_shift  s    ztest_evaluate.test_left_shiftc             C   s"   t ddd}ttd|d?  d S )NrY   r   )r   zx>>2rI   )r   r,   r7   )rB   rQ   rC   rC   rD   test_right_shift  s    ztest_evaluate.test_right_shiftc             C   s:   t ddd}ytd W n tk
r,   Y n
X tdd S )NrY   r   )r   z(x > 1) and (x < 9)zshould raise exception!)r   r7   	TypeErrorrb   )rB   rQ   rC   rC   rD   test_boolean_operator  s    z#test_evaluate.test_boolean_operatorc             C   sJ   t d}t dd }|d|  d| d| |   }td}t|| d S )Ng    .Ag?rI   r>   rV   z(a + 2*b) / (1 + a + 4*b*b))r   r7   r-   )rB   rF   rG   rQ   rS   rC   rC   rD   rW     s
     z test_evaluate.test_rational_exprc             C   sZ   dd }t d}t dd }|d|  }|j}t|||j|j }td}t|| d S )Nc             S   s   t | jtd}| |_||_|S )N)r   )r   r/   r
   realimag)rF   rG   rH   rC   rC   rD   complex  s    z0test_evaluate.test_complex_expr.<locals>.complexg     @gh㈵>y              ?z sin(complex(a, b)).real + z.imag)r   r   r   r   r7   r-   )rB   r   rF   rG   zrQ   rS   rC   rC   rD   test_complex_expr  s    ztest_evaluate.test_complex_exprc             C   s   t dddd d d }t ddd}ttd||  tdgdtfdtfgd	}t d|d< |d d
 |d }|d }ttd| ttd||  d S )Nr   rY   rI   2   rJ   za+bc1Zc2)r   i  r   za0+c1)r   r]   r,   r7   r   r   r	   Zfill)rB   rF   rG   rH   r   a0rC   rC   rD   test_complex_strides  s    z"test_evaluate.test_complex_stridesc             C   sh   t d}t dd}tjjd ddd}||d< ||d< |d }ttdt|d	k ttd
t| d S )Nr      zf4,f4)r   )Zformatsr/   f0f1zsqrt(c) > 1.g      ?zlog10(c))r   rZ   r   r   r-   r7   r   r'   )rB   rF   rG   ZrecarrrH   rC   rC   rD   test_recarray_strides  s    
z#test_evaluate.test_recarray_stridesc             C   s   t dddd d d }t d}t ddd}ttd||  ttd||  tdd	tfd
tfg}t|||d| d|   d S )Nr   rY   rI   rJ   r>   za+cza+dz2.0*a+3.0*crF   rH   g       @g      @)r   r]   r,   r7   r6   rN   )rB   rF   rH   dexprrC   rC   rD   test_broadcasting  s    ztest_evaluate.test_broadcastingc             C   sP   d}d}t td||  tddtfdtfg}t|||d| d|   d S )	Ng      @g      @za+bz2*a+3*brF   rG   rI   r;   )r.   r7   r6   rN   r+   )rB   rF   rG   r   rC   rC   rD   test_all_scalar  s
    ztest_evaluate.test_all_scalarc             C   sT   t dddd d d }t d}tddtfdtfg}t|||||| d S )Nr   rY   rI   z2*a+3*brF   rG   )r   r]   r6   rN   r,   run)rB   rF   rG   r   rC   rC   rD   test_run  s    ztest_evaluate.test_runc             C   s6   t d}ytd W n tk
r(   Y n
X |   d S )Nr;   za < [0, 0, 0])r   r7   r   fail)rB   rF   rC   rC   rD   test_illegal_value  s    z test_evaluate.test_illegal_valuec             C   sf   ddddddddd	d
dddddddddddg}x2|D ]*}|d }t j|i \}}t|t| q4W d S )Nr   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   absr*   r   r   z(a))r?   Z
necompilerZgetExprNamesr+   r:   )rB   Z	vml_funcsrP   Zstrexpr_Zex_uses_vmlrC   rC   rD   test_ex_uses_vml  s    
ztest_evaluate.test_ex_uses_vmlsparcc             C   s\   t ddd}d| d | d | d }x.tddD ] }t| td	}t|| q4W d S )
Nr>   g    .Ag      ?g      ?g      ?rI      z((.25*a + .75)*a - 1.5)*a - 2)r   ranger?   r@   r7   r-   )rB   rF   rG   rA   rH   rC   rC   rD   test_changing_nthreads_00_inc  s    
z+test_evaluate.test_changing_nthreads_00_incc             C   s^   t ddd}d| d | d | d }x0tdddD ] }t| td	}t|| q6W d S )
Nr   r>   g    .Ag      ?g      ?g      ?rI   rK   z((.25*a + .75)*a - 1.5)*a - 2)r   r   r?   r@   r7   r-   )rB   rF   rG   rA   rH   rC   rC   rD   test_changing_nthreads_01_dec  s    
z+test_evaluate.test_changing_nthreads_01_decN)r   r   r   rR   rT   rU   r   r   r   version_infor   r   r   r   r   rW   r   r   r   r   r   r   r   r   platformmachiner   r   rC   rC   rC   rD   r   [  s.   		
		
r   ZMISCzb*c+d*ez2*a+3*bz-azsinh(a)z2*a + (cos(3)+5)*sinh(cos(b))z2*a + arctan2(a, b)zarcsin(0.5)zwhere(a != 0.0, 2, a)zwhere(a > 10, b < a, b > a)zwhere((a-10).real != 0.0, a, 2)z 0.25 * (a < 5) + 0.33 * (a >= 5)zcos(1+1)z1+1r   zcos(a2)z+-*/%z**z(a+1) %s (b+3)z
3 %s (b+3)z
(a+1) %s 4z
2 %s (b+3)z
(a+1) %s 2z(a+1) %s -1z(a+1) %s 0.5z
(a+1) %s 0Z
OPERATIONS)<z<=z==z>=>z!=z
a/2+5 %s bz
a/2+5 %s 7z7 %s bz7.0 %s 5ZCOMPARISONS)r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r   r*   r   r   za + %s(b+c)Z1_ARG_FUNCS)r   r   za + %s(b+c, d+1)za + %s(b+c, 1)za + %s(1, d+1)Z2_ARG_FUNCS)ig      g      gg      r   g        r>   gffffff@g      @r;   z	(a+1)**%sZ	POW_TESTSc             C   s   t | |rdS t| drj| jdkrjt|  }|dkrF|t| kS t|  }|dkrj|t| kS |rt| t|kott| t|kddS t| dr| jdkrd}nd}t| t|kot	t| t||d	S d S )
NTr   )f4Zf8r   )rX   r   gh㈵>g:0yE>)atol)
r1   hasattrr   r3   r   r4   r/   r   r2   r0   )rF   rG   exactZnnansZninfsr   rC   rC   rD   equalJ  s     
(r   c               @   s   e Zd ZdS )SkipN)r   r   r   rC   rC   rC   rD   r   e  s    r   c              #   s  dg  fdd} d }xdD ]}xt t tjttfD ]}d}td| |dd d d }t||g|d}t||d| }t||d}t||d}	t||d}
|tkr|j}x&||||	|
gD ]}|d7 }|d	9 }qW |d
kr||d  }|dkr||d  }xdD ]\}}xtD ]\}}x|D ]}|tkrxd|ks d|ks d|ks d|ks d|ks d|ks d|krxq |t t fkr|r|dkrq | |||||	|
|||||||}|V  q W qW qW q8W qW d S )Nr   c                sl   t   fdd}d jf |_d  d7  < d jd|dd f |_|S )Nc                 s  y4t d tt } t d tt } W n* tk
r^ } z|}d } W d d }~X Y nX d }ytd}W n tk
r    Y n tk
r   td j	f  Y n tk
r } z2t
t|t|}|d ks|stdf   W d d }~X Y nz   tdf   Y n`X df }|d ks<t|t| |s~td j	| t| t| |t|t|f d S )Nignorealways)r   optimizationz-%r not implemented for %s (scalar=%d, opt=%s)znumexpr error for expression %rz3expected numexpr error not raised for expression %rza%r
(test_scalar=%r, dtype=%r, optimization=%r, exact=%r,
 npval=%r (%r - %r)
 neval=%r (%r - %r)))warningssimplefilterevalglobals	Exceptionr7   r   NotImplementedErrorprintr   
issubclasstyper   r/   )ZnpvalrO   Znp_exceptionZnevalZne_exceptionZsame_exc_typemsg)r   r   r   r   test_scalarthis_localsrC   rD   methodo  sD    



z:test_expressions.<locals>.make_test_method.<locals>.methodzItest_expressions(%s, test_scalar=%r, dtype=%r, optimization=%r, exact=%r)r   r>   ztest_scalar%d_%s_%s_%s_%04dascii)localsr   Zdescriptionrs   )rF   a2rG   rH   r   erQ   r   r   r   r   r   Zsectionr   )test_no)r   r   r   r   r   r   rD   make_test_methodk  s    .z*test_expressions.<locals>.make_test_method)r   r>   rI   r   rI   )r   y              ?y      ?      ?r>   ))ZnoneF)ZmoderateF)Z
aggressiveFr   r   %r   r   r   r   z(a+1) ** -1)	r^   rZ   Zfloat32rN   r   r   r   r   tests)r   rQ   r   r   Z
array_sizerF   r   rG   rH   r   r   r   r   Zsection_nameZsection_testsr   mrC   )r   rD   test_expressionsh  sJ    <


r   c               @   s   e Zd Zdd ZdS )
test_int64c             C   sB   t ddddgtd}td}t|ddd	d
g | |jjd d S )Nil        l        l    )r   z-ai  i   l     l r   )r   r   r7   r,   assertEqualr   name)rB   rF   re   rC   rC   rD   test_neg  s    ztest_int64.test_negN)r   r   r   r   rC   rC   rC   rD   r     s   r   c               @   sB   e Zd Zejd dk rdd Zdd Zdd Zd	d
 Zdd Z	dS )test_int32_int64r   rI   c             C   s&   t d}t|d | |jjd d S )NZ42L*   r   )r7   r,   r   r   r   )rB   re   rC   rC   rD   test_small_long  s    
z test_int32_int64.test_small_longc             C   s&   t d}t|d | |jjd d S )N2rI   r   )r7   r,   r   r   r   )rB   re   rC   rC   rD   test_small_int  s    
ztest_int32_int64.test_small_intc             C   s&   t d}t|d | |jjd d S )Nz2**40l        r   )r7   r,   r   r   r   )rB   re   rC   rC   rD   test_big_int  s    
ztest_int32_int64.test_big_intc             C   sp   t ddd}td}td}|d }td}td}t|| t|| | |jjd | |jjd d S )Nr   r   )r   rI   zint32array * itwozint32array * ltwor   )	r   rZ   r   r   r7   r,   r   r   r   )rB   
int32arrayZitwoZltwore   res32res64rC   rC   rD   test_long_constant_promotion  s    



z-test_int32_int64.test_long_constant_promotionc             C   sF   t ddd}t ddd}|| }td}t|| | |jjd d S )Nr   r   )r   r   zint32array * int64array)r   r7   r,   r   r   r   )rB   r   
int64arrayrespyresnxrC   rC   rD   test_int64_array_promotion  s    
z+test_int32_int64.test_int64_array_promotionN)
r   r   r   r   r   r   r   r   r   r   rC   rC   rC   rD   r     s   r   c               @   s$   e Zd Zdd Zdd Zdd ZdS )test_uint32_int64c             C   s0   t d}td}t|d | |jjd d S )Nr   rF   r   )rZ   uint32r7   r,   r   r   r   )rB   rF   re   rC   rC   rD   test_small_uint32  s    

z#test_uint32_int64.test_small_uint32c             C   sp   t ddd}td}td}|| }td}td}t|| t|| | |jjd | |jjd d S )Nr   r   )r   rI   zint32array * stwozint32array * utwor   )	r   rZ   r   r   r7   r,   r   r   r   )rB   r   ZstwoZutwore   r   r   rC   rC   rD   test_uint32_constant_promotion
  s    



z0test_uint32_int64.test_uint32_constant_promotionc             C   sF   t ddd}t ddd}|| }td}t|| | |jjd d S )Nr   r   )r   r   zuint32array * int64array)r   r7   r,   r   r   r   )rB   Zuint32arrayr   r   r   rC   rC   rD   r     s    
z,test_uint32_int64.test_int64_array_promotionN)r   r   r   r   r   r   rC   rC   rC   rD   r     s   r   c               @   s   e Zd ZdZdZddddgZddddgZeeee d	  Ze	ee Z
e	ee Z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!S )"test_strings   rL   s   foos   barry   s        x    r>   s   doodooc             C   s>   ddddddddg}x$|D ]}t d	}| ||  qW d S )
Ns      s     foo s     foo bs     foo b s   foo s   foo bs   foo b s   foo bar baz  s)r7   r   Ztostring)rB   Zstr_listr   rrC   rC   rD   test_null_chars)  s
    
ztest_strings.test_null_charsc             C   s(   | j }d}t|}t|}t|| d S )Nsarr)
str_array1r   r7   r,   )rB   r   r   res1res2rC   rC   rD   test_compare_copy1  s
    ztest_strings.test_compare_copyc             C   s.   | j }| j}d}t|}t|}t|| d S )Nzsarr1 >= sarr2)r   
str_array2r   r7   r,   )rB   sarr1sarr2r   r  r  rC   rC   rD   test_compare_array8  s    ztest_strings.test_compare_arrayc             C   s.   | j }| j}d}t|}t|}t|| d S )Nzsarr >= svar)r   str_constantr   r7   r,   )rB   r   Zsvarr   r  r  rC   rC   rD   test_compare_variable@  s    z"test_strings.test_compare_variablec             C   s.   | j }d| j }t|}t|}t|| d S )Nz
sarr >= %r)r   r  r   r7   r,   )rB   r   r   r  r  rC   rC   rD   test_compare_constantH  s
    
z"test_strings.test_compare_constantc             C   s$   | j }| j}d}| d|t  d S )Nzsarr1 + sarr2Zadd_sss)r   r  assert_missing_opr   )rB   r  r  r   rC   rC   rD   test_add_string_arrayO  s    z"test_strings.test_add_string_arrayc             C   sX   t ddg}t ddg}td}t|t ddg td}t|t ddg d S )Nry   s   pepes   pepe2z(a == b'') & (b == b'pepe2')TFz(a == b'pepe') & (b == b''))rZ   r   r7   r,   )rB   rF   rG   re   r  rC   rC   rD   test_empty_string1U  s    ztest_strings.test_empty_string1c             C   sX   t ddg}t ddg}td}t|t ddg td}t|t ddg d S )N   ps   pepes   pepe2ry   z(a == b'') & (b == b'pepe2')Fz(a == b'pepe') & (b == b''))rZ   r   r7   r,   )rB   rF   rG   re   r  rC   rC   rD   test_empty_string2]  s    ztest_strings.test_empty_string2c             C   s.   | j }tt|dd}d}| d|t  d S )Nr   )r   zsarr >= narrZge_bsi)r   r   lenr  r   )rB   r   Znarrr   rC   rC   rD   test_add_numeric_arraye  s    z#test_strings.test_add_numeric_arrayc          
   C   sd   d| }yt || W n> tk
rT } z d| |jd krD| | W d d }~X Y nX | | d S )Nz+expected NotImplementedError regarding '%s'z'%s'r   )r7   r   argsr   )rB   opr   r   r   ZnierC   rC   rD   r  k  s    ztest_strings.assert_missing_opc             C   sr   xVdD ]N\}}|  td |  td |  td |  td |  td qW d\}}|  td d S )	N))s   foos   foobar)s   foos   foo bar)s   foo as   foo barzs1 < s2zs1 <= s2z~(s1 == s2)z~(s1 >= s2)z
~(s1 > s2))s   foos   foo  zs1 == s2)Z
assertTruer7   )rB   s1s2rC   rC   rD   test_compare_prefixu  s    z test_strings.test_compare_prefixN)r   r   r   ZBLOCK_SIZE1ZBLOCK_SIZE2Z	str_list1Z	str_list2r  Z
str_nloopsr   r   r  r  r   r  r  r	  r
  r  r  r  r  r  r  rC   rC   rC   rD   r     s&   
r   c               @   s   e Zd Zdd ZdS )test_irregular_stridec             C   sv   t dtd}t dtd}t||g}|d }|d }td}td}t|| t dtd t|| t dtd d S )NrY   )r   r   r   zf0 < 5zf1 < 5rJ   )r   r   r   r   Z
fromarraysr7   r,   )rB   r   r   Z	irregularZi0Zi1rC   rC   rD   test_select  s    z!test_irregular_stride.test_selectN)r   r   r   r  rC   rC   rC   rD   r    s   r  c               @   s   e Zd Zdd Zdd ZdS )test_zerodimc             C   s@   t g td}t g td}td}td}t|| t|| d S )N)r   za0 + a1za0 * a1)r   r   r   r7   r,   )rB   r   a1r0r1rC   rC   rD   test_zerodim1d  s    
ztest_zerodim.test_zerodim1dc             C   sT   t g tdddd}t g tdddd}td}td}t|| t|| d S )N)r   r   rI   rV   za0 + a1za0 * a1)r   r   r]   r   r7   r,   )rB   r   r  r  r  rC   rC   rD   test_zerodim3d  s    
ztest_zerodim.test_zerodim3dN)r   r   r   r  r  rC   rC   rC   rD   r    s   
r  c          	   c   s@   t j| }|t j| < z
d V  W d |r2|t j| < nt j| = X d S )N)osenvironro   )keyvalueoldrC   rC   rD   _environment  s    

r$  c               @   s   e Zd Zdd Zdd ZdS )test_threading_configc          
   C   s@   t dd, t dd | dt  W d Q R X W d Q R X d S )NOMP_NUM_THREADS5ZNUMEXPR_NUM_THREADS3r;   )r$  r   r?   detect_number_of_threads)rB   rC   rC   rD   test_numexpr_num_threads  s    z.test_threading_config.test_numexpr_num_threadsc          	   C   s*   t dd | dt  W d Q R X d S )Nr&  r'  rJ   )r$  r   r?   r)  )rB   rC   rC   rD   test_omp_num_threads  s    z*test_threading_config.test_omp_num_threadsN)r   r   r   r*  r+  rC   rC   rC   rD   r%    s   r%  c               @   s   e Zd Zdd Zdd ZdS )test_threadingc             C   s4   dd l }G dd d|j}| }|  |  d S )Nr   c               @   s   e Zd Zdd ZdS )z.test_threading.test_thread.<locals>.ThreadTestc             S   s$   t d}ttdtdddg d S )Nr;   za**3r   r>   rL   )r   r,   r7   r   )rB   rF   rC   rC   rD   r     s    z2test_threading.test_thread.<locals>.ThreadTest.runN)r   r   r   r   rC   rC   rC   rD   
ThreadTest  s   r-  )	threadingThreadstartr   )rB   r.  r-  testrC   rC   rD   test_thread  s
    ztest_threading.test_threadc                sd   dd l  dd d d} fddt|D }x|D ]}|  q:W x|D ]}|  qPW d S )Nr   c             S   s   t | }td d S )Nza+a)r   r7   )nrF   rC   rC   rD   work  s    z-test_threading.test_multithread.<locals>.workrY      c                s   g | ]} j d dqS ))g     j@)targetr  )r/  )rq   i)r.  r4  rC   rD   rr     s   z3test_threading.test_multithread.<locals>.<listcomp>)r.  r   r0  r   )rB   rA   ZthreadstrC   )r.  r4  rD   test_multithread  s    

ztest_threading.test_multithreadN)r   r   r   r2  r9  rC   rC   rC   rD   r,    s   r,  c             C   s(   t d}td}| d k	r$| d d S )Ng     @@zra > 0ZDone)rZ   r   r7   Zput)qoutZraZrowsrC   rC   rD   _worker  s    
r;  c               @   s   e Zd Zdd ZdS )test_subprocessc             C   sd   ydd l }W n tk
r    d S X td t  | }|jt|fd}d|_|  |	 }d S )Nr   rI   )r6  r  T)
ZmultiprocessingImportErrorr?   r@   r;  ZQueueZProcessZdaemonr0  ro   )rB   Zmpr:  ZpsresultrC   rC   rD   test_multiprocess  s    
z!test_subprocess.test_multiprocessN)r   r   r   r?  rC   rC   rC   rD   r<    s   r<  c        
      C   s@  ddl m}  ddl}ttj}t|k r6td|tf  td tdtj  tdtj  tdt	j
  | \}}}}}}td	t	j||f  yJ| jd }	td
|	dd  td|	dd  td|	dd  W n tk
r   Y nX tdt  trtdt   tdtjtjf  tdtj  td dS )z6Print the versions of software that numexpr relies on.r   )cpuNz;*Warning*: NumPy version is lower than recommended: %s < %szL-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=zNumexpr version:   %szNumPy version:     %szPython version:    %szPlatform:          %s-%s-%szCPU vendor:        %sZVendorIdentifier zCPU model:         %sZProcessorNameStringzCPU clock speed:   %s MHzz~MHzzVML available?     %szVML/MKL version:   %sz@Number of threads used by default: %d (out of %d detected cores)zMaximum number of threads: %s)Znumexpr.cpuinfor@  r   r<   rZ   __version__minimum_numpy_versionr   r?   r   versionunameinforo   KeyErrorr:   Zget_vml_versionrA   ZncoresZMAX_THREADS)
r@  r   Z
np_versionsysnamenodenamereleaseZ
os_versionr   Z	processorZcpu_inforC   rC   rD   print_versions  s2    

rK  r>   c             C   s,   t   tjddddd tj| dt S )z.
    Run all the tests in the test suite.
    r   )ZdivideZinvalidZoverZunder)	verbosity)rK  rZ   ZseterrunittestZTextTestRunnerr   suite)rL  rC   rC   rD   r1  /  s    r1  Fc                 sD  dd l } dd l}|  }d}G dd dt  fdd}xt D ]}|| q@W xt|D ]}|| t dt	 kr|| t
 || t ||   || t || t || t || t || t || t |  dkr,|| t || t qZW |S )	Nr   r>   c               @   s   e Zd ZdS )zsuite.<locals>.TestExpressionsN)r   r   r   rC   rC   rC   rD   TestExpressionsF  s   rO  c                s&    fdd}t  j|d  d S )Nc                s     S )NrC   )rB   )rP   rC   rD   r   J  s    z)suite.<locals>.add_method.<locals>.method)setattrr   __get__)rP   r   )rO  )rP   rD   
add_methodI  s    zsuite.<locals>.add_methodr   )Zgnuzgnu/kfreebsd)rM  r   Z	TestSuiteTestCaser   r   ZaddTestZ	makeSuiter=   r   r   r   r   r   r   r  r  r%  systemlowerr<  r,  )rM  ZplZtheSuiteZniterrR  rP   r3  rC   )rO  rD   rN  ?  s2    rN  __main__)ZdefaultTest)N)r>   )nr  r   r   r   
contextlibr   ZnumpyrZ   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*   Znumpy.testingr+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r?   r5   r6   r7   r8   r9   r:   rM  rS  rN   r   r^   ZlongZdistutils.versionr<   rC  r=   r   r   r   Zoptestsrv   r  appendZcmptestsZ
func1testsrP   Z
func2testsZpowtestsr3  r   r   r   r   r   r   r   r   r  r  r$  r%  r,  r;  r<  rK  r1  Z__test__rN  r   mainrC   rC   rC   rD   <module>   s       + 3




h*l#
	"
/
