U
    ,d;^                     @   s  d dl Z d dlm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mZ d dlmZmZ d dlmZ d dlmZmZmZmZ d d	lmZmZmZmZm Z m!Z!m"Z" d dl#Z#d dl$Z$d dl%Z%G d
d de&Z'dd Z(dd Z)dd Z*dd Z+dd Z,ee(Z-dd Z.dd Z/dd Z0dd Z1dd Z2d d! Z3d"d# Z4G d$d% d%eZ5G d&d' d'eeZ6G d(d) d)eeZ7G d*d+ d+ee%jZ8G d,d- d-ee%jZ9G d.d/ d/ee%jZ:G d0d1 d1ee%jZ;e<d2kre%=  dS )3    N)StringIO)njit	vectorizetypeof)utilstypestypingircompilercpucgutils)CompilerFlags)
cpu_target)MemoryLeakMixinTestCasetemp_directorycreate_temp_module)overloadmodelslower_builtinregister_modelmake_attribute_wrappertype_callabletypeof_implc                       s   e Zd Z fddZ  ZS )	Namespacec                    s    || kr| | S t t| |S N)superr   __getattr__)sk	__class__ @/tmp/pip-unpacked-wheel-eu7e0c37/numba/tests/test_array_exprs.pyr      s    zNamespace.__getattr__)__name__
__module____qualname__r   __classcell__r$   r$   r"   r%   r      s   r   c                 C   s   | | | S r   r$   axyr$   r$   r%   axy    s    r.   c                 C   s   | | | S r   r$   r*   r$   r$   r%   ax2#   s    r/   c                 C   s&   | |d d|  |  d  d|   S )N       @g      @      ?r$   AsBsCsr$   r$   r%   pos_root&   s    r6   c                 C   s2   d|  }d| | }|d | }| |d  | S )Nr0   r1   r$   r3   r4   r5   Z_2AsZ_4AsCsZ
_Bs2_4AsCsr$   r$   r%   neg_root_common_subexpr)   s    r8   c                 C   s6   d|  }d| | }|d | d }| |d  | S )Nr0   y                r1   r$   r7   r$   r$   r%   neg_root_complex_subexpr/   s    r9   c                 C   s   t t| t |d dS )N      ?)npcosvaxysin)Za0Za1r$   r$   r%   
call_stuff7   s    r?   c                 C   s   |d d|  |  dk S )N      r   r$   r2   r$   r$   r%   are_roots_imaginary:   s    rB   c                 C   s   | | | S r   r$   r2   r$   r$   r%   div_add=   s    rC   c                 C   s   | d S )N   r$   )r3   r$   r$   r%   cube@   s    rE   c                 C   s   t | | t |||S r   )r;   r<   add)r+   boutr$   r$   r%   explicit_outputC   s    rI   c                 C   s$   | | }|| |  }|| | }|S r   r$   )r+   rG   cdur$   r$   r%   variable_name_reuseG   s    rM   c                 C   sr   | j d }tj||ftjd}t|D ]F}t||D ]6}t| | | |  d d  |||f< |||f< q4q&|S )Nr   dtyper@   r1   )shaper;   emptyfloat64rangesum)ZvectorsZ	n_vectorsresultijr$   r$   r%   distance_matrixO   s    
rX   c                   @   s<   e Zd Zeddi dddfddZeddi dfddZdS )RewritesTesterNc                 C   s@   |s
t  }d|_|d krtj}|d kr,tj}| |||||||S NT)r   Znrtr   typing_contexttarget_context)clsargsreturn_typeflagslocalslibraryr[   r\   r$   r$   r%   mk_pipeline\   s     zRewritesTester.mk_pipelinec                 K   s&   |s
t  }d|_| j|||||f|S rZ   )r   Zno_rewritesrc   )r]   r^   r_   r`   ra   rb   kwsr$   r$   r%   mk_no_rw_pipelinei   s    z RewritesTester.mk_no_rw_pipeline)r&   r'   r(   classmethodrc   re   r$   r$   r$   r%   rY   [   s     rY   c                   @   s   e Zd Zdd Zdd Zdd Zd%dd	Zefd
dZe	fddZ
dd Zdd Zd&ddZdd Zdd Zdd ZefddZdd Zdd  Zd!d" Zd#d$ ZdS )'TestArrayExpressionsc           	      C   s@   t |}||}|j}t |}||}|j}||||fS )zT
        Compile the given function both without and with rewrites enabled.
        )rY   re   compile_extraentry_pointrc   )	selffnarg_tyscontrol_pipelinecres_0control_cfunctest_pipelinecres_1
test_cfuncr$   r$   r%   _compile_functiont   s    



z&TestArrayExpressions._compile_functionc                 C   s6  t ddd}t ddd}t ddd}dd |||fD }| t|\}}}}t|}	|	t}
|
j}||||}||||}||||}t j	
|| t j	
|| |jjj}|jjj}|	jjj}| t|t| | t|t| | t|d jt|d j | t|d jt|d j dS )zv
        Using a simple array expression, verify that rewriting is taking
        place, and is fusing loops.
        r      
   r@   c                 S   s   g | ]}t |qS r$   r   .0argr$   r$   r%   
<listcomp>   s     z9TestArrayExpressions.test_simple_expr.<locals>.<listcomp>N)r;   linspacers   r.   rY   re   rh   r/   ri   testingassert_array_equalstatefunc_irblocksassertEquallenassertGreaterbody)rj   AXYrl   rm   Znb_axy_0rp   Znb_axy_1Zcontrol_pipeline2Zcres_2Znb_ctlexpectedactualcontrolir0ir1Zir2r$   r$   r%   test_simple_expr   s*    






 z%TestArrayExpressions.test_simple_exprc                 c   s:   |D ]0}t |tjrt |jtjr|jjdkr|V  qd S )NZ	arrayexpr)
isinstancer
   ZAssignvalueZExprop)rj   blockinstrr$   r$   r%   _get_array_exprs   s
    z%TestArrayExpressions._get_array_exprsNc           	      C   s~   |dkrt  }t|ts&td||\}}g }|D ](}t|trT| ||\}}|| q6|t|f}|| ||fS )zK
        Convert an array expression tree into a set of operators.
        Nz{0} not a tuple)setr   tuple
ValueErrorformat_array_expr_to_setappendrF   )	rj   exprrH   Z	operationZoperandsZprocessed_operandsZoperand_Zprocessed_exprr$   r$   r%   r      s    


z'TestArrayExpressions._array_expr_to_setc                 C   s   t jd}t jdd }t jd}dd |||fD }t|}||}|j}t|}	|	|}
|
j}||||}||||}||||}t j|| t j|| t	t
 S )Nru   r:   c                 S   s   g | ]}t |qS r$   r   rv   r$   r$   r%   ry      s     z<TestArrayExpressions._test_root_function.<locals>.<listcomp>)r;   randomrY   re   rh   ri   rc   r{   assert_array_almost_equalr   ra   )rj   rk   r   BCrl   rm   control_cresnb_fn_0rp   	test_cresnb_fn_1Z	np_resultZnb_result_0Znb_result_1r$   r$   r%   _test_root_function   s     



z(TestArrayExpressions._test_root_functionc                 C   s   t jdt jd}t|f}t|}||}|j}t|}||}|j}	|d }
| 	|
|| | 	|
|	| t
t S )Nru   rN   rD   )r;   arangerR   r   rY   re   rh   ri   rc   assertPreciseEqualr   ra   )rj   rk   r   rl   rm   r   r   rp   r   r   r   r$   r$   r%   _test_cube_function   s    




z(TestArrayExpressions._test_cube_functionc           	         sz   t jdt jd  d t fd }| ||\}}}} fdd}||}| ||| | ||| tt S )z
        Test function having a (a, b, out) signature where *out* is
        an output array the function writes into.
        ru   rN   rt   rD   c                    s   t  }|  | |S r   )r;   Z
zeros_like)rk   rH   r   r   r$   r%   run_func   s    
zETestArrayExpressions._test_explicit_output_function.<locals>.run_func)r;   r   rR   r   rs   r   r   ra   )	rj   rk   rl   rm   ro   rp   rr   r   r   r$   r   r%   _test_explicit_output_function   s    

z3TestArrayExpressions._test_explicit_output_functionc                 C   s"   t t| |}| || dS )z`
        Assert the *block* has the expected number of array expressions
        in it.
        N)r   listr   r   )rj   r   Zexpected_countZrewrite_countr$   r$   r%   _assert_array_exprs   s    z(TestArrayExpressions._assert_array_exprsFc                 C   s\   |  t|t| |d j}|d j}| |d | |d |sX| t|t| dS )z
        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.
        r   rt   N)r   r   r   r   r   )rj   
control_irtest_irtrivialcontrol_block
test_blockr$   r$   r%   _assert_total_rewrite  s    

z*TestArrayExpressions._assert_total_rewritec                 C   sf   |  t|t| | D ]D\}}|j}|| j}|  t|t| | |d | |d qdS )z
        Given two dictionaries of Numba IR blocks, check to make sure
        the control IR and the test IR both have no array expressions.
        r   N)r   r   itemsr   r   )rj   r   r   r!   vr   r   r$   r$   r%   _assert_no_rewrite  s    
z'TestArrayExpressions._assert_no_rewritec                 C   s,   |   }| j|jjjj|jjjjdd dS )z
        Ensure even a non-nested expression is rewritten, as it can enable
        scalar optimizations such as rewriting `x ** 2`.
        T)r   N)r   r   rm   r}   r~   r   rp   rj   nsr$   r$   r%   test_trivial_expr$  s
    
z&TestArrayExpressions.test_trivial_exprc                 C   s(   |   }| |jjjj|jjjj dS )z
        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   rm   r}   r~   r   rp   r   r$   r$   r%   test_complicated_expr.  s    
z*TestArrayExpressions.test_complicated_exprc           
         s     |}|jjjj}|jjjj} t|t|  t|d j	t|d j	  tt
 |d j	d t
 |d j	} t|d t
 fdd|D }t|dd |dd D ]&\}}||}	|	rʈ d|	 qdS )zp
        Attempt to verify that rewriting will incorporate user common
        subexpressions properly.
        r   rt   c                 3   s    | ]}  |jjd  V  qdS )rt   N)r   r   r   )rw   r   rj   r$   r%   	<genexpr>K  s   zBTestArrayExpressions.test_common_subexpressions.<locals>.<genexpr>Nz9Common subexpressions detected in array expressions ({0}))r   rm   r}   r~   r   rp   r   r   r   r   r   r   zipintersectionZfailr   )
rj   rk   r   r   r   Zarray_expr_instrsZ
array_setsZ
expr_set_0Z
expr_set_1Zintersectionsr$   r   r%   test_common_subexpressions8  s"    
  "
z/TestArrayExpressions.test_common_subexpressionsc                 C   s
   |  tS r   )r   r9   r   r$   r$   r%   test_complex_subexpressionS  s    z/TestArrayExpressions.test_complex_subexpressionc                 C   s   t jd}t jd}dd ||fD }tjj}tj||j|jd}|	t
}|j}tj||j|jd}|	t
}	|	j}
t
||}|||}|
||}t j|| t j|| | |jjj|jjj dS )zn
        Verify that ufunc and DUFunc calls are being properly included in
        array expressions.
        ru   c                 S   s   g | ]}t |qS r$   r   rv   r$   r$   r%   ry   ]  s     zDTestArrayExpressions.test_ufunc_and_dufunc_calls.<locals>.<listcomp>)r[   r\   N)r;   r   r=   Z_dispatcherZtargetdescrrY   re   r[   r\   rh   r?   ri   rc   r{   r   r   r}   r~   r   )rj   r   r   rl   Z
vaxy_descrrm   rn   Znb_call_stuff_0rp   rq   Znb_call_stuff_1r   r   r   r$   r$   r%   test_ufunc_and_dufunc_callsV  s4    




z0TestArrayExpressions.test_ufunc_and_dufunc_callsc                 C   s*   |  t}| |jjjj|jjjj dS )zQ
        Verify that comparison operators are supported by the rewriter.
        N)r   rB   r   rm   r}   r~   r   rp   r   r$   r$   r%   test_cmp_opw  s    

z TestArrayExpressions.test_cmp_opc                 C   s*   |  t}| |jjjj|jjjj dS )zQ
        Check that ufunc calls with explicit outputs are not rewritten.
        N)r   rI   r   rm   r}   r~   r   rp   r   r$   r$   r%   test_explicit_output  s    

z)TestArrayExpressions.test_explicit_output)N)F)r&   r'   r(   rs   r   r   r   r6   r   rE   r   r   r   r   r   r   r   r8   r   r   r   r   r   r$   r$   r$   r%   rg   r   s"    



!rg   c                   @   sD   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S )TestRewriteIssuesc                    sn   ddl m} dd l}|dddd  |dd fdd}|d	}||\}}| || | || d S )
Nr   )jitT)Znopythonc                 S   s   | S r   r$   )arrr$   r$   r%   foo  s    z.TestRewriteIssues.test_issue_1184.<locals>.fooc                    s    | } | }||fS r   r$   )r   rJ   rK   r   r$   r%   bar  s    z.TestRewriteIssues.test_issue_1184.<locals>.barru   )numbar   numpyr   ZassertIs)rj   r   r;   r   r   Zout_cZout_dr$   r   r%   test_issue_1184  s    

z!TestRewriteIssues.test_issue_1184c                 C   sN   d}t jj|d d|df}t|}tt|}t j|| t	  d S )Nd   rD   )size)
r;   r   uniformZreshaperX   r   r{   r   gcZcollect)rj   nr,   r   r   r$   r$   r%   test_issue_1264  s    z!TestRewriteIssues.test_issue_1264c                 C   sX   ddl m} |dd }tjd}tjd}|||}|||}tj|| dS )z*Test array expression with duplicated termr   )r   c                 S   s   t |}|| |  S r   )r;   r>   r+   rG   r$   r$   r%   r     s    
z.TestRewriteIssues.test_issue_1372.<locals>.fooru   N)r   r   r;   r   r   py_funcr{   assert_allclose)rj   r   r   r+   rG   expectgotr$   r$   r%   test_issue_1372  s    

z!TestRewriteIssues.test_issue_1372c                 C   sF   t dd }d}tjdtjd}|||}|||}| || dS )zP
        Typing of unary array expression (np.negate) can be incorrect.
        c                 S   s   ||  |   S r   r$   r   r$   r$   r%   r     s    z3TestRewriteIssues.test_unary_arrayexpr.<locals>.foog      ?ru   rN   N)r   r;   r   Zint32r   r   )rj   r   rG   r+   r   r   r$   r$   r%   test_unary_arrayexpr  s    

z&TestRewriteIssues.test_unary_arrayexprc                 C   sV   t dd }tddddg}tddddg}|||}|||}| || dS )zd
        Typing of bitwise boolean array expression can be incorrect
        (issue #1813).
        c                 S   s   | | @  S r   r$   r   r$   r$   r%   r     s    z5TestRewriteIssues.test_bitwise_arrayexpr.<locals>.fooTFN)r   r;   arrayr   r   )rj   r   r+   rG   r   r   r$   r$   r%   test_bitwise_arrayexpr  s    

z(TestRewriteIssues.test_bitwise_arrayexprc                 C   sX   t t}tddd}||||| t }|| | }| d| | d| dS )zo
        Type annotation of array expressions with disambiguated
        variable names (issue #1466).
        r   rt   ru   z
#   u.1 = z
#   u.2 = N)r   rM   r;   rz   r   Zinspect_typesgetvalueassertIn)rj   cfuncr+   bufresr$   r$   r%   test_annotations  s    
z"TestRewriteIssues.test_annotationsc                 C   s0   t dd }|d}|d}tj|| d S )Nc                 S   s,   t | }tdD ]}|| }| }q|S )Nr@   )r;   ZonesrS   copy)r,   r   r   valr$   r$   r%   f  s
    

z;TestRewriteIssues.test_issue_5599_name_collision.<locals>.f   )r   r   r;   r{   r|   )rj   r   r   r   r$   r$   r%   test_issue_5599_name_collision  s
    

z0TestRewriteIssues.test_issue_5599_name_collisionN)
r&   r'   r(   r   r   r   r   r   r   r   r$   r$   r$   r%   r     s   	r   c                   @   s   e Zd Zdd ZdS )TestSemanticsc                 C   sd   t }t|}tddtdg}tdddg}t|}||||}||||}tj|| d S )Ng        r:   inf)rC   r   r;   rR   floatZ	ones_liker{   r|   )rj   Zpyfuncr   r+   rG   rJ   r   r   r$   r$   r%   test_division_by_zero  s    
z#TestSemantics.test_division_by_zeroN)r&   r'   r(   r   r$   r$   r$   r%   r     s   r   c                   @   s    e Zd ZdZdd Zdd ZdS )TestOptionalsze Tests the arrival and correct lowering of Optional types at a arrayexpr
    derived ufunc, see #3972c                    s   t dd  t  fdd}tddf}|| }|j| }tj||  j}|d d }| t|t	j
 | t|jt	j d S )	Nc                 S   s   | | S r   r$   r,   r-   r$   r$   r%   arr_expr  s    z9TestOptionals.test_optional_scalar_type.<locals>.arr_exprc                    s   |dkrd }n|} | |S Nr   r$   r,   r-   zr   r$   r%   do_call  s    z8TestOptionals.test_optional_scalar_type.<locals>.do_callr   g333333r   rt   )r   r;   r   r   r{   r   
signatures
assertTruer   r   OptionaltypeFloatrj   r   r^   r   r   r    otyr$   r   r%   test_optional_scalar_type	  s    

z'TestOptionals.test_optional_scalar_typec                    s   t dd  t  fdd}tdtdf}|| }|j| }tj||  j}|d d }| t|t	j
 | t|jt	j | t|jjt	j d S )	Nc                 S   s   | | S r   r$   r   r$   r$   r%   r   &  s    z8TestOptionals.test_optional_array_type.<locals>.arr_exprc                    s    |d dkrd }n|} | |S r   r$   r   r   r$   r%   r   *  s    z7TestOptionals.test_optional_array_type.<locals>.do_callr         @r   rt   )r   r;   r   r   r{   r   r   r   r   r   r   r   ArrayrO   r   r   r$   r   r%   test_optional_array_type$  s    

z&TestOptionals.test_optional_array_typeN)r&   r'   r(   __doc__r   r   r$   r$   r$   r%   r     s   r   c                   @   s   e Zd Zdd Zdd ZdS )TestOptionalsExceptionsc              	      s   |    tdd  t fdd}tddf}| t}||  W 5 Q R X | dt|j  j	}|d d	 }| 
t|tj | 
t|jtj d S )
Nc                 S   s   | | S r   r$   r   r$   r$   r%   r   H  s    zUTestOptionalsExceptions.test_optional_scalar_type_exception_on_none.<locals>.arr_exprc                    s   |dkrd }n|} | |S r   r$   r   r   r$   r%   r   L  s    zTTestOptionalsExceptions.test_optional_scalar_type_exception_on_none.<locals>.do_callr   r:   zexpected float64, got Noner   rt   )disable_leak_checkr   r;   r   assertRaises	TypeErrorr   str	exceptionr   r   r   r   r   r   r   )rj   r   r^   raisesr    r   r$   r   r%   +test_optional_scalar_type_exception_on_noneD  s    
zCTestOptionalsExceptions.test_optional_scalar_type_exception_on_nonec              	      s   |    tdd  t fdd}tdtddf}| t}||  W 5 Q R X t|j}| d| | d	|  j	}|d
 d }| 
t|tj | 
t|jtj | 
t|jjtj d S )Nc                 S   s   | | S r   r$   r   r$   r$   r%   r   f  s    zTTestOptionalsExceptions.test_optional_array_type_exception_on_none.<locals>.arr_exprc                    s    |d dkrd }n|} | |S r   r$   r   r   r$   r%   r   j  s    zSTestOptionalsExceptions.test_optional_array_type_exception_on_none.<locals>.do_callr   r:   r   zexpected array(float64,zgot Noner   rt   )r   r   r;   r   r   r  r  r  r   r   r   r   r   r   r   r   rO   r   )rj   r   r^   r  Zexcstrr    r   r$   r   r%   *test_optional_array_type_exception_on_noneb  s     

zBTestOptionalsExceptions.test_optional_array_type_exception_on_noneN)r&   r'   r(   r  r  r$   r$   r$   r%   r   A  s   r   c                   @   s*   e Zd ZdZedZdd Zdd ZdS )TestExternalTypeszJ Tests RewriteArrayExprs with external (user defined) types,
    see #5157z
        from numba.core import types

        class FooType(types.Type):
            def __init__(self):
                super(FooType, self).__init__(name='Foo')
        c                    s|   G dd dt }t G dd dtj}t dd t| fdd}t|tjdd	 }t	
| fd
d}| fS )Nc                   @   s   e Zd Zdd ZdS )z,TestExternalTypes.make_foo_type.<locals>.Fooc                 S   s
   || _ d S r   r   )rj   r   r$   r$   r%   __init__  s    z5TestExternalTypes.make_foo_type.<locals>.Foo.__init__Nr&   r'   r(   r	  r$   r$   r$   r%   Foo  s   r  c                   @   s   e Zd Zdd ZdS )z1TestExternalTypes.make_foo_type.<locals>.FooModelc                 S   s"   dt jfg}tj| ||| d S )Nr   )r   intpr   StructModelr	  )rj   ZdmmZfe_typemembersr$   r$   r%   r	    s    z:TestExternalTypes.make_foo_type.<locals>.FooModel.__init__Nr
  r$   r$   r$   r%   FooModel  s   r  r   c                    s    fdd}|S )Nc                    s     S r   r$   r  FooTyper$   r%   typer  s    z@TestExternalTypes.make_foo_type.<locals>.type_foo.<locals>.typerr$   )contextr  r  r$   r%   type_foo  s    z1TestExternalTypes.make_foo_type.<locals>.type_fooc                 S   s*   |j }|\}t|| |}||_| S r   )r_   r   Zcreate_struct_proxyr   Z	_getvalue)r  Zbuildersigr^   typr   r   r$   r$   r%   impl_foo  s
    z1TestExternalTypes.make_foo_type.<locals>.impl_fooc                    s     S r   r$   )r   rJ   r  r$   r%   
typeof_foo  s    z3TestExternalTypes.make_foo_type.<locals>.typeof_foo)objectr   r   r  r   r   r   r   r  r   register)rj   r  r  r  r  r  r  r$   r  r%   make_foo_type  s    

zTestExternalTypes.make_foo_typec              	      s   t | j}| |j\ ttjfdd}ttjfdd}ttjfdd}t fdd}t fdd	}t fd
d}t	j
|ddt	ddg t	j
|ddt	ddg t	j
|dt	dg W 5 Q R X d S )Nc                    s&   t |  r"t |tjr"dd }|S d S )Nc                 S   s   t | j|d gS r   r;   r   r   lhsrhsr$   r$   r%   imp  s    KTestExternalTypes.test_external_type.<locals>.overload_foo_add.<locals>.imp)r   r   r   r  r  r   r  r$   r%   overload_foo_add  s    z>TestExternalTypes.test_external_type.<locals>.overload_foo_addc                    s$   t |  r t | r dd }|S d S )Nc                 S   s   t | j|jgS r   r  r  r$   r$   r%   r     s    r!  r   r"  r  r$   r%   r#    s    c                    s   t |  rdd }|S d S )Nc                 S   s   t | j gS r   r  r,   r$   r$   r%   r     s    zKTestExternalTypes.test_external_type.<locals>.overload_foo_neg.<locals>.impr$  )r,   r   r  r$   r%   overload_foo_neg  s    
z>TestExternalTypes.test_external_type.<locals>.overload_foo_negc                    s    | t |g S r   )r;   r   r   r  r$   r%   arr_expr_sum1  s    z;TestExternalTypes.test_external_type.<locals>.arr_expr_sum1c                    s    |  | S r   r$   r   r'  r$   r%   arr_expr_sum2  s    z;TestExternalTypes.test_external_type.<locals>.arr_expr_sum2c                    s
    |  S r   r$   r%  r'  r$   r%   arr_expr_neg  s    z:TestExternalTypes.test_external_type.<locals>.arr_expr_negr   rt   r@   rD   rA   )r   source_linesr  r  r   operatorrF   negr   r;   r{   r|   r   )rj   Ztest_moduler#  r&  r(  r)  r*  r$   )r  r  r%   test_external_type  s"    		z$TestExternalTypes.test_external_typeN)	r&   r'   r(   r   textwrapdedentr,  r  r/  r$   r$   r$   r%   r    s   
"r  __main__)>r   ior   r   r;   r   r   r   r   Z
numba.corer   r   r	   r
   r   r   r   Znumba.core.compilerr   r   Znumba.core.registryr   Znumba.tests.supportr   r   r   r   Znumba.extendingr   r   r   r   r   r   r   r-  r0  Zunittestdictr   r.   r/   r6   r8   r9   r=   r?   rB   rC   rE   rI   rM   rX   rY   rg   r   r   r   r   r  r&   mainr$   r$   r$   r%   <module>   sJ   $$	  l<Ca
