o
    8ήc                    @   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se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 dS )6    N)contextmanager)deepcopy)njitstencil)	PYVERSION)typesregistry)compile_extraFlags)ParallelOptions)tagskip_parfors_unsupported_32bit)LoweringErrorTypingErrorNumbaValueErrorc                 C   $   d| d | d  | d  | d   S N      ?r      r   r   r   r   r    ar   r   @/tmp/pip-target-vg8gfxp4/lib/python/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   r1   c                 C   sD   d| d | d  | d  | d  |d  |d  |d  |d   S r   r   r   br   r   r   stencil_multiple_input_kernel0       r4   c                 C   sD   || d | d  | d  | d  |d  |d  |d  |d   S Nr   r   r   r   r   )r   r3   wr   r   r   !stencil_multiple_input_kernel_var6   r5   r8   c                 C   s   |d r| d S |d S Nr   r   r   )r   r3   fr   r   r   %stencil_multiple_input_mixed_types_2d<   s   r<   )r3   )standard_indexingc                 C   s    | d |d  | d |d   S )Nr   r   r   r   r2   r   r   r   !stencil_with_standard_indexing_1dA   s    r>   c                 C   s@   | d |d  | d |d   | d |d   | d |d   S r6   r   r2   r   r   r   !stencil_with_standard_indexing_2dF   s
   r?   c                 C      | d S Nr   r   r   r   r   r   addone_njitL      rB   Tparallelc                 C   r@   rA   r   r   r   r   r   addone_pjitR   rC   rF   )      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superrI   __init__)selfargs	__class__r   r   rN   \   s   zTestStencilBase.__init__c                 C   s   t tjjtjj||d |i S N)r	   r   
cpu_targettyping_contexttarget_context)rO   funcsigflagsr   r   r   _compile_thisc   s   
zTestStencilBase._compile_thisc                 K   s0   t  }d|_|s
dn|}t||_| |||S rJ   )r
   rL   r   auto_parallelrZ   )rO   rW   rX   kwsrY   optionsr   r   r   compile_parallelh   s
   
z TestStencilBase.compile_parallelc                 C   s   | j ||| jdS )N)rY   )rZ   rK   )rO   rW   rX   r   r   r   compile_njito      zTestStencilBase.compile_njitc                 O   s2   t dd |D }| ||}| ||}||fS )Nc                 S      g | ]}t |qS r   numbatypeof.0xr   r   r   
<listcomp>s       z/TestStencilBase.compile_all.<locals>.<listcomp>)tupler^   r_   )rO   pyfuncrP   kwargsrX   cpfunccfuncr   r   r   compile_allr   s   zTestStencilBase.compile_allc           
      G   s   | j |g|R  \}}|| }|| }|j| }|j| }	tjj||dd tjj||dd tjj|	|dd | d|j  d S )NrG   decimal@do_scheduling)ro   entry_pointnptestingassert_almost_equalassertInlibraryget_llvm_str)
rO   no_stencil_funcrk   rP   rn   rm   expected	py_outputnjit_outputparfor_outputr   r   r   checkz   s   

zTestStencilBase.check)__name__
__module____qualname___numba_parallel_test_rN   rZ   r^   r_   ro   r   __classcell__r   r   rQ   r   rI   W   s    rI   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                       t t| j|i | d S rS   )rM   r   rN   rO   rP   rl   rQ   r   r   rN         zTestStencil.__init__c                 C   <   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 )Nr0   out)rt   arangereshapezerosr   nABr   r   r   test_with_out   s   z0TestStencil.test_stencil1.<locals>.test_with_outc                 S   $   t | d | | f}t|}|S Nr0   )rt   r   r   r   r   r   r   r   test_without_out      z3TestStencil.test_stencil1.<locals>.test_without_outc                 S      t | d | | f}t | d | | f}td| d D ]2}td| d D ](}d|||d f ||d |f  |||d f  ||d |f   |||f< q(q|S Nr0   r   r   rt   r   r   r   r'   r   r   r   r)   jr   r   r   test_impl_seq   s   z0TestStencil.test_stencil1.<locals>.test_impl_seqd   Nr   )rO   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 rS   )rt   r   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   rt   r   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   r7   r(   r)   r   r   r   r*      s   
DTestStencil.test_stencil2.<locals>.test_seq.<locals>.stencil2_kernelr"   rt   r   rc   r   )r   r7   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   r7   r   r   r)   r   r   r   r      s
   

&r   rG   rp   rr   c                 S   8   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#   index_offsetsr   r   r7   offsetr   r*   r   r   r   r   r      s   
r   c                 S   r   )Nc                 S   s    dt | | d |d   S )Nr%   r   r0   )rt   r   )r   r7   r   r   r   r*          r   r   r   r   r   r   r   r      s   
N)r   r^   r   intprs   rt   ru   rv   rw   rx   ry   )	rO   r   r   r   r7   rm   r{   r~   r   r   r   r   test_stencil2   s:   
	zTestStencil.test_stencil2c                 C   s   dd }t |}t |dd}d}||}||}||}| |d dko)|d dk | |d dko8|d dk | |d dkoG|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   r   r   )rt   r   r   r1   r   r   r   r   r   
  r   z+TestStencil.test_stencil3.<locals>.test_seqTrD   r   r:   r+   )   r   N)r   
assertTrue)rO   r   	test_njittest_parr   seq_resnjit_respar_resr   r   r   test_stencil3  s   "zTestStencil.test_stencil3c                 C   &   dd }dd }d}|  ||| dS )z1Tests standard indexing with a 1d array.
        c                 S   s    t | }ddg}t||}|S )N      @      @)rt   r   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   rt   r   r   r'   )r   r   r   r   r)   r   r   r   r   %  s   

*zDTestStencil.test_stencil_standard_indexing_1d.<locals>.test_impl_seqr   Nr   rO   r   r   r   r   r   r   !test_stencil_standard_indexing_1d  s   	z-TestStencil.test_stencil_standard_indexing_1dc                 C   r   )zLTests standard indexing with a 2d array and multiple stencil calls.
        c                 S   s:   t | d | | f}t d}t||}t||}|S )Nr0   rG   rG   )rt   r   r   onesr?   )r   r   r   r   Dr   r   r   r   5  s
   


z?TestStencil.test_stencil_standard_indexing_2d.<locals>.test_seqc                 S   sv  t | d | | f}t d}t | d | | f}t | d | | f}td| d D ]@}td| d D ]6}|||d f |d  ||d |f |d   |||d f |d   ||d |f |d   |||f< q9q0td| d D ]@}td| d D ]6}|||d f |d  ||d |f |d   |||d f |d   ||d |f |d   |||f< qqx|S )Nr0   r   r   r   r   r   r   )rt   r   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   )rt   r   r   r4   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 ]R}td| d D ]H}d|||d f ||d |f  |||d f  ||d |f  |||d f  ||d |f  |||d f  ||d |f   |||f< q4q+|S r   r   )r   r   r   r   r)   r   r   r   r   r   Y  s,   z?TestStencil.test_stencil_multiple_inputs.<locals>.test_impl_seqrG   c                 S   sD   t | d | | f}t | d | | f}d}t|||}|S )Nr0   r   )rt   r   r   r8   )r   r   r   r7   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 ]}|||f rH|||f n|||f |||f< q:q3|S )Nr0   dtyper   )rt   r   r   eyebool_r   r   r'   )r   r   r   SOr)   r   r   r   r   r   t  s    .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 )Nr0   r   )rt   r   r   r   r   r<   )r   r   r   r   r   r   r   r   r   ~  s
    z6TestStencil.test_stencil_mixed_types.<locals>.test_seqrG   r   )rO   r   r   r   r   r   r   test_stencil_mixed_typesr  s   
z$TestStencil.test_stencil_mixed_typesc                 C   r   )	z&Tests 2D numba.stencil calls.
        c                 S   sJ   t | d | | f}t | d | | f}tdd ||d |S )Nr0   c                 S   r   r   r   r   r   r   r   <lambda>  s    zCTestStencil.test_stencil_call.<locals>.test_impl1.<locals>.<lambda>r   rt   r   r   r   rc   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 )Nr0   c                 S   r   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   r   r   r   r   r   r   r   r     s    z4TestStencil.test_stencil_call.<locals>.test_impl_seqr   Nr   )rO   r   r   r   r   r   r   r   test_stencil_call  s   		zTestStencil.test_stencil_callc                 C   r   )z&Tests 1D numba.stencil calls.
        c                 S   s.   t | }t | }tdd ||d |S )Nc                 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>r   rt   r   r   rc   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   rO   r   r   r   r   r   r   test_stencil_call_1D  s   z TestStencil.test_stencil_call_1Dc                 C   sx  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 d   n1 sw   Y  | 	dt
|j | ttf}t|d W d   n1 sw   Y  | 	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   4   t | }t | }d}tdd |||d |S )Nr   c                 S   s   d| |  | d  | |   S Nr%   r   r   r   cr   r   r   r         zITestStencil.test_stencil_call_const.<locals>.test_impl1.<locals>.<lambda>r   r   r   r   r   r   r   r   r   r        

z7TestStencil.test_stencil_call_const.<locals>.test_impl1c                 S   r   )Nr0   c                 S   s$   d| d|  | d  | |d    S Nr%   r   r   r   r   r   r   r   r     s   $ zITestStencil.test_stencil_call_const.<locals>.test_impl2.<locals>.<lambda>r   r   r   r   r   r   r     r   z7TestStencil.test_stencil_call_const.<locals>.test_impl2c                 S   r   )Nr0   c                 S   s&   d| | d  | d  | |d    S r   r   r   r   r   r   r        & zITestStencil.test_stencil_call_const.<locals>.test_impl3.<locals>.<lambda>r   r   r   r   r   r   
test_impl3  r   z7TestStencil.test_stencil_call_const.<locals>.test_impl3c                 S   s:   t | }t | }d}d}tdd ||||d |S )Nr   r0   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>r   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   rG   rp   r   NzDstencil kernel index is not constant, 'neighborhood' option required)r^   r   r   rs   rt   ru   rv   assertRaisesr   rw   str	exceptionr   r   )rO   r   r   r   r   r   r   cpfunc1cpfunc2cpfunc3cpfunc4r{   parfor_output1parfor_output2parfor_output3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   r   r   r   r   r   r   r   r     r   zJTestStencil.test_stencil_parallel_off.<locals>.test_impl.<locals>.<lambda>)rc   r   )r   r   r   r   r     r`   z8TestStencil.test_stencil_parallel_off.<locals>.test_implNFr   rr   )r^   rc   float64assertNotInrx   ry   )rO   r   rm   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.
        TrD   c                 S   s   t dd }|| }|S )Nc                 S   s   d}| | d  S )Nr0   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   )rt   r   r   intr'   )r   r   r)   r   r   r   r   %  s   z7TestStencil.test_stencil_nested1.<locals>.test_impl_seq
   N)r   rt   r   ru   assert_equalr   r   r   r   test_stencil_nested1  s
   

z TestStencil.test_stencil_nested1c                    s  ddg}dd }|D ]L}t j||d  fdd}tdd	}t|d
}||dddf< t|} ||d tj|| | 	|}|D ]}	|	
 }
tj|
| qHq
t j|dd  fdd}tdd	}t|}| t} ||d W d   n1 sw   Y  d}| |t|j | j| jfD ](}z
||d W td ttfy } z| |t| W Y d}~qd}~ww dS )z/ Issue #3518, out kwarg did not work with cval.rH   r   c                 S      | d | d  S Nr:   r   r   r   r   r   r   kernel4     z1TestStencil.test_out_kwarg_w_cval.<locals>.kernelr,   c                     *   t dd} t | } | |d |S N   rG   r   r   rt   r   r   	ones_liker   ret
stencil_fnr   r   wrapped:     
z2TestStencil.test_out_kwarg_w_cval.<locals>.wrappedr  r  r$   r   Nr                 ?c                     r  r  r  r  r
  r   r   r  Q  r  z-cval type does not match stencil return type.r   zExpected error was not raised)rc   r   rt   r   r   	full_liker  ru   rv   ro   rs   r   r   rw   r   r   r_   r^   r   AssertionError)rO   
const_valsr   	const_valr  r   r{   r	  implsimplgotr   msgcompilerr   r
  r   test_out_kwarg_w_cval.  sD   


z!TestStencil.test_out_kwarg_w_cvalc           
         s   t jt jt j tdtd fD ]P}dd }tj||d  fdd}t dd}t |d	}||d
ddf< t 	|} ||d t j
|| | |}|D ]}| }	t j
|	| qRqdS )U Test issue #7286 where the cval is a np attr/string-based numerical
        constantinfc                 S   r   r   r   r   r   r   r   r   k  r  z9TestStencil.test_out_kwarg_w_cval_np_attr.<locals>.kernelr,   c                     r  )N      (@r  r   r  r  r
  r   r   r  p  r  z:TestStencil.test_out_kwarg_w_cval_np_attr.<locals>.wrappedr  r  r$   r   Nr   )rt   nanr  floatrc   r   r   r   r  r  ru   rv   ro   rs   )
rO   r-   r   r  r   r{   r	  r  r  r  r   r
  r   test_out_kwarg_w_cval_np_attrf  s    $

z)TestStencil.test_out_kwarg_w_cval_np_attr)r   r   r   rN   skip_unsupportedr   r   r   r   r   r   r   r   r   r   r   r   r  r  r   r   r   rQ   r   r      s<    

T



"

 

O



7r   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   _Builder__staterO   r   r   r   rN        
z#pyStencilGenerator.Builder.__init__c                 C   s*   g | ]}t d D ]
}tt|| qqS )   )r'   chrord)rf   vrg   r   r   r   rh     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"  )rO   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ctxrt   fullvalueattrr.  shaper   typeargr1  NrW   rP   keywordsstarargsrl   targetsr1  )astAssignNameStoreCall	AttributeLoadgen_numkeywordgen_callr-  r1  )rO   origvar	dtype_var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>  rB  re   r   r   r   rh     r   z9pyStencilGenerator.Builder.gen_assign.<locals>.<listcomp>r,  eltsr.  r1  r1  slicer.  r:  )r<  r=  	Subscriptr>  rB  IndexTupler?  )rO   rG  r1  index_names	elts_inforJ  r   r   r   
gen_assign  s&   
z%pyStencilGenerator.Builder.gen_assignNc              	   C   sz   t |trtj|d}n|}t |trt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'   Nr7  )targetiterbodyorelse)	
isinstancer   r<  NumForr>  r?  r@  rB  )rO   rG  startstopr[  	start_val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,  rO  )r<  Returnr>  rB  )rO   rG  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 valuerX  rO  )r<  rS  r^  rO   r1  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,  r0  )r<  rA  r>  rB  )rO   namer2  r   r   r   gen_attr  s   z#pyStencilGenerator.Builder.gen_attrc           	      C   sf   |  ||}| |}tj||t d}|r1|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]
            rP  r   rX  )leftopright)
rj  rh  r<  rR  rB  AddSubBinOpr^  abs)	rO   ri  r2  indexr   	attributeslisesspmr   r   r   gen_subscript  s   
z(pyStencilGenerator.Builder.gen_subscriptc                 C   sF   t |trtt|S t|dkrt|S tt t| S )z?
            Generates an ast.Num of value `value`
            r   )r]  boolr<  r^  r   rq  UnaryOpUSubrg  r   r   r   rC    s
   

z"pyStencilGenerator.Builder.gen_numc                 C   s^   dd |D }|du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,  rL  re   r   r   r   rh     s   " z7pyStencilGenerator.Builder.gen_call.<locals>.<listcomp>Nc                 S   s0   g | ]}t jd | t t|jd jdqS )r{  r   r5  )r<  rD  parser   r[  r1  re   r   r   r   rh     s    
r,  r7  r1  r.  )r<  r>  rB  Exprr@  )rO   	call_namerP   rl   
fixed_argsr8  rW   r   r   r   rE    s   z#pyStencilGenerator.Builder.gen_call)r   )r   r   NrS   )r   r   r   __doc__rN   idsr+  rK  rW  rd  rf  rh  rj  rw  rC  rE  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   sv   |  |}| j|jj}t|dd }t|dd }|r|r|s!|S t|tjr9t|tjr9t||j	j
|jj
S |S )Nrk  rm  )generic_visitsupported_opsgetrl  rR   getattrr]  r<  r^  rk  r   rm  )rO   noderl  lhsrhsr   r   r   visit_BinOp5  s   

z(pyStencilGenerator.FoldConst.visit_BinOpN)r   r   r   r  r<  rn  operatoraddro  subMultmulr  r  r   r   r   r   	FoldConst(  s    r  c                   @   X   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| g|R i | tjj| g|R i | || _|| _d| _d | _d | _	t
tj| _t
tj| _|r;|ng | _|| _|rHd| _d S d| _d S )Nr   z__%sn__%s)r<  NodeTransformerrN   r   r  	_argnames_const_assigns_idx_len_mins_maxesrt   iinfor   min_iminmax_imax_standard_indexing_neighborhood_id_pat)rO   argnamesconst_assignsr=   r#   rP   rl   r   r   r   rN   K  s   z'pyStencilGenerator.FixRelIndex.__init__c                 C   s0   t |tjr	|jS t |tjr|jj S td)zF
            Gets the literal value from a Num or UnaryOp
            z,get_val_from_num: Unknown indexing operation)r]  r<  r^  r   ry  operand
ValueError)rO   r  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v rk|jjjvrkt|jtjrE||S t|jtj	rP||S t|jjtj
r\||S t|jtjrg||S t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 ](\}} j||}|tjtj	 j
 j|  t dt |t d q	 jdkr=t| _n jt|krHtdt| jtjrUd}t|t }tj| jtjtj|t dt d|d}t||  t|  jd u r jd u r jg j  _ jg j  _ jst | jjjD ]D\}}t|tjst|tjr  |}	nt!|d	r|j" jv rǈ j|j" }	ntd
|	 j| k r|	 j|< |	 j| kr|	 j|< q|S t  jD ]\}} j| d  j|<  j| d  j|< q|S )Nr,  rk  rl  rm  r.  r   #Relative indexing mismatch detected=Assignments to array passed to stencil kernels is not allowedrM  r}  rP  r-  Cannot interpret indexing valuer   r   )#	enumeraterQ  r1  rN  r  r  appendr<  rp  r>  r  r  rB  rn  r  r   r  r]  r.  r?  rR  rS  rT  copy_locationfix_missing_locationsr  r  r  r  r  r^  ry  r  hasattrr-  )
r  idxrg   valusevalr  contextnewnodelnoderelvaluer$  r   r   handle2dindexo  s~   






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r7tdt| jtjrDd}t|t	 }tj| jtj|t	 d|d	}t||  t|  jd u rw jd u rw jg _ jg _ jst| jjtjst| jjtjr | jj}nt| jjd
r| jjj j v 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}  rP  r-  r  )r  r  rQ  r1  r<  rp  r>  r  r  rB  rn  r  r  r]  r.  r?  rR  rS  r  r  r  r  r  r  r  r^  ry  r  r  r-  )r  r  r  r  r  r  r  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  )r  r  r  r<  rp  r>  r  r  rB  rn  r  r  )r  rg   r  r1  r*  )r  rO   r   r   gen_idx  s   

zUpyStencilGenerator.FixRelIndex.visit_Subscript.<locals>.computeSlice.<locals>.gen_idx)r<  Slicelowerupperstepr  r  )r)   r  r  r  r$  )r  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}  )r  r  r1  r<  rp  r>  r  r  rB  rn  rS  r  r  )r)   r  r  r  r  r$  r   r   computeIndex  s   
zDpyStencilGenerator.FixRelIndex.visit_Subscript.<locals>.computeIndexc                    s  g }t | jjD ] \}}t|tjr||| t|tjr(| || qjdkr6t	| jj_njt	| jjkrCt
dt| jtjrPd}t
|t }tj| jtj|t d|d}jd u r~jd u r~jgj _jgj _js%t | jjD ]\}}t|tjr|j|jfD ]B}	t|	tjst|	tjr|	}
nt|	dr|	jjv rj|	j }
nt
d|
j| k r|
j|< |
j| kr|
j|< qq|j}t|tjst|tjr|}
nt|dr|jjv rj|j }
nt
d|
j| k r|
j|< |
j| kr#|
j|< qnt jD ]\}}	j| d j|< j| d	 j|< q*t||  t| |S )
Nr   r  r  )dimsr.  rP  r-  r  r   r   ) r  rQ  r  r]  r<  r  r  rS  r  r   r  r.  r?  rB  rR  r1  ExtSlicer  r  r  r  r  r  r  r^  ry  r  r  r-  r  r  r  )r  r  r)   r  r  r  r  rg   anoder  r  r  r  rO   r   r   handleExtSlice  s   
	








 
zFpyStencilGenerator.FixRelIndex.visit_Subscript.<locals>.handleExtSlicec                    sz   d| j }t |_t| jtjrd}t|t }tj| j||d}t	||  t
| jdkr9d_n	jdkrBtdjd u rVjd u rVjg_jg_jst| j jtjsit| j jtjrq| j j}nt| j jdr| j jjjv rj| j jj }ntd|jd k r|jd< |jd kr|jd< |S jd d jd< jd d jd< |S )	Nr   r  rP  r   r   r  r-  r  )rQ  r<  rB  r.  r]  r?  r  rR  r1  r  r  r  r  r  r  r  r  r^  ry  r  r  r-  r  )r  r  r  r  r  r  )r  rO   r   r   handleSliceQ  sP   







zCpyStencilGenerator.FixRelIndex.visit_Subscript.<locals>.handleSlicezUnhandled subscript)r  r1  r-  r  r  r]  rQ  r<  r  r  rT  rS  r  )rO   r  r  r  r  r  r   r  r   visit_Subscriptg  s(   >7K
0z.pyStencilGenerator.FixRelIndex.visit_Subscriptc                 C   s   | j dkr	td| j S )Nr   z+Transform has not been run/no indexes found)r  r  r$  r   r   r   idx_len  s
   
z&pyStencilGenerator.FixRelIndex.idx_lenc                 C      | j S rS   )r  r$  r   r   r   maxes     z$pyStencilGenerator.FixRelIndex.maxesc                 C   r  rS   )r  r$  r   r   r   mins  r  z#pyStencilGenerator.FixRelIndex.minsc                 C   r  rS   )r  r$  r   r   r   
id_pattern  r  z)pyStencilGenerator.FixRelIndex.id_patternN)r   r   r   r  rN   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   sX   t jj| g|R i | tjj| g|R i | || _|  | _d| j }|| _d S )Nz__b%s)	r<  r  rN   r   r  _relidx_infor+  _ret_var_idx_retvarname)rO   relidx_inforP   rl   retvarr   r   r   rN     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  )rf   lrO   var_patternr   r   rh     s    zDpyStencilGenerator.TransformReturns.visit_Return.<locals>.<listcomp>)r  r  r  r  rW  r  r1  r'   )rO   r  nloopsr   r  r   visit_Return  s   
z0pyStencilGenerator.TransformReturns.visit_Returnc                 C   r  rS   )r  r$  r   r   r   ret_var_name  r  z0pyStencilGenerator.TransformReturns.ret_var_nameN)r   r   r   r  rN   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 g|R i | tjj g|R i | |j _|j _|j	 _
| _| _|r0|ng  _|r7|nt  _ fdd jD  _t|drQ|  _n| _ jd  _d S )Nc                    s   g | ]	}| j vr|qS r   )r  re   r$  r   r   rh     s
    
z7pyStencilGenerator.FixFunc.__init__.<locals>.<listcomp>r   r   )r<  r  rN   r   r  original_kernel_original_kernelr  r  retty_rettyr  	_ret_infor  rj   r  _relidx_argsr  tolistr-   stencil_arr)	rO   kpropsr  ret_infor-   r=   r#   rP   rl   r   r$  r   rN     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 ]1}|| j
j|
 | j
j|
 \}}|}| | jd	|
|}| j|| j|
  |||	d
}|g}	|
d7 }
q<t|| | 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 urt|t|krtd| dd  D ]}t|dr0||jkr0tdq d S )Nr#   r   zInvalid neighborhood suppliedr   r3  z#Input stencil arrays do not commute)r  r3  r   r  r  )rP   rl   r#   
init_shaperg   r   r   r   check_stencil_arrays  s   



zJpyStencilGenerator.FixFunc.visit_FunctionDef.<locals>.check_stencil_arraysr   r  r#   )rl   c                 S   s,   | dkrdn|  }|dkr| nd}||fS r!  r   )r  maxsminlimmaxlimr   r   r   computebound  s   zBpyStencilGenerator.FixFunc.visit_FunctionDef.<locals>.computeboundr3  )r[  r   N)rP   defaultsvarargkwarg
kwonlyargskw_defaultsposonlyargsr  )ri  rP   r[  decorator_list)"r  inspect	getsourcer<  r|  stripr[  r  rE  r  r  r  r  r'   r  r  rw  r  rd  r  r  r  r;  r  r  rK  r-   rf  r6  	argumentsrP   FunctionDefri  r  )rO   r  r  checksrc
check_implchecker_callr  r  r  	loop_body
loop_countr  r  r  minboundmaxboundloops
_rettynamer  allocatereturner	add_kwargr  newargsrJ  r   r   r   visit_FunctionDef  s   







	z,pyStencilGenerator.FixFunc.visit_FunctionDefN)r   r   r   r  rN   r  r   r   r   r   FixFunc  s    r  c                   @   r  )z!pyStencilGenerator.GetKernelPropszV Gets the argument names and other properties
        of the original kernel.
        c                 O   sV   t jj| g|R i | tjj| g|R i | d | _d | _d | _d | _i | _	d S rS   )
r<  NodeVisitorrN   r   r  r  _kwargnamesr  r  r  r   r   r   r   rN   J  s   
z*pyStencilGenerator.GetKernelProps.__init__c                    s   | j d us
| jd urtdd  fdd|jjD | _ |jjr*d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?r6  c                    s   g | ]}t | qS r   )r  re   r2  r   r   rh   X  ri   zGpyStencilGenerator.GetKernelProps.visit_FunctionDef.<locals>.<listcomp>c                 S   s   g | ]}|j qS r   )r6  re   r   r   r   rh   Z  s    
__retdtyper,  r:  )r  r  RuntimeErrorrP   r  rE  ri  r<  r=  r>  r?  r1  r  r  r   r  r  )rO   r  compute_retdtyper   r  r   r  S  s   z3pyStencilGenerator.GetKernelProps.visit_FunctionDefc                 C   s   |  | |j}t|dkrL|d }t|tjrNt|jtjr)|jj| j	|j
< d S t|jtjrPt|jtjrA|jj| j	|j
< d S |jj | j	|j
< d S d S d S d S Nr   r   )r  r;  r   r]  r<  r>  r1  r^  r   r  r-  ry  UAdd)rO   r  tgtrY  r   r   r   visit_Assignb  s   
z.pyStencilGenerator.GetKernelProps.visit_Assignc                 C   r  )zD
            The names of the arguments to the function
            )r  r$  r   r   r   r  p     z*pyStencilGenerator.GetKernelProps.argnamesc                 C   r  )z{
            A map of variable name to constant for variables that are simple
            constant assignments
            )r  r$  r   r   r   r  w  s   z/pyStencilGenerator.GetKernelProps.const_assignsc                 C   r  )z)
            The return type
            )r  r$  r   r   r   r    r  z'pyStencilGenerator.GetKernelProps.rettyc                 C   r  )z7
            The original unmutated kernel
            )r  r$  r   r   r   r    r  z1pyStencilGenerator.GetKernelProps.original_kernelN)r   r   r   r  rN   r  r  r  r  r  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 )Nr7  )r  r<  r@  rW   rP   r8  )rO   r  rJ  r   r   r   
visit_Call  s   
z&pyStencilGenerator.FixCalls.visit_CallN)r   r   r   r  r  r   r   r   r   FixCalls  s    r  c           
         s   t |}t| }d}|rtd tt|  fdd}|| |rPtd ttj|dd zdd	l}	t|	| W |S  t	yO   Y |S w |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
        FORIGINALc                    s     }||  |j}|j}r D ]}||vrd}t|q }||  ||}||  |}||  ||| }	|	|  	 }
|
|  t
| jd  dS )z the pipeline of manipulations z4Non-existent variable specified in standard_indexingr   N)r  visitr  r  r  r  r  r  r  r  r<  r  r[  )treekernel_propsargnm
const_asgnrg   r  
fold_constrelidx_fixerreturn_transformerfixer	callFixerr-   r#   rO   r=   r   r   pipeline  s<   






z:pyStencilGenerator.generate_stencil_tree.<locals>.pipelinez


NEWT)include_attributesr   N)
r  r  r<  r|  r  printdumpastor	to_sourceImportError)
rO   rW   r-   r=   r#   srcr  DEBUGr   r$  r   r  r   generate_stencil_tree  s(   
-z(pyStencilGenerator.generate_stencil_treeN)r   r   r   r  r  r<  r  r  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J d| }d}|D ]}|dvr%td| q|dkr0t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)  compile	co_constspytypesFunctionTypeglobals)func_or_moder]   r-  rW   optionr-   r=   r#   genr  mod_code	func_code	full_funcr   r   r   	pyStencil  s.   


r9  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                    r   rS   )rM   r:  rN   r   rQ   r   r   rN     r   zTestManyStencils.__init__c                    s  | dt }| d}d}g  g td. fdd	}t|tr2|d }|d }	|d	 }
|d
 }n|}|}	|}
|}d|i}|| d}ztd/d|i|}||d| di}|r`td| W n& ty } z||d |1 stw   Y  |}d}W Y d}~nd}~ww d}||	d td/i || }W d   n1 sw   Y  t	|dkrfdd}n"t	|dkrćfdd}nt	|dkrчfdd}nt
dt	| tdd |D }d}||
d	 | ||}|j| }W d   n1 sw   Y  d}||d | ||}|j| }W d   n	1 s"w   Y  |r9td| td| td| |rz|	sQtjj||dd | |j|j W n* ty| } zddt|t|f f td t|  W Y d}~nd}~ww z|
stjj||dd | |j|j W n* ty } zd	dt|t|f f td!t|  W Y d}~nd}~ww z0|stjj||dd | |j|j z| d"|j  W n ty   d#}t|w W n* ty } zddt|t|f f td$t|  W Y d}~nd}~ww |r td%  r0d&d  D }td'| rRd(d D }d)d*d D }d+| }d,| }t|| |s_|du ratd-|dS dS )0a  
        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.
        r]   expected_exceptionFNc              
   3   s    zd V  W nI t yO } z=| d ur.t| dr| n| g}d}|D ]	}|t||O }q |s- n|dt|t|f f W Y d }~d S W Y d }~d S d }~ww | d ur[ | d S d S )N__iter__F%s: %s)	Exceptionr  r]  r  r4  r   )extyusecaser   lextyfoundex)should_failshould_not_failr   r   errorhandler0  s.   
z,TestManyStencils.check.<locals>.errorhandlerr9  r   r   parforr3  Tr#   z
Expected:
z@stencilr   c                    s    | S rS   r   )arg0stencil_func_implr   r   wrap_stencili     z,TestManyStencils.check.<locals>.wrap_stencilr0   c                    s
    | |S rS   r   )rH  arg1rI  r   r   rK  l  r%  rG   c                    s    | ||S rS   r   )rH  rM  arg2rI  r   r   rK  o     z+Up to 3 arguments can be provided, found %sc                 S   ra   r   rb   re   r   r   r   rh   v  ri   z*TestManyStencils.check.<locals>.<listcomp>parforsz
@stencil_output:
z
njit_output:
z
parfor_output:
rp   r=  z@stencil failed: %sz@njit failed: %srr   z*Could not find `@do_scheduling` in LLVM IRz@njit(parallel=True) failed: %sz

c                 S      g | ]}d | qS )r{  r   re   r   r   r   rh     s    zMThe following implementations should have raised an exception but did not:
%sc                 S   s   g | ]}d |d  qS )r{  r   r   re   r   r   r   rh     s     c                 S   rQ  )z%s: Message: %s

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

%sz)pyStencil failed, was not caught/expected)NNr   )r  dictr   r]  updater9  r"  r>  r   r   r  rj   r_   rs   r^   rt   ru   rv   assertEqualr   r  r4  r   rw   rx   ry   r  r
  join)rO   rk   rP   rl   r]   r;  DEBUG_OUTPUTrF  pystencil_ex
stencil_exnjit_ex	parfor_exstencil_argsexpected_presentast_implr{   rC  pyStencil_unhandled_exstencilfunc_outputrK  rX   r}   wrapped_cfuncr~   wrapped_cpfuncr   r  r  errsstr1str2r   )rD  rE  rJ  r   r     s&  










zTestManyStencils.checkc                 K   sD   t  }d |d< d |d< d |d< d |d< | D ]\}}|||< q|S )Nr9  r   r   rG  )rS  items)rO   rl   r   kr)  r   r   r   exception_dict  s   
zTestManyStencils.exception_dictc                 C   *   dd }t ddd}| || dS )z	rel indexc                 S      | d S r9   r   r   r   r   r   r     rL  z-TestManyStencils.test_basic00.<locals>.kernelr  rG   r   Nrt   r   r   r   rO   r   r   r   r   r   test_basic00     zTestManyStencils.test_basic00c                 C   ri  )rel index add constc                 S   rj  Nr   r   r   r   r   r   r     rL  z-TestManyStencils.test_basic01.<locals>.kernelr  rG   r   Nrk  rl  r   r   r   test_basic01  rn  zTestManyStencils.test_basic01c                 C   *   t ddd}dd }| || dS )ro  r  rG   r   c                 S   rj  )Nr   r   r   r   r   r   r     rL  z-TestManyStencils.test_basic02.<locals>.kernelNrk  rO   r   r   r   r   r   test_basic02     zTestManyStencils.test_basic02c                 C   rr  )ro  r  rG   r   c                 S   rj  )Nr   r   r   r   r   r   r     rL  z-TestManyStencils.test_basic03.<locals>.kernelNrk  rs  r   r   r   test_basic03  ru  zTestManyStencils.test_basic03c                 C   rr  )ro  r  rG   r   c                 S   rj  )Nr   r   r   r   r   r   r     rL  z-TestManyStencils.test_basic04.<locals>.kernelNrk  rs  r   r   r   test_basic04  ru  zTestManyStencils.test_basic04c                 C   rr  )ro  r  rG   r   c                 S   rj  )Nr   r   r   r   r   r   r   r     rL  z-TestManyStencils.test_basic05.<locals>.kernelNrk  rs  r   r   r   test_basic05  ru  zTestManyStencils.test_basic05c                 C   rr  )ro  r  rG   r   c                 S   rj  )Nr   r   r   r   r   r   r   r     rL  z-TestManyStencils.test_basic06.<locals>.kernelNrk  rs  r   r   r   test_basic06  ru  zTestManyStencils.test_basic06c                 C   rr  )ro  r  rG   r   c                 S   rj  )Nr   r   r   r   r   r   r   r     rL  z-TestManyStencils.test_basic07.<locals>.kernelNrk  rs  r   r   r   test_basic07  ru  zTestManyStencils.test_basic07c                 C   rr  )ro  r  rG   r   c                 S   rj  )Nr   r   r   r   r   r   r   r     rL  z-TestManyStencils.test_basic08.<locals>.kernelNrk  rs  r   r   r   test_basic08  ru  zTestManyStencils.test_basic08c                 C   rr  )ro  r  rG   r   c                 S   rj  )Nr.   r   r   r   r   r   r     rL  z-TestManyStencils.test_basic09.<locals>.kernelNrk  rs  r   r   r   test_basic09  ru  zTestManyStencils.test_basic09c                 C   rr  )ro  r  rG   r   c                 S      | d | d  S r   r   r   r   r   r   r   #  r  z-TestManyStencils.test_basic10.<locals>.kernelNrk  rs  r   r   r   test_basic10  ru  zTestManyStencils.test_basic10c                 C   rr  )ro  r  rG   r   c                 S   r  )Nr   r   r   r   r   r   r   r   +  r  z-TestManyStencils.test_basic11.<locals>.kernelNrk  rs  r   r   r   test_basic11'  ru  zTestManyStencils.test_basic11c                 C   rr  )ro  r  rG   r   c                 S   r  )Nrx  rz  r   r   r   r   r   r   3  r  z-TestManyStencils.test_basic12.<locals>.kernelNrk  rs  r   r   r   test_basic12/  ru  zTestManyStencils.test_basic12c                 C   rr  )ro  r  rG   r   c                 S   r  )Nr~  r|  r   r   r   r   r   r   ;  r  z-TestManyStencils.test_basic13.<locals>.kernelNrk  rs  r   r   r   test_basic137  ru  zTestManyStencils.test_basic13c                 C   rr  )!rel index add domain change constr  rG   r   c                 S      | d d S )Nr:   r  r   r   r   r   r   r   C  rO  z-TestManyStencils.test_basic14.<locals>.kernelNrk  rs  r   r   r   test_basic14?  ru  zTestManyStencils.test_basic14c                 C   rr  )r  r  rG   r   c                 S   s   d}| d | S )Nr  r:   r   r   tr   r   r   r   K     z.TestManyStencils.test_basic14b.<locals>.kernelNrk  rs  r   r   r   test_basic14bG     zTestManyStencils.test_basic14bc                 C   rr  )ztwo rel index, add constr  rG   r   c                 S      | d | d  d S )Nr:   r   r+   r   r   r   r   r   r   T     z-TestManyStencils.test_basic15.<locals>.kernelNrk  rs  r   r   r   test_basic15P  ru  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  rG   r   c                 S   r  )Nr:   )r   r   r+   r   r   r   r   r   r   \  r  z-TestManyStencils.test_basic16.<locals>.kernel)r9  r;  N)rt   r   r   rh  
IndexErrorr   )rO   r   r   rC  r   r   r   test_basic16X  s   zTestManyStencils.test_basic16c                 C   rr  )&two rel index boundary test, add constr  rG   r   c                 S   r  )Nr:   )r0   r   r+   r   r   r   r   r   r   g  r  z-TestManyStencils.test_basic17.<locals>.kernelNrk  rs  r   r   r   test_basic17c  ru  zTestManyStencils.test_basic17c                 C   rr  )r  r  rG   r   c                 S   r  )Nr:   r/   r   r+   r   r   r   r   r   r   o  r  z-TestManyStencils.test_basic18.<locals>.kernelNrk  rs  r   r   r   test_basic18k  ru  zTestManyStencils.test_basic18c                 C   rr  )r  r  rG   r   c                 S   r  )Nr:   r   rG   r+   r   r   r   r   r   r   w  r  z-TestManyStencils.test_basic19.<locals>.kernelNrk  rs  r   r   r   test_basic19s  ru  zTestManyStencils.test_basic19c                 C   rr  )r  r  rG   r   c                 S   r  )Nr:   )r   r+   r   r   r   r   r   r     r  z-TestManyStencils.test_basic20.<locals>.kernelNrk  rs  r   r   r   test_basic20{  ru  zTestManyStencils.test_basic20c                 C   rr  )zsame rel, add constr  rG   r   c                 S   s   | d | d  d S )Nr:   r+   r   r   r   r   r   r     r  z-TestManyStencils.test_basic21.<locals>.kernelNrk  rs  r   r   r   test_basic21  ru  zTestManyStencils.test_basic21c                 C   rr  )z%rel idx const expr folding, add constr  rG   r   c                 S   r  )Nr   r:   r+   r   r   r   r   r   r     r  z-TestManyStencils.test_basic22.<locals>.kernelNrk  rs  r   r   r   test_basic22  ru  zTestManyStencils.test_basic22c                 C   rr  )zrel idx, work in bodyr  rG   r   c                 S   s&   t d| d  }| d | d  | S Nr   )r0   r   r   r:   rt   sinr   rg   r   r   r   r     s   z-TestManyStencils.test_basic23.<locals>.kernelNrk  rs  r   r   r   test_basic23  r  zTestManyStencils.test_basic23c                 C   rr  )z,rel idx, dead code should not impact rel idxr  rG   r   c                 S   s"   t d| d  }| d | d  S r  r  r  r   r   r   r     s   z.TestManyStencils.test_basic23a.<locals>.kernelNrk  rs  r   r   r   test_basic23a  r  zTestManyStencils.test_basic23ac                 C   2   t ddd}dd }| j||ttgd dS )z1d idx on 2d arrr  rG   r   c                 S   r  )Nr   r+   r   r   r   r   r   r     rO  z-TestManyStencils.test_basic24.<locals>.kernelr  Nrt   r   r   r   r  r   rs  r   r   r   test_basic24     zTestManyStencils.test_basic24c                 C   r  )zno idx on 2d arrr  rG   r   c                 S   s   dS )Nr+   r   r   r   r   r   r     s   z-TestManyStencils.test_basic25.<locals>.kernelr  Nrt   r   r   r   r  r   rs  r   r   r   test_basic25  r  zTestManyStencils.test_basic25c                 C   s,   t dddd}dd }| || dS )z3d arr@   r      r0   c                 S      | d | d  d S )N)r   r   r   )r   r   r   r+   r   r   r   r   r   r     r  z-TestManyStencils.test_basic26.<locals>.kernelNrk  rs  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  r0   c                 S   r  )N)r   r   r   r   )r   r   r   r   r+   r   r   r   r   r   r     r  z-TestManyStencils.test_basic27.<locals>.kernelNrk  rs  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  rG   r   c                 S      | d t d S )Nr:         $@)rt   r   r   r   r   r   r     r`   z-TestManyStencils.test_basic28.<locals>.kernelN)rt   r   r   astypefloat32r   rs  r   r   r   test_basic28  s   zTestManyStencils.test_basic28c                 C   4   t ddd}dd }| j||tttgd dS )zconst index from func r  rG   r   c                 S   s   | dt tdf S r!  )r   rt   cosr   r   r   r   r        z-TestManyStencils.test_basic29.<locals>.kernelr  Nrt   r   r   r   r  r   r   rs  r   r   r   test_basic29  
   zTestManyStencils.test_basic29c                 C   rr  )zsigned zerosr  rG   r   c                 S   rj  r9   r   r   r   r   r   r     rL  z-TestManyStencils.test_basic30.<locals>.kernelNrk  rs  r   r   r   test_basic30  ru  zTestManyStencils.test_basic30c                 C   rr  )zdoes a const propagate? 2Dr  rG   r   c                 S   s   d}| |df S r  r   r  r   r   r   r     r  z-TestManyStencils.test_basic31.<locals>.kernelNrk  rs  r   r   r   test_basic31  r  zTestManyStencils.test_basic31z constant folding not implementedc                 C   rr  )zdoes a const propagate?r  rG   r   c                 S   s   d}d| }| |df S r  r   )r   sr  r   r   r   r     s   z.TestManyStencils.test_basic31b.<locals>.kernelNrk  rs  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 rA   r   r  r   r   r   r     s   z.TestManyStencils.test_basic31c.<locals>.kernelNrt   r   r   rs  r   r   r   test_basic31c  s   
zTestManyStencils.test_basic31cc                 C   r  )ztyped int indexr  rG   r   c                 S   s   | t ddf S r  )rt   int8r   r   r   r   r     r`   z-TestManyStencils.test_basic32.<locals>.kernelr  Nr  rs  r   r   r   test_basic32  r  zTestManyStencils.test_basic32c                 C   rr  )zadd 0d arrayr  rG   r   c                 S   r  )Nr:   r   )rt   arrayr   r   r   r   r     r`   z-TestManyStencils.test_basic33.<locals>.kernelNrk  rs  r   r   r   test_basic33  ru  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  Nrk  rl  r   r   r   test_basic34     zTestManyStencils.test_basic34c                 C   2   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   rj  rp  r   r   r   r   r   r     rL  z-TestManyStencils.test_basic35.<locals>.kernelr  rG   r   r-   r   r]   Nrk  rl  r   r   r   test_basic35     zTestManyStencils.test_basic35c                 C   r  )
zmore complex with cvalc                 S       | d | d  | d  | d  S Nr   r   rz  r   r   r   r   r   r     r   z-TestManyStencils.test_basic36.<locals>.kernelr  rG   r   r-   g      @r  Nrk  rl  r   r   r   test_basic36  r  zTestManyStencils.test_basic36c                 C   r  )
zcval is exprc                 S   r  r  r   r   r   r   r   r   $  r   z-TestManyStencils.test_basic37.<locals>.kernelr  rG   r   r-   g      Q@r  Nrk  rl  r   r   r   test_basic37"  r  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   r  r  r   r   r   r   r   r   +  r   z-TestManyStencils.test_basic38.<locals>.kernelr  rG   r   )r   rG  r   r-   r  r]   r;  N)rt   r   r   rh  r   r  r   rO   r   r   rC  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   r  r  r   r   r   r   r   r   6  r   z-TestManyStencils.test_basic39.<locals>.kernelr  rG   r   r-   r   r0   r  N)rt   r   r   r   r  r  rl  r   r   r   test_basic394  s   (zTestManyStencils.test_basic39c                 C   >   dd }t ddd}t ddd}| ||| dS )z2 args!c                 S      | d |d  S Nr   )r   r/   r   r2   r   r   r   r   =  r  z-TestManyStencils.test_basic40.<locals>.kernelr  rG   r   Nrk  rO   r   r   r3   r   r   r   test_basic40;     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   r  r  r   r2   r   r   r   r   E  r  z-TestManyStencils.test_basic41.<locals>.kernelr  rG   r   r+   r   r  Nrt   r   r   r   r  r  r  r   r   r   test_basic41C     
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   r  r  r   r2   r   r   r   r   O  r  z-TestManyStencils.test_basic42.<locals>.kernelr  rG   r         "@r  Nr  r  r   r   r   test_basic42M  r  zTestManyStencils.test_basic42c                 C   r  )z2 args more complexityc                 S   s    | d | d  |d  |d  S )Nr   r   r0   r  r   r   r2   r   r   r   r   Y  r   z-TestManyStencils.test_basic43.<locals>.kernelg      >@r      Nrk  r  r   r   r   test_basic43W  r  zTestManyStencils.test_basic43c                 C   F   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   r2   r   r   r   r   a  s   z-TestManyStencils.test_basic44.<locals>.kernelr  rG   r   r  Nrt   r   r   r   r  r   r  r   r   r   test_basic44_     
zTestManyStencils.test_basic44c                 C   r  )z02 args, has assignment and then cross dependencyc                 S   s   d| d< | d | d  S )Nr  r   r   r   r2   r   r   r   r   l     z-TestManyStencils.test_basic45.<locals>.kernelr  rG   r   r  Nr  r  r   r   r   test_basic45j  r  zTestManyStencils.test_basic45c                 C   r  )z#2 args, has cross relidx assignmentc                 S   s   |d | d< | d | d  S )Nr  r   r   r   r2   r   r   r   r   w     z-TestManyStencils.test_basic46.<locals>.kernelr  rG   r   r  Nr  r  r   r   r   test_basic46u  r  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      | d |d  |d  S )Nr   r   r   r   r   r3   r   r   r   r   r        z-TestManyStencils.test_basic47.<locals>.kernelr  rG   r   Nrk  rO   r   r   r3   r   r   r   r   test_basic47  s
   zTestManyStencils.test_basic47c                 C   ri  )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  rG   r   Nrk  rl  r   r   r   test_basic48  s   zTestManyStencils.test_basic48c                 C   F   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   r  )Nr   r  r   r2   r   r   r   r     r  z-TestManyStencils.test_basic49.<locals>.kernelr  rG   r   r=   r3   r  Nrk  r  r   r   r   test_basic49  s   zTestManyStencils.test_basic49z&dynamic range checking not implementedc                 C   H   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   r  )Nr   )r      r   r2   r   r   r   r     r  z-TestManyStencils.test_basic50.<locals>.kernelr  rG   r   r=   r3   r  N)rt   r   r   r   r  r  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   r  Nr   )r   r0   r   r2   r   r   r   r     r  z-TestManyStencils.test_basic51.<locals>.kernelr  rG   r   r=   r   r3   r  Nr  r  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   r  r   r   r   r     r  z-TestManyStencils.test_basic52.<locals>.kernelr  rG   r   r  r0   r=   r3   r  Nrk  r  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   r  r  r   r2   r   r   r   r     r  z-TestManyStencils.test_basic53.<locals>.kernelr  rG   r   r9  r   rG  r   r=   r   r  N)rt   r   r   rh  r  r>  r   rO   r   r   r3   rC  r   r   r   test_basic53  s"   
zTestManyStencils.test_basic53c                 C   r  )
z)2 args, standard_indexing, index from varc                 S   s   d}| d |d|f  S )Nr0   r   r   r   )r   r3   r  r   r   r   r     s   z-TestManyStencils.test_basic54.<locals>.kernelr  rG   r   r=   r3   r  Nrk  r  r   r   r   test_basic54     zTestManyStencils.test_basic54c                 C   r  )
z62 args, standard_indexing, index from more complex varc                 S   s    d}d| }| d |d|f  S )Nr   r0   r   r   r   )r   r3   r  r  r   r   r   r     s   z-TestManyStencils.test_basic55.<locals>.kernelr  rG   r   r=   r3   r  Nrk  r  r   r   r   test_basic55  s   zTestManyStencils.test_basic55c                 C   r  )
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   r0   r   r   )r   r3   r  accrg  r  r   r   r   r     s   
z-TestManyStencils.test_basic56.<locals>.kernelr  rG   r   r=   r3   r  Nrk  r  r   r   r   test_basic56  s   zTestManyStencils.test_basic56c                 C   r  )
z12 args, standard_indexing, split index operation c                 S   s   |d }| d |d  S )Nr   r   r   r   r  r   r   r   r     r  z-TestManyStencils.test_basic57.<locals>.kernelr  rG   r   r=   r3   r  Nrk  r  r   r   r   test_basic57  r  zTestManyStencils.test_basic57c                 C   r  )
z?2 args, standard_indexing, split index with broadcast mutation c                 S   s   |d d }| d |d  S )Nr   r   r   r   r  r   r   r   r     r  z-TestManyStencils.test_basic58.<locals>.kernelr  rG   r   r=   r3   r  Nrk  r  r   r   r   test_basic58  r  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   r  r   r   r   r   	  r  z-TestManyStencils.test_basic59.<locals>.kernelr  rG   r   r   r=   r3   r   r  Nrk  r  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   r  )Nr   r|  r   r   r  r   r   r   r   	  r  z-TestManyStencils.test_basic60.<locals>.kernelr  rG   r   )r   )rG  r=   r3   r   r  N)rt   r   r   rh  r  r   )rO   r   r   r3   r   rC  r   r   r   test_basic60	  s   
zTestManyStencils.test_basic60c                 C   r  )
z"2 args, standard_indexing on firstc                 S   r  r  r   r2   r   r   r   r   	  r  z-TestManyStencils.test_basic61.<locals>.kernelr  rG   r   r=   r   r  N)rt   r   r   r   r>  r  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   r  r  r   r2   r   r   r   r   -	  r  z-TestManyStencils.test_basic62.<locals>.kernelr  rG   r   r3   r  )r=   r-   r  Nrk  r  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   r2   r   r   r   r   <	  r  z-TestManyStencils.test_basic63.<locals>.kernelr  rG   r   r  r  r=   r3   r  Nrt   r   r   rh  r  r   r   r  r   r   r   test_basic639	  s"   
zTestManyStencils.test_basic63c                 C   8   dd }t ddd}| j||ddittgd d	S )
z!1 arg that uses standard_indexingc                 S   rj  r9   r   r   r   r   r   r   P	  rL  z-TestManyStencils.test_basic64.<locals>.kernelr  rG   r   r=   r   r  Nr  rl  r   r   r   test_basic64N	  s   
zTestManyStencils.test_basic64c                 C   *   dd }t d}| j||ddid dS )zbasic induced neighborhood testc                 S   (   d}t ddD ]}|| | 7 }q|d S Nr   r      r&   r   cumulr)   r   r   r   r   ^	     z-TestManyStencils.test_basic65.<locals>.kernel      N@r#   )r  r   r  Nr  rl  r   r   r   test_basic65\	     
zTestManyStencils.test_basic65c                 C   r  )zbasic const neighborhood testc                 S   s(   d}t ddD ]}|| d 7 }q|d S r  r&   r  r   r   r   r   i	  r  z-TestManyStencils.test_basic66.<locals>.kernelr  r#   r  r  Nr  rl  r   r   r   test_basic66g	  r  zTestManyStencils.test_basic66c                 C   r  )
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   r  r)   r   r   r   r   r   s	     z-TestManyStencils.test_basic67.<locals>.kernel      i@r      r#   r    r  r   r  Nrk  rl  r   r   r   test_basic67q	     zTestManyStencils.test_basic67c                 C   r  )
z basic 2d induced 1D neighborhoodc                 S   s,   d}t ddD ]
}|| d|f 7 }q|d S )Nr   r  r   r  r&   )r   r  r   r   r   r   r   ~	  s   z.TestManyStencils.test_basic67b.<locals>.kernelr   r   r!  r#   )r#  r  N)rt   r   r   r   r   r  rl  r   r   r   test_basic67b|	  s   
zTestManyStencils.test_basic67bc                 C   r  )
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 r  r&   r  r   r   r   r   	  r  z-TestManyStencils.test_basic68.<locals>.kernelr   r   r!  r#   r"  r  Nrk  rl  r   r   r   test_basic68	  r%  zTestManyStencils.test_basic68c                 C   r  )
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   r  r:   r  r&   r  r   r   r   r   	  s   z-TestManyStencils.test_basic69.<locals>.kernelr   r   r!  r#   r"  r  Nrk  rl  r   r   r   test_basic69	  r%  zTestManyStencils.test_basic69c                 C   r  )
zneighborhood adding complexityc                 S   sL   d}d}t ddD ]}|| }t ddD ]}|| ||f | 7 }qq	|d S )Nr   r  r!   r   r  r  r&   r   r  zzr)   r  r   r   r   r   r   	     z-TestManyStencils.test_basic70.<locals>.kernelr   r   r!  r#   r"  r  Nrk  rl  r   r   r   test_basic70	     zTestManyStencils.test_basic70c                 C   r  )zneighborhood, type changec                 S   s<   d}t ddD ]}d}|dkrd}|| | | 7 }q|d S )Nr   r  r   g        ir  r  r&   )r   r  r)   rg  r   r   r   r   	  s   z-TestManyStencils.test_basic71.<locals>.kernelr  r#   r  r  Nr  rl  r   r   r   test_basic71	  s   
zTestManyStencils.test_basic71c                 C   r  )z+neighborhood, narrower range than specifiedc                 S   r  )Nr   ir  r  r&   r  r   r   r   r   	  r  z-TestManyStencils.test_basic72.<locals>.kernelr  r#   r  r  Nr  rl  r   r   r   test_basic72	  r  zTestManyStencils.test_basic72c                 C   r  )zneighborhood, +ve rangec                 S   r  )Nr   r      r  r&   r  r   r   r   r   	  r  z-TestManyStencils.test_basic73.<locals>.kernelr  r#   ))r   r   r  Nr  rl  r   r   r   test_basic73	  r  zTestManyStencils.test_basic73c                 C   r  )zneighborhood, -ve rangec                 S   r  )Nr   r  r$   r  r&   r  r   r   r   r   	  r  z.TestManyStencils.test_basic73b.<locals>.kernelr  r#   ))r  r!   r  Nr  rl  r   r   r   test_basic73b	  r  zTestManyStencils.test_basic73bc                 C   r  )z!neighborhood, -ve->+ve range spanc                 S   r  )Nr   r!   r0  r  r&   r  r   r   r   r   	  r  z-TestManyStencils.test_basic74.<locals>.kernelr  r#   ))r!   r   r  Nr  rl  r   r   r   test_basic74	  r  zTestManyStencils.test_basic74c                 C   r  )z!neighborhood, -ve->-ve range spanc                 S   r  )Nr   r  r   r  r&   r  r   r   r   r   	  r  z-TestManyStencils.test_basic75.<locals>.kernelr  r#   ))r  r/   r  Nr  rl  r   r   r   test_basic75	  r  zTestManyStencils.test_basic75c                 C   r  )
zneighborhood, mixed range spanc                 S   sL   d}d}t ddD ]}|| }t ddD ]}|| ||f | 7 }qq	|d S )Nr   r  r  r   r  r&   r)  r   r   r   r   	  r+  z-TestManyStencils.test_basic76.<locals>.kernelr   r   r!  r#   ))r  r   )r  rG   r  Nrk  rl  r   r   r   test_basic76	  r-  zTestManyStencils.test_basic76c                 C   r  )
z neighborhood, two args c                 S   H   d}t ddD ]}t ddD ]}|| ||f |||f  7 }qq|d S Nr   r  r   r  r&   r   r3   r  r)   r   r   r   r   r   
     z-TestManyStencils.test_basic77.<locals>.kernelr   r   r!  r#   r  r   r;  r  Nrk  r  r   r   r   test_basic77
     zTestManyStencils.test_basic77c                 C   r  )
z. neighborhood, two args, -ve range, -ve range c                 S   H   d}t ddD ]}t ddD ]}|| ||f |||f  7 }qq|d S )Nr   r/   r   r  r&   r8  r   r   r   r   
  r9  z-TestManyStencils.test_basic78.<locals>.kernel     r@r  r!  r#   )r?  r  )r@  r/   r  Nrk  r  r   r   r   test_basic78
  s   
zTestManyStencils.test_basic78c                 C   r  )
z. neighborhood, two args, -ve range, +ve range c                 S   r>  )Nr   r?  r/   r0   r   r  r&   r8  r   r   r   r   
  r9  z.TestManyStencils.test_basic78b.<locals>.kernelrA  r  r!  r#   )rB  )r0   	   r  Nrk  r  r   r   r   test_basic78b
  r=  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   r6  r7  r&   r8  r   r   r   r   *
  r9  z-TestManyStencils.test_basic79.<locals>.kernelr   r   r!  r0   r  r#   r:  r  N)rt   r   r   rh  r  r   r   r  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 r7  r&   r8  r   r   r   r   >
  s   z-TestManyStencils.test_basic80.<locals>.kernelr   r   r!  y              (@r#   r:  r  Nrk  r  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 r7  r&   r8  r   r   r   r   J
     z-TestManyStencils.test_basic81.<locals>.kernelr   r   r!  r   r  r#   r:  r  N)	rt   r   r   copyrh  r  r   r  r   r  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   D   d}t ddD ]}t ddD ]}|| ||f |d  7 }qq|d S Nr   r  r   r   rG   r  r&   r8  r   r   r   r   ^
  rH  z-TestManyStencils.test_basic82.<locals>.kernelr   r   r!  r:  r3   )r#   r=   r  Nrt   r   r   rI  r   r  r   r   r   test_basic82\
  s   
zTestManyStencils.test_basic82c                 C   @   dd }t ddd}| }| j|||dddd	d
 dS )z. neighborhood, with standard_indexing and cvalc                 S   rK  rL  r&   r8  r   r   r   r   m
  rH  z-TestManyStencils.test_basic83.<locals>.kernelr   r   r!  r:  r3         ?r#   r=   r-   r  NrN  r  r   r   r   test_basic83k
  s   
zTestManyStencils.test_basic83c                 C   ri  )z kernel calls njit c                 S      | d t | d  S Nr:   r   )rB   r   r   r   r   r   |
  r  z-TestManyStencils.test_basic84.<locals>.kernelr   r   r!  Nrk  rl  r   r   r   test_basic84z
  r  zTestManyStencils.test_basic84c                 C   ri  )z! kernel calls njit(parallel=True)c                 S   rT  rU  )rF   r   r   r   r   r   
  r  z-TestManyStencils.test_basic85.<locals>.kernelr   r   r!  Nrk  rl  r   r   r   test_basic85
  r  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   rj  r9   r   r   r   r   r   r   
  rL  z-TestManyStencils.test_basic86.<locals>.kernelr   r   r!  badr  Nr  rl  r   r   r   test_basic86
  s
   
zTestManyStencils.test_basic86c                 C   ri  )z reserved arg name in use c                 S   rj  r9   r   )__sentinel__r   r   r   r   
  rL  z-TestManyStencils.test_basic87.<locals>.kernelr   r   r!  Nrk  rl  r   r   r   test_basic87
  r  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 rp  r   )r   r   r   r   r   r   
  rO  z-TestManyStencils.test_basic88.<locals>.kernelr  rG   r   r  r+   r  Nr
  r  r   r   r   test_basic88
  s   
zTestManyStencils.test_basic88c                 C   ri  )z basic multiple returnc                 S   s(   | d dkrdS | d dk r| d S dS )Nr   r   r  r  r  r:   r   r   r   r   r   r   r   
  s
   z-TestManyStencils.test_basic89.<locals>.kernelr   r   r!  Nrk  rl  r   r   r   test_basic89
  s   zTestManyStencils.test_basic89c                 C   rP  )z@ neighborhood, with standard_indexing and cval, multiple returnsc                 S   sX   d}t ddD ]}t ddD ]}|| ||f |d  7 }qq|d }|dkr*|d S |S )Nr   r  r   rM  r  r   r+   r&   )r   r3   r  r)   r   resr   r   r   r   
  s   z-TestManyStencils.test_basic90.<locals>.kernelr   r   r!  r:  r3   rQ  rR  r  NrN  r  r   r   r   test_basic90
  s   

zTestManyStencils.test_basic90c                 C   ri  )z? Issue #3454, const(int) == const(int) evaluating incorrectly. c                 S   s   d}ddkrd}| d | S )Nr   r0   r:   r   r2   r   r   r   r   
  s   z-TestManyStencils.test_basic91.<locals>.kernelr   r   r!  Nrk  rl  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   H   | d | d A | d A | d A | d A | d A | d A | d A | d	 A S 
Nr~  r   rx  r   r:   r   rz  r   r|  r   r   r   r   r   r   
     z-TestManyStencils.test_basic92.<locals>.kernelr!  r0   r   r   Nrt   r  r   r   r  r   r   rO   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 )ra  c                 S   rb  rc  r   r   r   r   r   r   
  rd  z-TestManyStencils.test_basic93.<locals>.kernelr!  r0   r   r   r-   Tr  Nre  rf  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   r0   rt   medianr   r   r   r   r   
  r   z-TestManyStencils.test_basic94.<locals>.kernelr!  r   r   r   r#   rx  rx  r  Nrt   r   uint32r   r   rl  r   r   r   test_basic94
  s   zTestManyStencils.test_basic94znot yet supportedc                 C   0   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   r0   r  r   rj  r   r   r   r   r   
  r   z-TestManyStencils.test_basic95.<locals>.kernelr!  r   r   r   Nrm  rl  r   r   r   test_basic95
     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 ri  rj  r   r   r   r   r   
  r`   z-TestManyStencils.test_basic96.<locals>.kernelr!  r   r#   )rx  r  N)rt   r   rn  r   rl  r   r   r   test_basic96
  s   zTestManyStencils.test_basic96c                 C   rp  )z 2D slice and index. c                 S   s   t | dddf S )Nr   r0   rG   rj  r   r   r   r   r     r  z-TestManyStencils.test_basic97.<locals>.kernelr!  r   r   r   Nrm  rl  r   r   r   test_basic97  rr  zTestManyStencils.test_basic97c                 C   sX   t jt jt j tdtd fD ]}dd }t dd}| j||d|dd qd	S )
r  r  c                 S   rj  r9   r   r   r   r   r   r     rL  z-TestManyStencils.test_basic98.<locals>.kernelg      @)r0   rG   rl  )r#   r-   r  N)rt   r  r  r  r   r   r   )rO   r-   r   r   r   r   r   test_basic98
  s   $
zTestManyStencils.test_basic98)sr   r   r   rN   r   rh  rm  rq  rt  rv  rw  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  unittestskipr  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  r  r$  r&  r'  r(  r,  r.  r/  r1  r2  r3  r4  r5  r<  rC  rE  rF  rG  rJ  rO  rS  rV  rW  rY  r[  r\  r]  r_  r`  rg  rh  ro  rq  rs  rt  ru  r   r   r   rQ   r   r:    s     4
					

		

	
		
			





		



r:  __main__)r*  )5sysnumpyrt   r<  r  r  r   r0  
contextlibr   rI  r   rc   r   r   numba.core.utilsr   
numba.corer   numba.core.compilerr	   r
   numba.core.cpur   numba.tests.supportr   r   r   numba.core.errorsr   r   r   rv  r  r   r*   r1   r4   r8   r<   r>   r?   rB   rF   skipIfTestCaserI   r   r   r9  r:  r   mainr   r   r   r   <module>   s   









7   y      
h'          