U
    iâË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|ŽS )Nr   ©Ú
cpu_targetÚreturn_typeÚlocals)Únumba.core.registryr
   Ú
setdefaultr   Útyping_contextÚtarget_context)ÚpyfuncÚargtypesÚkwargsr
   © r   úU/home/sam/Atlas/atlas_env/lib/python3.8/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   ÚarangeZ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    
r0   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    
r4   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
    

r6   c                  C   s0   t  d¡ tdƒD ]} tdƒD ]
}  dS qdS )Nr"   é
   r1   )r   r   r   )r   r$   r   r   r   Úlift_issue2561Y   s
    

r8   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 r9   r2   r3   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   r1   )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   )rE   Ú	overloadsÚvaluesÚ
assertTrueÚfndescÚnative)rF   rG   Ú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)rH   Úentry_pointrQ   ÚassertPreciseEqual©rF   r   r   ÚargsrG   Ú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)rH   ÚlistrR   rQ   rS   rT   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.
        ©rA   N)r   rB   ÚassertFalserE   rR   rS   rT   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   rB   r\   rE   rY   rR   rS   rT   r   r   r   Úcheck_no_lift_generator½   s    ÿz'TestLoopLifting.check_no_lift_generatorc              	   C   st   t ||td�}|  |j¡ |  ¡ � |j|Ž  W 5 Q R X 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   rB   rL   rE   ZassertTypingErrorrR   Úpyobject_looplift_flagsrS   rT   r   r   r   Úcheck_no_lift_nopythonÈ   s    ÿ
ÿ
z&TestLoopLifting.check_no_lift_nopythonc                 C   s   |   ttjfd¡ d S ©N)é{   )rX   r    r   Úintp©rF   r   r   r   Ú
test_lift1Ù   s    zTestLoopLifting.test_lift1c                 C   s   |   ttjfd¡ d S ra   )rX   r%   r   rc   rd   r   r   r   Ú
test_lift2Ü   s    zTestLoopLifting.test_lift2c                 C   s   |   ttjfd¡ d S ra   )rX   r.   r   rc   rd   r   r   r   Ú
test_lift3ß   s    zTestLoopLifting.test_lift3c                 C   s   |   ttjfd¡ d S ra   )rX   r0   r   rc   rd   r   r   r   Ú
test_lift4â   s    zTestLoopLifting.test_lift4c                 C   s   |   ttjfd¡ d S ra   )rX   r4   r   rc   rd   r   r   r   Ú
test_lift5å   s    zTestLoopLifting.test_lift5c                 C   s   |   tdd¡ d S )Nr   )rX   r8   rd   r   r   r   Útest_lift_issue2561è   s    z#TestLoopLifting.test_lift_issue2561c                 C   s   |   ttjfd¡ d S ra   )rZ   r6   r   rc   rd   r   r   r   Útest_lift_gen1ë   s    zTestLoopLifting.test_lift_gen1c                 C   s   |   ttjfd¡ d S ra   )r]   r:   r   rc   rd   r   r   r   Útest_reject1î   s    zTestLoopLifting.test_reject1c                 C   s   |   ttjfd¡ d S ra   )r^   r;   r   rc   rd   r   r   r   Útest_reject_gen1ñ   s    z TestLoopLifting.test_reject_gen1c                 C   s   |   ttjfd¡ d S ra   )r^   r=   r   rc   rd   r   r   r   Útest_reject_gen2ô   s    z TestLoopLifting.test_reject_gen2c                 C   s   |   ttjfd¡ d S ra   )r`   r?   r   rc   rd   r   r   r   Útest_reject_npm1÷   s    z TestLoopLifting.test_reject_npm1N)Ú__name__Ú
__module__Ú__qualname__rH   rQ   rX   rZ   r]   r^   r`   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   r   r   r   r   r@   …   s$   r@   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   ©rw   r   r   Úfoo  s    z4TestLoopLiftingAnnotate.test_annotate_1.<locals>.foor7   r"   ©Úfileú"The function contains lifted loopsr1   úLoop at line {line}©ÚlinezHas 1 overloadsN©Únumbaru   r   r+   ÚcopyÚtestingÚassert_equalr   Zinspect_typesÚgetvalueÚcloseZassertInÚ__code__Úco_firstlinenoÚformat)
rF   ru   rz   Úcfoor   ÚxcopyÚrÚbufÚ
annotationr€   r   ry   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   rt   c                   S   s   d S rv   r   r   r   r   r   rw   %  s    z4TestLoopLiftingAnnotate.test_annotate_2.<locals>.barc                    sJ   ˆ ƒ  t | jƒD ]}| |  d7  < qt | jƒD ]}| |  d9  < q0| S )Nr"   r1   rx   )r   r   r$   ry   r   r   rz   (  s    z4TestLoopLiftingAnnotate.test_annotate_2.<locals>.foor7   r"   r1   r{   r}   r   é   r~   r   Nr�   )rF   ru   rz   r‹   r   rŒ   r�   rŽ   r�   Úline1Úline2r   ry   r   Útest_annotate_2  s"    

z'TestLoopLiftingAnnotate.test_annotate_2N)rp   rq   rr   r�   r”   r   r   r   r   rs   û   s   "rs   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 rI   )rJ   Ú
signaturesrE   rC   rD   )rF   ÚjittedÚ	loopcountrE   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   )ru   Ú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"   r7   r>   r(   )	r‚   ru   rš   r>   r›   r   r+   Úpy_funcrS   )	rF   ru   rš   r>   r›   rŸ   rž   Znb_aZnp_ar   r   r   Útest_issue_734J  s    

z&TestLoopLiftingInAction.test_issue_734c                 C   sZ   ddl m} |ddd�dd„ ƒ}t dd	d
ddd
ddd
dg
¡}tj | |¡||ƒ¡ d S )Nr   rt   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"   r7   )r   ÚzerosrD   r   )r   r<   ÚindÚiir   r   r   Útest`  s    
z4TestLoopLiftingInAction.test_issue_812.<locals>.testr�   r!   r1   éýÿÿÿr'   r7   r‘   )r‚   ru   r   Úarrayr„   r…   r    )rF   ru   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   rt   c                 S   s&   d}| D ]}||7 }q|  ¡ }||fS rI   )Ú__hash__)r   ÚbÚsÚeÚhr   r   r   Úlift_issue2368v  s
    
z?TestLoopLiftingInAction.test_issue_2368.<locals>.lift_issue2368r7   r"   )r‚   ru   r   Zonesr*   rC   rJ   r–   rE   rK   rL   rM   rN   )
rF   ru   r®   r   rª   r—   rV   rW   rO   rP   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   rt   Trœ   c                 S   s   d}t | ƒD ]}|}q|S rI   ©r   ©Únr<   r   r   r   r   r¥   ‘  s    z?TestLoopLiftingInAction.test_no_iteration_w_redef.<locals>.testéÿÿÿÿr"   ©r˜   ©r‚   ru   rC   r    r™   ©rF   ru   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   rt   Trœ   c                 S   s   d}t | ƒD ]}||7 }q|S rI   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   rt   Trœ   c                 S   s   t | ƒD ]}|}q|S rv   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 )	zäTest 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   rt   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>.testr7   N)r‚   ru   r   r+   rC   r    )rF   ru   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   rt   Trœ   c                  S   s2   d} d}t dƒD ]}|dkr d} || 7 }q|| fS )Nr'   r   r1   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   s`   ddl m} dd l}dd„ }| ¡ �2 | d¡ |dd�|ƒ}|  |dƒ|dƒ¡ W 5 Q R X d S )Nr   rt   c                 S   s   | rt dƒD ]}qd S )Nr7   r°   )r   r   r   r   r   r   í  s    zRTestLoopLiftingInAction.test_stack_offset_error_when_has_no_return.<locals>.pyfuncÚerrorTrœ   )r‚   ru   ÚwarningsÚcatch_warningsÚsimplefilterrC   )rF   ru   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   rt   c                 S   s   | S rv   r   )r   r   r   r   rw      s    z<TestLoopLiftingInAction.test_variable_scope_bug.<locals>.barc                    s*   d}t | ƒD ]}|| }q|ˆ | ƒ }|S )Nrº   r°   )r   r­   Úkry   r   r   rz     s
    
z<TestLoopLiftingInAction.test_variable_scope_bug.<locals>.foor7   N)r‚   ru   rC   )rF   ru   rz   r‹   r   ry   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   rt   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   rz     s    z<TestLoopLiftingInAction.test_recompilation_loop.<locals>.foor7   r"   r³   r1   N)	r‚   ru   r   r+   rC   rD   rJ   r–   rE   )rF   ru   rz   r‹   rU   rE   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>/  s     zRTestLoopLiftingInAction.test_lift_listcomp_block0.<locals>.foo.<locals>.<listcomp>)r"   r   )ÚXr   r   r   r   rz   .  s    z>TestLoopLiftingInAction.test_lift_listcomp_block0.<locals>.foor   rt   r"   r   Trœ   )r‚   ru   rC   rJ   r–   rE   rD   )rF   rz   ru   Ú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 |Ž}|jf |Ž}|  |d |d ¡ |  |d
 |d
 ¡ |j|jd  j\}|  t	|j
ƒd
¡ d S )Nr   rt   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-   r/   Úx0Úy0r²   ZxsZysr   r   r   r   rz   H  s    02zDTestLoopLiftingInAction.test_lift_objectmode_issue_4223.<locals>.foog333333û?g333333ã?g333333ó?éÈ   )r   rª   r-   r/   rÓ   rÔ   r²   r"   )r‚   ru   Údictr    rS   rJ   r–   rE   rC   rD   Znopython_signatures)rF   ru   rz   r   rW   rV   rE   r   r   r   Útest_lift_objectmode_issue_4223E  s    
	
z7TestLoopLiftingInAction.test_lift_objectmode_issue_4223N)rp   rq   rr   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unittestrB   Zenable_pyobjectZenable_loopliftrƒ   r_   Zenable_pyobject_loopliftr   r    r%   r.   r0   r4   r6   r8   r:   r;   r=   r?   r@   rs   r•   rp   Úmainr   r   r   r   Ú<module>   s:   	
			
vJ  
