U
    iâË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�rÚe% =¡  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__© úU/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/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
   ÚAssignÚvalueÚ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_operandsÚ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 |	¡¡ qÊd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>Néÿÿÿÿz9Common 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 )Néd   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ç   g333333ó¿r   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  r2  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   r0  r3  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
