a
    
dF                     @   s  d dl mZ d dlZd dlmZ d dlmZmZ d dl	m
Z
mZmZ d dlZe Zde_de_e Zde_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G dd  d ee
Z G d!d" d"e
Z!G d#d$ d$ee
Z"e#d%kre$  dS )&    )StringION)types)compile_extraFlags)TestCasetagMemoryLeakMixinTc                 K   s>   ddl m} |dd  |di  t|j|j| |fi |S )Nr   
cpu_targetreturn_typelocals)numba.core.registryr
   
setdefaultr   typing_contexttarget_context)pyfuncargtypeskwargsr
    r   e/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/numba/tests/test_looplifting.pycompile_isolated   s    r   c                 C   s&   t d}t|jD ]}| ||< q|S )N   )npemptyrangesizexair   r   r   lift1    s    

r    c                 C   sB   t d}t|jd D ]$}t|jd D ]}| |||f< q*q|S )N)r      r      )r   r   r   shape)r   r   r   jr   r   r   lift2)   s
    
r%   c                 C   sB   t  }tjdtjd}d}t|jd D ]}||| |  7 }q(|S N   Zdtyper   objectr   arangeint64r   r#   )r   _r   cr   r   r   r   lift33   s    r/   c                 C   sR   t  }tjdtjd}d}d}t|jd D ]}||| |  7 }||7 }q,|| S r&   r)   )r   r-   r   r.   dr   r   r   r   lift4<   s    
r1   c                 C   s4   t  }td}t|jd D ]}|dkr q0q|S )Nr!   r      r*   r   r+   r   r#   r   r-   r   r   r   r   r   lift5G   s    
r5   c                 c   s8   t d}dV  t|jD ]}| ||< qt |V  d S )Nr   r   )r   r   r   r   sumr   r   r   r   	lift_gen1P   s
    

r7   c                  C   s0   t d tdD ]} tdD ]
}  dS qdS )Nr"   
   r2   )r   r   r   )r   r$   r   r   r   lift_issue2561Y   s
    

r9   c                 C   s(   t d}t|jd D ]
}|  S |S Nr!   r   )r   r+   r   r#   r   r   r   r   reject1`   s    
r;   c                 c   s2   t  }td}t|jd D ]}|| V  qd S r:   r3   r4   r   r   r   reject_gen1h   s    
r<   c                 c   sL   t  }td}t|jD ],}|| |  }t|D ]}|d }q2|V  qd S )Nr   r2   )r*   r   r+   r   r   )r   r-   r   r   resr$   r   r   r   reject_gen2o   s    

r>   c                 C   s@   t jdt jd}t|jD ] }t }t |d | ||< q|S )Nr   r(   r"   )r   r   int32r   r   r*   r+   )r   r   r   r-   r   r   r   reject_npm1{   s
    r@   c                   @   s   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d Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%S )&TestLoopLiftingc              	   C   s<   ddl m} t|j|j||d ti d}| t|jd |S )Nr   r	   )r   flagsr   r"   )	r   r
   r   r   r   looplift_flagsassertEquallenlifted)selfr   r   r
   cresr   r   r   try_lift   s    zTestLoopLifting.try_liftc                 C   s(   |j d }|j \}| |jj d S Nr   )rF   	overloadsvalues
assertTruefndescnative)rG   rH   jitlooploopcresr   r   r   assert_lifted_native   s    
z$TestLoopLifting.assert_lifted_nativec                 C   s8   |  ||}|| }|j| }| | | || dS )zH
        Check that pyfunc can loop-lift even in nopython mode.
        N)rI   entry_pointrR   assertPreciseEqualrG   r   r   argsrH   expectedgotr   r   r   check_lift_ok   s
    

zTestLoopLifting.check_lift_okc                 C   s@   |  ||}t|| }t|j| }| | | || dS )zg
        Check that pyfunc (a generator function) can loop-lift even in
        nopython mode.
        N)rI   listrS   rR   rT   rU   r   r   r   check_lift_generator_ok   s
    
z'TestLoopLifting.check_lift_generator_okc                 C   s<   t ||td}| |j || }|j| }| || dS )z4
        Check that pyfunc can't loop-lift.
        rB   N)r   rC   assertFalserF   rS   rT   rU   r   r   r   check_no_lift   s    
zTestLoopLifting.check_no_liftc                 C   sD   t ||td}| |j t|| }t|j| }| || dS )zK
        Check that pyfunc (a generator function) can't loop-lift.
        r\   N)r   rC   r]   rF   rZ   rS   rT   rU   r   r   r   check_no_lift_generator   s    z'TestLoopLifting.check_no_lift_generatorc                 C   s   t ||td}| |j |   |j|  W d   n1 sB0    Y  t ||td}| |j || }|j| }| || dS )z
        Check that pyfunc will fail loop-lifting if pyobject mode
        is disabled inside the loop, succeed otherwise.
        r\   N)r   rC   rM   rF   ZassertTypingErrorrS   pyobject_looplift_flagsrT   rU   r   r   r   check_no_lift_nopython   s    
(
z&TestLoopLifting.check_no_lift_nopythonc                 C   s   |  ttjfd d S N){   )rY   r    r   intprG   r   r   r   
test_lift1   s    zTestLoopLifting.test_lift1c                 C   s   |  ttjfd d S rb   )rY   r%   r   rd   re   r   r   r   
test_lift2   s    zTestLoopLifting.test_lift2c                 C   s   |  ttjfd d S rb   )rY   r/   r   rd   re   r   r   r   
test_lift3   s    zTestLoopLifting.test_lift3c                 C   s   |  ttjfd d S rb   )rY   r1   r   rd   re   r   r   r   
test_lift4   s    zTestLoopLifting.test_lift4c                 C   s   |  ttjfd d S rb   )rY   r5   r   rd   re   r   r   r   
test_lift5   s    zTestLoopLifting.test_lift5c                 C   s   |  tdd d S )Nr   )rY   r9   re   r   r   r   test_lift_issue2561   s    z#TestLoopLifting.test_lift_issue2561c                 C   s   |  ttjfd d S rb   )r[   r7   r   rd   re   r   r   r   test_lift_gen1   s    zTestLoopLifting.test_lift_gen1c                 C   s   |  ttjfd d S rb   )r^   r;   r   rd   re   r   r   r   test_reject1   s    zTestLoopLifting.test_reject1c                 C   s   |  ttjfd d S rb   )r_   r<   r   rd   re   r   r   r   test_reject_gen1   s    z TestLoopLifting.test_reject_gen1c                 C   s   |  ttjfd d S rb   )r_   r>   r   rd   re   r   r   r   test_reject_gen2   s    z TestLoopLifting.test_reject_gen2c                 C   s   |  ttjfd d S rb   )ra   r@   r   rd   re   r   r   r   test_reject_npm1   s    z TestLoopLifting.test_reject_npm1N)__name__
__module____qualname__rI   rR   rY   r[   r^   r_   ra   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   r   r   r   r   rA      s$   rA   c                   @   s   e Zd Zdd Zdd ZdS )TestLoopLiftingAnnotatec           
         s   ddl m} dd   fdd}||}td}| }||}tj||d  t }|j|d	 |	 }|
  | d
| |jjd }	| dj|	d| | d| dS )zO
        Verify that annotation works as expected with one lifted loop
        r   jitc                   S   s   d S Nr   r   r   r   r   bar  s    z4TestLoopLiftingAnnotate.test_annotate_1.<locals>.barc                    s*      t | jD ]}| |  d7  < q| S )Nr"   r   r   )r   r   rx   r   r   foo  s    z4TestLoopLiftingAnnotate.test_annotate_1.<locals>.foor8   r"   file"The function contains lifted loopsr2   Loop at line {line}linezHas 1 overloadsNnumbarv   r   r+   copytestingassert_equalr   Zinspect_typesgetvaluecloseZassertIn__code__co_firstlinenoformat)
rG   rv   r{   cfoor   xcopyrbuf
annotationr   r   rz   r   test_annotate_1   s     
z'TestLoopLiftingAnnotate.test_annotate_1c                    s   ddl m} dd   fdd}||}td}| }||}tj||d d	  t }|j|d
 |	 }|
  | d| |jjd }	|jjd }
| dj|	d| | dj|
d| dS )zP
        Verify that annotation works as expected with two lifted loops
        r   ru   c                   S   s   d S rw   r   r   r   r   r   rx   %  s    z4TestLoopLiftingAnnotate.test_annotate_2.<locals>.barc                    sJ      t | jD ]}| |  d7  < qt | jD ]}| |  d9  < q0| S )Nr"   r2   ry   )r   r   r$   rz   r   r   r{   (  s    z4TestLoopLiftingAnnotate.test_annotate_2.<locals>.foor8   r"   r2   r|   r~   r      r   r   Nr   )rG   rv   r{   r   r   r   r   r   r   Zline1Zline2r   rz   r   test_annotate_2  s"    

z'TestLoopLiftingAnnotate.test_annotate_2N)rq   rr   rs   r   r   r   r   r   r   rt      s   "rt   c                   @   s|   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d Zdd ZdS )TestLoopLiftingInActionc                 C   s&   |j |jd  j}| t|| d S rJ   )rK   
signaturesrF   rD   rE   )rG   jitted	loopcountrF   r   r   r   assert_has_liftedF  s    z)TestLoopLiftingInAction.assert_has_liftedc           	      C   s   ddl m}m}m}m} ||||d d  dddd }dD ]B}tjdd	d
}tjdd	d
}||| ||| | || q>d S )Nr   )rv   voidr?   doubleTZforceobjc                 S   sV   | dkr.t |jd D ]}|| d ||< qn$t |jd D ]}|| d ||< q<d S )Nr   g       @      ?)r   r#   )ur   r   r   r   r   forloop_with_ifM  s
    z?TestLoopLiftingInAction.test_issue_734.<locals>.forloop_with_if)r   r"   r8   r?   r(   )	r   rv   r   r?   r   r   r+   py_funcrT   )	rG   rv   r   r?   r   r   r   Znb_aZnp_ar   r   r   test_issue_734J  s    

z&TestLoopLiftingInAction.test_issue_734c                 C   sJ   ddl m} |ddddd }tg d}tj|||| d S )	Nr   ru   zf8[:](f8[:])Tr   c                 S   sl   t t| }d}tt| D ](}|d7 }| | ||< | | dkr qHqt|d t| D ]}d||< qZ|S )Nr   r"   r8   )r   zerosrE   r   )r   r=   indiir   r   r   test`  s    
z4TestLoopLiftingInAction.test_issue_812.<locals>.test)
r   r!   r2   r'   r2   r8   r'   r2   r   )r   rv   r   arrayr   r   r   )rG   rv   r   r   r   r   r   test_issue_812]  s
    

z&TestLoopLiftingInAction.test_issue_812c           
      C   s   ddl m} dd }td}t }||}|||}|||}| |d |d  | |d |d  |j|jd  jd }|j	 \}	| 
|	jj d S )Nr   ru   c                 S   s&   d}| D ]}||7 }q|  }||fS rJ   )__hash__)r   bsehr   r   r   lift_issue2368v  s
    
z?TestLoopLiftingInAction.test_issue_2368.<locals>.lift_issue2368r8   r"   )r   rv   r   Zonesr*   rD   rK   r   rF   rL   rM   rN   rO   )
rG   rv   r   r   r   r   rW   rX   rP   rQ   r   r   r   test_issue_2368s  s    


z'TestLoopLiftingInAction.test_issue_2368c                 C   sj   ddl m} |dddd }| |d|d | j|dd	 | |d|d | j|dd	 d S )
Nr   ru   Tr   c                 S   s   d}t | D ]}|}q|S rJ   r   nr=   r   r   r   r   r     s    z?TestLoopLiftingInAction.test_no_iteration_w_redef.<locals>.testr"   r   r   rv   rD   r   r   rG   rv   r   r   r   r   test_no_iteration_w_redef  s    
z1TestLoopLiftingInAction.test_no_iteration_w_redefc                 C   sj   ddl m} |dddd }| |d|d | j|dd	 | |d|d | j|dd	 d S )
Nr   ru   Tr   c                 S   s   d}t | D ]}||7 }q|S rJ   r   r   r   r   r   r     s    
z7TestLoopLiftingInAction.test_no_iteration.<locals>.testr   r"   r   r   r   r   r   r   test_no_iteration  s    
z)TestLoopLiftingInAction.test_no_iterationc                 C   sF   ddl m} |dddd }| |d|d | j|dd d S )	Nr   ru   Tr   c                 S   s   t | D ]}|}q|S rw   r   )r   r   r=   r   r   r   r     s    z>TestLoopLiftingInAction.test_define_in_loop_body.<locals>.testr"   r   r   r   r   r   r   test_define_in_loop_body  s
    
z0TestLoopLiftingInAction.test_define_in_loop_bodyc                 C   sB   ddl m} |dddd }td}| |||| dS )	zTest a problem caused by invalid discovery of loop argument
        when a variable is used afterwards but not before.

        Before the fix, this will result in::

        numba.ir.NotDefinedError: 'i' is not defined
        r   ru   Tr   c                 S   sP   t | tjkr<| jdkr6d}d}t| jd D ]}q.qLtnd}d\}}|S d S )Nr"           r   )r   r   )typer   Zndarrayndimr   r#   	Exception)argresultr$   r   r   r   r   r     s    
z;TestLoopLiftingInAction.test_invalid_argument.<locals>.testr8   N)r   rv   r   r+   rD   r   )rG   rv   r   r   r   r   r   test_invalid_argument  s
    

z-TestLoopLiftingInAction.test_invalid_argumentc                 C   sB   ddl m} |dddd }| | |  | j|dd d S )	Nr   ru   Tr   c                  S   s2   d} d}t dD ]}|dkr d} || 7 }q|| fS )Nr'   r   r2   r   r   )r   yr   r   r   r   r     s    
zHTestLoopLiftingInAction.test_conditionally_defined_in_loop.<locals>.testr"   r   r   r   r   r   r   "test_conditionally_defined_in_loop  s
    
	z:TestLoopLiftingInAction.test_conditionally_defined_in_loopc                 C   st   ddl m} dd l}dd }| < |d |dd|}| |d|d W d    n1 sf0    Y  d S )Nr   ru   c                 S   s   | rt dD ]}qd S )Nr8   r   )r   r   r   r   r   r     s    zRTestLoopLiftingInAction.test_stack_offset_error_when_has_no_return.<locals>.pyfuncerrorTr   )r   rv   warningscatch_warningssimplefilterrD   )rG   rv   r   r   Zcfuncr   r   r   *test_stack_offset_error_when_has_no_return  s    

zBTestLoopLiftingInAction.test_stack_offset_error_when_has_no_returnc                    s@   ddl m} dd   fdd}||}| |d|d dS )	z
        https://github.com/numba/numba/issues/2179

        Looplifting transformation is using the wrong version of variable `h`.
        r   ru   c                 S   s   | S rw   r   )r   r   r   r   rx      s    z<TestLoopLiftingInAction.test_variable_scope_bug.<locals>.barc                    s*   d}t | D ]}|| }q| |  }|S )Nr   r   )r   r   krz   r   r   r{     s
    
z<TestLoopLiftingInAction.test_variable_scope_bug.<locals>.foor8   N)r   rv   rD   )rG   rv   r{   r   r   rz   r   test_variable_scope_bug  s
    z/TestLoopLiftingInAction.test_variable_scope_bugc                 C   s   ddl m} dd }||}tddf}| || ||  | t|j|jd  jd |j|jd  jd }| t|jd tddf}| || ||  | t|jd d	S )
z<
        https://github.com/numba/numba/issues/2481
        r   ru   c                 S   sB   | d d | }d}t |jD ] }t  ||d d d |  }q|S )Nr"   r   )r   r   r*   )r   r   Ar.   r   r   r   r   r{     s    z<TestLoopLiftingInAction.test_recompilation_loop.<locals>.foor8   r"   r   r2   N)	r   rv   r   r+   rD   rE   rK   r   rF   )rG   rv   r{   r   rV   rF   r   r   r   test_recompilation_loop  s    
z/TestLoopLiftingInAction.test_recompilation_loopc                 C   sx   dd }ddl m} | |}|d | |j|jd  jd |dd|}|d | t|j|jd  jd d S )	Nc                 S   s   dd dD  dD ]}q| S )Nc                 S   s   g | ]}|qS r   r   ).0r   r   r   r   
<listcomp>/      zRTestLoopLiftingInAction.test_lift_listcomp_block0.<locals>.foo.<locals>.<listcomp>)r"   r   )Xr   r   r   r   r{   .  s    z>TestLoopLiftingInAction.test_lift_listcomp_block0.<locals>.foor   ru   r"   r   Tr   )r   rv   rD   rK   r   rF   rE   )rG   r{   rv   fr   r   r   test_lift_listcomp_block0,  s    
z1TestLoopLiftingInAction.test_lift_listcomp_block0c              	   C   s   ddl m} |dd }tdddddddd	}|f i |}|jf i |}| |d |d  | |d
 |d
  |j|jd  j\}| t	|j
d
 d S )Nr   ru   c           
      S   s   t |t | }}|| |d< |d< t |d D ]d}	t | ||	  |t | ||	    ||	d < t |||	  |t |||	    ||	d < q6t  ||fS )Nr   r"   )r   r   r+   sincosr*   )
r   r   r.   r0   x0y0r   xsZysr   r   r   r   r{   H  s    02zDTestLoopLiftingInAction.test_lift_objectmode_issue_4223.<locals>.foog333333?g333333?g333333?   )r   r   r.   r0   r   r   r   r"   )r   rv   dictr   rT   rK   r   rF   rD   rE   Znopython_signatures)rG   rv   r{   r   rX   rW   rF   r   r   r   test_lift_objectmode_issue_4223E  s    
	z7TestLoopLiftingInAction.test_lift_objectmode_issue_4223N)rq   rr   rs   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   E  s   r   __main__)%ior   numpyr   Z
numba.corer   Znumba.core.compilerr   r   Znumba.tests.supportr   r   r   ZunittestrC   Zenable_pyobjectZenable_loopliftr   r`   Zenable_pyobject_loopliftr   r    r%   r/   r1   r5   r7   r9   r;   r<   r>   r@   rA   rt   r   rq   mainr   r   r   r   <module>   s:   	
			
vJ  
