o
    8ήcw=                     @   s   d dl Zd dl Z d dl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 G dd deZG dd	 d	eZG d
d deZedkrLe  dS dS )    N)njitjit)TypingErrorUnsupportedError)ir)TestCaseIRPreservingTestPipelinec                   @   sl   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd ZdS )TestClosurec                    sJ   d  fdd}t di ||}| |dd d | |dd d S )	N
   c                       |   S N xYr   ?/tmp/pip-target-vg8gfxp4/lib/python/numba/tests/test_closure.pyadd_Y      z3TestClosure.run_jit_closure_variable.<locals>.add_Yi4(i4)         r   r   assertEqual)selfjitargsr   c_add_Yr   r   r   run_jit_closure_variable   s   z$TestClosure.run_jit_closure_variablec                 C      | j dd d S NTforceobjr   r   r   r   r   test_jit_closure_variable      z%TestClosure.test_jit_closure_variablec                 C   r    NTnopythonr$   r%   r   r   r   test_jit_closure_variable_npm   r'   z)TestClosure.test_jit_closure_variable_npmc                    s   d  fdd}t d	i ||}| |dd d t d	i ||}| |dd d | |dd | |dd d S )
Nr
   c                    r   r   r   r   r   r   r   r   %   r   z0TestClosure.run_rejitting_closure.<locals>.add_Yr   r   r   r      r   r   )r   r   r   r   	c_add_Y_2r   r   r   run_rejitting_closure"   s   z!TestClosure.run_rejitting_closurec                 C   r    r!   r.   r%   r   r   r   test_rejitting_closure4   r'   z"TestClosure.test_rejitting_closurec                 C   r    r(   r/   r%   r   r   r   test_rejitting_closure_npm7   r'   z&TestClosure.test_rejitting_closure_npmc                    s<   d d fdd}t di ||}| |dd d S )	Nr
      c                    s   |    S r   r   r   r   Zr   r   add_Y_mult_Z>      zDTestClosure.run_jit_multiple_closure_variables.<locals>.add_Y_mult_Zr   r      r   r   )r   r   r5   c_add_Y_mult_Zr   r3   r   "run_jit_multiple_closure_variables:   s
   z.TestClosure.run_jit_multiple_closure_variablesc                 C   r    r!   r9   r%   r   r   r   #test_jit_multiple_closure_variablesD   r'   z/TestClosure.test_jit_multiple_closure_variablesc                 C   r    r(   r:   r%   r   r   r   'test_jit_multiple_closure_variables_npmG   r'   z3TestClosure.test_jit_multiple_closure_variables_npmc                    s   dd }t di ||     fdd}t di ||}|  | |  | |dd W d    d S 1 s>w   Y  d S )	Nc                 S   s   | d S )Nr
   r   ar   r   r   mult_10K   r   z3TestClosure.run_jit_inner_function.<locals>.mult_10
intp(intp)c                    s    | d S )N   r   r   	c_mult_10r   r   do_mathQ   r6   z3TestClosure.run_jit_inner_function.<locals>.do_mathr   2   )r@   )r   disable_compileassertRefCountr   )r   r   r?   rD   	c_do_mathr   rB   r   run_jit_inner_functionJ   s   "z"TestClosure.run_jit_inner_functionc                 C   r    r!   rI   r%   r   r   r   test_jit_inner_functionZ   r'   z#TestClosure.test_jit_inner_functionc                 C   r    r(   rJ   r%   r   r   r   test_jit_inner_function_npm]   r'   z'TestClosure.test_jit_inner_function_npmN)__name__
__module____qualname__r   r&   r+   r.   r0   r1   r9   r;   r<   rI   rK   rL   r   r   r   r   r	      s    
r	   c                   @   sH   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dS )TestInlinedClosurez
    Tests for (partial) closure support in njit. The support is partial
    because it only works for closures that can be successfully inlined
    at compile time.
    c                 C   (   dd }t |}| |d|d d S )Nc                 S   s   dd }|| ||  S )Nc                 S   s   | |  S r   r   r   r   r   r   innerl   r   zDTestInlinedClosure.test_inner_function.<locals>.outer.<locals>.innerr   r   rR   r   r   r   outerj   s   z5TestInlinedClosure.test_inner_function.<locals>.outerr
   r   r   r   rT   cfuncr   r   r   test_inner_functionh   s   z&TestInlinedClosure.test_inner_functionc                 C   rQ   )Nc                    s$   | d   fdd}|| ||  S )Nr   c                    s   | |    S r   r   r   yr   r   rR   y   r6   zQTestInlinedClosure.test_inner_function_with_closure.<locals>.outer.<locals>.innerr   rS   r   rY   r   rT   v   s   zBTestInlinedClosure.test_inner_function_with_closure.<locals>.outerr
   rU   rV   r   r   r    test_inner_function_with_closuret   s   z3TestInlinedClosure.test_inner_function_with_closurec                 C   rQ   )Nc                    s(   | d   fdd}||   ||  S )Nr   c                    s   |   S r   r   r   rY   r   r   rR      r   zSTestInlinedClosure.test_inner_function_with_closure_2.<locals>.outer.<locals>.innerr   rS   r   rY   r   rT      s   zDTestInlinedClosure.test_inner_function_with_closure_2.<locals>.outerr
   rU   rV   r   r   r   "test_inner_function_with_closure_2   s   	z5TestInlinedClosure.test_inner_function_with_closure_2c                 C   s>   d}i }t | | t|d }| |d|d d d S )Na  
            def outer(x):
                y = x + 1
                z = 0

                def inner(x):
                    nonlocal z
                    z += x * x
                    return z + y

                return inner(x) + inner(x) + z
        rT   r
   )execstripr   r   )r   codensrW   r   r   r   "test_inner_function_with_closure_3   s
   z5TestInlinedClosure.test_inner_function_with_closure_3c                 C   rQ   )Nc                    s    fdd}|   S )Nc                    s0    fdd}d}t  D ]}|||7 }q|S )Nc                    s     |  S r   r   zr   rZ   r   r   	innermost   r6   z^TestInlinedClosure.test_inner_function_nested.<locals>.outer.<locals>.inner.<locals>.innermostr   range)rZ   re   sir   rY   r   rR      s
   zKTestInlinedClosure.test_inner_function_nested.<locals>.outer.<locals>.innerr   rS   r   r   r   rT      s   
z<TestInlinedClosure.test_inner_function_nested.<locals>.outerr
   rU   rV   r   r   r   test_inner_function_nested   s   z-TestInlinedClosure.test_inner_function_nestedc                    s  t fddfdd}fdd}dd }d	d
 }dd }dd }d  fdd}d  fdd}dd }	dd }
dd }dd }d9dd}d9dd }d9d!d"}d#d$ }d%d& }d'd( }d)d* }d+d, }d-d. }d/d0 }|||||||	|
|||||||g}|D ]}t |}d1}| |||| q| t}td2d3|}|| W d4   n1 sw   Y  d5}| |t|j | t}td2d3|}|| W d4   n1 sw   Y  d5}| |t|j | t}td2d3|}|| W d4   n	1 sw   Y  d6}| |t|j | t	}td2d3|}|| W d4   n	1 s3w   Y  d7}| |t|j | t	}td2d3|}|| W d4   n	1 s_w   Y  d7}| |t|j | t	}td2d3|}|| W d4   n	1 sw   Y  d7}| |t|j | t	}td2d3|}|  W d4   n	1 sw   Y  d8}| |t|j d4S ):z3 Tests the large number of use cases defined below c                    s$   | dk r| S  | d  | d  S )Nr2   r   r   )nfib3r   r   rm      s   z4TestInlinedClosure.test_bulk_use_cases.<locals>.fib3c                    s    fdd}|| S )z, Test calling recursive function from inner c                        | S r   r   r   rl   r   r   rR      r   zETestInlinedClosure.test_bulk_use_cases.<locals>.outer1.<locals>.innerr   rS   rl   r   r   outer1   s   z6TestInlinedClosure.test_bulk_use_cases.<locals>.outer1c                       | d   fdd}|| S )z. Test calling recursive function from closure r   c                    s   |   S r   r   r   )rm   rc   r   r   rR      r6   zETestInlinedClosure.test_bulk_use_cases.<locals>.outer2.<locals>.innerr   rS   rl   rb   r   outer2      z6TestInlinedClosure.test_bulk_use_cases.<locals>.outer2c                    s    fdd  | S )z Test recursive inner c                    s   | dk rdS  | d  d S Nr2   r
   r   r   r   rR   r   r   rR      s   zETestInlinedClosure.test_bulk_use_cases.<locals>.outer3.<locals>.innerr   r   r   rt   r   outer3   s   z6TestInlinedClosure.test_bulk_use_cases.<locals>.outer3c                    s   | d  fdd  | S )z Test recursive closure r   c                    s    |  dk rdS  | d  d S rs   r   r   rR   rZ   r   r   rR      s   zETestInlinedClosure.test_bulk_use_cases.<locals>.outer4.<locals>.innerr   r   r   rv   r   outer4   s   z6TestInlinedClosure.test_bulk_use_cases.<locals>.outer4c                       | d   fdd}|| S )z Test nested closure r   c                    s$   |  d   fdd}||  S )Nr2   c                    r   r   r   r   rb   r   r   inner2   r   zVTestInlinedClosure.test_bulk_use_cases.<locals>.outer5.<locals>.inner1.<locals>.inner2r   r   ry   rY   rb   r   inner1   s   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer5.<locals>.inner1r   r   r{   r   rY   r   outer5   s   z6TestInlinedClosure.test_bulk_use_cases.<locals>.outer5c                    rx   )z. Test closure with list comprehension in body r   c                    s    |  d }dd t |D S )Nr2   c                 S      g | ]}|qS r   r   ).0tr   r   r   
<listcomp>       zZTestInlinedClosure.test_bulk_use_cases.<locals>.outer6.<locals>.inner1.<locals>.<listcomp>rf   r   rc   rY   r   r   r{      s   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer6.<locals>.inner1r   r|   r   rY   r   outer6      z6TestInlinedClosure.test_bulk_use_cases.<locals>.outer6	   c                    s   | d }| |   S )z) Test use of outer scope var, no closure r   r   r   _OUTER_SCOPE_VARr   r   outer7   s   z6TestInlinedClosure.test_bulk_use_cases.<locals>.outer7c                    rp   )z+ Test use of outer scope var, with closure r   c                       |    S r   r   r   )r   rc   r   r   rR     r6   zETestInlinedClosure.test_bulk_use_cases.<locals>.outer8.<locals>.innerr   rS   r   rb   r   outer8  rr   z6TestInlinedClosure.test_bulk_use_cases.<locals>.outer8c                    s    | d   fdd}|}|| S )z Test closure assignmentr   c                    r   r   r   r   rb   r   r   rR     r   zETestInlinedClosure.test_bulk_use_cases.<locals>.outer9.<locals>.innerr   )r   rR   fr   rb   r   outer9
  s   z6TestInlinedClosure.test_bulk_use_cases.<locals>.outer9c                    s(   | d fdd  fdd}|| S )z! Test two inner, one calls other r   c                    r   r   r   r   rb   r   r   rR     r   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer10.<locals>.innerc                    rn   r   r   r   rt   r   r   ry     r   zGTestInlinedClosure.test_bulk_use_cases.<locals>.outer10.<locals>.inner2r   rz   r   )rR   rc   r   outer10  s   z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer10c                    s   | d   fdd}|S )z return the closure r   c                    r   r   r   r   rb   r   r   rR   #  r   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer11.<locals>.innerr   rS   r   rb   r   outer11  s   z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer11c                    s   | d  d fdd	}|| S )z closure with kwargr      c                       |   | S r   r   r   kwrb   r   r   rR   +  r6   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer12.<locals>.innerNr   r   rS   r   rb   r   outer12'  rr   z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer12r   c                 S   s   | d | }|S )z outer with kwarg no closurer   r   )r   r   rc   r   r   r   outer13/  s   z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer13c                    s   | d  fdd}|| S )z! outer with kwarg used in closurer   c                    r   r   r   r   r   rc   r   r   rR   8  r6   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer14.<locals>.innerr   r   r   rR   r   r   r   outer144  rr   z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer14c                    s   | d   fdd}|| |S )z# outer with kwarg as arg to closurer   c                    r   r   r   r   rb   r   r   rR   @  r6   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer15.<locals>.innerr   r   r   rb   r   outer15<  s   
z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer15c                    s    | d   fdd}t || S )z( closure is generator, consumed locally r   c                 3       |   V  d S r   r   r   rb   r   r   rR   H     zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer16.<locals>.inner)listrS   r   rb   r   outer16D  s   z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer16c                    rx   )z  closure is generator, returned r   c                 3   r   r   r   r   rb   r   r   rR   Q  r   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer17.<locals>.innerr   rS   r   rb   r   outer17M  r   z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer17c                    s*   | d   fdd}|| D ]}|}q|S )z( closure is generator, consumed in loop r   c                 3   r   r   r   r   rb   r   r   rR   Z  r   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer18.<locals>.innerr   )r   rR   ri   r   r   rb   r   outer18V  s
   z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer18c                    s2   | d  | d  fdd}fdd}||| S )z# closure as arg to another closure r   r2   c                    r   r   r   r   )z1r   r   rR   g  r   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer19.<locals>.innerc                    s   | |  S r   r   )r   r   )z2r   r   ry   j  r6   zGTestInlinedClosure.test_bulk_use_cases.<locals>.outer19.<locals>.inner2r   )r   rR   ry   r   )r   r   r   outer19b  s
   
z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer19c                    rx   )z Test calling numpy in closure r   c                       | t   S r   )numpycosr   rb   r   r   rR   s     zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer20.<locals>.innerr   rS   r   rb   r   outer20o     z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer20c                    rx   )z) Test calling numpy import as in closure r   c                    r   r   )npr   r   rb   r   r   rR   {  r   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer21.<locals>.innerr   rS   r   rb   r   outer21w  r   z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer21c                  S   s   dd } d}| |  dS )z6Test to ensure that unsupported *args raises correctlyc                 S   s   d S r   r   )r>   br   r   r   bar  s   zDTestInlinedClosure.test_bulk_use_cases.<locals>.outer22.<locals>.barr   r2   Nr   )r   r   r   r   r   outer22  s   z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer22r
   Tr)   Nz.Unsupported use of op_LOAD_CLOSURE encounteredz%Cannot capture the non-constant valuez-The use of yield in a closure is unsupported.z,Calling a closure with *args is unsupported.r   )
r   r   assertRaisesNotImplementedErrorr   assertInstr	exceptionr   r   )r   ro   rq   ru   rw   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   refrW   varraisesmsgr   )r   rm   r   test_bulk_use_cases   s   			


		






z&TestInlinedClosure.test_bulk_use_casesc           	      C   s   t tddd }| |ddd |j|jd  jd }g }|j D ] }|jD ]}t	|t
jrCt	|jt
jrC|jjd	krC|| q)q$| t|d
 |D ]}|jj}d}| || qOd S )N)pipeline_classc                 S   s   dd }|| ||fS )Nc                 S   s   d}d}|| |  S )N   r
   r   )rc   r   rZ   r   r   r   r     s   zITestInlinedClosure.test_closure_renaming_scheme.<locals>.foo.<locals>.barr   )r>   r   r   r   r   r   foo  s   z<TestInlinedClosure.test_closure_renaming_scheme.<locals>.foor
      )   #   r   preserved_irr   r2   zclosure__locals__bar_v[0-9]+.x)r   r   r   	overloads
signaturesmetadatablocksvaluesbody
isinstancer   AssignvalueConstappendlentargetnameassertRegex)	r   r   func_irstoreblkstmtri   r   regexr   r   r   test_closure_renaming_scheme  s&   


z/TestInlinedClosure.test_closure_renaming_schemeN)rM   rN   rO   __doc__rX   r[   r\   ra   rj   r   r   r   r   r   r   rP   a   s      rP   c                   @   sJ   e Zd ZeeddgZdd Zdd Zdd Zd	d
 Zdd Z	dd Z
dS )TestObjmodeFallbackTr"   c                 C   sP   dd }t jd}t t jddd t}| jD ]	}|||| qd S )Nc                    sF   | j \}}t|D ]}| |  tt dd} fdd|D  q	d S )NT)reversec                    s"   g | ]}t t |k qS r   )setr   argwhereflattenr   r   coxvr   r   r     s   " zLTestObjmodeFallback.test_issue2955.<locals>.numbaFailure.<locals>.<listcomp>)shaperg   sortedr   )scorescoocrowscolsri   groupsr   r   r   numbaFailure  s   
z8TestObjmodeFallback.test_issue2955.<locals>.numbaFailure)r
   r
   r
   gʡE?)r   randomabsrandnastypeint
decorators)r   r   r   rZ   dr   r   r   test_issue2955  s   
z"TestObjmodeFallback.test_issue2955c                 C   sv   dd }| j D ]1}||tdddtddd}|tdddtddd}tj|| qd S )Nc                 S   s   t | tjurt| } t |tjurt|}| j\}}ttdd t|D | f} tt| | j|}|d }|dd  }||fS )Nc                 S   s   g | ]}d gqS r   r   r   _r   r   r   r     s    zCTestObjmodeFallback.test_issue3239.<locals>.fit.<locals>.<listcomp>r   r   )	typer   ndarrayarrayr   hstackrg   dotT)XrZ   mr   res	interceptcoefsr   r   r   fit  s   


z/TestObjmodeFallback.test_issue3239.<locals>.fitr
   r   )r   r   arangereshapetestingassert_equal)r   r   r   r   expr   r   r   test_issue3239  s   
z"TestObjmodeFallback.test_issue3239c                    s.   ddg  fdd}| j D ]}||  qd S )N)r   |   )4   r   c                     s$    fdddD  t dD ]} qd S )Nc                    s   g | ]} | qS r   r   )r   indexr   r   r   r         zATestObjmodeFallback.test_issue3289.<locals>.a.<locals>.<listcomp>)r   r   r   rf   r   r  r   r   r>     s   z-TestObjmodeFallback.test_issue3289.<locals>.a)r   )r   r>   r   r   r  r   test_issue3289  s
   
z"TestObjmodeFallback.test_issue3289c                 C   sP   dd }t ddgddggd}| jD ]}|||}t j||| qd S )Nc                 S   s6   t dd | d D }| d dk}t|rd}||fS )Nc                 S   s   g | ]}t |qS r   )r   )r   r   r   r   r   r     r  zCTestObjmodeFallback.test_issue3413.<locals>.foo.<locals>.<listcomp>rZ   r   r      )maxany)datar   maskrc   r   r   r   r     s
   z/TestObjmodeFallback.test_issue3413.<locals>.foor   r   r2      rd   )r   r   r   r   assert_allclose)r   r   r  r   r   r   r   r   test_issue3413  s   	
z"TestObjmodeFallback.test_issue3413c                 C   s2   dd }| j D ]}|| }tj||  qd S )Nc                  S   s   t d} t dd | D S )N)r   )r  rA   c                 S   r~   r   r   r   r   r   r   r   ,  r   zDTestObjmodeFallback.test_issue3659.<locals>.main.<locals>.<listcomp>)r   r   r=   r   r   r   main*  s   
z0TestObjmodeFallback.test_issue3659.<locals>.main)r   r   r   r  )r   r  r   r   r   r   r   test_issue3659(  s
   

z"TestObjmodeFallback.test_issue3659c                 C   s@   dd }t d}| jD ]}|||}t j||| qd S )Nc                 S   s0   t dd | jD  t dd | jD  | S )Nc                 S   s   g | ]}t |qS r   r   float_r   r   r   r   r   4      zFTestObjmodeFallback.test_issue3803.<locals>.center.<locals>.<listcomp>c                 S   s   g | ]}t d qS r   r  r   r   r   r   r   5  r  )r   r   r   )r   r   r   r   center3  s   z2TestObjmodeFallback.test_issue3803.<locals>.center)r
   )r   zerosr   r   r  )r   r  r   r   r   r   r   r   test_issue38031  s   

z"TestObjmodeFallback.test_issue3803N)rM   rN   rO   r   r   r   r  r	  r  r  r  r   r   r   r   r     s    
	r   __main__)r   r   unittestnumbar   r   numba.core.errorsr   r   
numba.corer   numba.tests.supportr   r   r	   rP   r   rM   r  r   r   r   r   <module>   s   U  ~a