U
    zh$&                     @   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Zd dlZd dlZd dl	Z	d dl
mZ d dlmZ d dlZd dlZd dlZd dlmZ e jG dd dZG dd dejjjZdS )	    N)Optional)patch)report_compile_source_on_errorc                   @   s6   e Zd ZU eed< eed< dd Zdd Zdd Zd	S )
MinifierTestResultminifier_code
repro_codec                 C   sP   t d|}|d k	std|d}t jdd|t jd}t dd|}| S )	Nz3class Repro\(torch\.nn\.Module\):\s+([ ].*\n| *\n)+zfailed to find moduler   z\s+$
)flagsz\n{3,}z

)researchAssertionErrorgroupsub	MULTILINEstrip)selftmatchr r   T/var/www/html/venv/lib/python3.8/site-packages/torch/_dynamo/test_minifier_common.py_get_module   s    
zMinifierTestResult._get_modulec                 C   s   |  | jS N)r   r   r   r   r   r   minifier_module"   s    z"MinifierTestResult.minifier_modulec                 C   s   |  | jS r   )r   r   r   r   r   r   repro_module%   s    zMinifierTestResult.repro_moduleN)__name__
__module____qualname__str__annotations__r   r   r   r   r   r   r   r      s
   
r   c                       s   e Zd Ze Ze fddZedd Zdd Z	ddd	d
Z
dd ZddddZddddZdd Zddee dddZ  ZS )MinifierTestBasec                    sF   t    | jtjjj| jd | jtj	jdddd d S )N)Zdebug_dir_rootF   )Zpattern_matcherZcompile_threadszcpp.vec_isa_ok)
super
setUpClass_exit_stackenter_contexttorch_dynamoconfigr   	DEBUG_DIR	_inductorcls	__class__r   r   r$   ,   s    
zMinifierTestBase.setUpClassc                 C   s<   t dddkrt| j ntd| j  | j  d S )NZPYTORCH_KEEP_TMPDIR01z%test_minifier_common tmpdir kept at: )osgetenvshutilrmtreer*   printr%   closer,   r   r   r   tearDownClassA   s    zMinifierTestBase.tearDownClassc                 C   sD   |dkst tjj  dtjj  d|dkr4dnd d|dS )N)Zcompile_errorZruntime_errorZaccuracyr   z
torch._inductor.config.cpucppZtritonz .inject_relu_bug_TESTING_ONLY = )r   r'   r(   r)   codegen_configr+   )r   ZdeviceZbug_typer   r   r   _gen_codegen_fn_patch_codeI   s    

z+MinifierTestBase._gen_codegen_fn_patch_codeN)cwdc             
   C   s  |st |dkst||d dks.t||d dkr^t |dksNt||d }dg}n@t |dksrt|t|d }| }W 5 Q R X |dd  }tjj }tjj }zt
 }t|}	td}
|
|	 zzZt }|d k	rt| td|( t  t|d	|d
 W 5 Q R X W 5 Q R X d}W n& tk
r`   d}tj|d Y nX W 5 |
|	 |d k	rt| tj  X W 5 tjj	| tjj	| X t||d| dS tj|d|ddS d S )N   r   python3r"   -c   ztorch._dynamozsys.argv__main__)r   Z__compile_source__file    utf-8TF)capture_outputr=   check) lenr   openreadr'   r(   r)   Zshallow_copy_dictr+   Zload_configioStringIOloggingStreamHandler	getLogger
addHandlerremoveHandlerr2   chdirresetgetcwdr   r   exec	Exception	traceback	print_exc
subprocessCompletedProcessgetvalueencoderun)r   argsisolater=   codefZdynamo_configZinductor_configstderrZlog_handlerlogZprev_cwdrcr   r   r   _maybe_subprocess_runQ   sR    	



$


z&MinifierTestBase._maybe_subprocess_runc                C   sn   | j dd|g|| jd}td|jd td|jd td|jd}|d k	rf||dfS |d fS )	Nr?   r@   r`   r=   ztest stdout:rF   ztest stderr:z(\S+)minifier_launcher.pyr"   )	rf   r*   r6   stdoutdecoderc   r
   r   r   )r   ra   r`   procZrepro_dir_matchr   r   r   _run_test_code   s       
zMinifierTestBase._run_test_coder   )minifier_argsc          
   	   C   s   |  | tj|d}t|}| }W 5 Q R X | tj| d|df|}|sb|d | j	|||d}t
d|jd |jd}	t
d|	 | d	|	 ||fS )
Nzminifier_launcher.pyr?   Zminifyz--no-isolaterg   zminifier stdout:rF   zminifier stderr:z#Input graph did not fail the tester)assertIsNotNoner2   pathjoinrJ   rK   
assertTrueexistsappendrf   r6   rh   ri   rc   ZassertNotIn)
r   	repro_dirr`   rl   Zlaunch_filerb   Zlaunch_coder_   Zlaunch_procrc   r   r   r   _run_minifier_launcher   s    



z'MinifierTestBase._run_minifier_launcherTr`   c             	   C   s   |  | tj|d}t|}| }W 5 Q R X | tj| | jd|g||d}t	d|j
d t	d|jd ||fS )Nzrepro.pyr?   rg   zrepro stdout:rF   zrepro stderr:)rm   r2   rn   ro   rJ   rK   rp   rq   rf   r6   rh   ri   rc   )r   rs   r`   Z
repro_filerb   r   
repro_procr   r   r   
_run_repro   s    

  zMinifierTestBase._run_reproc                 C   s<   dt jj  dt jj  d| d| d| j d| dS )Nz"import torch
import torch._dynamo
r   z%
torch._dynamo.config.repro_after = "z%"
torch._dynamo.config.repro_level = z(
torch._dynamo.config.debug_dir_root = "z"
)r'   r(   r)   r;   r+   r*   )r   run_coderepro_afterrepro_levelr   r   r   _gen_test_code   s    

zMinifierTestBase._gen_test_code)returnc                C   s  |r
d}n|d ks|dkr d}nd}|  |||}tdtjd | j||d\}}	|d krv| |jd | |	 d S | ||j	d	 | 
|	 td
tjd | j|	||d\}
}tdtjd | j|	|d\}}| ||j	d	 | |jd t||dS )NrA   ZAccuracyError   r>   zrunning testrC   ru   r   rF   zrunning minifier)r`   rl   zrunning repro)r   r   )r{   r6   sysrc   rk   ZassertEqual
returncodeZassertIsNoneZassertInri   rm   rt   rw   ZassertNotEqualr   )r   rx   ry   Zexpected_errorr`   rl   rz   Z	test_codeZ	test_procrs   Zminifier_procr   rv   r   r   r   r   _run_full_test   s2    

  
zMinifierTestBase._run_full_test)r   r   r   tempfilemkdtempr*   classmethodr$   r8   r<   rf   rk   rt   rw   r{   r   r   r   __classcell__r   r   r.   r   r!   )   s   
>r!   )dataclassesrL   rN   r2   r
   r4   rZ   r~   r   rX   typingr   Zunittest.mockr   r'   Ztorch._dynamoZtorch._dynamo.test_caseZtorch.utils._tracebackr   	dataclassr   r(   Z	test_caseZTestCaser!   r   r   r   r   <module>   s$   