U
    ,d                    @   s  d dl Z d dlZd dlZ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Zd dlmZmZ d dlmZ d dl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 d d
lmZmZmZ d dl Z eZ!edd Z"edddd Z#edddd Z$edd Z%edd Z&edd Z'edddd Z(edddd  Z)ed!d" Z*eshed#d$d%d& Z+e ,ed'kd(G d)d* d*e j-Z.G d+d, d,e.Z/G d-d. d.Z0d5d0d1Z1e!G d2d3 d3e.Z2e3d4kre 4  dS )6    N)contextmanager)deepcopy)njitstencil)	PYVERSION)typesregistry)compile_extraFlags)ParallelOptions)tagskip_parfors_unsupported_32bit)LoweringErrorTypingErrorNumbaValueErrorc                 C   s$   d| d | d  | d  | d   S N      ?r      r   r   r   r   r    ar   r   =/tmp/pip-unpacked-wheel-eu7e0c37/numba/tests/test_stencils.pystencil1_kernel   s    r   )r   neighborhoodc                 C   s,   | d }t ddD ]}|| | 7 }qd| S )Nr    r   333333?range)r   cumir   r   r   stencil2_kernel#   s    r)         ?cvalc                 C   s   d| d  S )Nr      r   r   r   r   r   stencil3_kernel+   s    r0   c                 C   sD   d| d | d  | d  | d  |d  |d  |d  |d   S r   r   r   br   r   r   stencil_multiple_input_kernel0   s     r3   c                 C   sD   || d | d  | d  | d  |d  |d  |d  |d   S Nr   r   r   r   r   )r   r2   wr   r   r   !stencil_multiple_input_kernel_var6   s     r6   c                 C   s   |d r| d S |d S Nr   r   r   )r   r2   fr   r   r   %stencil_multiple_input_mixed_types_2d<   s    r:   )r2   )standard_indexingc                 C   s    | d |d  | d |d   S )Nr   r   r   r   r1   r   r   r   !stencil_with_standard_indexing_1dA   s    r<   c                 C   s@   | d |d  | d |d   | d |d   | d |d   S r4   r   r1   r   r   r   !stencil_with_standard_indexing_2dF   s
    r=   c                 C   s   | d S Nr   r   r   r   r   r   addone_njitL   s    r?   Tparallelc                 C   s   | d S r>   r   r   r   r   r   addone_pjitR   s    rB   )      z Run under 3.7 only, AST unstablec                       sH   e Zd ZdZ fddZdd Zdd Zdd	 Zd
d Zdd Z	  Z
S )TestStencilBaseFc                    s$   t  | _d| j_tt| j|  d S NT)r
   cflagsnrtsuperrE   __init__)selfargs	__class__r   r   rJ   \   s    zTestStencilBase.__init__c                 C   s   t tjjtjj||d |i S N)r	   r   Z
cpu_targetZtyping_contextZtarget_context)rK   funcsigflagsr   r   r   _compile_thisc   s        zTestStencilBase._compile_thisc                 K   s0   t  }d|_|sdn|}t||_| |||S rF   )r
   rH   r   Zauto_parallelrS   )rK   rP   rQ   kwsrR   optionsr   r   r   compile_parallelh   s
    
z TestStencilBase.compile_parallelc                 C   s   | j ||| jdS )N)rR   )rS   rG   )rK   rP   rQ   r   r   r   compile_njito   s    zTestStencilBase.compile_njitc                 O   s2   t dd |D }| ||}| ||}||fS )Nc                 S   s   g | ]}t |qS r   numbaZtypeof.0xr   r   r   
<listcomp>s   s     z/TestStencilBase.compile_all.<locals>.<listcomp>)tuplerV   rW   )rK   pyfuncrL   kwargsrQ   cpfunccfuncr   r   r   compile_allr   s    zTestStencilBase.compile_allc           
      G   s   | j |f| \}}|| }|| }|j| }|j| }	tjj||dd tjj||dd tjj|	|dd | d|j  d S )NrC   decimal@do_scheduling)rc   entry_pointnptestingassert_almost_equalassertInlibraryget_llvm_str)
rK   Zno_stencil_funcr_   rL   rb   ra   expectedZ	py_outputnjit_outputparfor_outputr   r   r   checkz   s    

zTestStencilBase.check)__name__
__module____qualname__Z_numba_parallel_test_rJ   rS   rV   rW   rc   rq   __classcell__r   r   rM   r   rE   W   s   rE   c                       s   e Zd Z fd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
ed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edd Z  ZS )TestStencilc                    s   t t| j|| d S rO   )rI   rv   rJ   rK   rL   r`   rM   r   r   rJ      s    zTestStencil.__init__c                 C   s<   dd }dd }dd }d}|  ||| |  ||| dS )	zHTests whether the optional out argument to stencil calls works.
        c                 S   s@   t | d | | f}t | d | | f}t||d}|S )Nr/   out)rh   arangereshapezerosr   nABr   r   r   test_with_out   s    z0TestStencil.test_stencil1.<locals>.test_with_outc                 S   s$   t | d | | f}t|}|S Nr/   )rh   rz   r{   r   r}   r   r   r   test_without_out   s    z3TestStencil.test_stencil1.<locals>.test_without_outc                 S   s   t | d | | f}t | d | | f}td| d D ]d}td| d D ]P}d|||d f ||d |f  |||d f  ||d |f   |||f< qPq>|S Nr/   r   r   rh   rz   r{   r|   r&   r~   r   r   r(   jr   r   r   test_impl_seq   s    z0TestStencil.test_stencil1.<locals>.test_impl_seqd   Nrq   )rK   r   r   r   r~   r   r   r   test_stencil1   s    	zTestStencil.test_stencil1c           	      C   s8  dd }dd }d}|  ||| dd }dd }d}d}| |tjtjf}|||}|||}tjj||d	d
 | d|j	
  dd }d}| |tjtjtjf}||||}tjj||d	d
 | d|j	
  dd }d}| |tjtjtjf}||||}tjj||d	d
 | d|j	
  dS )z`Tests whether the optional neighborhood argument to the stencil
        decorate works.
        c                 S   s   t | }t|}|S rO   )rh   rz   r)   r}   r   r   r   test_seq   s    
z+TestStencil.test_stencil2.<locals>.test_seqc                 S   sL   t | }t | }tdt|D ]$}dt||d |d   ||< q"|S )N   r$   r   rh   rz   r|   r&   lensumr~   r   r   r(   r   r   r   r      s
    

"z0TestStencil.test_stencil2.<locals>.test_impl_seqr   c                 S   s2   t | }dd }tj|| |ffd||}|S )Nc                 S   s8   | |  }t | d |d D ]}|| | 7 }qd| S Nr   r$   r%   r   r5   r'   r(   r   r   r   r)      s    
DTestStencil.test_stencil2.<locals>.test_seq.<locals>.stencil2_kernelr!   rh   rz   rY   r   )r~   r5   r   r)   r   r   r   r   r      s    
c                 S   sT   t | }t | }t|t|| D ](}dt||| || d   ||< q&|S )Nr$   r   r   )r~   r5   r   r   r(   r   r   r   r      s
    

&r   rC   rd   rf   c                 S   s8   t | }dd }tj|| |ff| fd||}|S )Nc                 S   s@   | | d  }t | d |d D ]}|| |d  7 }q"d| S r   r%   r   r   r   r   r)      s    r   r"   Zindex_offsetsr   r~   r5   offsetr   r)   r   r   r   r   r      s    
 r   c                 S   s8   t | }dd }tj|| |ff| fd||}|S )Nc                 S   s    dt | | d |d   S )Nr$   r   r/   )rh   r   )r   r5   r   r   r   r)      s    r   r   r   r   r   r   r   r      s    
 N)rq   rV   r   intprg   rh   ri   rj   rk   rl   rm   )	rK   r   r   r~   r5   ra   rn   rp   r   r   r   r   test_stencil2   s:    
	zTestStencil.test_stencil2c                 C   s   dd }t |}t |dd}d}||}||}||}| |d dkoR|d dk | |d dkop|d dk | |d dko|d dk d	S )
zTests whether a non-zero optional cval argument to the stencil
        decorator works.  Also tests integer result type.
        c                 S   s$   t | d | | f}t|}|S r   )rh   rz   r{   r0   r}   r   r   r   r   
  s    z+TestStencil.test_stencil3.<locals>.test_seqTr@   r   r8   r*   )   r   N)r   
assertTrue)rK   r   Z	test_njitZtest_parr~   Zseq_resZnjit_resZpar_resr   r   r   test_stencil3  s    zTestStencil.test_stencil3c                 C   s&   dd }dd }d}|  ||| dS )z1Tests standard indexing with a 1d array.
        c                 S   s    t | }ddg}t||}|S )N      @      @)rh   rz   r<   r~   r   r   Cr   r   r   r     s    

z?TestStencil.test_stencil_standard_indexing_1d.<locals>.test_seqc                 S   sX   t | }ddg}t | }td| D ],}||d  |d  || |d   ||< q&|S )Nr   r   r   r   rh   rz   r|   r&   )r~   r   r   r   r(   r   r   r   r   %  s    

*zDTestStencil.test_stencil_standard_indexing_1d.<locals>.test_impl_seqr   Nr   rK   r   r   r~   r   r   r   !test_stencil_standard_indexing_1d  s    	z-TestStencil.test_stencil_standard_indexing_1dc                 C   s&   dd }dd }d}|  ||| dS )zLTests standard indexing with a 2d array and multiple stencil calls.
        c                 S   s:   t | d | | f}t d}t||}t||}|S )Nr/   rC   rC   )rh   rz   r{   onesr=   )r~   r   r   r   Dr   r   r   r   5  s
    


z?TestStencil.test_stencil_standard_indexing_2d.<locals>.test_seqc                 S   sx  t | d | | f}t d}t | d | | f}t | d | | f}td| d D ]}td| d D ]l}|||d f |d  ||d |f |d   |||d f |d   ||d |f |d   |||f< qrq`td| d D ]}td| d D ]n}|||d f |d  ||d |f |d   |||d f |d   ||d |f |d   |||f< qq|S )Nr/   r   r   r   r   r   r   )rh   rz   r{   r   r|   r&   )r~   r   r   r   r   r(   r   r   r   r   r   <  s&    
..zDTestStencil.test_stencil_standard_indexing_2d.<locals>.test_impl_seqr   Nr   r   r   r   r   !test_stencil_standard_indexing_2d1  s    z-TestStencil.test_stencil_standard_indexing_2dc                 C   s<   dd }dd }d}|  ||| dd }|  ||| dS )z=Tests whether multiple inputs of the same size work.
        c                 S   s>   t | d | | f}t | d | | f}t||}|S r   )rh   rz   r{   r3   r   r   r   r   r   S  s    
z:TestStencil.test_stencil_multiple_inputs.<locals>.test_seqc                 S   s   t | d | | f}t | d | | f}t | d | | f}td| d D ]}td| d D ]}d|||d f ||d |f  |||d f  ||d |f  |||d f  ||d |f  |||d f  ||d |f   |||f< qhqV|S r   r   )r~   r   r   r   r(   r   r   r   r   r   Y  s*    z?TestStencil.test_stencil_multiple_inputs.<locals>.test_impl_seqrC   c                 S   sD   t | d | | f}t | d | | f}d}t|||}|S )Nr/   r   )rh   rz   r{   r6   )r~   r   r   r5   r   r   r   r   r   j  s
    Nr   r   r   r   r   test_stencil_multiple_inputsO  s    z(TestStencil.test_stencil_multiple_inputsc                 C   s&   dd }dd }d}|  ||| d S )Nc                 S   s   t | d | | f}| d t | d | | f }t j| t jd}t j| | f|jd}td| D ]@}td| D ]0}|||f r|||f n
|||f |||f< qtqf|S )Nr/   dtyper   )rh   rz   r{   eyebool_r|   r   r&   )r~   r   r   SOr(   r   r   r   r   r   t  s     0z;TestStencil.test_stencil_mixed_types.<locals>.test_impl_seqc                 S   sX   t | d | | f}| d t | d | | f }t j| t jd}t|||}|S )Nr/   r   )rh   rz   r{   r   r   r:   )r~   r   r   r   r   r   r   r   r   ~  s
     z6TestStencil.test_stencil_mixed_types.<locals>.test_seqrC   r   )rK   r   r   r~   r   r   r   test_stencil_mixed_typesr  s    
z$TestStencil.test_stencil_mixed_typesc                 C   s<   dd }dd }dd }d}|  ||| |  ||| dS )	z&Tests 2D numba.stencil calls.
        c                 S   sJ   t | d | | f}t | d | | f}tdd ||d |S )Nr/   c                 S   s$   d| d | d  | d  | d   S r   r   r   r   r   r   <lambda>  s   zCTestStencil.test_stencil_call.<locals>.test_impl1.<locals>.<lambda>rx   rh   rz   r{   r|   rY   r   r}   r   r   r   
test_impl1  s     z1TestStencil.test_stencil_call.<locals>.test_impl1c                 S   sJ   t | d | | f}t | d | | f}dd }t||}|S )Nr/   c                 S   s$   d| d | d  | d  | d   S r   r   r   r   r   r   sf  s    z=TestStencil.test_stencil_call.<locals>.test_impl2.<locals>.sfr   )r~   r   r   r   r   r   r   
test_impl2  s
    z1TestStencil.test_stencil_call.<locals>.test_impl2c                 S   s   t | d | | f}t | d | | f}td| d D ]d}td| d D ]P}d|||d f ||d |f  |||d f  ||d |f   |||f< qPq>|S r   r   r   r   r   r   r     s     z4TestStencil.test_stencil_call.<locals>.test_impl_seqr   Nr   )rK   r   r   r   r~   r   r   r   test_stencil_call  s    		zTestStencil.test_stencil_callc                 C   s&   dd }dd }d}|  ||| dS )z&Tests 1D numba.stencil calls.
        c                 S   s.   t | }t | }tdd ||d |S )Nc                 S   s   d| d | d  | d   S Nr$   r   r   r   r   r   r   r   r   r         zETestStencil.test_stencil_call_1D.<locals>.test_impl.<locals>.<lambda>rx   rh   rz   r|   rY   r   r}   r   r   r   	test_impl  s    

z3TestStencil.test_stencil_call_1D.<locals>.test_implc                 S   sT   t | }t | }td| d D ],}d||d  ||  ||d    ||< q"|S r   r   r   r   r   r   r     s
    

*z7TestStencil.test_stencil_call_1D.<locals>.test_impl_seqr   Nr   rK   r   r   r~   r   r   r   test_stencil_call_1D  s    z TestStencil.test_stencil_call_1Dc              	   C   sP  dd }dd }dd }dd }d	d
 }d}|  |tjf}|  |tjf}|  |tjf}	|  |tjf}
||}||}||}|	|}|
|}tjj||dd tjj||dd tjj||dd tjj||dd | t}|d W 5 Q R X | 	dt
|j | ttf}t|d W 5 Q R X | 	dt
|j dS )zTests numba.stencil call that has an index that can be inferred as
        constant from a unary expr. Otherwise, this would raise an error since
        neighborhood length is not specified.
        c                 S   s4   t | }t | }d}tdd |||d |S )Nr   c                 S   s   d| |  | d  | |   S Nr$   r   r   r   cr   r   r   r     r   zITestStencil.test_stencil_call_const.<locals>.test_impl1.<locals>.<lambda>rx   r   r~   r   r   r   r   r   r   r     s    

  z7TestStencil.test_stencil_call_const.<locals>.test_impl1c                 S   s4   t | }t | }d}tdd |||d |S )Nr/   c                 S   s$   d| d|  | d  | |d    S Nr$   r   r   r   r   r   r   r   r     r   zITestStencil.test_stencil_call_const.<locals>.test_impl2.<locals>.<lambda>rx   r   r   r   r   r   r     s    

  z7TestStencil.test_stencil_call_const.<locals>.test_impl2c                 S   s4   t | }t | }d}tdd |||d |S )Nr/   c                 S   s&   d| | d  | d  | |d    S r   r   r   r   r   r   r     r   zITestStencil.test_stencil_call_const.<locals>.test_impl3.<locals>.<lambda>rx   r   r   r   r   r   
test_impl3  s    

  z7TestStencil.test_stencil_call_const.<locals>.test_impl3c                 S   s:   t | }t | }d}d}tdd ||||d |S )Nr   r/   c                 S   s&   d| | |  | d  | ||    S r   r   )r   r   dr   r   r   r     r   zITestStencil.test_stencil_call_const.<locals>.test_impl4.<locals>.<lambda>rx   r   )r~   r   r   r   r   r   r   r   
test_impl4  s    

   z7TestStencil.test_stencil_call_const.<locals>.test_impl4c                 S   sX   t | }t | }d}td| d D ],}d|||  ||  |||    ||< q&|S r   r   )r~   r   r   r   r(   r   r   r   r     s    

*z:TestStencil.test_stencil_call_const.<locals>.test_impl_seqr   rC   rd   r   zDstencil kernel index is not constant, 'neighborhood' option requiredN)rV   r   r   rg   rh   ri   rj   assertRaisesr   rk   str	exceptionr   r   )rK   r   r   r   r   r   r~   Zcpfunc1Zcpfunc2Zcpfunc3Zcpfunc4rn   Zparfor_output1Zparfor_output2Zparfor_output3Zparfor_output4er   r   r   test_stencil_call_const  s:    			



z#TestStencil.test_stencil_call_constc                 C   s:   dd }| j |tjdd fdd}| d|j  dS )zYTests 1D numba.stencil calls without parallel translation
           turned off.
        c                 S   s   t dd | S )Nc                 S   s   d| d | d  | d   S r   r   r   r   r   r   r     r   zJTestStencil.test_stencil_parallel_off.<locals>.test_impl.<locals>.<lambda>)rY   r   )r   r   r   r   r     s    z8TestStencil.test_stencil_parallel_off.<locals>.test_implNFr   rf   )rV   rY   float64ZassertNotInrl   rm   )rK   r   ra   r   r   r   test_stencil_parallel_off  s    z%TestStencil.test_stencil_parallel_offc                 C   s>   t dddd }dd }td}tj|||| dS )	z6Tests whether nested stencil decorator works.
        Tr@   c                 S   s   t dd }|| }|S )Nc                 S   s   d}| | d  S )Nr/   r   r   r   r   r   r   fun  s    z@TestStencil.test_stencil_nested1.<locals>.test_impl.<locals>.funr   )r~   r   r   r   r   r   r     s    
z3TestStencil.test_stencil_nested1.<locals>.test_implc                 S   s:   t jt| td}tdt| D ]}| |d  ||< q |S )Nr   r   )rh   r|   r   intr&   )r~   r   r(   r   r   r   r   %  s    z7TestStencil.test_stencil_nested1.<locals>.test_impl_seq
   N)r   rh   rz   ri   Zassert_equalr   r   r   r   test_stencil_nested1  s
    

z TestStencil.test_stencil_nested1c                    s  ddg}dd }|D ]}t j||d  fdd}tdd	}t|d
}||dddf< t|} ||d tj|| | 	|}|D ]}	|	
 }
tj|
| qqt j|dd  fdd}tdd	}t|}| t} ||d W 5 Q R X d}| |t|j | j| jfD ]V}z||d W n8 ttfk
rp } z| |t| W 5 d}~X Y n
X tdq&dS )z/ Issue #3518, out kwarg did not work with cval.rD   r   c                 S   s   | d | d  S Nr8   r   r   r   r   r   r   kernel4  s    z1TestStencil.test_out_kwarg_w_cval.<locals>.kernelr+   c                     s*   t dd} t | } | |d |S N   rC   r   rx   rh   rz   r{   	ones_liker   retZ
stencil_fnr   r   wrapped:  s    
z2TestStencil.test_out_kwarg_w_cval.<locals>.wrappedr   r   r#   r   Nrx                 ?c                     s*   t dd} t | } | |d |S r   r   r   r   r   r   r   Q  s    
z-cval type does not match stencil return type.r   zExpected error was not raised)rY   r   rh   rz   r{   	full_liker   ri   rj   rc   rg   r   r   rk   r   r   rW   rV   r   AssertionError)rK   Z
const_valsr   Z	const_valr   r   rn   r   implsimplgotr   msgcompilerr   r   r   test_out_kwarg_w_cval.  s:    


"z!TestStencil.test_out_kwarg_w_cvalc           
         s   t jt jt j tdtd fD ]}dd }tj||d  fdd}t dd}t |d	}||d
ddf< t 	|} ||d t j
|| | |}|D ]}| }	t j
|	| qq dS )U Test issue #7286 where the cval is a np attr/string-based numerical
        constantinfc                 S   s   | d | d  S r   r   r   r   r   r   r   k  s    z9TestStencil.test_out_kwarg_w_cval_np_attr.<locals>.kernelr+   c                     s*   t dd} t | } | |d |S )N      (@r   rx   r   r   r   r   r   r   p  s    
z:TestStencil.test_out_kwarg_w_cval_np_attr.<locals>.wrappedr   r   r#   r   Nrx   )rh   nanr   floatrY   r   rz   r{   r   r   ri   rj   rc   rg   )
rK   r,   r   r   r   rn   r   r   r   r   r   r   r   test_out_kwarg_w_cval_np_attrf  s    $

z)TestStencil.test_out_kwarg_w_cval_np_attr)rr   rs   rt   rJ   skip_unsupportedr   r   r   r   r   r   r   r   r   r   r   r   r   r   ru   r   r   rM   r   rv      s:   

T



"

 

O



7rv   c                   @   s   e Zd ZdZG dd dZG dd dejeZG dd dejeZG dd	 d	ejeZ	G d
d dejeZ
G dd dejeZG dd dejZdd ZdS )pyStencilGeneratorz
    Holds the classes and methods needed to generate a python stencil
    implementation from a kernel purely using AST transforms.
    c                   @   s~   e Zd ZdZdd Zdd dD Zdd Zdd
dZdd ZdddZ	dd Z
dd Zdd ZdddZdd Zd ddZdS )!zpyStencilGenerator.Builderz
        Provides code generation for the AST manipulation pipeline.
        The class methods largely produce AST nodes/trees.
        c                 C   s
   d| _ d S Nr   Z_Builder__staterK   r   r   r   rJ     s    z#pyStencilGenerator.Builder.__init__c                 C   s*   g | ]"}t d D ]}tt|| qqS )   )r&   chrord)r[   vr\   r   r   r   r]     s     
  z%pyStencilGenerator.Builder.<listcomp>)r   r   c                 C   s   | j }| j d | _ |S )zZ
            a monotonically increasing index for use in labelling variables.
            r   r   )rK   tmpr   r   r   varidx  s    z!pyStencilGenerator.Builder.varidxr   c                 C   s   t jt j|t  dgt jt jt jdt  ddt  dt jt j|t  ddt  d| |gt jd| 	d|j
gjdgd	d	d
d}|S )z
            Generates an AST equivalent to:
                `var = np.full(orig.shape, init_val, dtype = dtype_var)`
            idctxrh   fullvalueattrr   shaper   typeargr   NrP   rL   keywordsZstarargsr`   targetsr   )astAssignNameStoreCall	AttributeLoadgen_numkeywordgen_callr   r   )rK   origvarZ	dtype_varZinit_valnewr   r   r   gen_alloc_return  sB    z+pyStencilGenerator.Builder.gen_alloc_returnc                 C   sV   dd |D }t jt jt j|t  dt jt j|t  ddt  dg|d}|S )z
            Generates an AST equivalent to:
                `retvar[(*index_names,)] = value[<already present indexing>]`
            c                 S   s   g | ]}t j|t  d qS )r   r  r  r  rZ   r   r   r   r]     s     z9pyStencilGenerator.Builder.gen_assign.<locals>.<listcomp>r   eltsr   r   r   slicer   r  )r  r  	Subscriptr  r  IndexTupler  )rK   r  r   Zindex_namesZ	elts_infor  r   r   r   
gen_assign  s&    
z%pyStencilGenerator.Builder.gen_assignNc              	   C   sz   t |trtj|d}n|}t |tr4tj|d}n|}tjtj|t dtjtjdt d||gg ddd|g dS )z}
            Generates an AST equivalent to a loop in `var` from
            `start` to `stop` with body `body`.
            r~   r   r&   Nr  )targetiterbodyZorelse)	
isinstancer   r  NumZForr  r  r	  r  )rK   r  startstopr   Z	start_valZstop_valr   r   r   gen_loop  s$    

  z#pyStencilGenerator.Builder.gen_loopc                 C   s   t jt j|t  ddS )zE
            Generates an AST equivalent to `return var`
            r   r  )r  ZReturnr  r  )rK   r  r   r   r   
gen_return  s    z%pyStencilGenerator.Builder.gen_returnc                 C   s   t jt j|ddS )z'Generates an Index with the given valuer  r  )r  r  r"  rK   r   r   r   r   	gen_slice  s    z$pyStencilGenerator.Builder.gen_slicec                 C   s"   t jt j|t  d|t  dS )zA
            Generates AST equivalent to `name.attr`
            r   r   )r  r
  r  r  )rK   namer   r   r   r   gen_attr  s
     z#pyStencilGenerator.Builder.gen_attrc           	      C   sf   |  ||}| |}tj||t d}|rb|dkr>t nt }tj||tjt	|dd}|S )z
            Generates an AST equivalent to a subscript, something like:
                name.attr[slice(index) +/- offset]
            r  r   r  )leftopright)
r*  r(  r  r  r  AddSubBinOpr"  abs)	rK   r)  r   indexr   	attributeZslisessZpmr   r   r   gen_subscript  s    
z(pyStencilGenerator.Builder.gen_subscriptc                 C   sJ   t |trtt|S t|dkr.t|S tt t| S dS )z?
            Generates an ast.Num of value `value`
            r   N)r!  boolr  r"  r   r1  UnaryOpZUSubr'  r   r   r   r    s
    

z"pyStencilGenerator.Builder.gen_numc                 C   s^   dd |D }|dk	r&dd |D }ng }t j|t  d}t jt j|||dddt  dS )z|
            Generates an AST equivalent to a call, something like:
                `call_name(*args, **kwargs)
            c                 S   s"   g | ]}t jd | t  dqS )%sr   r  rZ   r   r   r   r]     s     z7pyStencilGenerator.Builder.gen_call.<locals>.<listcomp>Nc                 S   s0   g | ](}t jd | t t|jd jdqS )r8  r   r   )r  r  parser   r   r   rZ   r   r   r   r]     s   r   r  r   r   )r  r  r  ZExprr	  )rK   Z	call_namerL   r`   Z
fixed_argsr  rP   r   r   r   r    s       z#pyStencilGenerator.Builder.gen_call)r   )r   r   N)N)N)rr   rs   rt   __doc__rJ   idsr   r  r  r%  r&  r(  r*  r5  r  r  r   r   r   r   Builder  s   	
 

r=  c                   @   s4   e Zd ZdZejejejej	ej
ejiZdd ZdS )zpyStencilGenerator.FoldConstzn
        Folds const expr, this is so const expressions in the relidx are
        more easily handled
        c                 C   sz   |  |}| j|jj}t|dd }t|dd }|r>|r>|sB|S t|tjrrt|tjrrt||j	j
|jj
S |S d S )Nr+  r-  )generic_visitsupported_opsgetr,  rN   getattrr!  r  r"  r+  r~   r-  )rK   noder,  lhsrhsr   r   r   visit_BinOp5  s    

z(pyStencilGenerator.FoldConst.visit_BinOpN)rr   rs   rt   r;  r  r.  operatoraddr/  subZMultmulr?  rE  r   r   r   r   	FoldConst(  s      rJ  c                   @   sX   e Zd ZdZdd Zdd Zdd Zedd	 Zed
d Z	edd Z
edd ZdS )zpyStencilGenerator.FixRelIndexza Fixes the relative indexes to be written in as
        induction index + relative index
        c                 O   s   t jj| f|| tjj| f|| || _|| _d| _d | _d | _	t
tj| _t
tj| _|rj|ng | _|| _|r~dnd| _d S )Nr   z__%sn__%s)r  NodeTransformerrJ   r   r=  	_argnames_const_assigns_idx_len_mins_maxesrh   Ziinfor   min_iminmax_imax_standard_indexing_neighborhood_id_pat)rK   argnamesconst_assignsr;   r"   rL   r`   r   r   r   rJ   K  s    z'pyStencilGenerator.FixRelIndex.__init__c                 C   s4   t |tjr|jS t |tjr(|jj S tddS )zF
            Gets the literal value from a Num or UnaryOp
            z,get_val_from_num: Unknown indexing operationN)r!  r  r"  r~   r7  Zoperand
ValueError)rK   rB  r   r   r   get_val_from_num[  s    
z/pyStencilGenerator.FixRelIndex.get_val_from_numc                    s   fdd}fdd}fddfdd  fd	d
}fdd} |}|jjjkr|jjjkrt|jtjr||S t|jtj	r||S t|jjtj
r||S t|jtjr||S tdn|S dS )z
            Transforms subscripts of the form `a[x]` and `a[x, y, z, ...]`
            where `x, y, z` are relative indexes, to forms such as:
            `a[x + i]` and `a[x + i, y + j, z + k]` for use in loop induced
            indexing.
            c           
   	      s   g }t | jjjD ]P\}} j||}|tjtj	 j
 j|  t dt |t d q jdkrzt| _n jt|krtdt| jtjrd}t|t }tj| jtjtj|t dt d|d}t||  t|  jd kr. jd kr. jg j  _ jg j  _ jst | jjjD ]\}}t|tjsht|tjrt  |}	n0t!|d	r|j" jkr j|j" }	ntd
|	 j| k r|	 j|< |	 j| krD|	 j|< qDn>t  jD ]2\}} j| d  j|<  j| d  j|< q|S )Nr   r+  r,  r-  r   r   #Relative indexing mismatch detected=Assignments to array passed to stencil kernels is not allowedr  r:  r  r   Cannot interpret indexing valuer   r   )#	enumerater  r   r  rN  r@  appendr  r0  r  rX  r<  r  r.  rO  r   r[  r!  r   r  r  r  r  copy_locationfix_missing_locationsrP  rQ  rU  rS  rW  r"  r7  r\  hasattrr   )
rB  idxr\   valusevalr   contextnewnodelnoderelvaluer   r   r   handle2dindexo  sz    




zEpyStencilGenerator.FixRelIndex.visit_Subscript.<locals>.handle2dindexc                    s   j | jj| jj}tjtj j jd  t	 dt
 |t	 d} jdkr\d _n jdkrntdt| jtjrd}t|t	 }tj| jtj|t	 d|d	}t||  t|  jd kr jd kr jg _ jg _ jst| jjtjst| jjtjr* | jj}n<t| jjd
r^| jjj j kr^ j | jjj }ntd| jd k r| jd< | jd kr| jd< n( jd d  jd<  jd d  jd< t||  t| |S )Nr   r   r]  r   r   r^  r_  r:  r  r   r`  )rN  r@  r  r   r  r0  r  rX  r<  r  r.  rO  r[  r!  r   r  r  r  rc  rd  rP  rQ  rU  rS  rW  r"  r7  r\  re  r   )rB  rh  rf  r   ri  rj  rl  r   r   r   handle1dindex  sl     






zEpyStencilGenerator.FixRelIndex.visit_Subscript.<locals>.handle1dindexc                    sH    fdd}t | j| | j|  j}t |  t | |S )Nc                    sf   j | | }| }tjtjjj|  t dt	 |t d}t
|  t| |S )Nr   r]  )rN  r@  r\  r  r0  r  rX  r<  r  r.  rc  rd  )rg  r\   rh  r   r   )rB  rK   r   r   gen_idx  s    

zUpyStencilGenerator.FixRelIndex.visit_Subscript.<locals>.computeSlice.<locals>.gen_idx)r  Sliceloweruppersteprc  rd  )r(   rB  ro  rj  r   )rB  r   computeSlice  s    

zDpyStencilGenerator.FixRelIndex.visit_Subscript.<locals>.computeSlicec                    sr    j |j|j}tjtj j j|   t dt	 |t d}tj
|t d}t|| t| |S )Nr   r]  r:  )rN  r@  r   r  r0  r  rX  r<  r  r.  r  rc  rd  )r(   rB  rh  rf  rj  r   r   r   computeIndex  s    
zDpyStencilGenerator.FixRelIndex.visit_Subscript.<locals>.computeIndexc                    s  g }t | jjD ]@\}}t|tjr4||| t|tjr| || qjdkrlt	| jj_njt	| jjkrt
dt| jtjrd}t
|t }tj| jtj|t d|d}jd krjd krjgj _jgj _jsbt | jjD ]L\}}t|tjr|j|jfD ]}	t|	tjsTt|	tjr`|	}
n0t|	dr|	jjkrj|	j }
nt
d|
j| k r|
j|< |
j| kr4|
j|< q4n|j}t|tjst|tjr|}
n0t|dr |jjkr j|j }
nt
d|
j| k rB|
j|< |
j| kr|
j|< qn>t jD ]2\}}	j| d j|< j| d	 j|< qlt||  t| |S )
Nr   r^  r_  )dimsr   r  r   r`  r   r   ) ra  r  rv  r!  r  rp  rb  r  rO  r   r[  r   r  r  r  r   ExtSlicerP  rQ  rU  rS  rW  rq  rr  r"  r7  r\  re  r   rN  rc  rd  )rB  rf  r(   rg  r   ri  rj  r\   Zanoderk  rl  ru  rt  rK   r   r   handleExtSlice  s    
	






zFpyStencilGenerator.FixRelIndex.visit_Subscript.<locals>.handleExtSlicec                    s   d| j }t |_t| jtjr0d}t|t }tj| j||d}t	||  t
| jdkrrd_njdkrtdjd krjd krjg_jg_jsVt| j jtjst| j jtjr| j j}n<t| j jdr| j jjjkrj| j jj }ntd|jd k r:|jd< |jd kr~|jd< n(jd d jd< jd d jd< |S )	Nr   r_  r  r   r   r^  r   r`  )r  r  r  r   r!  r  r[  r  r   rc  rd  rO  rP  rQ  rU  rS  rW  r"  r7  r\  re  r   rN  )rB  rf  r   ri  rj  rl  )rt  rK   r   r   handleSliceQ  sN    






zCpyStencilGenerator.FixRelIndex.visit_Subscript.<locals>.handleSlicezUnhandled subscriptN)r>  r   r   rM  rV  r!  r  r  rw  rp  r  r  r[  )rK   rB  rm  rn  ry  rz  r   rx  r   visit_Subscriptg  s(    >7K0

z.pyStencilGenerator.FixRelIndex.visit_Subscriptc                 C   s   | j dkrtdn| j S d S )Nr   z+Transform has not been run/no indexes found)rO  r[  r   r   r   r   idx_len  s
    
z&pyStencilGenerator.FixRelIndex.idx_lenc                 C   s   | j S rO   )rQ  r   r   r   r   maxes  s    z$pyStencilGenerator.FixRelIndex.maxesc                 C   s   | j S rO   )rP  r   r   r   r   mins  s    z#pyStencilGenerator.FixRelIndex.minsc                 C   s   | j S rO   )rX  r   r   r   r   
id_pattern  s    z)pyStencilGenerator.FixRelIndex.id_patternN)rr   rs   rt   r;  rJ   r\  r{  propertyr|  r}  r~  r  r   r   r   r   FixRelIndexF  s     1


r  c                   @   s,   e Zd ZdZdd Zdd Zedd ZdS )	z#pyStencilGenerator.TransformReturnsz;
        Transforms return nodes into assignments.
        c                 O   sL   t jj| f|| tjj| f|| || _|  | _d| j }|| _d S )Nz__b%s)	r  rL  rJ   r   r=  _relidx_infor   Z_ret_var_idx_retvarname)rK   relidx_inforL   r`   retvarr   r   r   rJ     s    

z,pyStencilGenerator.TransformReturns.__init__c                    s@     |  jj} jj  j|j fddt|D S )Nc                    s   g | ]} j |  qS r   )r<  )r[   lrK   var_patternr   r   r]     s     zDpyStencilGenerator.TransformReturns.visit_Return.<locals>.<listcomp>)r>  r  r|  r  r  r  r   r&   )rK   rB  nloopsr   r  r   visit_Return  s    
 z0pyStencilGenerator.TransformReturns.visit_Returnc                 C   s   | j S rO   )r  r   r   r   r   ret_var_name  s    z0pyStencilGenerator.TransformReturns.ret_var_nameN)rr   rs   rt   r;  rJ   r  r  r  r   r   r   r   TransformReturns  s
   r  c                   @   s    e Zd ZdZdd Zdd ZdS )zpyStencilGenerator.FixFuncz The main function rewriter, takes the body of the kernel and generates:
         * checking function calls
         * return value allocation
         * loop nests
         * return site
         * Function definition as an entry point
        c           	         s   t jj f|| tjj f|| |j _|j _|j	 _
| _| _|rT|ng  _|rb|nt  _ fdd jD  _t|dr|  _n| _ jd  _d S )Nc                    s   g | ]}| j kr|qS r   )rV  rZ   r   r   r   r]     s    
 z7pyStencilGenerator.FixFunc.__init__.<locals>.<listcomp>r   r   )r  rL  rJ   r   r=  original_kernel_original_kernelrY  rM  retty_rettyr  	_ret_inforV  r^   rW  _relidx_argsre  tolistr,   stencil_arr)	rK   Zkpropsr  Zret_infor,   r;   r"   rL   r`   r   r   r   rJ     s&    

z#pyStencilGenerator.FixFunc.__init__c              
   C   s  |  | dd }t|}t| jd }t| | jd| j	dgd}| j
j}dd }| j
j}|j}	d}
t|D ]b}|| j
j|
 | j
j|
 \}}|}| | jd	|
|}| j|| j|
  |||	d
}|g}	|
d7 }
qxt|| | jjd }| jj}| | j||| j}t|| | |}t|| tddg}g }tj|jj| |ddg g g d}tjd|j  |||| j!| j|||gg d}t|| |S )z
            Transforms the kernel function into a function that will perform
            the stencil like behaviour on the kernel.
            c                  _   sf   | d}| d j}|d k	r4t|t|kr4td| dd  D ] }t|dr@||jkr@tdq@d S )Nr"   r   zInvalid neighborhood suppliedr   r   z#Input stencil arrays do not commute)r@  r   r   r[  re  )rL   r`   r"   Z
init_shaper\   r   r   r   check_stencil_arrays  s    



zJpyStencilGenerator.FixFunc.visit_FunctionDef.<locals>.check_stencil_arraysr   r  r"   )r`   c                 S   s,   | dkrdn|  }|dkr | nd}||fS r   r   )r~  Zmaxsminlimmaxlimr   r   r   computebound  s    zBpyStencilGenerator.FixFunc.visit_FunctionDef.<locals>.computeboundr   )r   r   N)rL   defaultsvarargkwarg
kwonlyargskw_defaultsposonlyargsrK  )r)  rL   r   Zdecorator_list)"r>  inspect	getsourcer  r9  stripr   rd  r  r  r  r|  r  r&   r~  r}  r5  r  r%  r<  rc  r  r  r  r  r  r,   r&  r   	argumentsrL   ZFunctionDefr)  r  )rK   rB  r  ZchecksrcZ
check_implZchecker_callr  r  r  Z	loop_bodyZ
loop_countr  r  r  ZminboundZmaxboundZloopsZ
_rettynamer  allocateZreturnerZ	add_kwargr  Znewargsr  r   r   r   visit_FunctionDef  s    




     
   
	z,pyStencilGenerator.FixFunc.visit_FunctionDefN)rr   rs   rt   r;  rJ   r  r   r   r   r   FixFunc  s   r  c                   @   sX   e Zd ZdZdd Zdd Zdd Zedd	 Zed
d Z	edd Z
edd ZdS )z!pyStencilGenerator.GetKernelPropszV Gets the argument names and other properties
        of the original kernel.
        c                 O   sJ   t jj| f|| tjj| f|| d | _d | _d | _d | _i | _	d S rO   )
r  NodeVisitorrJ   r   r=  rM  _kwargnamesr  r  rN  rw   r   r   r   rJ   J  s    z*pyStencilGenerator.GetKernelProps.__init__c                    s   | j d k	s| jd k	rtdd  fdd|jjD | _ |jjrTdd |jjD | _| |j| j }tjtj	dt
 dg|jd| _tt|| _| | d S )	Nz%multiple definition of function/args?r   c                    s   g | ]}t | qS r   )rA  rZ   r   r   r   r]   X  s     zGpyStencilGenerator.GetKernelProps.visit_FunctionDef.<locals>.<listcomp>c                 S   s   g | ]
}|j qS r   )r   rZ   r   r   r   r]   Z  s     Z
__retdtyper   r  )rM  r  RuntimeErrorrL   r  r  r)  r  r  r  r  r   r  rd  r   r  r>  )rK   rB  Zcompute_retdtyper   r  r   r  S  s    z3pyStencilGenerator.GetKernelProps.visit_FunctionDefc                 C   s   |  | |j}t|dkr|d }t|tjrt|jtjrP|jj| j	|j
< n@t|jtjrt|jtjr~|jj| j	|j
< n|jj | j	|j
< d S Nr   r   )r>  r  r   r!  r  r  r   r"  r~   rN  r   r7  ZUAdd)rK   rB  Ztgtr  r   r   r   visit_Assignb  s    
z.pyStencilGenerator.GetKernelProps.visit_Assignc                 C   s   | j S )zD
            The names of the arguments to the function
            )rM  r   r   r   r   rY  p  s    z*pyStencilGenerator.GetKernelProps.argnamesc                 C   s   | j S )z{
            A map of variable name to constant for variables that are simple
            constant assignments
            )rN  r   r   r   r   rZ  w  s    z/pyStencilGenerator.GetKernelProps.const_assignsc                 C   s   | j S )z)
            The return type
            )r  r   r   r   r   r    s    z'pyStencilGenerator.GetKernelProps.rettyc                 C   s   | j S )z7
            The original unmutated kernel
            )r  r   r   r   r   r    s    z1pyStencilGenerator.GetKernelProps.original_kernelN)rr   rs   rt   r;  rJ   r  r  r  rY  rZ  r  r  r   r   r   r   GetKernelPropsE  s   	


r  c                   @   s   e Zd ZdZdd ZdS )zpyStencilGenerator.FixCallsz3 Fixes call sites for astor (in case it is in use) c                 C   s(   |  | tj|j|j|jd d d}|S )Nr  )r>  r  r	  rP   rL   r  )rK   rB  r  r   r   r   
visit_Call  s    
z&pyStencilGenerator.FixCalls.visit_CallN)rr   rs   rt   r;  r  r   r   r   r   FixCalls  s   r  c           
         s   t |}t| }d}|r6td tt|  fdd}|| |rtd ttj|dd zdd	l}	t|	| W n t	k
r   Y nX |S )
z
        Generates the AST tree for a stencil from:
        func - a python stencil kernel
        cval, standard_indexing and neighborhood as per the @stencil decorator
        FZORIGINALc                    s     }||  |j}|j}r@D ]}||kr&d}t|q& }||  ||}||  |}||  ||| }	|	|  	 }
|
|  t
| jd  dS )z the pipeline of manipulations z4Non-existent variable specified in standard_indexingr   N)r  visitrY  rZ  r[  rJ  r  r  r  r  r  rd  r   )treeZkernel_propsZargnmZ
const_asgnr\   r   Z
fold_constZrelidx_fixerZreturn_transformerfixerZ	callFixerr,   r"   rK   r;   r   r   pipeline  s@    


   




z:pyStencilGenerator.generate_stencil_tree.<locals>.pipelinez


NEWT)Zinclude_attributesr   N)
r  r  r  r9  r  printdumpastorZ	to_sourceImportError)
rK   rP   r,   r;   r"   srcr  DEBUGr  r  r   r  r   generate_stencil_tree  s"    
-z(pyStencilGenerator.generate_stencil_treeN)rr   rs   rt   r;  r=  r  rL  rJ  r  r  r  r  r  r  r  r   r   r   r   r     s      f Hr   constantc                 K   s   t | tsd}| }nt | ts&td| }d}|D ]}|dkr2td| q2|dkr`td| |dd}|d	d}|d
d}t }|||||}	t|	ddd}
|
jd }t	
|t }|S )zs
    A pure python implementation of (a large subset of) stencil functionality,
    equivalent to StencilFunc.
    r  zWstencil mode should be
                                                        a stringN)r,   r;   r"   zUnknown stencil option zUnsupported mode style r,   r   r;   r"   z<ast>exec)filenamemode)r!  r   r   r[  r@  r   r  compile	co_constspytypesFunctionTypeglobals)func_or_moderU   r  rP   optionr,   r;   r"   genr  Zmod_code	func_codeZ	full_funcr   r   r   	pyStencil  s,    


r  c                       s  e Zd Z 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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/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Z d=d> Z!d?d@ Z"dAdB Z#dCdD Z$dEdF Z%dGdH Z&dIdJ Z'e()dKdLdM Z*dNdO Z+dPdQ Z,dRdS Z-dTdU Z.dVdW Z/dXdY Z0dZd[ Z1d\d] Z2d^d_ Z3d`da Z4dbdc Z5ddde Z6dfdg Z7dhdi Z8djdk Z9dldm Z:dndo Z;dpdq Z<drds Z=e()dtdudv Z>dwdx Z?dydz Z@d{d| ZAd}d~ ZBdd ZCdd ZDdd ZEdd ZFdd ZGdd ZHdd ZIdd ZJdd ZKdd ZLdd ZMdd ZNdd ZOdd ZPdd ZQdd ZRdd ZSdd ZTdd ZUdd ZVdd ZWdd ZXdd ZYdd ZZdd Z[dd Z\dd Z]dd Z^dd Z_dd Z`dd Zadd Zbdd Zcdd ZdddĄ ZeddƄ ZfddȄ Zgddʄ Zhdd̄ Zidd΄ ZjddЄ Zkdd҄ ZlddԄ Zme()dաddׄ Znddل Zoe()dաddۄ Zpdd݄ Zq  ZrS )TestManyStencilsc                    s   t t| j|| d S rO   )rI   r  rJ   rw   rM   r   r   rJ     s    zTestManyStencils.__init__c                    s  | dt }| d}d}g  g td. fdd	}t|trd|d }|d }	|d	 }
|d
 }n|}|}	|}
|}d|i}|| d}z8tf d|i|}||d| di}|rtd| W nF tk
r } z&||d
 |W 5 Q R X |}d}W 5 d}~X Y nX d}||	d tf || }W 5 Q R X t	|dkrRfdd}nHt	|dkrnfdd}n,t	|dkrfdd}nt
dt	| tdd |D }d}||
d	 | ||}|j| }W 5 Q R X d}||d | ||}|j| }W 5 Q R X |r0td| td| td| |rz,|	s`tjj||dd | |j|j W nR tk
r } z2ddt|t|f f td t|  W 5 d}~X Y nX z,|
stjj||dd | |j|j W nR tk
r4 } z2d	dt|t|f f td!t|  W 5 d}~X Y nX zf|stjj||dd | |j|j z| d"|j  W n" tk
r   d#}t|Y nX W nR tk
r } z2ddt|t|f f td$t|  W 5 d}~X Y nX |rtd%  rd&d  D }td'| rbd(d D }d)d*d D }d+| }d,| }t|| |s||dkr|td-|dS )/a  
        For a given kernel:

        The expected result is computed from a pyStencil version of the
        stencil.

        The following results are then computed:
        * from a pure @stencil decoration of the kernel.
        * from the njit of a trivial wrapper function around the pure @stencil
          decorated function.
        * from the njit(parallel=True) of a trivial wrapper function around
           the pure @stencil decorated function.

        The results are then compared.
        rU   expected_exceptionFNc              
   3   s   z
d V  W n t k
r } zb| d k	r\t| dr2| n| g}d}|D ]}|t||O }q@|sz n|dt|t|f f W 5 d }~X Y nX | d k	r | d S )N__iter__F%s: %s)	Exceptionre  r!  rb  r   r   )ZextyZusecaser   Zlextyfoundex)should_failshould_not_failr   r   errorhandler0  s"    
z,TestManyStencils.check.<locals>.errorhandlerr  r   r   parforr  Tr"   z
Expected:
z@stencilr   c                    s    | S rO   r   )arg0stencil_func_implr   r   wrap_stencili  s    z,TestManyStencils.check.<locals>.wrap_stencilr/   c                    s
    | |S rO   r   )r  arg1r  r   r   r  l  s    rC   c                    s    | ||S rO   r   )r  r  Zarg2r  r   r   r  o  s    z+Up to 3 arguments can be provided, found %sc                 S   s   g | ]}t |qS r   rX   rZ   r   r   r   r]   v  s     z*TestManyStencils.check.<locals>.<listcomp>Zparforsz
@stencil_output:
z
njit_output:
z
parfor_output:
rd   r  z@stencil failed: %sz@njit failed: %srf   z*Could not find `@do_scheduling` in LLVM IRz@njit(parallel=True) failed: %sz

c                 S   s   g | ]}d | qS )r8  r   rZ   r   r   r   r]     s     zMThe following implementations should have raised an exception but did not:
%sc                 S   s   g | ]}d |d  qS )r8  r   r   rZ   r   r   r   r]     s      c                 S   s   g | ]}d | qS )z%s: Message: %s

r   rZ   r   r   r   r]     s   zNThe following implementations should not have raised an exception but did:
%s
zErrors were:

%sz)pyStencil failed, was not caught/expected)NN)r@  dictr   r!  updater  r  r  r   r   r[  r^   rW   rg   rV   rh   ri   rj   assertEqualr   rb  r   r   rk   rl   rm   r   r  join)rK   r_   rL   r`   rU   r  ZDEBUG_OUTPUTr  Zpystencil_exZ
stencil_exZnjit_exZ	parfor_exZstencil_argsZexpected_presentZast_implrn   r  ZpyStencil_unhandled_exZstencilfunc_outputr  rQ   ro   Zwrapped_cfuncrp   Zwrapped_cpfuncr   r   r   ZerrsZstr1Zstr2r   )r  r  r  r   rq     s   







  "  "  "

zTestManyStencils.checkc                 K   sD   t  }d |d< d |d< d |d< d |d< | D ]\}}|||< q.|S )Nr  r   r   r  )r  items)rK   r`   r   kr   r   r   r   exception_dict  s    
zTestManyStencils.exception_dictc                 C   s*   dd }t ddd}| || dS )z	rel indexc                 S   s   | d S r7   r   r   r   r   r   r     s    z-TestManyStencils.test_basic00.<locals>.kernelr   rC   r   Nrh   rz   r{   rq   rK   r   r   r   r   r   test_basic00  s    zTestManyStencils.test_basic00c                 C   s*   dd }t ddd}| || dS )rel index add constc                 S   s   | d S Nr   r   r   r   r   r   r     s    z-TestManyStencils.test_basic01.<locals>.kernelr   rC   r   Nr  r  r   r   r   test_basic01  s    zTestManyStencils.test_basic01c                 C   s*   t ddd}dd }| || dS )r  r   rC   r   c                 S   s   | d S )Nr   r   r   r   r   r   r     s    z-TestManyStencils.test_basic02.<locals>.kernelNr  rK   r   r   r   r   r   test_basic02  s    zTestManyStencils.test_basic02c                 C   s*   t ddd}dd }| || dS )r  r   rC   r   c                 S   s   | d S )Nr   r   r   r   r   r   r     s    z-TestManyStencils.test_basic03.<locals>.kernelNr  r  r   r   r   test_basic03  s    zTestManyStencils.test_basic03c                 C   s*   t ddd}dd }| || dS )r  r   rC   r   c                 S   s   | d S )Nr   r   r   r   r   r   r     s    z-TestManyStencils.test_basic04.<locals>.kernelNr  r  r   r   r   test_basic04  s    zTestManyStencils.test_basic04c                 C   s*   t ddd}dd }| || dS )r  r   rC   r   c                 S   s   | d S )Nr   r   r   r   r   r   r   r     s    z-TestManyStencils.test_basic05.<locals>.kernelNr  r  r   r   r   test_basic05  s    zTestManyStencils.test_basic05c                 C   s*   t ddd}dd }| || dS )r  r   rC   r   c                 S   s   | d S )Nr   r   r   r   r   r   r   r     s    z-TestManyStencils.test_basic06.<locals>.kernelNr  r  r   r   r   test_basic06  s    zTestManyStencils.test_basic06c                 C   s*   t ddd}dd }| || dS )r  r   rC   r   c                 S   s   | d S )Nr   r   r   r   r   r   r   r     s    z-TestManyStencils.test_basic07.<locals>.kernelNr  r  r   r   r   test_basic07  s    zTestManyStencils.test_basic07c                 C   s*   t ddd}dd }| || dS )r  r   rC   r   c                 S   s   | d S )Nr   r   r   r   r   r   r   r     s    z-TestManyStencils.test_basic08.<locals>.kernelNr  r  r   r   r   test_basic08  s    zTestManyStencils.test_basic08c                 C   s*   t ddd}dd }| || dS )r  r   rC   r   c                 S   s   | d S )Nr-   r   r   r   r   r   r     s    z-TestManyStencils.test_basic09.<locals>.kernelNr  r  r   r   r   test_basic09  s    zTestManyStencils.test_basic09c                 C   s*   t ddd}dd }| || dS )r  r   rC   r   c                 S   s   | d | d  S r   r   r   r   r   r   r   #  s    z-TestManyStencils.test_basic10.<locals>.kernelNr  r  r   r   r   test_basic10  s    zTestManyStencils.test_basic10c                 C   s*   t ddd}dd }| || dS )r  r   rC   r   c                 S   s   | d | d  S )Nr   r   r   r   r   r   r   r   +  s    z-TestManyStencils.test_basic11.<locals>.kernelNr  r  r   r   r   test_basic11'  s    zTestManyStencils.test_basic11c                 C   s*   t ddd}dd }| || dS )r  r   rC   r   c                 S   s   | d | d  S )Nr  r  r   r   r   r   r   r   3  s    z-TestManyStencils.test_basic12.<locals>.kernelNr  r  r   r   r   test_basic12/  s    zTestManyStencils.test_basic12c                 C   s*   t ddd}dd }| || dS )r  r   rC   r   c                 S   s   | d | d  S )Nr  r  r   r   r   r   r   r   ;  s    z-TestManyStencils.test_basic13.<locals>.kernelNr  r  r   r   r   test_basic137  s    zTestManyStencils.test_basic13c                 C   s*   t ddd}dd }| || dS )!rel index add domain change constr   rC   r   c                 S   s   | d d S )Nr8   r   r   r   r   r   r   r   C  s    z-TestManyStencils.test_basic14.<locals>.kernelNr  r  r   r   r   test_basic14?  s    zTestManyStencils.test_basic14c                 C   s*   t ddd}dd }| || dS )r  r   rC   r   c                 S   s   d}| d | S )Nr   r8   r   r   tr   r   r   r   K  s    z.TestManyStencils.test_basic14b.<locals>.kernelNr  r  r   r   r   test_basic14bG  s    zTestManyStencils.test_basic14bc                 C   s*   t ddd}dd }| || dS )ztwo rel index, add constr   rC   r   c                 S   s   | d | d  d S )Nr8   r   r*   r   r   r   r   r   r   T  s    z-TestManyStencils.test_basic15.<locals>.kernelNr  r  r   r   r   test_basic15P  s    zTestManyStencils.test_basic15c                 C   s:   t ddd}dd }| jtd}| j|||d dS )	ztwo rel index OOB, add constr   rC   r   c                 S   s   | d | d  d S )Nr8   )r   r   r*   r   r   r   r   r   r   \  s    z-TestManyStencils.test_basic16.<locals>.kernel)r  r  N)rh   rz   r{   r  
IndexErrorrq   )rK   r   r   r  r   r   r   test_basic16X  s    zTestManyStencils.test_basic16c                 C   s*   t ddd}dd }| || dS )&two rel index boundary test, add constr   rC   r   c                 S   s   | d | d  d S )Nr8   )r/   r   r*   r   r   r   r   r   r   g  s    z-TestManyStencils.test_basic17.<locals>.kernelNr  r  r   r   r   test_basic17c  s    zTestManyStencils.test_basic17c                 C   s*   t ddd}dd }| || dS )r  r   rC   r   c                 S   s   | d | d  d S )Nr8   r.   r   r*   r   r   r   r   r   r   o  s    z-TestManyStencils.test_basic18.<locals>.kernelNr  r  r   r   r   test_basic18k  s    zTestManyStencils.test_basic18c                 C   s*   t ddd}dd }| || dS )r  r   rC   r   c                 S   s   | d | d  d S )Nr8   r   rC   r*   r   r   r   r   r   r   w  s    z-TestManyStencils.test_basic19.<locals>.kernelNr  r  r   r   r   test_basic19s  s    zTestManyStencils.test_basic19c                 C   s*   t ddd}dd }| || dS )r  r   rC   r   c                 S   s   | d | d  d S )Nr8   )r   r*   r   r   r   r   r   r     s    z-TestManyStencils.test_basic20.<locals>.kernelNr  r  r   r   r   test_basic20{  s    zTestManyStencils.test_basic20c                 C   s*   t ddd}dd }| || dS )zsame rel, add constr   rC   r   c                 S   s   | d | d  d S )Nr8   r*   r   r   r   r   r   r     s    z-TestManyStencils.test_basic21.<locals>.kernelNr  r  r   r   r   test_basic21  s    zTestManyStencils.test_basic21c                 C   s*   t ddd}dd }| || dS )z%rel idx const expr folding, add constr   rC   r   c                 S   s   | d | d  d S )Nr   r8   r*   r   r   r   r   r   r     s    z-TestManyStencils.test_basic22.<locals>.kernelNr  r  r   r   r   test_basic22  s    zTestManyStencils.test_basic22c                 C   s*   t ddd}dd }| || dS )zrel idx, work in bodyr   rC   r   c                 S   s&   t d| d  }| d | d  | S Nr   )r/   r   r   r8   rh   sinr   r\   r   r   r   r     s    z-TestManyStencils.test_basic23.<locals>.kernelNr  r  r   r   r   test_basic23  s    zTestManyStencils.test_basic23c                 C   s*   t ddd}dd }| || dS )z,rel idx, dead code should not impact rel idxr   rC   r   c                 S   s"   t d| d  }| d | d  S r  r  r  r   r   r   r     s    z.TestManyStencils.test_basic23a.<locals>.kernelNr  r  r   r   r   test_basic23a  s    zTestManyStencils.test_basic23ac                 C   s2   t ddd}dd }| j||ttgd dS )z1d idx on 2d arrr   rC   r   c                 S   s   | d d S )Nr   r*   r   r   r   r   r   r     s    z-TestManyStencils.test_basic24.<locals>.kernelr  Nrh   rz   r{   rq   r[  r   r  r   r   r   test_basic24  s    zTestManyStencils.test_basic24c                 C   s2   t ddd}dd }| j||ttgd dS )zno idx on 2d arrr   rC   r   c                 S   s   dS )Nr*   r   r   r   r   r   r     s    z-TestManyStencils.test_basic25.<locals>.kernelr  Nrh   rz   r{   rq   r[  r   r  r   r   r   test_basic25  s    zTestManyStencils.test_basic25c                 C   s,   t dddd}dd }| || dS )z3d arr@   r      r/   c                 S   s   | d | d  d S )N)r   r   r   )r   r   r   r*   r   r   r   r   r   r     s    z-TestManyStencils.test_basic26.<locals>.kernelNr  r  r   r   r   test_basic26  s    zTestManyStencils.test_basic26c                 C   s.   t ddddd}dd }| || dS )z4d arr   r   r  r/   c                 S   s   | d | d  d S )N)r   r   r   r   )r   r   r   r   r*   r   r   r   r   r   r     s    z-TestManyStencils.test_basic27.<locals>.kernelNr  r  r   r   r   test_basic27  s    zTestManyStencils.test_basic27c                 C   s2   t dddt j}dd }| || dS )ztype widen r   rC   r   c                 S   s   | d t d S )Nr8         $@)rh   r   r   r   r   r   r     s    z-TestManyStencils.test_basic28.<locals>.kernelN)rh   rz   r{   astypeZfloat32rq   r  r   r   r   test_basic28  s    zTestManyStencils.test_basic28c                 C   s4   t ddd}dd }| j||tttgd dS )zconst index from func r   rC   r   c                 S   s   | dt tdf S r   )r   rh   cosr   r   r   r   r     s    z-TestManyStencils.test_basic29.<locals>.kernelr  Nrh   rz   r{   rq   r[  r   r   r  r   r   r   test_basic29  s
    zTestManyStencils.test_basic29c                 C   s*   t ddd}dd }| || dS )zsigned zerosr   rC   r   c                 S   s   | d S r7   r   r   r   r   r   r     s    z-TestManyStencils.test_basic30.<locals>.kernelNr  r  r   r   r   test_basic30  s    zTestManyStencils.test_basic30c                 C   s*   t ddd}dd }| || dS )zdoes a const propagate? 2Dr   rC   r   c                 S   s   d}| |df S r  r   r  r   r   r   r     s    z-TestManyStencils.test_basic31.<locals>.kernelNr  r  r   r   r   test_basic31  s    zTestManyStencils.test_basic31z constant folding not implementedc                 C   s*   t ddd}dd }| || dS )zdoes a const propagate?r   rC   r   c                 S   s   d}d| }| |df S r  r   )r   sr  r   r   r   r     s    z.TestManyStencils.test_basic31b.<locals>.kernelNr  r  r   r   r   test_basic31b  s    zTestManyStencils.test_basic31bc                 C   s"   t d}dd }| || dS )zdoes a const propagate? 1Dr   c                 S   s   d}| | S r>   r   r  r   r   r   r     s    z.TestManyStencils.test_basic31c.<locals>.kernelNrh   rz   rq   r  r   r   r   test_basic31c  s    
zTestManyStencils.test_basic31cc                 C   s4   t ddd}dd }| j||tttgd dS )ztyped int indexr   rC   r   c                 S   s   | t ddf S r  )rh   Zint8r   r   r   r   r     s    z-TestManyStencils.test_basic32.<locals>.kernelr  Nr  r  r   r   r   test_basic32  s
    zTestManyStencils.test_basic32c                 C   s*   t ddd}dd }| || dS )zadd 0d arrayr   rC   r   c                 S   s   | d t d S )Nr8   r   )rh   arrayr   r   r   r   r     s    z-TestManyStencils.test_basic33.<locals>.kernelNr  r  r   r   r   test_basic33  s    zTestManyStencils.test_basic33c                 C   s*   dd }t ddd}| || dS )z<More complex rel index with dependency on addition rel indexc                 S   s6   d| d  }|| d | d  | d  t | d   S )N      @r   r   r   r  r  )r   gr   r   r   r     s    z-TestManyStencils.test_basic34.<locals>.kernel   r   Nr  r  r   r   r   test_basic34  s    zTestManyStencils.test_basic34c                 C   s2   dd }t ddd}| j||ddid d	S )
z<simple cval where cval is int but castable to dtype of floatc                 S   s   | d S r  r   r   r   r   r   r     s    z-TestManyStencils.test_basic35.<locals>.kernelr   rC   r   r,   r   rU   Nr  r  r   r   r   test_basic35  s    zTestManyStencils.test_basic35c                 C   s2   dd }t ddd}| j||ddid d	S )
zmore complex with cvalc                 S   s    | d | d  | d  | d  S Nr   r   r  r   r   r   r   r   r     s    z-TestManyStencils.test_basic36.<locals>.kernelr   rC   r   r,   g      @r-  Nr  r  r   r   r   test_basic36  s    zTestManyStencils.test_basic36c                 C   s2   dd }t ddd}| j||ddid d	S )
zcval is exprc                 S   s    | d | d  | d  | d  S r/  r   r   r   r   r   r   $  s    z-TestManyStencils.test_basic37.<locals>.kernelr   rC   r   r,   g      Q@r-  Nr  r  r   r   r   test_basic37"  s    zTestManyStencils.test_basic37c                 C   sD   dd }t ddd}| jtttd}| j||ddi|d	 d
S )zcval is complexc                 S   s    | d | d  | d  | d  S r/  r   r   r   r   r   r   +  s    z-TestManyStencils.test_basic38.<locals>.kernelr   rC   r   )r   r  r   r,   r   rU   r  N)rh   rz   r{   r  r   r[  rq   rK   r   r   r  r   r   r   test_basic38)  s    zTestManyStencils.test_basic38c                 C   sB   dd }t ddd}| j||dt dt d id	 d
S )zcval is func exprc                 S   s    | d | d  | d  | d  S r/  r   r   r   r   r   r   6  s    z-TestManyStencils.test_basic39.<locals>.kernelr   rC   r   r,   r   r/   r-  N)rh   rz   r{   rq   r  r  r  r   r   r   test_basic394  s    zTestManyStencils.test_basic39c                 C   s>   dd }t ddd}t ddd}| ||| dS )z2 args!c                 S   s   | d |d  S Nr   )r   r.   r   r1   r   r   r   r   =  s    z-TestManyStencils.test_basic40.<locals>.kernelr   rC   r   Nr  rK   r   r   r2   r   r   r   test_basic40;  s    zTestManyStencils.test_basic40c                 C   sF   dd }t ddd}t ddd}| j|||ttgd d	S )
z(2 args! rel arrays wildly not same size!c                 S   s   | d |d  S r6  r   r1   r   r   r   r   E  s    z-TestManyStencils.test_basic41.<locals>.kernelr   rC   r   r*   r   r  Nrh   rz   r{   rq   r[  r   r7  r   r   r   test_basic41C  s       zTestManyStencils.test_basic41c                 C   sF   dd }t ddd}t ddd}| j|||ttgd dS )	z%2 args! rel arrays very close in sizec                 S   s   | d |d  S r6  r   r1   r   r   r   r   O  s    z-TestManyStencils.test_basic42.<locals>.kernelr   rC   r         "@r  Nr9  r7  r   r   r   test_basic42M  s       zTestManyStencils.test_basic42c                 C   s>   dd }t ddd}t ddd}| ||| dS )z2 args more complexityc                 S   s    | d | d  |d  |d  S )Nr   r   r/   r  r   r   r1   r   r   r   r   Y  s    z-TestManyStencils.test_basic43.<locals>.kernelg      >@r      Nr  r7  r   r   r   test_basic43W  s    zTestManyStencils.test_basic43c                 C   sF   dd }t ddd}t ddd}| j|||ttgd dS )z!2 args, has assignment before usec                 S   s   d| d< | d S )Nr   r   r   r1   r   r   r   r   a  s    z-TestManyStencils.test_basic44.<locals>.kernelr   rC   r   r  Nrh   rz   r{   rq   r[  r   r7  r   r   r   test_basic44_  s       zTestManyStencils.test_basic44c                 C   sF   dd }t ddd}t ddd}| j|||ttgd dS )z02 args, has assignment and then cross dependencyc                 S   s   d| d< | d | d  S )Nr   r   r   r   r1   r   r   r   r   l  s    z-TestManyStencils.test_basic45.<locals>.kernelr   rC   r   r  Nr@  r7  r   r   r   test_basic45j  s       zTestManyStencils.test_basic45c                 C   sF   dd }t ddd}t ddd}| j|||ttgd dS )z#2 args, has cross relidx assignmentc                 S   s   |d | d< | d | d  S )Nr=  r   r   r   r1   r   r   r   r   w  s    z-TestManyStencils.test_basic46.<locals>.kernelr   rC   r   r  Nr@  r7  r   r   r   test_basic46u  s       zTestManyStencils.test_basic46c                 C   sR   dd }t ddd}t ddd}t ddd}| |||| dS )z3 argsc                 S   s   | d |d  |d  S )Nr   r   r   r   r   r2   r   r   r   r   r     s    z-TestManyStencils.test_basic47.<locals>.kernelr   rC   r   Nr  rK   r   r   r2   r   r   r   r   test_basic47  s
    zTestManyStencils.test_basic47c                 C   s*   dd }t ddd}| || dS )z22 args, has assignment before use via memory aliasc                 S   s"   | j }d|d d d d f< | d S )Nr   r   )Tr   r   r   r   r     s    z-TestManyStencils.test_basic48.<locals>.kernelr   rC   r   Nr  r  r   r   r   test_basic48  s    zTestManyStencils.test_basic48c                 C   sF   dd }t ddd}t ddd}| j|||ddid d	S )
z#2 args, standard_indexing on secondc                 S   s   | d |d  S )Nr   r  r   r1   r   r   r   r     s    z-TestManyStencils.test_basic49.<locals>.kernelr   rC   r   r;   r2   r-  Nr  r7  r   r   r   test_basic49  s    zTestManyStencils.test_basic49z&dynamic range checking not implementedc                 C   sH   dd }t ddd}t ddd}| j|||dditd d	S )
z2 args, standard_indexing OOBc                 S   s   | d |d  S )Nr   )r      r   r1   r   r   r   r     s    z-TestManyStencils.test_basic50.<locals>.kernelr   rC   r   r;   r2   r2  N)rh   rz   r{   rq   r  r7  r   r   r   test_basic50  s     zTestManyStencils.test_basic50c                 C   sP   dd }t ddd}t ddd}| j|||dddgittgd	 d
S )z$2 args, standard_indexing, no relidxc                 S   s   | d |d  S Nr   )r   r/   r   r1   r   r   r   r     s    z-TestManyStencils.test_basic51.<locals>.kernelr   rC   r   r;   r   r2   r2  Nr  r7  r   r   r   test_basic51  s         zTestManyStencils.test_basic51c                 C   sZ   dd }t ddd}t ddd}t ddd}| j||||dd	id
 dS )z(3 args, standard_indexing on middle arg c                 S   s   | d |d  |d  S )Nr   r=  r   rD  r   r   r   r     s    z-TestManyStencils.test_basic52.<locals>.kernelr   rC   r   r)  r/   r;   r2   r-  Nr  rE  r   r   r   test_basic52  s
    zTestManyStencils.test_basic52c                 C   sZ   dd }t ddd}t ddd}| jttttd}| j|||ddi|d	 d
S )z92 args, standard_indexing on variable that does not existc                 S   s   | d |d  S rL  r   r1   r   r   r   r     s    z-TestManyStencils.test_basic53.<locals>.kernelr   rC   r   r  r   r  r   r;   r   r2  N)rh   rz   r{   r  r[  r  rq   rK   r   r   r2   r  r   r   r   test_basic53  s$     zTestManyStencils.test_basic53c                 C   sF   dd }t ddd}t ddd}| j|||ddid d	S )
z)2 args, standard_indexing, index from varc                 S   s   d}| d |d|f  S )Nr/   r   r   r   )r   r2   r  r   r   r   r     s    z-TestManyStencils.test_basic54.<locals>.kernelr   rC   r   r;   r2   r-  Nr  r7  r   r   r   test_basic54  s    zTestManyStencils.test_basic54c                 C   sF   dd }t ddd}t ddd}| j|||ddid d	S )
z62 args, standard_indexing, index from more complex varc                 S   s    d}d| }| d |d|f  S )Nr   r/   r   r   r   )r   r2   r"  r  r   r   r   r     s    z-TestManyStencils.test_basic55.<locals>.kernelr   rC   r   r;   r2   r-  Nr  r7  r   r   r   test_basic55  s    zTestManyStencils.test_basic55c                 C   sF   dd }t ddd}t ddd}| j|||ddid d	S )
z,2 args, standard_indexing, added complexity c                 S   sJ   d}d}|dd d f D ]}||7 }qd| d }| d |d|f  | S )Nr   r   r/   r   r   )r   r2   r"  accr  r  r   r   r   r     s    
z-TestManyStencils.test_basic56.<locals>.kernelr   rC   r   r;   r2   r-  Nr  r7  r   r   r   test_basic56  s    zTestManyStencils.test_basic56c                 C   sF   dd }t ddd}t ddd}| j|||ddid d	S )
z12 args, standard_indexing, split index operation c                 S   s   |d }| d |d  S )Nr   r   r   r   rD  r   r   r   r     s    z-TestManyStencils.test_basic57.<locals>.kernelr   rC   r   r;   r2   r-  Nr  r7  r   r   r   test_basic57  s    zTestManyStencils.test_basic57c                 C   sF   dd }t ddd}t ddd}| j|||ddid d	S )
z?2 args, standard_indexing, split index with broadcast mutation c                 S   s   |d d }| d |d  S )Nr   r   r   r   rD  r   r   r   r     s    z-TestManyStencils.test_basic58.<locals>.kernelr   rC   r   r;   r2   r-  Nr  r7  r   r   r   test_basic58  s    zTestManyStencils.test_basic58c                 C   sP   dd }t ddd}t ddd}d}| j||||ddd	gid
 dS )z>3 args, mix of array, relative and standard indexing and constc                 S   s   | d |d  | S Nr   r  r   rD  r   r   r   r   	  s    z-TestManyStencils.test_basic59.<locals>.kernelr   rC   r   r   r;   r2   r   r-  Nr  rE  r   r   r   test_basic59	  s
    zTestManyStencils.test_basic59c                 C   s^   dd }t ddd}t ddd}d}| jtd}| j||||dd	d
gi|d dS )zP3 args, mix of array, relative and standard indexing,
        tuple pass throughc                 S   s   | d |d  |d  S )Nr   r  r   r   rD  r   r   r   r   	  s    z-TestManyStencils.test_basic60.<locals>.kernelr   rC   r   )r   )r  r;   r2   r   r2  N)rh   rz   r{   r  r[  rq   )rK   r   r   r2   r   r  r   r   r   test_basic60	  s"        zTestManyStencils.test_basic60c                 C   sH   dd }t ddd}t ddd}| j|||dditd d	S )
z"2 args, standard_indexing on firstc                 S   s   | d |d  S rX  r   r1   r   r   r   r   	  s    z-TestManyStencils.test_basic61.<locals>.kernelr   rC   r   r;   r   r2  N)rh   rz   r{   rq   r  r7  r   r   r   test_basic61	  s     zTestManyStencils.test_basic61c                 C   sH   dd }t ddd}t ddd}| j|||dddd	 d
S )z"2 args, standard_indexing and cvalc                 S   s   | d |d  S rX  r   r1   r   r   r   r   -	  s    z-TestManyStencils.test_basic62.<locals>.kernelr   rC   r   r2   r  )r;   r,   r-  Nr  r7  r   r   r   test_basic62+	  s    zTestManyStencils.test_basic62c                 C   sZ   dd }t ddd}t ddd}| jttttd}| j|||dd	i|d
 dS )zQ2 args, standard_indexing applied to relative, should fail,
        non-const idxc                 S   s   | d|d f S )Nr   r   r   r1   r   r   r   r   <	  s    z-TestManyStencils.test_basic63.<locals>.kernelr   rC   r   r   rO  r;   r2   r2  Nrh   rz   r{   r  r[  r   rq   rP  r   r   r   test_basic639	  s$     zTestManyStencils.test_basic63c                 C   s8   dd }t ddd}| j||ddittgd d	S )
z!1 arg that uses standard_indexingc                 S   s   | d S r7   r   r   r   r   r   r   P	  s    z-TestManyStencils.test_basic64.<locals>.kernelr   rC   r   r;   r   r2  Nr  r  r   r   r   test_basic64N	  s     zTestManyStencils.test_basic64c                 C   s*   dd }t d}| j||ddid dS )zbasic induced neighborhood testc                 S   s(   d}t ddD ]}|| | 7 }q|d S Nr   r      r%   r   cumulr(   r   r   r   r   ^	  s    z-TestManyStencils.test_basic65.<locals>.kernel      N@r"   )ra  r   r-  Nr$  r  r   r   r   test_basic65\	  s    
zTestManyStencils.test_basic65c                 C   s*   dd }t d}| j||ddid dS )zbasic const neighborhood testc                 S   s(   d}t ddD ]}|| d 7 }q|d S r`  r%   rc  r   r   r   r   i	  s    z-TestManyStencils.test_basic66.<locals>.kernelre  r"   rf  r-  Nr$  r  r   r   r   test_basic66g	  s    
zTestManyStencils.test_basic66c                 C   s2   dd }t ddd}| j||ddid d	S )
z"basic 2d induced neighborhood testc                 S   s<   d}t ddD ]$}t ddD ]}|| ||f 7 }qq|d S Nr   r    r   2   r%   r   rd  r(   r   r   r   r   r   s	  s
    z-TestManyStencils.test_basic67.<locals>.kernel      i@r      r"   r   rj  r   r-  Nr  r  r   r   r   test_basic67q	  s    zTestManyStencils.test_basic67c                 C   s8   dd }t ddd}| j||ddittgd d	S )
z basic 2d induced 1D neighborhoodc                 S   s,   d}t ddD ]}|| d|f 7 }q|d S )Nr   rj  r   rk  r%   )r   rd  r   r   r   r   r   ~	  s    z.TestManyStencils.test_basic67b.<locals>.kernelrm  r   rn  r"   )rp  r2  N)rh   rz   r{   rq   r   r[  r  r   r   r   test_basic67b|	  s     zTestManyStencils.test_basic67bc                 C   s2   dd }t ddd}| j||ddid d	S )
z0basic 2d one induced, one cost neighborhood testc                 S   s<   d}t ddD ]$}t ddD ]}|| |df 7 }qq|d S ri  r%   rl  r   r   r   r   	  s
    z-TestManyStencils.test_basic68.<locals>.kernelrm  r   rn  r"   ro  r-  Nr  r  r   r   r   test_basic68	  s    zTestManyStencils.test_basic68c                 C   s2   dd }t ddd}| j||ddid d	S )
z#basic 2d two cost neighborhood testc                 S   s8   d}t ddD ] }t ddD ]}|| d 7 }qq|d S )Nr   r    r   rj  r8   rk  r%   rl  r   r   r   r   	  s
    z-TestManyStencils.test_basic69.<locals>.kernelrm  r   rn  r"   ro  r-  Nr  r  r   r   r   test_basic69	  s    zTestManyStencils.test_basic69c                 C   s2   dd }t ddd}| j||ddid d	S )
zneighborhood adding complexityc                 S   sL   d}d}t ddD ]0}|| }t ddD ]}|| ||f | 7 }q(q|d S )Nr   r   r    r   rj  rk  r%   r   rd  zzr(   r  r   r   r   r   r   	  s    z-TestManyStencils.test_basic70.<locals>.kernelrm  r   rn  r"   ro  r-  Nr  r  r   r   r   test_basic70	  s    zTestManyStencils.test_basic70c                 C   s*   dd }t d}| j||ddid dS )zneighborhood, type changec                 S   s<   d}t ddD ]$}d}|dkr"d}|| | | 7 }q|d S )Nr   ra  r   g        ir   rb  r%   )r   rd  r(   r  r   r   r   r   	  s    z-TestManyStencils.test_basic71.<locals>.kernelre  r"   rf  r-  Nr$  r  r   r   r   test_basic71	  s    
zTestManyStencils.test_basic71c                 C   s*   dd }t d}| j||ddid dS )z+neighborhood, narrower range than specifiedc                 S   s(   d}t ddD ]}|| | 7 }q|d S )Nr   ir  rb  r%   rc  r   r   r   r   	  s    z-TestManyStencils.test_basic72.<locals>.kernelre  r"   rf  r-  Nr$  r  r   r   r   test_basic72	  s    
zTestManyStencils.test_basic72c                 C   s*   dd }t d}| j||ddid dS )zneighborhood, +ve rangec                 S   s(   d}t ddD ]}|| | 7 }q|d S )Nr   r      rb  r%   rc  r   r   r   r   	  s    z-TestManyStencils.test_basic73.<locals>.kernelre  r"   ))r   r   r-  Nr$  r  r   r   r   test_basic73	  s    
zTestManyStencils.test_basic73c                 C   s*   dd }t d}| j||ddid dS )zneighborhood, -ve rangec                 S   s(   d}t ddD ]}|| | 7 }q|d S )Nr   rj  r#   rb  r%   rc  r   r   r   r   	  s    z.TestManyStencils.test_basic73b.<locals>.kernelre  r"   ))rj  r    r-  Nr$  r  r   r   r   test_basic73b	  s    
zTestManyStencils.test_basic73bc                 C   s*   dd }t d}| j||ddid dS )z!neighborhood, -ve->+ve range spanc                 S   s(   d}t ddD ]}|| | 7 }q|d S )Nr   r    rz  rb  r%   rc  r   r   r   r   	  s    z-TestManyStencils.test_basic74.<locals>.kernelre  r"   ))r    r   r-  Nr$  r  r   r   r   test_basic74	  s    
zTestManyStencils.test_basic74c                 C   s*   dd }t d}| j||ddid dS )z!neighborhood, -ve->-ve range spanc                 S   s(   d}t ddD ]}|| | 7 }q|d S )Nr   rj  r   rb  r%   rc  r   r   r   r   	  s    z-TestManyStencils.test_basic75.<locals>.kernelre  r"   ))rj  r.   r-  Nr$  r  r   r   r   test_basic75	  s    
zTestManyStencils.test_basic75c                 C   s2   dd }t ddd}| j||ddid d	S )
zneighborhood, mixed range spanc                 S   sL   d}d}t ddD ]0}|| }t ddD ]}|| ||f | 7 }q(q|d S )Nr   r   r  r   rk  r%   ru  r   r   r   r   	  s    z-TestManyStencils.test_basic76.<locals>.kernelrm  r   rn  r"   ))r  r   )r  rC   r-  Nr  r  r   r   r   test_basic76	  s    zTestManyStencils.test_basic76c                 C   sF   dd }t ddd}t ddd}| j|||ddid d	S )
z neighborhood, two args c                 S   sH   d}t ddD ]0}t ddD ] }|| ||f |||f  7 }qq|d S Nr   r  r   r;  r%   r   r2   rd  r(   r   r   r   r   r   
  s
     z-TestManyStencils.test_basic77.<locals>.kernelrm  r   rn  r"   r  r   r  r-  Nr  r7  r   r   r   test_basic77
  s    zTestManyStencils.test_basic77c                 C   sF   dd }t ddd}t ddd}| j|||ddid d	S )
z. neighborhood, two args, -ve range, -ve range c                 S   sH   d}t ddD ]0}t ddD ] }|| ||f |||f  7 }qq|d S )Nr   r.   r   r;  r%   r  r   r   r   r   
  s
     z-TestManyStencils.test_basic78.<locals>.kernel     r@rJ  rn  r"   )r  r  )r  r.   r-  Nr  r7  r   r   r   test_basic78
  s       zTestManyStencils.test_basic78c                 C   sF   dd }t ddd}t ddd}| j|||ddid d	S )
z. neighborhood, two args, -ve range, +ve range c                 S   sH   d}t ddD ]0}t ddD ] }|| ||f |||f  7 }qq|d S )Nr   r  r.   r/   r   r;  r%   r  r   r   r   r   
  s
     z.TestManyStencils.test_basic78b.<locals>.kernelr  rJ  rn  r"   )r  )r/   	   r-  Nr  r7  r   r   r   test_basic78b
  s    zTestManyStencils.test_basic78bc                 C   s\   dd }t ddd}t dddd}| jttttd}| j|||dd	i|d
 dS )z% neighborhood, two incompatible args c                 S   sH   d}t ddD ]0}t ddD ] }|| ||f |||f  7 }qq|d S r  r%   r  r   r   r   r   *
  s
     z-TestManyStencils.test_basic79.<locals>.kernelrm  r   rn  r/   rO  r"   r  r2  N)rh   rz   r{   r  r[  r   rq   rP  r   r   r   test_basic79(
  s$       zTestManyStencils.test_basic79c                 C   s8   dd }t ddd}d}| j|||ddid	 d
S )z neighborhood, type change c                 S   s@   d}t ddD ](}t ddD ]}|| ||f | 7 }qq|d S r  r%   r  r   r   r   r   >
  s
    z-TestManyStencils.test_basic80.<locals>.kernelrm  r   rn  y              (@r"   r  r-  Nr  r7  r   r   r   test_basic80<
  s    zTestManyStencils.test_basic80c                 C   sT   dd }t ddd}|d  }| jttttd}| j|||dd	i|d
 dS )z1 neighborhood, dimensionally incompatible arrays c                 S   sD   d}t ddD ],}t ddD ]}|| ||f ||  7 }qq|d S r  r%   r  r   r   r   r   J
  s
    z-TestManyStencils.test_basic81.<locals>.kernelrm  r   rn  r   rO  r"   r  r2  N)	rh   rz   r{   copyr  r[  r   r   rq   rP  r   r   r   test_basic81H
  s$       zTestManyStencils.test_basic81c                 C   s>   dd }t ddd}| }| j|||dddd	 d
S )z% neighborhood, with standard_indexingc                 S   sD   d}t ddD ],}t ddD ]}|| ||f |d  7 }qq|d S Nr   r  r   r   rC   r;  r%   r  r   r   r   r   ^
  s
    z-TestManyStencils.test_basic82.<locals>.kernelrm  r   rn  r  r2   )r"   r;   r-  Nrh   rz   r{   r  rq   r7  r   r   r   test_basic82\
  s      zTestManyStencils.test_basic82c                 C   s@   dd }t ddd}| }| j|||dddd	d
 dS )z. neighborhood, with standard_indexing and cvalc                 S   sD   d}t ddD ],}t ddD ]}|| ||f |d  7 }qq|d S r  r%   r  r   r   r   r   m
  s
    z-TestManyStencils.test_basic83.<locals>.kernelrm  r   rn  r  r2         ?r"   r;   r,   r-  Nr  r7  r   r   r   test_basic83k
  s       zTestManyStencils.test_basic83c                 C   s*   dd }t ddd}| || dS )z kernel calls njit c                 S   s   | d t | d  S Nr8   r   )r?   r   r   r   r   r   |
  s    z-TestManyStencils.test_basic84.<locals>.kernelrm  r   rn  Nr  r  r   r   r   test_basic84z
  s    zTestManyStencils.test_basic84c                 C   s*   dd }t ddd}| || dS )z! kernel calls njit(parallel=True)c                 S   s   | d t | d  S r  )rB   r   r   r   r   r   
  s    z-TestManyStencils.test_basic85.<locals>.kernelrm  r   rn  Nr  r  r   r   r   test_basic85
  s    zTestManyStencils.test_basic85c                 C   s8   dd }t ddd}| j||ddittgd dS )	z bad kwarg c                 S   s   | d S r7   r   r   r   r   r   r   
  s    z-TestManyStencils.test_basic86.<locals>.kernelrm  r   rn  badr2  Nr  r  r   r   r   test_basic86
  s
    zTestManyStencils.test_basic86c                 C   s*   dd }t ddd}| || dS )z reserved arg name in use c                 S   s   | d S r7   r   )Z__sentinel__r   r   r   r   
  s    z-TestManyStencils.test_basic87.<locals>.kernelrm  r   rn  Nr  r  r   r   r   test_basic87
  s    zTestManyStencils.test_basic87c                 C   sD   dd }t ddd}| jttttd}| j||di |d d	S )
z use of reserved word c                 S   s   || d  S r  r   )r   ry   r   r   r   r   
  s    z-TestManyStencils.test_basic88.<locals>.kernelr   rC   r   rO  r*   r2  Nr]  r3  r   r   r   test_basic88
  s    zTestManyStencils.test_basic88c                 C   s*   dd }t ddd}| || dS )z basic multiple returnc                 S   s,   | d dkrdS | d dk r$| d S dS d S )Nr   r   r  r  r  r8   r   r   r   r   r   r   r   
  s
    z-TestManyStencils.test_basic89.<locals>.kernelrm  r   rn  Nr  r  r   r   r   test_basic89
  s    zTestManyStencils.test_basic89c                 C   s@   dd }t ddd}| }| j|||dddd	d
 dS )z@ neighborhood, with standard_indexing and cval, multiple returnsc                 S   s\   d}t ddD ],}t ddD ]}|| ||f |d  7 }qq|d }|dkrT|d S |S d S )Nr   r  r   r  r;  rm  r*   r%   )r   r2   rd  r(   r   resr   r   r   r   
  s    z-TestManyStencils.test_basic90.<locals>.kernelrm  r   rn  r  r2   r  r  r-  Nr  r7  r   r   r   test_basic90
  s    
   zTestManyStencils.test_basic90c                 C   s*   dd }t ddd}| || dS )z? Issue #3454, const(int) == const(int) evaluating incorrectly. c                 S   s   d}ddkrd}| d | S )Nr   r/   r8   r   r1   r   r   r   r   
  s    z-TestManyStencils.test_basic91.<locals>.kernelrm  r   rn  Nr  r  r   r   r   test_basic91
  s    zTestManyStencils.test_basic91c                 C   s<   dd }t t dd ddt j}| || dS )7 Issue #3497, bool return type evaluating incorrectly. c                 S   sH   | d | d A | d A | d A | d A | d A | d A | d A | d	 A S 
Nr  r   r  r   r8   r   r  r   r  r   r   r   r   r   r   
  s    z-TestManyStencils.test_basic92.<locals>.kernelrn  r/   r   r   Nrh   r'  rz   r{   r  r   rq   rK   r   r   r   r   r   test_basic92
  s    $zTestManyStencils.test_basic92c                 C   sD   dd }t t dd ddt j}| j||ddid	 d
S )r  c                 S   sH   | d | d A | d A | d A | d A | d A | d A | d A | d	 A S r  r   r   r   r   r   r   
  s    z-TestManyStencils.test_basic93.<locals>.kernelrn  r/   r   r   r,   Tr-  Nr  r  r   r   r   test_basic93
  s    $zTestManyStencils.test_basic93c                 C   s8   dd }t jdt jddd}| j||ddid	 d
S )z" Issue #3528. Support for slices. c                 S   s   t | ddddf S Nr   r/   rh   Zmedianr   r   r   r   r   
  s    z-TestManyStencils.test_basic94.<locals>.kernelrn  r   r   r   r"   r  r  r-  Nrh   rz   uint32r{   rq   r  r   r   r   test_basic94
  s    zTestManyStencils.test_basic94znot yet supportedc                 C   s0   dd }t jdt jddd}| || dS )z  Slice, calculate neighborhood. c                 S   s   t | ddddf S )Nr   r/   r  r   r  r   r   r   r   r   
  s    z-TestManyStencils.test_basic95.<locals>.kernelrn  r   r   r   Nr  r  r   r   r   test_basic95
  s    zTestManyStencils.test_basic95c                 C   s0   dd }t jdt jd}| j||ddid dS )	z 1D slice. c                 S   s   t | dd S r  r  r   r   r   r   r   
  s    z-TestManyStencils.test_basic96.<locals>.kernelrn  r   r"   )r  r-  N)rh   rz   r  rq   r  r   r   r   test_basic96
  s    zTestManyStencils.test_basic96c                 C   s0   dd }t jdt jddd}| || dS )z 2D slice and index. c                 S   s   t | dddf S )Nr   r/   rC   r  r   r   r   r   r     s    z-TestManyStencils.test_basic97.<locals>.kernelrn  r   r   r   Nr  r  r   r   r   test_basic97  s    zTestManyStencils.test_basic97c                 C   sX   t jt jt j tdtd fD ]2}dd }t dd}| j||d|dd q d	S )
r   r   c                 S   s   | d S r7   r   r   r   r   r   r     s    z-TestManyStencils.test_basic98.<locals>.kernelg      @)r/   rC   r  )r"   r,   r-  N)rh   r   r   r   rz   r{   rq   )rK   r,   r   r   r   r   r   test_basic98
  s    $
zTestManyStencils.test_basic98)srr   rs   rt   rJ   rq   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r	  r
  r  r  r  r  r  r  r  r  r   r!  unittestskipr#  r%  r&  r(  r,  r.  r0  r1  r4  r5  r8  r:  r<  r?  rA  rB  rC  rF  rH  rI  rK  rM  rN  rQ  rR  rS  rU  rV  rW  rY  rZ  r[  r\  r^  r_  rg  rh  rq  rr  rs  rt  rw  rx  ry  r{  r|  r}  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  ru   r   r   rM   r   r    s    4
					

		

	
		
			





		



r  __main__)r  )5sysZnumpyrh   r  r  rF  r   r  
contextlibr   r  r   rY   r   r   Znumba.core.utilsr   Z
numba.corer   Znumba.core.compilerr	   r
   Znumba.core.cpur   Znumba.tests.supportr   r   r   Znumba.core.errorsr   r   r   r  r   r   r)   r0   r3   r6   r:   r<   r=   r?   rB   ZskipIfZTestCaserE   rv   r   r  r  rr   mainr   r   r   r   <module>   s   









7   y      h
'          
