
\K]c           @` s  d  d l  m Z m Z m Z d  d l Z d  d l Z d  d l m Z m	 Z	 d  d l m
 Z d  d l m Z m Z m Z 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
 e f d     YZ d   Z d   Z d   Z d   Z  d   Z! e	 e  Z" d   Z# d   Z$ d   Z% d   Z& d   Z' d   Z( d   Z) d e f d     YZ* d e e f d     YZ+ d e e f d     YZ, d e e j f d     YZ- d  e e j f d!     YZ. d" e e j f d#     YZ/ e0 d$ k re j1   n  d S(%   i    (   t   print_functiont   divisiont   absolute_importN(   t   njitt	   vectorize(   t   unittest_support(   t   compilert   typingt   typeoft   irt   utilst   types(   t   Pipelinet   _PipelineManagert   Flags(   t   cpui   (   t   MemoryLeakMixint   TestCaset	   Namespacec           B` s   e  Z d    Z RS(   c         C` s*   | |  k r |  | St  t |   j |  S(   N(   t   superR   t   __getattr__(   t   st   k(    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyR      s    (   t   __name__t
   __module__R   (    (    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyR      s   c         C` s   |  | | S(   N(    (   t   at   xt   y(    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   axy   s    c         C` s   |  | | S(   N(    (   R   R   R   (    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   ax2   s    c         C` s%   | | d d |  | d d |  S(   Ng       @g      @g      ?(    (   t   Ast   Bst   Cs(    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   pos_root   s    c         C` s7   d |  } d | | } | d | } | | d | S(   Ng       @g      ?(    (   R   R   R    t   _2Ast   _4AsCst
   _Bs2_4AsCs(    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   neg_root_common_subexpr   s    
c         C` s;   d |  } d | | } | d | d } | | d | S(   Ng       @y                g      ?(    (   R   R   R    R"   R#   R$   (    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   neg_root_complex_subexpr"   s    
c         C` s&   t  j t |  t  j |  d d   S(   Ng      ?(   t   npt   cost   vaxyt   sin(   t   a0t   a1(    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt
   call_stuff*   s    c         C` s   | d d |  | d k  S(   Ni   i   i    (    (   R   R   R    (    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   are_roots_imaginary-   s    c         C` s   |  | | S(   N(    (   R   R   R    (    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   div_add0   s    c         C` s   |  d S(   Ni   (    (   R   (    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   cube3   s    c         C` s#   t  j |  |  t  j | | |  S(   N(   R'   R(   t   add(   R   t   bt   out(    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   explicit_output6   s    c         C` s*   |  | } | |  | } | | | } | S(   N(    (   R   R2   t   ct   dt   u(    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   variable_name_reuse:   s    
c         C` s   |  j  d } t j | | f d t j } xi t |  D][ } xR t | |  D]A } t j |  | |  | d  d | | | f <| | | f <qN Wq8 W| S(   Ni    t   dtypei   g      ?(   t   shapeR'   t   emptyt   float64t   ranget   sum(   t   vectorst	   n_vectorst   resultt   it   j(    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   distance_matrixB   s    =t   RewritesTesterc           B` sD   e  Z e d d i  d d d d    Z e d d i  d d   Z RS(   c         C` sp   | s t    } n  t | _ | d  k r6 t j   } n  | d  k rT t j |  } n  |  | | | | | | |  S(   N(   R   t   Truet   nrtt   NoneR   t   ContextR   t
   CPUContext(   t   clst   argst   return_typet   flagst   localst   libraryt   typing_contextt   target_context(    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   mk_pipelineO   s    	c         K` s7   | s t    } n  t | _ |  j | | | | | |  S(   N(   R   RF   t   no_rewritesRS   (   RK   RL   RM   RN   RO   RP   t   kws(    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   mk_no_rw_pipeline\   s    	N(   R   R   t   classmethodRH   RS   RV   (    (    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyRE   N   s   		t   TestArrayExpressionsc           B` s   e  Z d    Z d   Z d   Z d d  Z e d  Z e	 d  Z
 d   Z d   Z e d  Z d	   Z d
   Z d   Z e d  Z d   Z d   Z d   Z d   Z RS(   c   	      C` s^   t  j |  } | j |  } | j } t  j |  } | j |  } | j } | | | | f S(   sT   
        Compile the given function both without and with rewrites enabled.
        (   RE   RV   t   compile_extrat   entry_pointRS   (	   t   selft   fnt   arg_tyst   control_pipelinet   cres_0t   control_cfunct   test_pipelinet   cres_1t
   test_cfunc(    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   _compile_functiong   s    		c         C` s  t  j d d d  } t  j d d d  } t  j d d d  } g  | | | f D] } t |  ^ qO } |  j t |  \ } } } }	 t j |  }
 |
 j t  } | j	 } | | | |  } |	 | | |  } | | | |  } t  j
 j | |  t  j
 j | |  | j j } | j j } |
 j j } |  j t |  t |   |  j t |  t |   |  j t | d j  t | d j   |  j t | d j  t | d j   d S(   sv   
        Using a simple array expression, verify that rewriting is taking
        place, and is fusing loops.
        i    i   i
   i   N(   R'   t   linspaceR   Rd   R   RE   RV   RY   R   RZ   t   testingt   assert_array_equalt   func_irt   blockst   assertEqualt   lent   assertGreatert   body(   R[   t   At   Xt   Yt   argR]   R^   t   nb_axy_0Ra   t   nb_axy_1t   control_pipeline2t   cres_2t   nb_ctlt   expectedt   actualt   controlt   ir0t   ir1t   ir2(    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   test_simple_expru   s(    (	*c         c` s\   xU | D]M } t  | t j  r t  | j t j  rT | j j d k rQ | VqQ qT q q Wd  S(   Nt	   arrayexpr(   t
   isinstanceR	   t   Assignt   valuet   Exprt   op(   R[   t   blockt   instr(    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   _get_array_exprs   s
    c   	      C` s   | d k r t   } n  t | t  s? t d j |    n  | \ } } g  } xE | D]= } t | t  r |  j | |  \ } } n  | j |  qX W| t |  f } | j |  | | f S(   sK   
        Convert an array expression tree into a set of operators.
        s   {0} not a tupleN(	   RH   t   setR   t   tuplet
   ValueErrort   formatt   _array_expr_to_sett   appendR1   (	   R[   t   exprR3   t	   operationt   operandst   processed_operandst   operandt   _t   processed_expr(    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyR      s    c         C` s  t  j j d  } t  j j d  d } t  j j d  } g  | | | f D] } t |  ^ qJ } t j |  } | j |  } | j }	 t j |  }
 |
 j |  } | j } | | | |  } |	 | | |  } | | | |  } t  j j	 | |  t  j j	 | |  t
 t    S(   Ni
   g      ?(   R'   t   randomR   RE   RV   RY   RZ   RS   Rf   t   assert_array_almost_equalR   RO   (   R[   R\   Rn   t   Bt   CRq   R]   R^   t   control_crest   nb_fn_0Ra   t	   test_crest   nb_fn_1t	   np_resultt   nb_result_0t   nb_result_1(    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   _test_root_function   s     (		c         C` s   t  j d d t  j } t |  f } t j |  } | j |  } | j } t j |  } | j |  } | j }	 | d }
 |  j	 |
 | |   |  j	 |
 |	 |   t
 t    S(   Ni
   R9   i   (   R'   t   arangeR<   R   RE   RV   RY   RZ   RS   t   assertPreciseEqualR   RO   (   R[   R\   Rn   R]   R^   R   R   Ra   R   R   Rw   (    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   _test_cube_function   s    		
c   	      ` s   t  j d d t  j     d  t    f d } |  j | |  \ } } } }    f d   } | |  } |  j | | |   |  j | | |   t t    S(   s   
        Test function having a (a, b, out) signature where *out* is
        an output array the function writes into.
        i
   R9   i   i   c         ` s#   t  j    } |     |  | S(   N(   R'   t
   zeros_like(   R\   R3   (   Rn   R   (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   run_func   s    (   R'   R   R<   R   Rd   R   R   RO   (	   R[   R\   R]   R^   R`   Ra   Rc   R   Rw   (    (   Rn   R   s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   _test_explicit_output_function   s    
c         C` s/   t  t |  j |    } |  j | |  d S(   s`   
        Assert the *block* has the expected number of array expressions
        in it.
        N(   Rk   t   listR   Rj   (   R[   R   t   expected_countt   rewrite_count(    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   _assert_array_exprs   s    c         C` s   |  j  t |  t |   | d j } | d j } |  j | d  |  j | d  | s{ |  j t |  t |   n  d S(   s   
        Given two dictionaries of Numba IR blocks, check to make sure the
        control IR has no array expressions, while the test IR
        contains one and only one.
        i    i   N(   Rj   Rk   Rm   R   Rl   (   R[   t
   control_irt   test_irt   trivialt   control_blockt
   test_block(    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   _assert_total_rewrite   s    c         C` s   |  j  t |  t |   xl | j   D]^ \ } } | j } | | j } |  j  t |  t |   |  j | d  |  j | d  q) Wd S(   s   
        Given two dictionaries of Numba IR blocks, check to make sure
        the control IR and the test IR both have no array expressions.
        i    N(   Rj   Rk   t   itemsRm   R   (   R[   R   R   R   t   vR   R   (    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   _assert_no_rewrite	  s    	c         C` s8   |  j    } |  j | j j j | j j j d t d S(   s   
        Ensure even a non-nested expression is rewritten, as it can enable
        scalar optimizations such as rewriting `x ** 2`.
        R   N(   R   R   R^   Rh   Ri   Ra   RF   (   R[   t   ns(    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   test_trivial_expr  s    c         C` s2   |  j    } |  j | j j j | j j j  d S(   s   
        Using the polynomial root function, ensure the full expression is
        being put in the same kernel with no remnants of intermediate
        array expressions.
        N(   R   R   R^   Rh   Ri   Ra   (   R[   R   (    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   test_complicated_expr!  s    c   
      ` sG    j  |  } | j j j } | j j j }   j t |  t |     j t | d j  t | d j     j t t	   j
 | d j    d  t	   j
 | d j   }   j t |  d  t	   f d   | D  } xS t | d  | d  D]: \ } } | j |  }	 |	 r  j d j |	   qqWd S(   sp   
        Attempt to verify that rewriting will incorporate user common
        subexpressions properly.
        i    i   c         3` s(   |  ] }   j  | j j  d  Vq d S(   i   N(   R   R   R   (   t   .0R   (   R[   (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pys	   <genexpr>>  s   is9   Common subexpressions detected in array expressions ({0})N(   R   R^   Rh   Ri   Ra   Rj   Rk   Rl   Rm   R   R   t   zipt   intersectiont   failR   (
   R[   R\   R   Rz   R{   t   array_expr_instrst
   array_setst
   expr_set_0t
   expr_set_1t   intersections(    (   R[   s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   test_common_subexpressions+  s    *,$c         C` s   |  j  t  S(   N(   R   R&   (   R[   (    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   test_complex_subexpressionF  s    c         C` s:  t  j j d  } t  j j d  } g  | | f D] } t |  ^ q1 } t j j } t j | d | j d | j	 } | j
 t  } | j } t j | d | j d | j	 }	 |	 j
 t  }
 |
 j } t | |  } | | |  } | | |  } t  j j | |  t  j j | |  |  j | j j |	 j j  d S(   sn   
        Verify that ufunc and DUFunc calls are being properly included in
        array expressions.
        i
   RQ   RR   N(   R'   R   R   R)   t   _dispatchert   targetdescrRE   RV   RQ   RR   RY   R-   RZ   RS   Rf   R   R   Rh   Ri   (   R[   Rn   R   Rq   R]   t
   vaxy_descrR^   R_   t   nb_call_stuff_0Ra   Rb   t   nb_call_stuff_1Rw   Ry   Rx   (    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   test_ufunc_and_dufunc_callsI  s.    %				c         C` s5   |  j  t  } |  j | j j j | j j j  d S(   sQ   
        Verify that comparison operators are supported by the rewriter.
        N(   R   R.   R   R^   Rh   Ri   Ra   (   R[   R   (    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   test_cmp_opj  s    c         C` s5   |  j  t  } |  j | j j j | j j j  d S(   sQ   
        Check that ufunc calls with explicit outputs are not rewritten.
        N(   R   R4   R   R^   Rh   Ri   Ra   (   R[   R   (    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   test_explicit_outputr  s    N(   R   R   Rd   R}   R   RH   R   R!   R   R0   R   R   R   t   FalseR   R   R   R   R%   R   R   R   R   R   (    (    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyRX   e   s"   		 					
	
		!	t   TestRewriteIssuesc           B` s>   e  Z d    Z d   Z d   Z d   Z d   Z d   Z RS(   c         ` s   d d l  m } d d  l } | d t  d      | d t    f d    } | j d  } | |  \ } } |  j | |  |  j | |  d  S(   Ni    (   t   jitt   nopythonc         S` s   |  S(   N(    (   t   arr(    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   foo  s    c         ` s"     |   }   |   } | | f S(   N(    (   R   R5   R6   (   R   (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   bar  s    i
   (   t   numbaR   t   numpyRF   R   t   assertIs(   R[   R   R'   R   R   t   out_ct   out_d(    (   R   s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   test_issue_1184}  s    c         C` sm   d } t  j j d | d  j | d f  } t |  } t t  |  } t  j j | |  t j	   d  S(   Nid   t   sizei   (
   R'   R   t   uniformt   reshapeRD   R   Rf   R   t   gct   collect(   R[   t   nR   Rw   Rx   (    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   test_issue_1264  s    (c         C` s{   d d l  m } | d    } t j j d  } t j j d  } | j | |  } | | |  } t j j | |  d S(   s*   Test array expression with duplicated termi    (   R   c         S` s   t  j |  } | | |  S(   N(   R'   R*   (   R   R2   (    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyR     s    i
   N(   R   R   R'   R   R   t   py_funcRf   t   assert_allclose(   R[   R   R   R   R2   t   expectt   got(    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   test_issue_1372  s    c         C` sb   t  d    } d } t j d d t j } | j | |  } | | |  } |  j | |  d S(   sP   
        Typing of unary array expression (np.negate) can be incorrect.
        c         S` s   | |  |  S(   N(    (   R   R2   (    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyR     s    g      ?i
   R9   N(   R   R'   R   t   int32R   R   (   R[   R   R2   R   R   R   (    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   test_unary_arrayexpr  s    c         C` sz   t  d    } t j t t t t g  } t j t t t t g  } | j | |  } | | |  } |  j | |  d S(   sd   
        Typing of bitwise boolean array expression can be incorrect
        (issue #1813).
        c         S` s
   |  | @S(   N(    (   R   R2   (    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyR     s    N(   R   R'   t   arrayRF   R   R   R   (   R[   R   R   R2   R   R   (    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   test_bitwise_arrayexpr  s    c         C` s}   t  t  } t j d d d  } | | | | |  t j   } | j |  | j   } |  j d |  |  j d |  d S(   so   
        Type annotation of array expressions with disambiguated
        variable names (issue #1466).
        i    i   i
   s
   #   u.1 = s
   #   u.2 = N(	   R   R8   R'   Re   R
   t   StringIOt   inspect_typest   getvaluet   assertIn(   R[   t   cfuncR   t   buft   res(    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   test_annotations  s    (   R   R   R   R   R   R   R   R   (    (    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyR   {  s   						t   TestSemanticsc           B` s   e  Z d    Z RS(   c         C` s   t  } t |  } t j d d t d  g  } t j d d d g  } t j |  } | | | |  } | | | |  } t j j | |  d  S(   Ng        g      ?t   inf(   R/   R   R'   R<   t   floatt	   ones_likeRf   Rg   (   R[   t   pyfuncR   R   R2   R5   R   R   (    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   test_division_by_zero  s    (   R   R   R   (    (    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyR     s   t   TestOptionalsc           B` s    e  Z d  Z d   Z d   Z RS(   se    Tests the arrival and correct lowering of Optional types at a arrayexpr
    derived ufunc, see #3972c         ` s   t  d      t    f d    } t j d  d f } | |   } | j |   } t j j | |    j } | d d } |  j t | t	 j
   |  j t | j t	 j   d  S(   Nc         S` s   |  | S(   N(    (   R   R   (    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   arr_expr  s    c         ` s(   | d k r d  } n | }   |  |  S(   Ni    (   RH   (   R   R   t   z(   R   (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   do_call  s    	i   g333333i    i   (   R   R'   R   R   Rf   R   t
   signaturest
   assertTrueR   R   t   Optionalt   typet   Float(   R[   R   RL   R   Rw   R   t   oty(    (   R   s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   test_optional_scalar_type  s    	c         ` s   t  d      t    f d    } t j d  t j d  f } | |   } | j |   } t j j | |    j } | d d } |  j t | t	 j
   |  j t | j t	 j   |  j t | j j t	 j   d  S(   Nc         S` s   |  | S(   N(    (   R   R   (    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyR     s    c         ` s,   | d d k r d  } n | }   |  |  S(   Ni    (   RH   (   R   R   R   (   R   (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyR     s    	i   g      @i    i   (   R   R'   R   R   Rf   R   R   R   R   R   R   R   t   ArrayR9   R   (   R[   R   RL   R   Rw   R   R   (    (   R   s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   test_optional_array_type	  s    	(   R   R   t   __doc__R   R   (    (    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyR     s   	t   TestOptionalsExceptionsc           B` s   e  Z d    Z d   Z RS(   c         ` s   |  j    t d      t   f d    } t j d  d f } |  j t   } | |   Wd  QX|  j d t | j     j	 } | d d } |  j
 t | t j   |  j
 t | j t j   d  S(   Nc         S` s   |  | S(   N(    (   R   R   (    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyR   -  s    c         ` s(   | d k r d  } n | }   |  |  S(   Ni    (   RH   (   R   R   R   (   R   (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyR   1  s    	i   g      ?s   expected float64, got Nonei    i   (   t   disable_leak_checkR   R'   R   t   assertRaisest	   TypeErrorR   t   strt	   exceptionR   R   R   R   R   R   R   (   R[   R   RL   t   raisesR   R   (    (   R   s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt+   test_optional_scalar_type_exception_on_none)  s    
	c         ` s  |  j    t d      t   f d    } t j d  t j d d  f } |  j t   } | |   Wd  QXt | j  } |  j d |  |  j d |    j	 } | d d	 } |  j
 t | t j   |  j
 t | j t j   |  j
 t | j j t j   d  S(
   Nc         S` s   |  | S(   N(    (   R   R   (    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyR   K  s    c         ` s,   | d d k r d  } n | }   |  |  S(   Ni    (   RH   (   R   R   R   (   R   (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyR   O  s    	i   g      ?g      @s   expected array(float64,s   got Nonei    i   (   R  R   R'   R   R  R  R  R  R   R   R   R   R   R   R   R   R9   R   (   R[   R   RL   R  t   excstrR   R   (    (   R   s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt*   test_optional_array_type_exception_on_noneG  s    
!	(   R   R   R	  R  (    (    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyR  &  s   	t   __main__(2   t
   __future__R    R   R   R   R   R'   R   R   R   R   t   unittestR   R   R   R	   R
   R   t   numba.compilerR   R   R   t   numba.targetsR   t   supportR   R   t   dictR   R   R   R!   R%   R&   R)   R-   R.   R/   R0   R4   R8   RD   RE   RX   R   R   R   R  R   t   main(    (    (    s;   lib/python2.7/site-packages/numba/tests/test_array_exprs.pyt   <module>   s>   .												 ]=C