U
    iâËd],  ã                   @   sœ  d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZm	Z	m
Z
mZmZmZmZ d dlmZ d dlmZmZmZ d dlmZmZ d dlmZ d dlmZ d dlmZ d d	lmZ d dlZd
d„ Z dd„ Z!G dd„ de"ƒZ#dej$fgZ%dd„ Z&dd„ Z'dd„ Z(eƒ Z)edƒe)_*de)_+G dd„ deƒZ,G dd„ de,ƒZ-G dd„ de-ƒZ.G dd„ de,ƒZ/G d d!„ d!e,ƒZ0G d"d#„ d#e-ƒZ1G d$d%„ d%eƒZ2e3d&k�r˜e 4¡  dS )'é    N)ÚTestCaseÚoverride_configÚoverride_env_configÚcaptured_stdoutÚforbid_codegenÚskip_parfors_unsupportedÚ
needs_blas)Újit)ÚtypesÚcompilerÚutils)Úcompile_isolatedÚFlags)ÚParallelOptions)ÚNumbaPerformanceWarning)Úprange)Újitclassc                 C   s   | d }|S )Né   © )ZsomeargÚretvalr   r   úO/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/numba/tests/test_debug.pyÚsimple_nopython   s    r   c                 c   s   | V  |V  d S ©Nr   )ÚxÚyr   r   r   Ú
simple_gen   s    r   c                   @   s   e Zd Zdd„ ZdS )ÚSimpleClassc                 C   s
   d| _ d S )Né   ©Úh)Úselfr   r   r   Ú__init__    s    zSimpleClass.__init__N)Ú__name__Ú
__module__Ú__qualname__r!   r   r   r   r   r      s   r   r   c                 C   s   | j S r   r   )Úobjr   r   r   Úsimple_class_user%   s    r&   c                 C   s   t  | |¡S r   )ÚnpÚdot)ÚaÚbr   r   r   Úunsupported_parfor(   s    r+   c                 C   s2   t  | ¡}t| ƒD ]}|| t  |¡ ||< q|S r   )r'   Zonesr   Úsin)Únr)   Úir   r   r   Úsupported_parfor+   s    
r/   Tc                	   @   st   e Zd Zeddddddddgƒ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 )ÚDebugTestBaseÚbytecodeÚcfgÚirÚ	typeinferÚllvmÚfunc_opt_llvmÚoptimized_llvmÚassemblyc                 O   s   | j tf|ž|Ž d S r   )ÚassertRaisesÚAssertionError)r    ÚargsÚkwargsr   r   r   Úassert_fails:   s    zDebugTestBase.assert_failsc                 C   sn   t  | jd¡}|D ]}||ks"t‚d||< qt| ¡ ƒD ]0\}}t| d| ƒ}|r\||ƒ q8|  ||¡ q8d S )NFTz_check_dump_%s)ÚdictÚfromkeysÚ	all_dumpsr:   ÚsortedÚitemsÚgetattrr=   )r    ÚoutZ
dump_namesZenabled_dumpsÚnameÚenabledZ
check_methr   r   r   Úcheck_debug_output=   s    

z DebugTestBase.check_debug_outputc                 C   s(   t jdkr|  d|¡ n|  d|¡ d S )N)é   é   Z	BINARY_OPÚ
BINARY_ADD)r   Z	PYVERSIONÚassertIn©r    rD   r   r   r   Ú_check_dump_bytecodeI   s    
z"DebugTestBase._check_dump_bytecodec                 C   s   |   d|¡ d S )NzCFG dominators©rK   rL   r   r   r   Ú_check_dump_cfgO   s    zDebugTestBase._check_dump_cfgc                 C   s   |   d| j |¡ d S )Nz--IR DUMP: %s--©rK   Ú	func_namerL   r   r   r   Ú_check_dump_irR   s    zDebugTestBase._check_dump_irc                 C   s   |   d|¡ d S )Nz--propagate--rN   rL   r   r   r   Ú_check_dump_typeinferU   s    z#DebugTestBase._check_dump_typeinferc                 C   s2   |   d|¡ tjjd jjdkr.|  |d|¡ d S )Nz--LLVM DUMPÚauto_parallelFz#store i64 %\"\.\d", i64\* %"retptr")rK   r   r   ÚoptionsÚdefaultrF   ÚassertRegexrL   r   r   r   Ú_check_dump_llvmX   s    zDebugTestBase._check_dump_llvmc                 C   s"   |   d| j |¡ |   d|¡ d S )Nz--FUNCTION OPTIMIZED DUMP %súadd nsw i64 %arg.somearg, 1rP   rL   r   r   r   Ú_check_dump_func_opt_llvm]   s    z'DebugTestBase._check_dump_func_opt_llvmc                 C   s"   |   d| j |¡ |   d|¡ d S )Nz--OPTIMIZED DUMP %srY   rP   rL   r   r   r   Ú_check_dump_optimized_llvmb   s    z(DebugTestBase._check_dump_optimized_llvmc                 C   s.   |   d| j |¡ t ¡ dkr*|   d|¡ d S )Nz--ASSEMBLY %s)Úx86_64ZAMD64Úi386Úi686Zxorl)rK   rQ   ÚplatformÚmachinerL   r   r   r   Ú_check_dump_assemblyf   s    z"DebugTestBase._check_dump_assemblyN)r"   r#   r$   Úsetr@   r=   rG   rM   rO   rR   rS   rX   rZ   r[   ra   r   r   r   r   r0   5   s     ÿr0   c                   @   s   e Zd ZdZdd„ ZdS )ÚFunctionDebugTestBaser   c              	   C   s:   t ƒ �&}tttjfƒ}|  | d¡d¡ W 5 Q R X | ¡ S )Né   rH   )r   r   r   r
   Úint64ÚassertPreciseEqualÚentry_pointÚgetvalue©r    rD   Úcresr   r   r   Úcompile_simple_nopythonp   s    z-FunctionDebugTestBase.compile_simple_nopythonN)r"   r#   r$   rQ   rk   r   r   r   r   rc   l   s   rc   c                   @   sD   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S )ÚTestFunctionDebugOutputc              	   C   s0   t ddƒ� |  ¡ }W 5 Q R X |  |dg¡ d S )NZDUMP_BYTECODETr1   ©r   rk   rG   rL   r   r   r   Útest_dump_bytecodez   s    z*TestFunctionDebugOutput.test_dump_bytecodec              	   C   s0   t ddƒ� |  ¡ }W 5 Q R X |  |dg¡ d S )NÚDUMP_IRTr3   rm   rL   r   r   r   Útest_dump_ir   s    z$TestFunctionDebugOutput.test_dump_irc              	   C   s0   t ddƒ� |  ¡ }W 5 Q R X |  |dg¡ d S )NZDUMP_CFGTr2   rm   rL   r   r   r   Útest_dump_cfg„   s    z%TestFunctionDebugOutput.test_dump_cfgc              	   C   s0   t ddƒ� |  ¡ }W 5 Q R X |  |dg¡ d S )NZ	DUMP_LLVMTr5   rm   rL   r   r   r   Útest_dump_llvm‰   s    z&TestFunctionDebugOutput.test_dump_llvmc              	   C   s0   t ddƒ� |  ¡ }W 5 Q R X |  |dg¡ d S )NZDUMP_FUNC_OPTTr6   rm   rL   r   r   r   Útest_dump_func_opt_llvmŽ   s    z/TestFunctionDebugOutput.test_dump_func_opt_llvmc              	   C   s0   t ddƒ� |  ¡ }W 5 Q R X |  |dg¡ d S )NZDUMP_OPTIMIZEDTr7   rm   rL   r   r   r   Útest_dump_optimized_llvm“   s    z0TestFunctionDebugOutput.test_dump_optimized_llvmc              	   C   s0   t ddƒ� |  ¡ }W 5 Q R X |  |dg¡ d S )NZDUMP_ASSEMBLYTr8   rm   rL   r   r   r   Útest_dump_assembly˜   s    z*TestFunctionDebugOutput.test_dump_assemblyN)
r"   r#   r$   rn   rp   rq   rr   rs   rt   ru   r   r   r   r   rl   x   s   rl   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚTestGeneratorDebugOutputr   c              	   C   sH   t ƒ �4}tttjtjfƒ}|  t| dd¡ƒddg¡ W 5 Q R X | ¡ S )Nrd   r   )	r   r   r   r
   re   rf   Úlistrg   rh   ri   r   r   r   Úcompile_simple_gen¢   s    &z+TestGeneratorDebugOutput.compile_simple_genc              	   C   sX   t ddƒ� |  ¡ }W 5 Q R X |  |dg¡ |  d| j |¡ t d¡}|  ||¡ d S )Nro   Tr3   z--GENERATOR INFO: %szÜ
            generator state variables: ['x', 'y']
            yield point #1: live variables = ['y'], weak live variables = ['x']
            yield point #2: live variables = [], weak live variables = ['y']
            )r   rx   rG   rK   rQ   ÚtextwrapÚdedent)r    rD   Zexpected_gen_infor   r   r   Útest_dump_ir_generator©   s    
z/TestGeneratorDebugOutput.test_dump_ir_generatorN)r"   r#   r$   rQ   rx   r{   r   r   r   r   rv   ž   s   rv   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚTestDisableJITz:
    Test the NUMBA_DISABLE_JIT environment variable.
    c              
   C   sJ   t ddƒ�6 tƒ �$ tdd�tƒ}|  |dƒd¡ W 5 Q R X W 5 Q R X d S )NÚDISABLE_JITT©Znopythonrd   rH   )r   r   r	   r   rf   )r    Úcfuncr   r   r   Útest_jit»   s    zTestDisableJIT.test_jitc              
   C   sj   t ddƒ�V tƒ �D ttƒtƒ}|ƒ }|  |jd¡ tdd�tƒ}|  ||ƒd¡ W 5 Q R X W 5 Q R X d S )Nr}   Tr   r~   )	r   r   r   Úsimple_class_specr   rf   r   r	   r&   )r    ZSimpleJITClassr%   r   r   r   r   Útest_jitclassÁ   s    zTestDisableJIT.test_jitclassN)r"   r#   r$   Ú__doc__r€   r‚   r   r   r   r   r|   ¶   s   r|   c                   @   s   e Zd ZdZdZdd„ ZdS )ÚTestEnvironmentOverridezN
    Test that environment variables are reloaded by Numba when modified.
    Fc              
   C   s^   |   ¡ }|  |¡ tddƒ�& |   ¡ }|  |ddddddg¡ W 5 Q R X |   ¡ }|  |¡ d S )	NZNUMBA_DEBUGÚ1r3   r4   r5   r6   r7   r8   )rk   ZassertFalser   rG   rL   r   r   r   Ú
test_debugÕ   s    

  þz"TestEnvironmentOverride.test_debugN)r"   r#   r$   rƒ   Ú_numba_parallel_test_r†   r   r   r   r   r„   Í   s   r„   c                   @   s8   e Zd ZdZdZdd„ Zeedd„ ƒƒZedd„ ƒZ	d	S )
ÚTestParforsDebugz5
    Tests debug options associated with parfors
    Fc                 C   s8   d}d}|D ]}|t |jƒkrd} q(q|  |d¡ d S )NzX'parallel=True' was specified but no transformation for parallel execution was possible.FTz Warning message should be found.)ÚstrÚmessageÚ
assertTrue)r    Z	warn_listÚmsgZwarning_foundÚwr   r   r   Úcheck_parfors_warningê   s    z&TestParforsDebug.check_parfors_warningc              	   C   sT   t  t jdd¡}tjdd��$}t dt¡ tt||ft	d�}W 5 Q R X |  
|¡ dS )zr
        Test that using parallel=True on a function that does not have parallel
        semantics warns.
        rd   ÚCT)ÚrecordÚalways©ÚflagsN)r
   ZArrayZfloat64ÚwarningsÚcatch_warningsÚsimplefilterr   r   r+   Úforce_parallel_flagsrŽ   )r    Zarr_tyr�   rj   r   r   r   Ú
test_warnsô   s    
ÿzTestParforsDebug.test_warnsc              
   C   s^  t ttjftd�}tddƒ��6 tƒ �}t ttjftd�}W 5 Q R X | ¡  d¡}dd„ |D ƒ}dd„ |D ƒ}dd„ |D ƒ}t	t
 d	¡ |d
 ¡ d¡ƒ}t||t|ƒ ƒ}d}	d}
t|||	ƒD ]"\}}}|
 ||¡}|  ||¡ qÀ|d |d
 f}	d}
|D ]}|
j|	Ž }|  ||¡ qütjdt|gƒf}	d}
|D ]}|
j|	Ž }|  ||¡ �q2W 5 Q R X dS )zM
        Test that NUMBA_DEBUG_ARRAY_OPT_STATS produces valid output
        r’   ZNUMBA_DEBUG_ARRAY_OPT_STATSr…   Ú
c                 S   s   g | ]}d |kr|‘qS )zis produced from patternr   ©Ú.0r   r   r   r   Ú
<listcomp>  s      z?TestParforsDebug.test_array_debug_opt_stats.<locals>.<listcomp>c                 S   s   g | ]}d |kr|‘qS )zis fused intor   rš   r   r   r   rœ     s      c                 S   s   g | ]}d |kr|‘qS )zAfter fusion, functionr   rš   r   r   r   rœ     s      z	#([0-9]+)r   r   )z"('ones function', 'NumPy mapping'))r   ÚuserÚ z6Parallel for-loop #{} is produced from pattern '{}' atz1Parallel for-loop #{} is fused into for-loop #{}.z:After fusion, function {} has {} parallel for-loop(s) #{}.N)r   r/   r
   re   r—   r   r   rh   ÚsplitÚintÚreÚcompileÚsearchÚgroupÚrangeÚlenÚzipÚformatrK   r"   rb   )r    rj   rD   ÚoutputZparallel_loop_outputZfuse_outputZafter_fusion_outputZparfor_stateZboundsÚpatternÚfmtr.   ZtrialsZlpatternZto_matchr   r   r   Útest_array_debug_opt_stats  sP    	
ÿ
ÿÿÿÿÿÿ
ÿÿ

z+TestParforsDebug.test_array_debug_opt_statsN)
r"   r#   r$   rƒ   r‡   rŽ   r   r   r˜   r¬   r   r   r   r   rˆ   â   s   
rˆ   Ú__main__)5Úosr_   r¡   ry   r”   Únumpyr'   Znumba.tests.supportr   r   r   r   r   r   r   Znumbar	   Z
numba.corer
   r   r   Znumba.core.compilerr   r   Znumba.core.cpur   Znumba.core.errorsr   r   Znumba.experimentalr   Zunittestr   r   Úobjectr   Zint32r�   r&   r+   r/   r—   rT   Znrtr0   rc   rl   rv   r|   r„   rˆ   r"   Úmainr   r   r   r   Ú<module>   sB   $
7&Z
