U
    ,‰dÏ¥  ã                   @   sÚ  d dl Z d dlZd dlZd dlmZ d dlmZ d dlm	Z	m
Z
mZ d dlmZmZmZmZmZmZmZmZ d dlmZmZmZmZ d dl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%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- d dl.m/Z/m0Z0m1Z1m2Z2 d dl3m4Z4m Z m5Z5 d dl6m7Z7 d dl8Z8eZ9e7dej:fdej:fgƒG dd„ de;ƒƒZ<dZ=dZ>G dd„ deƒZ?e5dddG dd„ de4ƒƒZ@G dd„ deƒZAG dd„ deƒZBG dd „ d eƒZCG d!d"„ d"eƒZDeEd#krÖe8 F¡  dS )$é    N)Ú
namedtuple)ÚStringIO)ÚnjitÚtypeofÚprange)ÚtypesÚtypingÚirÚbytecodeÚpostprocÚcpuÚregistryÚutils)ÚTestCaseÚtagÚskip_parfors_unsupportedÚskip_unless_scipy)ÚEquivSetÚArrayAnalysis)ÚCompilerÚFlagsÚPassManager)Úremove_dead)
ÚExtractByteCodeÚTranslateByteCodeÚ	FixupArgsÚIRProcessingÚDeadBranchPruneÚRewriteSemanticConstantsÚGenericRewritesÚWithLiftingÚ
PreserveIRÚInlineClosureLikes)ÚNopythonTypeInferenceÚAnnotateTypesÚNopythonRewritesÚIRLegalization)ÚFunctionPassr   Úregister_pass)ÚjitclassÚLÚTc                   @   s   e Zd Zdd„ ZdS )ÚExampleClass3700c                 C   s   || _ |d | _d S ©Né   )r*   r+   )ÚselfÚn© r1   úC/tmp/pip-unpacked-wheel-eu7e0c37/numba/tests/test_array_analysis.pyÚ__init__+   s    zExampleClass3700.__init__N)Ú__name__Ú
__module__Ú__qualname__r3   r1   r1   r1   r2   r,   )   s   r,   )g333333ó?©é   é   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚTestEquivSetz'
    Test array_analysis.EquivSet.
    c                 C   sž   t ƒ }| dd¡ |  | dd¡¡ |  | dd¡¡ | dd¡ |  | dd¡¡ |  | dd¡¡ | dd¡ |  | dddd¡¡ |  | dd¡¡ d S ©NÚaÚbÚcÚdÚe)r   Úinsert_equivÚ
assertTrueÚis_equivÚassertFalse)r/   Ús1r1   r1   r2   Útest_insert_equiv:   s    zTestEquivSet.test_insert_equivc                 C   sì   t ƒ }t ƒ }| |¡}|  | ¡ ¡ | dd¡ | |¡}|  | ¡ ¡ | dd¡ | |¡}|  | ¡ ¡ | dd¡ | |¡}|  | ¡ ¡ | dd¡ | dd¡ | |¡}|  | dd¡¡ |  | dd¡¡ |  | dd¡¡ d S r;   )r   Z	intersectrB   Zis_emptyrA   rC   rD   )r/   rE   Ús2Úrr1   r1   r2   Útest_intersectF   s&    




zTestEquivSet.test_intersectN)r4   r5   r6   Ú__doc__rF   rI   r1   r1   r1   r2   r:   5   s   r:   FT)Zanalysis_onlyZmutates_CFGc                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚArrayAnalysisPassZarray_analysis_passc                 C   s   t  | ¡ d S ©N)r'   r3   )r/   r1   r1   r2   r3   `   s    zArrayAnalysisPass.__init__c                 C   sr   t |j|j|j|jƒ|_|j |jj¡ t 	|j¡}| ¡  |j
 |j ¡ ¡ |jrnt|j
ƒdkrn| |j
¡ dS )Nr.   F)r   Z	typingctxÚfunc_irÚtypemapZ	calltypesÚarray_analysisÚrunÚblocksr   ZPostProcessorÚfunc_ir_copiesÚappendÚcopyÚtest_idempotenceÚlen)r/   ÚstateZ	post_procr1   r1   r2   Úrun_passc   s    
 ÿzArrayAnalysisPass.run_passN)r4   r5   r6   Ú_namer3   rX   r1   r1   r1   r2   rK   \   s   rK   c                   @   s0   e Zd Zeddi dddfdd„ƒZddd„ZdS )ÚArrayAnalysisTesterNc                 C   sD   |s
t ƒ }d|_|d kr tjj}|d kr0tjj}| |||||||ƒS ©NT)r   Znrtr   Z
cpu_targetÚtyping_contextÚtarget_context)ÚclsÚargsÚreturn_typeÚflagsÚlocalsZlibraryr\   r]   r1   r1   r2   Úmk_pipelineq   s     ÿzArrayAnalysisTester.mk_pipelinec                 C   s  t j |¡| j_tƒ  | j¡ d| j_d| j_| j}g |_	||_
d}t|ƒ}| td¡ | td¡ | td¡ |jjsœ| td¡ | td¡ | td	¡ | td
¡ | td¡ |jjsÈ| td¡ | td¡ |rä| td¡ | td¡ | td¡ | ¡  | |¡ |jS )z4
        Populate and run compiler pipeline
        r1   NZarray_analysis_testingzanalyzing bytecodezfix up argszprocessing IRznopython rewriteszrewrite semantic constantszdead branch pruningz(inline calls to locally defined closuresznopython frontendzarray analysiszidempotence array analysisz$ensure IR is legal prior to loweringzannotate types)r
   ZFunctionIdentityÚfrom_functionrW   Zfunc_idr   rX   ZliftedZlifted_fromrR   rU   r   Zadd_passr   r   r   ra   Zno_rewritesr   r   r   r"   r#   r%   rK   r&   r$   ÚfinalizerP   rO   )r/   ÚfuncrU   rW   ÚnameZpmr1   r1   r2   Úcompile_to_ir~   s<    ÿ
z!ArrayAnalysisTester.compile_to_ir)N)r4   r5   r6   Úclassmethodrc   rh   r1   r1   r1   r2   rZ   o   s     ÿrZ   c                   @   s   e Zd Zdd„ Zg g dfdd„Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zedd„ ƒZd S )!ÚTestArrayAnalysisc                 C   sX   g }|D ]4}t |j|j|ƒ tƒ }|j|d | | ¡ ¡ q|  tt	|ƒƒdk¡ d S )N)Úfiler.   )
r   rQ   Ú	arg_namesr   ÚdumprS   ÚgetvaluerB   rV   Úset)r/   Zir_listÚoutputsrM   Úoutputr1   r1   r2   Ú
compare_ir®   s    zTestArrayAnalysis.compare_irTc           
      C   s|   t  |¡}|r| jndd„ }| ||¡}|rD|D ]}	|	|jd ƒ q0|dkr`|  |  |j¡¡ n|D ]}	|	|j|jƒ qddS )z<
        Compile the given function and get its IR.
        c                 S   s   dS )Nr1   r1   )Úxr1   r1   r2   Ú<lambda>¼   ó    z5TestArrayAnalysis._compile_and_test.<locals>.<lambda>r   N)	rZ   rc   rr   rh   Ú
equiv_setsrB   Ú_has_no_assertcallrM   rN   )
r/   ÚfnZarg_tysÚassertsÚequivsÚ
idempotentZtest_pipelinerU   Zanalysisrf   r1   r1   r2   Ú_compile_and_test·   s    
z#TestArrayAnalysis._compile_and_testc           
      C   s‚   d  d |¡¡}|j ¡ D ]b\}}|jddD ]L}| |jj¡}t|t	j
ƒr.|jdkr.||jd j }	|	j |¡r.  dS q.qdS )	NzSizes of {} do not matchz, Úcall©ÚopÚassert_equivr   TF)ÚformatÚjoinrQ   ÚitemsÚ
find_exprsÚget_definitionrf   rg   Ú
isinstancer	   ÚGlobalr_   Zliteral_valueÚ
startswith)
r/   rM   rN   r_   ÚmsgÚlabelÚblockÚexprrx   Útypr1   r1   r2   Ú_has_assertcallÈ   s    z!TestArrayAnalysis._has_assertcallc                 C   sŽ   |j  ¡ D ]~\}}|jddD ]h}|jdkr|j|jdd}|j|dd}t|tjƒr\|j	n|}t|tjƒrr|j	n|}||kr  dS qq
dS )NÚgetattrr~   ÚshapeT)Zlhs_onlyF)
rQ   rƒ   r„   Úattrr…   Úvaluer†   r	   ZVarrg   )r/   rM   rs   rŠ   r‹   rŒ   ÚyÚzr1   r1   r2   Ú_has_shapecallÓ   s    
z TestArrayAnalysis._has_shapecallc                 C   sV   |j  ¡ D ]F\}}|jddD ]0}| |jj¡}t|tjƒr|jdkr  dS qq
dS )Nr}   r~   r€   FT)	rQ   rƒ   r„   r…   rf   rg   r†   r	   r‡   )r/   rM   rŠ   r‹   rŒ   rx   r1   r1   r2   rw   ß   s    z$TestArrayAnalysis._has_no_assertcallc                    s   ‡ ‡fdd„S )Nc                    s   ˆ  ˆ | |ˆ ¡¡S rL   )rB   rŽ   ©rM   rN   ©r_   r/   r1   r2   rt   è   s   ÿz/TestArrayAnalysis.with_assert.<locals>.<lambda>r1   ©r/   r_   r1   r—   r2   Úwith_assertç   s    zTestArrayAnalysis.with_assertc                    s   ‡ ‡fdd„S )Nc                    s   ˆ  ˆ | |ˆ ¡¡S rL   )rD   rŽ   r–   r—   r1   r2   rt   ì   s   ÿz2TestArrayAnalysis.without_assert.<locals>.<lambda>r1   r˜   r1   r—   r2   Úwithout_assertë   s    z TestArrayAnalysis.without_assertc                    s   ‡ fdd„‰‡‡fdd„S )Nc                    s<   t ˆ ƒ}t|d ƒD ]"}|  ˆ | ˆ |d  ¡s dS qdS ©Nr.   FT©rV   ÚrangerC   ©Ú	equiv_setr0   Úi©r_   r1   r2   Úcheckð   s
    z+TestArrayAnalysis.with_equiv.<locals>.checkc                    s   ˆ  ˆ | ƒ¡S rL   ©rB   ©rŸ   ©r¢   r/   r1   r2   rt   ö   ru   z.TestArrayAnalysis.with_equiv.<locals>.<lambda>r1   r˜   r1   ©r_   r¢   r/   r2   Ú
with_equivï   s    zTestArrayAnalysis.with_equivc                    s   ‡ fdd„‰‡‡fdd„S )Nc                    s<   t ˆ ƒ}t|d ƒD ]"}|  ˆ | ˆ |d  ¡r dS qdS r›   rœ   rž   r¡   r1   r2   r¢   ù   s
    z.TestArrayAnalysis.without_equiv.<locals>.checkc                    s   ˆ  ˆ | ƒ¡S rL   r£   r¤   r¥   r1   r2   rt   ÿ   ru   z1TestArrayAnalysis.without_equiv.<locals>.<lambda>r1   r˜   r1   r¦   r2   Úwithout_equivø   s    zTestArrayAnalysis.without_equivc                    s   ‡ ‡fdd„S )Nc                    s   ˆ   ˆ  | ˆ¡¡S rL   )rB   r•   ©rM   Ús©r/   rs   r1   r2   rt     ru   z2TestArrayAnalysis.with_shapecall.<locals>.<lambda>r1   r«   r1   r«   r2   Úwith_shapecall  s    z TestArrayAnalysis.with_shapecallc                    s   ‡ ‡fdd„S )Nc                    s   ˆ   ˆ  | ˆ¡¡S rL   )rD   r•   r©   r«   r1   r2   rt     ru   z5TestArrayAnalysis.without_shapecall.<locals>.<lambda>r1   r«   r1   r«   r2   Úwithout_shapecall  s    z#TestArrayAnalysis.without_shapecallc              	      sê  dd„ }| j |d|  dd¡|  dd¡|  dd	¡gd
 dd„ }| j |tjfd d dd„ }| j |tjtjf|  dd¡gd dd„ }| j |tjfd d dd„ }| j |tjfd d dd„ }| j |tjfd d dd„ }| j |tjtjf|  dd¡|  dd¡gd dd„ }| j |tjtjf|  dd¡|  dd¡gd dd„ }	| j |	tjtjf|  dd¡|  dd¡gd dd„ }
| j |
tjf|  d d!¡gd d"d#„ }| j |tjtjf|  d d!¡|  d$d%¡gd d&d'„ }| j |d|  dd(¡gd
 d)d*„ }| j |d|  dd(d+¡gd
 d,d-„ }t tjd.d$¡}| j |t ||f¡fd d d/d0„ }| j |tjf|  d d!¡gd
 td1ddgƒ‰ ‡ fd2d3„}| j |tjf|  d4d5¡gd
 d6d7„ }| j |t tjd.d$¡fd d d8d9„ }| j |t tjd:d$¡fd d d;d<„ }| j |tjtjtjfd d d=d>„ }| j |tjtjfd d d?d@„ }| j |t tjd.d$¡t tjd.d$¡fd d | j |t tjd:d$¡t tjd:d$¡fd d |  	t
¡2}| j |t tjd.d$¡t tjd:d$¡fd d W 5 Q R X dA}|  |t|jƒ¡ d S )BNc                  S   s.   t  d¡} t  d¡}d}d}t  ||f¡}d S ©Nr   r.   ©ÚnpÚzeros)r<   r=   Úmr0   r>   r1   r1   r2   Útest_0  s    

z1TestArrayAnalysis.test_base_cases.<locals>.test_0r1   r<   )r   r=   ©r.   r>   ©r   r.   ©rz   c                 S   s   t  | ¡}t  | ¡}|| S rL   r¯   ©r0   r<   r=   r1   r1   r2   Útest_1  s    

z1TestArrayAnalysis.test_base_cases.<locals>.test_1)ry   c                 S   s   t  |¡}t  | ¡}|| S rL   r¯   ©r²   r0   r<   r=   r1   r1   r2   Útest_2  s    

z1TestArrayAnalysis.test_base_cases.<locals>.test_2c                 S   s   t  | ¡}||  S rL   r¯   ©r0   r<   r1   r1   r2   Útest_3!  s    
z1TestArrayAnalysis.test_base_cases.<locals>.test_3c                 S   s"   t  | ¡}|d }|d }|| S ©Nr.   é   r¯   ©r0   r<   r=   r>   r1   r1   r2   Útest_4&  s    
z1TestArrayAnalysis.test_base_cases.<locals>.test_4c                 S   s(   t  | | f¡}| }t  || f¡}|| S rL   r¯   )r0   r<   r²   r=   r1   r1   r2   Útest_5-  s    z1TestArrayAnalysis.test_base_cases.<locals>.test_5c                 S   s,   t  |¡}t  | ¡}|| }|| }|| S rL   r¯   )r²   r0   r<   r=   r?   r@   r1   r1   r2   Útest_64  s
    

z1TestArrayAnalysis.test_base_cases.<locals>.test_6r?   r@   c                 S   s6   t  |¡}t  | ¡}| dkr&|| }n|| }|| S ©Né
   r¯   ©r²   r0   r<   r=   r?   r1   r1   r2   Útest_7>  s    


z1TestArrayAnalysis.test_base_cases.<locals>.test_7c                 S   s6   t  |¡}t  | ¡}| dkr&|| }n|| }|| S rÃ   r¯   rÅ   r1   r1   r2   Útest_8J  s    


z1TestArrayAnalysis.test_base_cases.<locals>.test_8c                 S   s@   t  | ¡}d}| dk r<| d7 } t  | ¡}|t  || ¡7 }q|S ©Nr   r¾   r.   ©r°   ÚonesÚsum)r²   ÚArª   ÚBr1   r1   r2   Útest_9V  s    

z1TestArrayAnalysis.test_base_cases.<locals>.test_9rÌ   rÍ   c                 S   sd   | d }|d }|d }t  |¡}t  |¡}t  |¡}t  | ¡}t  || ¡}	t  || ¡}
|	|
 S r-   ©r°   r±   rË   )r²   r0   ÚpÚqrH   rÌ   rÍ   ÚCÚDrª   Útr1   r1   r2   Útest_10a  s    



z2TestArrayAnalysis.test_base_cases.<locals>.test_10rÒ   rÓ   c                  S   sD   t  d¡} t  d¡}| dd … }|d d… }t|ƒ}t|ƒ}||kS )Né   r.   éÿÿÿÿ©r°   rÊ   rV   ©r<   r=   r>   r?   r@   Úfr1   r1   r2   Útest_11p  s    

z2TestArrayAnalysis.test_base_cases.<locals>.test_11rÚ   c                  S   sl   t  d¡ d¡} t  d¡ d¡}| dd …d d …f }|d d…d d …f }|jd }|jd }t|ƒ}||kS )Né   )rÖ   rÖ   r.   r×   r   )r°   rÊ   Úreshaper   rV   )r<   r=   r>   r?   r@   rÚ   Úgr1   r1   r2   Útest_12{  s    

z2TestArrayAnalysis.test_base_cases.<locals>.test_12rÞ   c                 S   s   | }|d S ©Nr   r1   )r+   ZT2r1   r1   r2   Útest_tup_arg‡  s    z7TestArrayAnalysis.test_base_cases.<locals>.test_tup_argr.   c                 S   s&   t  | ¡}|f}t  t|d ƒ¡}|S rà   rØ   )r²   rÌ   ÚSrÍ   r1   r1   r2   Útest_arr_in_tup  s    
z:TestArrayAnalysis.test_base_cases.<locals>.test_arr_in_tupr+   c                    s   ˆ | | ƒ}|d S rà   r1   )r0   rH   ©r+   r1   r2   Útest_namedtuple™  s    
z:TestArrayAnalysis.test_base_cases.<locals>.test_namedtuplerH   ©r0   r0   c                 S   s   t  | ¡}t|d ƒS rà   )r°   ÚwhererV   )rÌ   r>   r1   r1   r2   Útest_np_where_tup_return   s    
zCTestArrayAnalysis.test_base_cases.<locals>.test_np_where_tup_returnc                 S   s    | j \}}t ||f¡}| | S rL   )r   r°   rÊ   )rÌ   r²   r0   rÍ   r1   r1   r2   Ú
test_shape§  s    
z5TestArrayAnalysis.test_base_cases.<locals>.test_shaper¾   c           	      S   sˆ   t  | ¡}t  |¡}t  |¡}| |kr6t  || ¡}nd}||krHd}nt  || ¡}d}| |kr|||kr|t  || | ¡}|| | S rà   rÉ   )	Úlr²   r0   rÌ   rÍ   rÒ   rH   rª   rÔ   r1   r1   r2   Ú	test_cond®  s    


z4TestArrayAnalysis.test_base_cases.<locals>.test_condc                 S   s.   | |kst ‚t | ¡}t |¡}t || ¡S rL   )ÚAssertionErrorr°   rÊ   rË   )r²   r0   rÌ   rÍ   r1   r1   r2   Útest_assert_1Â  s    

z8TestArrayAnalysis.test_base_cases.<locals>.test_assert_1c                 S   s   | j |j kst‚t | | ¡S rL   )r   rì   r°   rË   )rÌ   rÍ   r1   r1   r2   Útest_assert_2Ê  s    z8TestArrayAnalysis.test_base_cases.<locals>.test_assert_2zDimension mismatch)r|   r§   r   Úintpr™   rš   ÚArrayÚTupler   ÚassertRaisesrì   ZassertInÚstrÚ	exception)r/   r³   r¸   rº   r¼   rÀ   rÁ   rÂ   rÆ   rÇ   rÎ   rÕ   rÛ   rß   rá   Zint_arr_typrã   rå   rè   ré   rë   rí   rî   Zraisesr‰   r1   rä   r2   Útest_base_cases  sÔ    


þÿÿ

ÿÿ

ÿÿ

ÿÿÿ

ÿÿÿ	ÿ ÿÿÿ ÿÿÿÿÿþÿþÿþz!TestArrayAnalysis.test_base_casesc                    sÐ   ddl m} |dd„ ƒ‰ ‡ fdd„}| j|tjf|  dd¡g|  dd¡gd	 ‡ fd
d„}| j|tjf|  dd¡gd |dddd„ ƒ‰‡fdd„}| j|tjf|  ddd¡|  dd¡g|  dd¡gd	 d S )Nr   )Ústencilc                 S   s$   d| d | d  | d  | d   S )Ng      Ð?rµ   )r.   r   )r   r×   )r×   r   r1   ©r<   r1   r1   r2   Úkernel_1ß  s    z4TestArrayAnalysis.test_stencilcall.<locals>.kernel_1c                    s   t  | | f¡}ˆ |ƒ}|| S rL   ©r°   rÊ   r·   ©rø   r1   r2   r¸   ã  s    z2TestArrayAnalysis.test_stencilcall.<locals>.test_1r<   r=   ©rz   ry   c                    s4   t  | | f¡}t  | d | d f¡}ˆ ||d |S )Nr.   )Úoutrù   r·   rú   r1   r2   rº   ì  s    z2TestArrayAnalysis.test_stencilcall.<locals>.test_2r¶   )r>   )Zstandard_indexingc                 S   s   | d |d  |d  S )N)r   r.   r   )r   r×   r   r   r1   )r<   r=   r>   r1   r1   r2   Úkernel_2õ  s    z4TestArrayAnalysis.test_stencilcall.<locals>.kernel_2c                    sB   t  d¡ ddd¡}t  d¡ | dd¡}t  d¡}ˆ |||ƒ}|S )Né@   r9   é   r¾   r.   )r°   ÚarangerÝ   r±   )r0   r<   r=   ÚuÚv)rý   r1   r2   r¼   ù  s
    
z2TestArrayAnalysis.test_stencilcall.<locals>.test_3r  r  )	Znumba.stencils.stencilrö   r|   r   rï   r§   rš   r¨   r™   )r/   rö   r¸   rº   r¼   r1   )rø   rý   r2   Útest_stencilcallÝ  s*    
þÿ

ÿýz"TestArrayAnalysis.test_stencilcallc           
   
   C   sº  dd„ }| j |tjtjf|  dd¡|  dd¡gdd d	d
„ }| j |tjf|  dd¡|  dd¡gdd dd„ }| j |tjf|  dd¡gdd dd„ }| j |tjf|  dd¡gdd dd„ }| j |tjtjf|  dd¡|  dd¡|  dd¡gdd dd„ }| j |tjf|  dd¡gdd dd„ }| j |tjf|  dd¡gdd dd„ }| j |tjf|  dd¡gdd dd„ }	| j |	tjf|  dd¡|  dd¡|  dd¡|  dd¡gdd d S )Nc                 S   sX   t  | ¡}t  |¡}t  || ¡}|d| d … }|d|d … }t  || ¡}|| S r-   rÏ   )r²   r0   rÌ   rÍ   rª   rÒ   rÓ   rÔ   r1   r1   r2   r¸     s    

z,TestArrayAnalysis.test_slice.<locals>.test_1rÌ   rÍ   rÒ   rÓ   F)ry   r{   c                 S   sJ   t  | ¡}|d| d … }|d| d … }|d| d … }|| }|| S )Nr   r8   r.   r¾   r¯   )r²   rÌ   rÍ   rÒ   rÓ   ÚEr1   r1   r2   rº     s    
z,TestArrayAnalysis.test_slice.<locals>.test_2r  c                 S   sR   t  | | f¡}|d| d …d| d …f }|d| d …d| d …f }|| }|S rÈ   r¯   ©r²   rÌ   rÍ   rÒ   r  r1   r1   r2   r¼      s
    z,TestArrayAnalysis.test_slice.<locals>.test_3c                 S   sJ   t  | | f¡}|d| d …d d …f }|d| d …d d …f }|| }|S rÈ   r¯   r  r1   r1   r2   rÀ   *  s
    z,TestArrayAnalysis.test_slice.<locals>.test_4c                 S   sb   t  | ¡}t  | ¡}|d| d … |d| d …< t  |¡}|d| d … }||d|d …< || S )Nr.   r   r¾   r¯   )r²   r0   rÌ   rÍ   rÒ   rÓ   r1   r1   r2   rÁ   4  s    


z,TestArrayAnalysis.test_slice.<locals>.test_5c                 S   sJ   t  | | f¡}|d| d …d d…f }|d| d …d d…f }|| }|S )Nr   r¾   r×   r.   r¯   r  r1   r1   r2   rÂ   D  s
    z,TestArrayAnalysis.test_slice.<locals>.test_6c                 S   sJ   t  | | f¡}|d| d …dd…f }|d| d …dd…f }|| }|S )Nr   r¾   éýÿÿÿr×   r.   éüÿÿÿéþÿÿÿr¯   r  r1   r1   r2   rÆ   N  s
    z,TestArrayAnalysis.test_slice.<locals>.test_7c                 S   sF   t  | | f¡}|d | d …dd …f }|dd…d d …f }|| }|S )Nr¾   r   r.   r×   r¯   r  r1   r1   r2   rÇ   X  s
    z,TestArrayAnalysis.test_slice.<locals>.test_8c                 S   sN   t  | ¡}|d d… }|dd … }|d dd… }|| }|}|d7 }|||fS )Nr   r.   r×   r¯   )r²   rÌ   rÍ   rÒ   rÓ   r  ÚFr1   r1   r2   rÎ   b  s    
z,TestArrayAnalysis.test_slice.<locals>.test_9r²   r	  )rz   r{   )r|   r   rï   r™   rš   r¨   r§   )
r/   r¸   rº   r¼   rÀ   rÁ   rÂ   rÆ   rÇ   rÎ   r1   r1   r2   Ú
test_slice  sp    

ÿý

ÿýþþ



þüþþþ



ýûzTestArrayAnalysis.test_slicec                 C   sx  dd„ }| j |tjf|  dd¡|  dd¡|  dd¡gd d	d
„ }| j |tjf|  dd¡g|  d¡gd dd„ }| j |tjf|  dd¡|  dd¡|  dd¡gd dd„ }| j |tjf|  dd¡|  dd¡|  dd¡gd dd„ }| j |tjf|  dd¡|  dd¡|  dd¡|  dd¡gd dd„ }| j |tjf|  dd¡gd dd„ }| j |tjf|  dd¡|  dd¡g|  d¡|  d¡gd dd„ }| j |t tjdd¡f|  ddddd¡g|  d¡|  d¡gd dd„ }	| j |	tjf|  dd¡g|  d¡gd d d!„ }
| j |
tjtjf|  dd"¡|  dd#¡|  dd#¡gd d$d%„ }| j |tjtjtjf|  dd&¡|  dd'¡|  dd'¡|  dd(¡|  d)d(¡|  dd*¡|  d+d*¡gd d,d-„ }| j |tjtjf|  dd"¡|  dd"¡|  dd"¡gd d.d/„ }td0ƒd1 }dgd2d3„ t	tdƒ|ƒD ƒ }dgd4d3„ t	tdƒ|ƒD ƒ }|d5d3„ t	tdƒ|ƒD ƒ7 }| j |tjf| j|Ž | j|Ž gd d6d7„ }| j |tjtjf|  dd8¡|  d9d:¡g|  d¡|  d¡|  d9¡|  d;¡gd d<d=„ }| j |d>|  d;d?¡|  d@dA¡|  dBdC¡|  dDdE¡|  dFdG¡|  dHdI¡|  dJdK¡gd dLdM„ }| j |tjtjf|  dNd¡|  ddO¡|  ddPdQ¡|  dRdS¡|  dTdUdV¡gd dWdX„ }| j |tj
tj
f|  ddY¡|  ddZ¡gd d[d\„ }| j |tjtjtjf|  dd]¡|  dd^¡|  dd]¡|  dRd_¡|  dTd`¡|  dUd`¡g|  dNda¡gd dbdc„ }| j |tjtjf|  ddd¡gd d ddde„ }| j |d>|  dd¡gd d d S )fNc                 S   s,   t  | ¡}t  | | f¡}t j| | fd}d S ©N)r   r¯   r¿   r1   r1   r2   Ú
test_zerosv  s    
z6TestArrayAnalysis.test_numpy_calls.<locals>.test_zerosr<   r0   r=   ræ   r>   r¶   c                 S   s   t  d¡}t  d¡}|| S r½   )r°   ÚarrayrÊ   r·   r1   r1   r2   Útest_0d_array  s    

z9TestArrayAnalysis.test_numpy_calls.<locals>.test_0d_arrayrû   c                 S   s,   t  | ¡}t  | | f¡}t j| | fd}d S r  rù   r¿   r1   r1   r2   Ú	test_ones‡  s    
z5TestArrayAnalysis.test_numpy_calls.<locals>.test_onesc                 S   s,   t  | ¡}t  | | f¡}t j| | fd}d S r  )r°   Úemptyr¿   r1   r1   r2   Ú
test_empty  s    
z6TestArrayAnalysis.test_numpy_calls.<locals>.test_emptyc                 S   s:   t  | ¡}t j| d}t j| | d}t j| | d d}d S )N)ÚN)r  ÚMr.   )r°   Zeye©r0   r<   r=   r>   r?   r1   r1   r2   Útest_eye™  s    
z4TestArrayAnalysis.test_numpy_calls.<locals>.test_eyer?   c                 S   s   t  | ¡}d S rL   )r°   Úidentityr»   r1   r1   r2   Útest_identity¤  s    z9TestArrayAnalysis.test_numpy_calls.<locals>.test_identityc                 S   s0   t  | ¡}t  |¡}t  |¡}t j|dd}d S )Nr.   )Úk)r°   r  Zdiagr  r1   r1   r2   Ú	test_diag©  s    


z5TestArrayAnalysis.test_numpy_calls.<locals>.test_diag)r0   c                 S   s8   t  | ¡}t  | ¡}t  | ¡}t  | d¡}t  | ¡}d S r-   )r°   Z
empty_likeZ
zeros_likeZ	ones_likeZ	full_likeZasfortranarrayrÙ   r1   r1   r2   Útest_array_like´  s
    


z;TestArrayAnalysis.test_numpy_calls.<locals>.test_array_liker¾   rÒ   r@   rÚ   c                 S   s,   t  | |  ¡}| | | f¡}| ¡ | ¡  S rL   )r°   rÊ   rÝ   rË   r·   r1   r1   r2   Útest_reshapeÁ  s    z8TestArrayAnalysis.test_numpy_calls.<locals>.test_reshapec                 S   s    t  | |f¡}|j}| ¡ }d S rL   ©r°   rÊ   r+   Z	transpose©r²   r0   r<   r=   r>   r1   r1   r2   Útest_transposeÊ  s    z:TestArrayAnalysis.test_numpy_calls.<locals>.test_transpose)r²   r0   )r0   r²   c           
      S   sR   t  | ||f¡}|j}| ¡ }| ddd¡}| d¡}| ddd¡}| d¡}	d S )Nr¾   r   r.   )r¾   r   r.   )r   r¾   r.   r  )
r²   r0   r  r<   r=   r>   r?   Údtr@   Úetr1   r1   r2   Útest_transpose_3dÖ  s    
z=TestArrayAnalysis.test_numpy_calls.<locals>.test_transpose_3d)r²   r0   r  )r  r0   r²   )r  r²   r0   r  )r²   r  r0   r   c                 S   s   t  | |f¡}|j}|j}d S rL   )r°   rÊ   ÚrealÚimagr  r1   r1   r2   Útest_real_imag_attré  s    z?TestArrayAnalysis.test_numpy_calls.<locals>.test_real_imag_attrc           G      S   sÔ  t j | ¡}t j | | ¡}t j | ¡}t j | | ¡}t j | ¡}t j | | f¡}t jj| | fd}t j | ¡}t j | | f¡}	t jj| | fd}
t j | ¡}t j | | f¡}t jj| | fd}t j | ¡}t j | | f¡}t jj| | fd}t j | ¡}t j | | f¡}t jj| | fd}t j d| ¡}t j d| | f¡}t jjd| | fd}t j 	d| ¡}t j 	d| | f¡}t jj	d| | fd}t j 
d| ¡}t j 
d| | f¡}t jj
d| | fd}t j d| ¡}t j d| | f¡}t jjd| | fd}t j d| ¡} t j d| | f¡}!t jjd| | fd}"t j d| ¡}#t j d| | f¡}$t jjd| | fd}%t j d| ¡}&t j d| | f¡}'t jjd| | fd}(t j dd| ¡})t j dd| | f¡}*t jjdd| | fd}+t j dd| ¡},t j dd| | f¡}-t jjdd| | fd}.t j dd| ¡}/t j dd| | f¡}0t jjdd| | fd}1t j dd| ¡}2t j dd| | f¡}3t jjdd| | fd}4t j dd| ¡}5t j dd| | f¡}6t jjdd| | fd}7t j dd| ¡}8t j dd| | f¡}9t jjdd| | fd}:t j dd| ¡};t j dd| | f¡}<t jjdd| | fd}=t j dd| ¡}>t j dd| | f¡}?t jjdd| | fd}@t j dd| ¡}At j dd| | f¡}Bt jjdd| | fd}Ct j ddd| ¡}Dt j ddd| | f¡}Et jjddd| | fd}Fd S )N)ÚsizerÄ   gš™™™™™¹?r   r.   r  )r°   ÚrandomZrandZrandnZranfZrandom_sampleÚsampleZstandard_normalZ	chisquareZweibullÚpowerZ	geometricZexponentialZpoissonZrayleighÚnormalÚuniformÚbetaZbinomialrÚ   ÚgammaZ	lognormalZlaplaceÚrandintÚ
triangular)Gr0   Za0Za1Zb0Zb1Zc0Zc1Úc2Zd0Úd1Zd2Ze0Úe1Úe2Zf0Úf1Úf2Zg0Zg1Zg2Zh0Úh1Úh2Zi0Úi1Úi2Zj0Zj1Zj2Zk0Zk1Zk2Zl0Úl1Úl2Zm0Úm1Úm2Zn0Zn1Zn2Zo0Zo1Zo2Zp0Úp1Úp2Zq0Zq1Zq2Zr0Zr1Zr2Ús0rE   rG   Út0Út1Út2Zu0Úu1Úu2Zv0Zv1Zv2Zw0Zw1Zw2Zx0Úx1Zx2r1   r1   r2   Útest_randomô  sŒ    z7TestArrayAnalysis.test_numpy_calls.<locals>.test_randomrs   r.   c                 S   s   g | ]}t |ƒd  ‘qS )Ú0©Úchr©Ú.0rs   r1   r1   r2   Ú
<listcomp>=  s     z6TestArrayAnalysis.test_numpy_calls.<locals>.<listcomp>c                 S   s   g | ]}t |ƒd  ‘qS ©Ú1rH  rJ  r1   r1   r2   rL  >  s     c                 S   s   g | ]}t |ƒd  ‘qS rM  rH  rJ  r1   r1   r2   rL  ?  s     c                 S   s¨   t  | ¡}t  |¡}t  ||f¡}t  d|f¡}t  d|f¡}t  ||f¡}t  | df¡}t  | df¡}	t j||	fdd}
t  | |f¡}t  | |f¡}t  ||f¡}d S )Nr¾   r8   r.   ©Zaxis)r°   rÊ   Zconcatenate)r²   r0   r<   r=   r>   r?   r@   rÚ   r    Újr  rê   ÚorÐ   r1   r1   r2   Útest_concatenateD  s    

z<TestArrayAnalysis.test_numpy_calls.<locals>.test_concatenate)rÖ   r0   r  )r²   rÖ   rÐ   c            
      S   s„   t  d¡} t  d¡}t  d¡}t  | | f¡}t  ||f¡}t  | | f¡}t  ||f¡}t  | | f¡}t  ||f¡}t  ||f¡}	d S )N)r¾   ©r¾   r8   )r¾   r8   r9   )r°   rÊ   ZvstackZhstackZdstack)
r  rê   rQ  rÐ   rÑ   rH   rª   rÔ   r  r  r1   r1   r2   Útest_vsd_stack_  s    


z:TestArrayAnalysis.test_numpy_calls.<locals>.test_vsd_stackr1   )r¾   r¾   rÑ   )r9   r8   rH   )r9   rª   )r¾   é   rÔ   )r.   r¾   r¾   r  )r¾   r8   r¾   r  )r¾   r8   rÿ   c                 S   s˜   t  | ¡}t  |¡}t  ||f¡}t  | |f¡}t  | |f¡}t  ||f¡}t j||fdd}t j||fdd}	t j||fdd}
t j||fdd}d S )Nr   rO  r.   r¾   r×   )r°   rÊ   Ústack)r²   r0   r<   r=   r>   r?   r@   rÚ   rÞ   Úhr    rP  r1   r1   r2   Ú
test_stacku  s    

z6TestArrayAnalysis.test_numpy_calls.<locals>.test_stackr²   )r¾   r²   rÞ   )r¾   r²   r0   rW  )r²   r¾   r0   r    rP  )r²   r0   r¾   c                 S   s   t  | |¡}t  | |d¡}d S rÃ   )r°   Zlinspacer¹   r1   r1   r2   Útest_linspaceŒ  s    z9TestArrayAnalysis.test_numpy_calls.<locals>.test_linspace)é2   )rÄ   c           	      S   s¤   t  t  d¡t  d¡¡}t  t  d¡t  d¡¡}t  t  d¡t  d¡¡}t  t  d¡t  d¡¡}t  t  ||f¡t  ||f¡¡}t  t  ||f¡t  | | f¡¡}d S )Nr.   r¾   rS  )r.   r¾   r7   )r°   ÚdotrÊ   )	rê   r²   r0   r<   r=   r@   rW  r    rP  r1   r1   r2   Útest_dot•  s     z4TestArrayAnalysis.test_numpy_calls.<locals>.test_dotr´   )r8   )r¾   r9   )r²   r²   rê   c                 S   s>   t  | |f¡}t  |¡}|| }t  d|f¡}|| | }d S r-   rù   )r²   r0   r<   r=   r>   r?   r@   r1   r1   r2   Útest_broadcast¬  s
    
z:TestArrayAnalysis.test_numpy_calls.<locals>.test_broadcastc                  S   s   t  t¡} t  t¡}d S rL   )r°   rÊ   ÚGVAL2)r<   r=   r1   r1   r2   Útest_global_tuple·  s    
z=TestArrayAnalysis.test_numpy_calls.<locals>.test_global_tuple)r|   r   rï   r§   r¨   r­   r¬   rð   Úordr   Zfloat64r™   )r/   r  r  r  r  r  r  r  r  r  r  r!  r$  rF  ÚlastZvars1dZvars2drR  rT  rX  rY  r\  r]  r_  r1   r1   r2   Útest_numpy_callst  sH   


þÿ
þ


þÿ


þÿ



ýÿÿ

ÿÿýÿÿý
þ


þÿ







úÿ	


þÿHÿÿ

þýü	






úÿ


  ÿ ÿ  ÿúÿ

ÿÿ





ûø
þþz"TestArrayAnalysis.test_numpy_callsN)r4   r5   r6   rr   r|   rŽ   r•   rw   r™   rš   r§   r¨   r¬   r­   rõ   r  r
  r   rb  r1   r1   r1   r2   rj   ¬   s"   			 W)nrj   c                   @   s\   e Zd ZdZdZedd„ ƒZedd„ ƒZedd„ ƒZed	d
„ ƒZ	edd„ ƒZ
edd„ ƒZdS )Ú!TestArrayAnalysisParallelRequiredzkThis is to just split out tests that need the parallel backend and
    therefore serialised execution.
    Fc                    sP   t dd„ ƒ‰ ‡ fdd„}zt |dddƒ W n tk
rJ   |  d¡ Y nX d S )	Nc                 S   s   || fS rL   r1   )rs   r“   r1   r1   r2   ÚswapÊ  s    z9TestArrayAnalysisParallelRequired.test_misc.<locals>.swapc                    sD   t  | ¡}t  | ¡}t| ƒD ]"}ˆ || || ƒ\||< ||< qd S rL   )r°   rÊ   r   )r²   r<   r=   r    ©rd  r1   r2   Útest_bug2537Î  s    

zATestArrayAnalysisParallelRequired.test_misc.<locals>.test_bug2537T©ÚparallelrÄ   ztest_bug2537 raised IndexError!)r   Ú
IndexErrorZfail)r/   rf  r1   re  r2   Ú	test_miscÇ  s    
z+TestArrayAnalysisParallelRequired.test_miscc                    s<   t ddgƒ}|dƒ‰ ‡ fdd„}|  t|ddƒ |ƒ ¡ d S )NÚRowrÌ   r8   c                     s   ˆ } | j }|dkrd}|S )Nr¾   r8   )rÌ   )ÚrrÚres©Úrowr1   r2   Ú	test_implÞ  s
    zKTestArrayAnalysisParallelRequired.test_global_namedtuple.<locals>.test_implTrg  )r   ÚassertEqualr   )r/   rk  rp  r1   rn  r2   Útest_global_namedtupleÙ  s    z8TestArrayAnalysisParallelRequired.test_global_namedtuplec                 C   sP   dd„ }d}t |ƒ}t |j¡}t |j¡}|  t|dd||ƒ|||ƒ¡ d S )Nc                 S   s    t | jƒD ]}|||< q
| ¡ S rL   )r   r+   rË   )Út_objÚXr    r1   r1   r2   rp  ê  s    
zLTestArrayAnalysisParallelRequired.test_array_T_issue_3700.<locals>.test_implrÖ   Trg  )r,   r°   r±   r+   rq  r   )r/   rp  r0   rs  ZX1ZX2r1   r1   r2   Útest_array_T_issue_3700ç  s     ÿz9TestArrayAnalysisParallelRequired.test_array_T_issue_3700c                 C   s`   dd„ }|   t|ddƒ |ƒ ¡ dd„ }t d¡}td ƒ}tj t|dd||ƒ|||ƒ¡ d S )Nc                  S   s   t d d ƒ} dS r[   )Úslicer÷   r1   r1   r2   Ú
test_impl1ù  s    
zQTestArrayAnalysisParallelRequired.test_slice_shape_issue_3380.<locals>.test_impl1Trg  c                 S   s   |}| | S rL   r1   )rÌ   r<   r=   r1   r1   r2   Ú
test_impl2ÿ  s    zQTestArrayAnalysisParallelRequired.test_slice_shape_issue_3380.<locals>.test_impl2rÄ   )rq  r   r°   r   rv  ÚtestingÚassert_array_equal)r/   rw  rx  rÌ   r<   r1   r1   r2   Útest_slice_shape_issue_3380ö  s    
 ÿz=TestArrayAnalysisParallelRequired.test_slice_shape_issue_3380c                 C   s8   t dddd„ ƒ}t d¡}tj ||ƒ| |¡¡ d S )NTrg  c                 S   sH   | j d }t |¡}t|ƒD ]&}t | t d¡t d¡… ¡||< q|S r®   )r   r°   r±   r   rË   Úint32)Údatar  Zsumsr    r1   r1   r2   rp    s
    

$zPTestArrayAnalysisParallelRequired.test_slice_dtype_issue_5056.<locals>.test_implg      $@)r   r°   r   ry  rz  Zpy_func)r/   rp  r}  r1   r1   r2   Útest_slice_dtype_issue_5056  s    

z=TestArrayAnalysisParallelRequired.test_slice_dtype_issue_5056c                 C   s$   dd„ }|   t|ddƒ |ƒ ¡ dS )zimake sure a global tuple with non-integer values does not cause errors
        (test for #6726).
        c                  S   s   t d } | S rà   )ÚGVAL)r?   r1   r1   r2   rp    s    zFTestArrayAnalysisParallelRequired.test_global_tuple.<locals>.test_implTrg  N)rq  r   )r/   rp  r1   r1   r2   r_    s    z3TestArrayAnalysisParallelRequired.test_global_tupleN)r4   r5   r6   rJ   Z_numba_parallel_test_Úskip_unsupportedrj  rr  ru  r{  r~  r_  r1   r1   r1   r2   rc  À  s   




rc  c                   @   s    e Zd Zdd„ Zedd„ ƒZdS )ÚTestArrayAnalysisInterfacec              
   C   s‚   i }t tƒD ]}| d¡rtt|ƒ||< qdd„ }t |¡}| ¡ D ]8\}}t |¡}| j||d |  ||¡ W 5 Q R X qDd S )NZ_analyze_op_call_c                 S   s   d S rL   r1   )r/   ZscoperŸ   Úlocr_   Úkwsr1   r1   r2   Ú
iface_stub,  s    zMTestArrayAnalysisInterface.test_analyze_op_call_interface.<locals>.iface_stub)ÚfnameÚsig)	Údirr   rˆ   r   r   Zpysignaturerƒ   ZsubTestrq  )r/   Zaocr…  r„  Úexpectedr  r  Úgotr1   r1   r2   Útest_analyze_op_call_interface%  s    


z9TestArrayAnalysisInterface.test_analyze_op_call_interfacec              	      sÎ   ddl m} ddlm} |j| ‰ddi‰‡ ‡‡fdd„‰‡‡fdd„}zF||j|< tj‰ ‡ fd	d
„}tdd|ƒdƒ}ˆd }ˆ |d¡ W 5 ˆ|j|< X tdd|ƒdƒ}ˆ 	||¡ ˆ 
|ˆd ¡ d S )Nr   )ÚParfor)rO   Úcounterc                    s’   | j }|jd  d¡D ]:}| |j¡}t|dd ƒˆ krt|jd dd ƒdkr qVqd S | |¡}| jd }ˆ 	| 
d|j¡¡ ˆd  d7  < d S )Nr   r}   r’   rg   r0   rŒ  r.   )rM   rQ   r„   r…   rf   r   r_   Zget_assigneerv   rB   rC   rg   )rO   rM   r}   ZcalleeZ
variable_AÚes)r  r/   Úsharedr1   r2   Útestcode?  s    

zKTestArrayAnalysisInterface.test_array_analysis_extensions.<locals>.testcodec                    s   ˆ|ƒ ˆ | |||ƒS )z7Recursive array analysis for parfor nodes.
            r1   )ZparforrŸ   rN   rO   )Úorig_parforr  r1   r2   Ú
new_parforP  s       ÿzMTestArrayAnalysisInterface.test_array_analysis_extensions.<locals>.new_parforc                    s4   ˆ | ƒ}t | ƒD ]}t |¡}| ¡ ||< q|d S r-   )r   r°   r   rË   )r0   rÌ   r    râ   )r  r1   r2   rÚ   ^  s
    
zDTestArrayAnalysisInterface.test_array_analysis_extensions.<locals>.fTrg  rÄ   )Znumba.parfors.parforr‹  Znumba.parforsrO   Zarray_analysis_extensionsr°   r  r   ZassertGreaterZassertPreciseEqualrq  )r/   r‹  rO   r‘  rÚ   r‰  Zexecuted_countrˆ  r1   )r  r  r/   rŽ  r  r2   Útest_array_analysis_extensions4  s"    
	
z9TestArrayAnalysisInterface.test_array_analysis_extensionsN)r4   r5   r6   rŠ  r€  r’  r1   r1   r1   r2   r  $  s   r  Ú__main__)GÚ	itertoolsZnumpyr°   ÚsysÚcollectionsr   Úior   Znumbar   r   r   Z
numba.corer   r   r	   r
   r   r   r   r   Znumba.tests.supportr   r   r   r   Znumba.parfors.array_analysisr   r   Znumba.core.compilerr   r   r   Znumba.core.ir_utilsr   Znumba.core.untyped_passesr   r   r   r   r   r   r   r    r!   r"   Znumba.core.typed_passesr#   r$   r%   r&   Znumba.core.compiler_machineryr'   r(   Znumba.experimentalr)   Zunittestr€  r|  Úobjectr,   r  r^  r:   rK   rZ   rj   rc  r  r4   Úmainr1   r1   r1   r2   Ú<module>   sF   (
0'
=      dO
