o
    i=5                     @   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ed
krDe  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   U/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/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   r4   c_add_Y_mult_Zr   r2   r   "run_jit_multiple_closure_variables:   s
   z.TestClosure.run_jit_multiple_closure_variablesc                 C   r    r!   r8   r$   r   r   r   #test_jit_multiple_closure_variablesD   r&   z/TestClosure.test_jit_multiple_closure_variablesc                 C   r    r'   r9   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   r5   z3TestClosure.run_jit_inner_function.<locals>.do_mathr   2   )r>   )r   disable_compileassertRefCountr   )r   r   r=   rC   	c_do_mathr   rA   r   run_jit_inner_functionJ   s   "z"TestClosure.run_jit_inner_functionc                 C   r    r!   rH   r$   r   r   r   test_jit_inner_functionZ   r&   z#TestClosure.test_jit_inner_functionc                 C   r    r'   rI   r$   r   r   r   test_jit_inner_function_npm]   r&   z'TestClosure.test_jit_inner_function_npmN)__name__
__module____qualname__r   r%   r*   r-   r/   r0   r8   r:   r;   rH   rJ   rK   r   r   r   r   r	      s    
r	   c                   @   s^   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d Zej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   rQ   r   r   r   outerj   s   z5TestInlinedClosure.test_inner_function.<locals>.outerr
   r   r   r   rS   cfuncr   r   r   test_inner_functionh   s   z&TestInlinedClosure.test_inner_functionc                 C   rP   )Nc                    s$   | d   fdd}|| ||  S )Nr   c                    s   | |    S r   r   r   yr   r   rQ   y   r5   zQTestInlinedClosure.test_inner_function_with_closure.<locals>.outer.<locals>.innerr   rR   r   rX   r   rS   v   s   zBTestInlinedClosure.test_inner_function_with_closure.<locals>.outerr
   rT   rU   r   r   r    test_inner_function_with_closuret   s   z3TestInlinedClosure.test_inner_function_with_closurec                 C   rP   )Nc                    s(   | d   fdd}||   ||  S )Nr   c                    s   |   S r   r   r   rX   r   r   rQ      r   zSTestInlinedClosure.test_inner_function_with_closure_2.<locals>.outer.<locals>.innerr   rR   r   rX   r   rS      s   zDTestInlinedClosure.test_inner_function_with_closure_2.<locals>.outerr
   rT   rU   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
        rS   r
   )execstripr   r   )r   codensrV   r   r   r   "test_inner_function_with_closure_3   s
   z5TestInlinedClosure.test_inner_function_with_closure_3c                 C   rP   )Nc                    s    fdd}|   S )Nc                    s0    fdd}d}t  D ]}|||7 }q|S )Nc                    s     |  S r   r   zr   rY   r   r   	innermost   r5   z^TestInlinedClosure.test_inner_function_nested.<locals>.outer.<locals>.inner.<locals>.innermostr   range)rY   rd   sir   rX   r   rQ      s
   zKTestInlinedClosure.test_inner_function_nested.<locals>.outer.<locals>.innerr   rR   r   r   r   rS      s   
z<TestInlinedClosure.test_inner_function_nested.<locals>.outerr
   rT   rU   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 )Nr1   r   r   )nfib3r   r   rl      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   rk   r   r   rQ      r   zETestInlinedClosure.test_bulk_use_cases.<locals>.outer1.<locals>.innerr   rR   rk   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   )rl   rb   r   r   rQ      r5   zETestInlinedClosure.test_bulk_use_cases.<locals>.outer2.<locals>.innerr   rR   rk   ra   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 Nr1   r
   r   r   r   rQ   r   r   rQ      s   zETestInlinedClosure.test_bulk_use_cases.<locals>.outer3.<locals>.innerr   r   r   rs   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 rr   r   r   rQ   rY   r   r   rQ      s   zETestInlinedClosure.test_bulk_use_cases.<locals>.outer4.<locals>.innerr   r   r   ru   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 )Nr1   c                    r   r   r   r   ra   r   r   inner2   r   zVTestInlinedClosure.test_bulk_use_cases.<locals>.outer5.<locals>.inner1.<locals>.inner2r   r   rx   rX   ra   r   inner1   s   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer5.<locals>.inner1r   r   rz   r   rX   r   outer5   s   z6TestInlinedClosure.test_bulk_use_cases.<locals>.outer5c                    rw   )z. Test closure with list comprehension in body r   c                    s    |  d }dd t |D S )Nr1   c                 S   s   g | ]}|qS r   r   ).0tr   r   r   
<listcomp>       zZTestInlinedClosure.test_bulk_use_cases.<locals>.outer6.<locals>.inner1.<locals>.<listcomp>re   r   rb   rX   r   r   rz      s   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer6.<locals>.inner1r   r{   r   rX   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                    ro   )z+ Test use of outer scope var, with closure r   c                       |    S r   r   r   )r   rb   r   r   rQ     r5   zETestInlinedClosure.test_bulk_use_cases.<locals>.outer8.<locals>.innerr   rR   r   ra   r   outer8  rq   z6TestInlinedClosure.test_bulk_use_cases.<locals>.outer8c                    s    | d   fdd}|}|| S )z Test closure assignmentr   c                    r   r   r   r   ra   r   r   rQ     r   zETestInlinedClosure.test_bulk_use_cases.<locals>.outer9.<locals>.innerr   )r   rQ   fr   ra   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   ra   r   r   rQ     r   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer10.<locals>.innerc                    rm   r   r   r   rs   r   r   rx     r   zGTestInlinedClosure.test_bulk_use_cases.<locals>.outer10.<locals>.inner2r   ry   r   )rQ   rb   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   ra   r   r   rQ   #  r   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer11.<locals>.innerr   rR   r   ra   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   kwra   r   r   rQ   +  r5   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer12.<locals>.innerNr   r   rR   r   ra   r   outer12'  rq   z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer12r   c                 S   s   | d | }|S )z outer with kwarg no closurer   r   )r   r   rb   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   rb   r   r   rQ   8  r5   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer14.<locals>.innerr   r   r   rQ   r   r   r   outer144  rq   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   ra   r   r   rQ   @  r5   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer15.<locals>.innerr   r   r   ra   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   ra   r   r   rQ   H     zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer16.<locals>.inner)listrR   r   ra   r   outer16D  s   z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer16c                    rw   )z  closure is generator, returned r   c                 3   r   r   r   r   ra   r   r   rQ   Q  r   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer17.<locals>.innerr   rR   r   ra   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   ra   r   r   rQ   Z  r   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer18.<locals>.innerr   )r   rQ   rh   r~   r   ra   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   r1   c                    r   r   r   r   )z1r   r   rQ   g  r   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer19.<locals>.innerc                    s   | |  S r   r   )r   r   )z2r   r   rx   j  r5   zGTestInlinedClosure.test_bulk_use_cases.<locals>.outer19.<locals>.inner2r   )r   rQ   rx   r   )r   r   r   outer19b  s
   
z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer19c                    rw   )z Test calling numpy in closure r   c                       | t   S r   )numpycosr   ra   r   r   rQ   s     zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer20.<locals>.innerr   rR   r   ra   r   outer20o     z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer20c                    rw   )z) Test calling numpy import as in closure r   c                    r   r   )npr   r   ra   r   r   rQ   {  r   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer21.<locals>.innerr   rR   r   ra   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   r1   Nr   )r   r   r   r   r   outer22  s   z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer22r
   Tr(   Nz,Unsupported use of cell variable 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   rn   rp   rt   rv   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   refrV   varraisesmsgr   )r   rl   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   )rb   r   rY   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   r1   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stmtrh   r   regexr   r   r   test_closure_renaming_scheme  s&   


z/TestInlinedClosure.test_closure_renaming_schemec                    s0   t dd  t  fdd}tj| d d S )Nc                  S   s   ddd} | S )N皙?c                 S   s   | | S r   r   rc   r   r   r   r     r   z;TestInlinedClosure.test_issue9222.<locals>.foo.<locals>.bar)r   r   )r   r   r   r   r     s   
z.TestInlinedClosure.test_issue9222.<locals>.fooc                      s
     dS r?   r   r   r   r   r   consume  s   
z2TestInlinedClosure.test_issue9222.<locals>.consumegffffff@)r   r   testingassert_allclose)r   r   r   r   r   test_issue9222  s
   
z!TestInlinedClosure.test_issue9222c                 C   s   t dd }|  d S )Nc                  S   s4   d} t dD ]}tdd t | dD  d} qd S )Nr   r   c                 S   s   g | ]}d qS )r   r   )r}   _r   r   r   r     r   zFTestInlinedClosure.test_issue_9577.<locals>._inner.<locals>.<listcomp>r   )rf   r   array)range_startr   r   r   r   _inner  s
   z2TestInlinedClosure.test_issue_9577.<locals>._inner)r   )r   r   r   r   r   test_issue_9577  s   

z"TestInlinedClosure.test_issue_9577N)rL   rM   rN   __doc__rW   rZ   r[   r`   ri   r   r   r   r   run_test_in_subprocessr   r   r   r   r   rO   a   s      "rO   __main__)r   r   unittestnumbar   r   numba.core.errorsr   r   
numba.corer   numba.tests.supportr   r   r	   rO   rL   mainr   r   r   r   <module>   s   U   