U
    9%ew=                     @   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re  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                    sF   d  fdd}t d||}| |dd d | |dd d S )	N
   c                    s   |   S N xYr   W/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/numba/tests/test_closure.pyadd_Y   s    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   s   | j dd d S NTZforceobjr   r   r   r   r   test_jit_closure_variable   s    z%TestClosure.test_jit_closure_variablec                 C   s   | j dd d S NTZnopythonr   r    r   r   r   test_jit_closure_variable_npm   s    z)TestClosure.test_jit_closure_variable_npmc                    sx   d  fdd}t d	||}| |dd d t d
||}| |dd d | |dd | |dd d S )Nr
   c                    s   |   S r   r   r   r   r   r   r   %   s    z0TestClosure.run_rejitting_closure.<locals>.add_Yr   r   r   r      )r   )r   r   )r   r   r   r   Z	c_add_Y_2r   r   r   run_rejitting_closure"   s    z!TestClosure.run_rejitting_closurec                 C   s   | j dd d S r   r&   r    r   r   r   test_rejitting_closure4   s    z"TestClosure.test_rejitting_closurec                 C   s   | j dd d S r"   r'   r    r   r   r   test_rejitting_closure_npm7   s    z&TestClosure.test_rejitting_closure_npmc                    s8   d d fdd}t d||}| |dd d S )	Nr
      c                    s   |    S r   r   r   r   Zr   r   add_Y_mult_Z>   s    zDTestClosure.run_jit_multiple_closure_variables.<locals>.add_Y_mult_Zr   r      )r   r   )r   r   r-   Zc_add_Y_mult_Zr   r+   r   "run_jit_multiple_closure_variables:   s
    z.TestClosure.run_jit_multiple_closure_variablesc                 C   s   | j dd d S r   r/   r    r   r   r   #test_jit_multiple_closure_variablesD   s    z/TestClosure.test_jit_multiple_closure_variablesc                 C   s   | j dd d S r"   r0   r    r   r   r   'test_jit_multiple_closure_variables_npmG   s    z3TestClosure.test_jit_multiple_closure_variables_npmc              	      sl   dd }t d||     fdd}t d	||}|  | |  | |dd W 5 Q R X d S )
Nc                 S   s   | d S )Nr
   r   ar   r   r   mult_10K   s    z3TestClosure.run_jit_inner_function.<locals>.mult_10
intp(intp)c                    s    | d S )N   r   r   Z	c_mult_10r   r   do_mathQ   s    z3TestClosure.run_jit_inner_function.<locals>.do_mathr   2   )r6   )r6   )r   Zdisable_compileZassertRefCountr   )r   r   r5   r9   Z	c_do_mathr   r8   r   run_jit_inner_functionJ   s    z"TestClosure.run_jit_inner_functionc                 C   s   | j dd d S r   r;   r    r   r   r   test_jit_inner_functionZ   s    z#TestClosure.test_jit_inner_functionc                 C   s   | j dd d S r"   r<   r    r   r   r   test_jit_inner_function_npm]   s    z'TestClosure.test_jit_inner_function_npmN)__name__
__module____qualname__r   r!   r$   r&   r(   r)   r/   r1   r2   r;   r=   r>   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   s(   dd }t |}| |d|d d S )Nc                 S   s   dd }|| ||  S )Nc                 S   s   | |  S r   r   r   r   r   r   innerl   s    zDTestInlinedClosure.test_inner_function.<locals>.outer.<locals>.innerr   r   rC   r   r   r   outerj   s    z5TestInlinedClosure.test_inner_function.<locals>.outerr
   r   r   r   rE   cfuncr   r   r   test_inner_functionh   s    z&TestInlinedClosure.test_inner_functionc                 C   s(   dd }t |}| |d|d d S )Nc                    s$   | d   fdd}|| ||  S )Nr   c                    s   | |    S r   r   r   yr   r   rC   y   s    zQTestInlinedClosure.test_inner_function_with_closure.<locals>.outer.<locals>.innerr   rD   r   rJ   r   rE   v   s    zBTestInlinedClosure.test_inner_function_with_closure.<locals>.outerr
   rF   rG   r   r   r    test_inner_function_with_closuret   s    z3TestInlinedClosure.test_inner_function_with_closurec                 C   s(   dd }t |}| |d|d d S )Nc                    s(   | d   fdd}||   ||  S )Nr   c                    s   |   S r   r   r   rJ   r   r   rC      s    zSTestInlinedClosure.test_inner_function_with_closure_2.<locals>.outer.<locals>.innerr   rD   r   rJ   r   rE      s    zDTestInlinedClosure.test_inner_function_with_closure_2.<locals>.outerr
   rF   rG   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
        rE   r
   )execstripr   r   )r   codensrH   r   r   r   "test_inner_function_with_closure_3   s
    z5TestInlinedClosure.test_inner_function_with_closure_3c                 C   s(   dd }t |}| |d|d d S )Nc                    s    fdd}|   S )Nc                    s0    fdd}d}t  D ]}|||7 }q|S )Nc                    s     |  S r   r   zr   rK   r   r   	innermost   s    z^TestInlinedClosure.test_inner_function_nested.<locals>.outer.<locals>.inner.<locals>.innermostr   range)rK   rV   sir   rJ   r   rC      s
    zKTestInlinedClosure.test_inner_function_nested.<locals>.outer.<locals>.innerr   rD   r   r   r   rE      s    
z<TestInlinedClosure.test_inner_function_nested.<locals>.outerr
   rF   rG   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}d:dd }d;d!d"}d#d$ }d%d& }d'd( }d)d* }d+d, }d-d. }d/d0 }|||||||	|
|||||||g}|D ]&}t |}d1}| |||| q| t}td2d3|}|| W 5 Q R X d4}| |t|j | t}td2d3|}|| W 5 Q R X d4}| |t|j | t}td2d3|}|| W 5 Q R X d5}| |t|j | t	}td2d3|}|| W 5 Q R X d6}| |t|j | t	}td2d3|}|| W 5 Q R X d6}| |t|j | t	}td2d3|}|| W 5 Q R X d6}| |t|j | t	}td2d3|}|  W 5 Q R X d7}| |t|j d8S )<z3 Tests the large number of use cases defined below c                    s$   | dk r| S  | d  | d  S )Nr*   r   r   )nfib3r   r   r^      s    z4TestInlinedClosure.test_bulk_use_cases.<locals>.fib3c                    s    fdd}|| S )z, Test calling recursive function from inner c                    s    | S r   r   r   r]   r   r   rC      s    zETestInlinedClosure.test_bulk_use_cases.<locals>.outer1.<locals>.innerr   rD   r]   r   r   outer1   s    z6TestInlinedClosure.test_bulk_use_cases.<locals>.outer1c                    s   | d   fdd}|| S )z. Test calling recursive function from closure r   c                    s   |   S r   r   r   )r^   rT   r   r   rC      s    zETestInlinedClosure.test_bulk_use_cases.<locals>.outer2.<locals>.innerr   rD   r]   rS   r   outer2   s    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 Nr*   r
   r   r   r   rC   r   r   rC      s    zETestInlinedClosure.test_bulk_use_cases.<locals>.outer3.<locals>.innerr   r   r   rb   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 ra   r   r   rC   rK   r   r   rC      s    zETestInlinedClosure.test_bulk_use_cases.<locals>.outer4.<locals>.innerr   r   r   rd   r   outer4   s    z6TestInlinedClosure.test_bulk_use_cases.<locals>.outer4c                    s   | d   fdd}|| S )z Test nested closure r   c                    s$   |  d   fdd}||  S )Nr*   c                    s   |   S r   r   r   rS   r   r   inner2   s    zVTestInlinedClosure.test_bulk_use_cases.<locals>.outer5.<locals>.inner1.<locals>.inner2r   r   rf   rJ   rS   r   inner1   s    zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer5.<locals>.inner1r   r   rh   r   rJ   r   outer5   s    z6TestInlinedClosure.test_bulk_use_cases.<locals>.outer5c                    s   | d   fdd}|| S )z. Test closure with list comprehension in body r   c                    s    |  d }dd t |D S )Nr*   c                 S   s   g | ]}|qS r   r   ).0tr   r   r   
<listcomp>   s     zZTestInlinedClosure.test_bulk_use_cases.<locals>.outer6.<locals>.inner1.<locals>.<listcomp>rW   r   rT   rJ   r   r   rh      s    zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer6.<locals>.inner1r   ri   r   rJ   r   outer6   s    z6TestInlinedClosure.test_bulk_use_cases.<locals>.outer6	   c                    s   | d }| |   S )z) Test use of outer scope var, no closure r   r   rn   _OUTER_SCOPE_VARr   r   outer7   s    z6TestInlinedClosure.test_bulk_use_cases.<locals>.outer7c                    s   | d   fdd}|| S )z+ Test use of outer scope var, with closure r   c                    s   |    S r   r   r   )rr   rT   r   r   rC     s    zETestInlinedClosure.test_bulk_use_cases.<locals>.outer8.<locals>.innerr   rD   rq   rS   r   outer8  s    z6TestInlinedClosure.test_bulk_use_cases.<locals>.outer8c                    s    | d   fdd}|}|| S )z Test closure assignmentr   c                    s   |   S r   r   r   rS   r   r   rC     s    zETestInlinedClosure.test_bulk_use_cases.<locals>.outer9.<locals>.innerr   )r   rC   fr   rS   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                    s   |   S r   r   r   rS   r   r   rC     s    zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer10.<locals>.innerc                    s    | S r   r   r   rb   r   r   rf     s    zGTestInlinedClosure.test_bulk_use_cases.<locals>.outer10.<locals>.inner2r   rg   r   )rC   rT   r   outer10  s    z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer10c                    s   | d   fdd}|S )z return the closure r   c                    s   |   S r   r   r   rS   r   r   rC   #  s    zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer11.<locals>.innerr   rD   r   rS   r   outer11  s    z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer11c                    s   | d  d fdd	}|| S )z closure with kwargr      c                    s   |   | S r   r   r   kwrS   r   r   rC   +  s    zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer12.<locals>.inner)ry   r   rD   r   rS   r   outer12'  s    z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer12ry   c                 S   s   | d | }|S )z outer with kwarg no closurer   r   )r   r{   rT   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                    s   |    S r   r   r   r{   rT   r   r   rC   8  s    zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer14.<locals>.innerr   r   r{   rC   r   r~   r   outer144  s    z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer14c                    s   | d   fdd}|| |S )z# outer with kwarg as arg to closurer   c                    s   |   | S r   r   rz   rS   r   r   rC   @  s    zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer15.<locals>.innerr   r   r   rS   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   s   |   V  d S r   r   r   rS   r   r   rC   H  s    zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer16.<locals>.inner)listrD   r   rS   r   outer16D  s    z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer16c                    s   | d   fdd}|| S )z  closure is generator, returned r   c                 3   s   |   V  d S r   r   r   rS   r   r   rC   Q  s    zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer17.<locals>.innerr   rD   r   rS   r   outer17M  s    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   s   |   V  d S r   r   r   rS   r   r   rC   Z  s    zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer18.<locals>.innerr   )r   rC   rZ   rl   r   rS   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   r*   c                    s   |   S r   r   r   )z1r   r   rC   g  s    zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer19.<locals>.innerc                    s   | |  S r   r   )ru   r   )z2r   r   rf   j  s    zGTestInlinedClosure.test_bulk_use_cases.<locals>.outer19.<locals>.inner2r   )r   rC   rf   r   )r   r   r   outer19b  s
    z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer19c                    s   | d   fdd}|| S )z Test calling numpy in closure r   c                    s   | t   S r   )numpycosr   rS   r   r   rC   s  s    zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer20.<locals>.innerr   rD   r   rS   r   outer20o  s    z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer20c                    s   | d   fdd}|| S )z) Test calling numpy import as in closure r   c                    s   | t   S r   )npr   r   rS   r   r   rC   {  s    zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer21.<locals>.innerr   rD   r   rS   r   outer21w  s    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   )r4   br   r   r   bar  s    zDTestInlinedClosure.test_bulk_use_cases.<locals>.outer22.<locals>.barr   r*   Nr   )r   r   r   r   r   outer22  s    z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer22r
   Tr#   z.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.N)ry   )ry   )ry   )
r   r   assertRaisesNotImplementedErrorr   ZassertInstr	exceptionr   r   )r   r_   r`   rc   re   rj   ro   rs   rt   rv   rw   rx   r|   r}   r   r   r   r   r   r   r   r   r   ru   refrH   varZraisesmsgr   )rr   r^   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 ]4}t	|t
jrRt	|jt
jrR|jjd	krR|| qRqH| t|d
 |D ]}|jj}d}| || qd S )N)Zpipeline_classc                 S   s   dd }|| ||fS )Nc                 S   s   d}d}|| |  S )N   r
   r   )rT   r   rK   r   r   r   r     s    zITestInlinedClosure.test_closure_renaming_scheme.<locals>.foo.<locals>.barr   )r4   r   r   r   r   r   foo  s    z<TestInlinedClosure.test_closure_renaming_scheme.<locals>.foor
      )   #   r   Zpreserved_irr   r*   zclosure__locals__bar_v[0-9]+.x)r   r   r   Z	overloadsZ
signaturesmetadatablocksvaluesbody
isinstancer   AssignvalueZConstappendlentargetnameassertRegex)	r   r   Zfunc_irstoreZblkstmtrZ   r   regexr   r   r   test_closure_renaming_scheme  s     

z/TestInlinedClosure.test_closure_renaming_schemeN)r?   r@   rA   __doc__rI   rL   rM   rR   r[   r   r   r   r   r   r   rB   a   s     rB   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 ]}|||| q8d 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   Zargwhereflattenrk   r   Zcoxvr   r   rm     s     zLTestObjmodeFallback.test_issue2955.<locals>.numbaFailure.<locals>.<listcomp>)shaperX   sortedr   )ZscoresZcoocrowscolsrZ   groupsr   r   r   numbaFailure  s
    
z8TestObjmodeFallback.test_issue2955.<locals>.numbaFailure)r
   r
   r
   gʡE?)r   randomabsZrandnZastypeint
decorators)r   r   r   rK   dr   r   r   test_issue2955  s
    
z"TestObjmodeFallback.test_issue2955c                 C   sv   dd }| j D ]b}||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k	rt| } t |tjk	r0t|}| 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   rk   _r   r   r   rm     s     zCTestObjmodeFallback.test_issue3239.<locals>.fit.<locals>.<listcomp>r   r   )	typer   Zndarrayarrayr   ZhstackrX   dotT)XrK   mr   resZ	interceptZcoefsr   r   r   fit  s    


z/TestObjmodeFallback.test_issue3239.<locals>.fitr
   r   )r   r   arangeZreshapetestingZ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   )rk   indexr   r   r   rm     s     zATestObjmodeFallback.test_issue3289.<locals>.a.<locals>.<listcomp>)r   r   r   rW   r   r   r   r   r4     s    z-TestObjmodeFallback.test_issue3289.<locals>.a)r   )r   r4   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   )rk   r   r   r   r   rm     s     zCTestObjmodeFallback.test_issue3413.<locals>.foo.<locals>.<listcomp>rK   r   r      )maxany)datarl   maskrT   r   r   r   r     s
    z/TestObjmodeFallback.test_issue3413.<locals>.foor   r   r*      rU   )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   r7   c                 S   s   g | ]}|qS r   r   r   r   r   r   rm   ,  s     zDTestObjmodeFallback.test_issue3659.<locals>.main.<locals>.<listcomp>)r   r   r3   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   Zfloat_r   r   r   r   rm   4  s     zFTestObjmodeFallback.test_issue3803.<locals>.center.<locals>.<listcomp>c                 S   s   g | ]}t d qS r   r   r   r   r   r   rm   5  s     )r   r   r   )r   r   r   r   center3  s    z2TestObjmodeFallback.test_issue3803.<locals>.center)r
   )r   Zzerosr   r   r   )r   r   r   r   r   r   r   r   test_issue38031  s
    

z"TestObjmodeFallback.test_issue3803N)r?   r@   rA   r   r   r   r   r   r   r   r   r   r   r   r   r     s   
	r   __main__)r   r   ZunittestZnumbar   r   Znumba.core.errorsr   r   Z
numba.corer   Znumba.tests.supportr   r   r	   rB   r   r?   r   r   r   r   r   <module>   s   U  ~a