
    7h.                     $   S r SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSSK	r	SSK
r
SSKJr  SSKJr  SSKrSSKrSSKrSSKJr  SSKJr  \R,                   " S S5      5       r " S	 S
\R0                  R2                  R4                  5      rg)au  Common utilities for testing Dynamo's minifier functionality.

This module provides the base infrastructure for running minification tests in Dynamo.
It includes:
- MinifierTestResult: A dataclass for storing and processing minifier test results
- MinifierTestBase: A base test class with utilities for:
  - Running tests in isolated environments
  - Managing temporary directories and configurations
  - Executing minifier launcher scripts
  - Running and validating reproduction scripts
  - Supporting both compile-time and runtime error testing

The minifier helps reduce failing Dynamo compilations to minimal reproductions.
    N)Optional)patch)_as_posix_path)report_compile_source_on_errorc                   B    \ rS rSr% \\S'   \\S'   S rS rS rS r	Sr
g	)
MinifierTestResult&   minifier_code
repro_codec                     [         R                  " SU5      nUc   S5       eUR                  S5      n[         R                  " SSU[         R                  S9n[         R                  " SSU5      nUR                  5       $ )	Nz3class Repro\(torch\.nn\.Module\):\s+([ ].*\n| *\n)+zfailed to find moduler   z\s+$
)flagsz\n{3,}z

)researchgroupsub	MULTILINEstrip)selftmatchrs       \/var/www/fran/franai/venv/lib/python3.13/site-packages/torch/_dynamo/test_minifier_common.py_get_moduleMinifierTestResult._get_module+   si    		PRST 9"99 KKNFF7D!2<<8FF9fa(wwy    c                 |    Sn[         R                  " XR                  5      nU(       a  UR                  S5      nU$ g )Nz,torch\.export\.load\(\s*["\'](.*?)["\']\s*\)   )r   r   r   r   )r   patternr   	file_paths       r   get_exported_program_path,MinifierTestResult.get_exported_program_path3   s5     B		'??3AIr   c                 8    U R                  U R                  5      $ N)r   r
   r   s    r   minifier_module"MinifierTestResult.minifier_module?   s     2 233r   c                 8    U R                  U R                  5      $ r$   )r   r   r%   s    r   repro_moduleMinifierTestResult.repro_moduleB   s    00r    N)__name__
__module____qualname____firstlineno__str__annotations__r   r!   r&   r)   __static_attributes__r+   r   r   r   r   &   s!    O
41r   r   c                      ^  \ rS rSr\R
                  " 5       r\U 4S j5       r\S 5       r	S r
SS.S jrS rS	SS
.S jrSS.S jrS rS	S.S\\   4S jjrS	rU =r$ )MinifierTestBaseF   c                   > [         TU ]  5         [        R                  R	                  U R
                  5      (       d  [        R                  " 5       U l        U R                  R                  [        R                  R                  R                  U R
                  S95        U R                  R                  [        R                  R                  R                  SSSS.5      5        g )N)debug_dir_rootFr   )pattern_matchercompile_threadszcpp.vec_isa_ok)super
setUpClassospathexists	DEBUG_DIRtempfilemkdtemp_exit_stackenter_contexttorch_dynamoconfigr   	_inductor)cls	__class__s    r   r;   MinifierTestBase.setUpClassI   s    ww~~cmm,,$,,.CM%%MM  &&cmm&D	

 	%%OO""(( (-'(&+		
r   c                     [         R                  " SS5      S:w  a!  [        R                  " U R                  5        O[        SU R                   35        U R                  R                  5         g )NPYTORCH_KEEP_TMPDIR01z%test_minifier_common tmpdir kept at: )r<   getenvshutilrmtreer?   printrB   close)rH   s    r   tearDownClassMinifierTestBase.tearDownClass`   sJ    99*C0C7MM#--(9#--IJr   c                     US;   d   e[         R                  R                  R                  5        S[         R                  R                  R                  5        SUS:X  a  SOS SU< S3$ )N)compile_errorruntime_erroraccuracyr   z
torch._inductor.config.cpucpptritonz .inject_relu_bug_TESTING_ONLY = )rD   rE   rF   codegen_configrG   )r   devicebug_types      r   _gen_codegen_fn_patch_code+MinifierTestBase._gen_codegen_fn_patch_codeh   st    IIII$$& ' (&&( ) *!'5h??_`h_k l 	r   N)cwdc                ^   U(       Gd  [        U5      S:  d   U5       eUS   S:X  d   U5       eUS   S:X  a  [        U5      S:X  d   U5       eUS   nS/nOB[        U5      S:  d   U5       e[        US   5       nUR                  5       nS S S 5        USS  n[        R                  R
                  R                  5       n[        R                  R
                  R                  5       n [        R                  " 5       n[        R                  " U5      n	[        R                  " S5      n
U
R                  U	5         [        [        R                   " 5       5      nUb!  [        U5      n[        R"                  " U5        [%        SU5         ['        5          [)        WS	US
.5        S S S 5        S S S 5        SnU
R1                  U	5        Ub  [        R"                  " W5        [        R                  R3                  5          [        R                  R
                  R5                  U5        [        R                  R
                  R5                  U5        [6        R8                  " UUSUR;                  5       R=                  S5      5      $ Ub  [        U5      n[6        R>                  " USUSS9$ ! , (       d  f       GN)= f! , (       d  f       GN!= f! , (       d  f       GN+= f! [*         a    Sn[,        R.                  " US9   GNOf = f! U
R1                  U	5        Ub  [        R"                  " W5        [        R                  R3                  5         f = f! [        R                  R
                  R5                  U5        [        R                  R
                  R5                  U5        f = f)N   r   python3r   -c   ztorch._dynamozsys.argv__main__)r,   __compile_source__filer   utf-8TF)capture_outputrb   check) lenopenreadrD   rE   rF   get_config_copyrG   ioStringIOloggingStreamHandler	getLogger
addHandlerr   r<   getcwdchdirr   r   exec	Exception	traceback	print_excremoveHandlerresetload_config
subprocessCompletedProcessgetvalueencoderun)r   argsisolaterb   codefdynamo_configinductor_configstderrlog_handlerlogprev_cwdrcs                r   _maybe_subprocess_run&MinifierTestBase._maybe_subprocess_runp   s   t9>'4'>7i'--'Aw$4yA~+t+~Awv4yA~+t+~$q']a668D #ABx "MM00@@BM#oo44DDFOD%33F;''8{+*-biik:H,S1z402P2RT
RV#WX 3S0B
 %%k2* MM'')$$00?&&22?C ..!((1	  $S)>>$tERRe #]. 3S2R00 ! 5B''V45 %%k2* MM'')$$00?&&22?Cs}   ;J.*AM =AK$ KK &K.
K$ 8AM .
J= 
K	
K
K!K$ $ LL LL A
MM AN,c                b   U R                  SSU/X R                  S9n[        SUR                  R	                  S5      5        [        SUR
                  R	                  S5      5        [        R                  " SUR
                  R	                  S5      5      nUb  X4R                  S5      4$ US 4$ )	Nre   rf   r   rb   ztest stdout:rl   ztest stderr:z(\S+)minifier_launcher.pyr   )	r   r?   rR   stdoutdecoder   r   r   r   )r   r   r   procrepro_dir_matchs        r   _run_test_codeMinifierTestBase._run_test_code   s    ))d#W.. * 
 	ndkk009:ndkk009:))($++*<*<W*E
 &..q111Tzr   r+   )minifier_argsrepro_afterc                j   U R                  U5        [        [        R                  R	                  US5      5      n[        U5       nUR                  5       nS S S 5        U R                  [        R                  R                  U5      5        SUS/UQnU(       d  US:w  a  UR                  S5        U R                  XUS9n	[        SU	R                  R                  S5      5        U	R                  R                  S5      n
[        S	U
5        U R                  S
U
5        U	W4$ ! , (       d  f       N= f)Nzminifier_launcher.pyre   minifyaot_inductorz--no-isolater   zminifier stdout:rl   zminifier stderr:z#Input graph did not fail the tester)assertIsNotNoner   r<   r=   joinrp   rq   
assertTruer>   appendr   rR   r   r   r   assertNotIn)r   	repro_dirr   r   r   launch_filer   launch_coder   launch_procr   s              r   _run_minifier_launcher'MinifierTestBase._run_minifier_launcher   s     	Y'$RWW\\)=S%TU+!&&(K {34;A=A;.8 KK'00I0V +"4"4";";G"DE##**73 &)>GK'' s   D$$
D2Tr   c                   U R                  U5        [        [        R                  R	                  US5      5      n[        U5       nUR                  5       nS S S 5        U R                  [        R                  R                  U5      5        U R                  SU/X!S9n[        SUR                  R                  S5      5        [        SUR                  R                  S5      5        UW4$ ! , (       d  f       N= f)Nzrepro.pyre   r   zrepro stdout:rl   zrepro stderr:)r   r   r<   r=   r   rp   rq   r   r>   r   rR   r   r   r   )r   r   r   
repro_filer   r   
repro_procs          r   
_run_reproMinifierTestBase._run_repro   s    Y'#BGGLLJ$GH
*J z23//
#W 0 

 	oz0077@Aoz0077@A:%% s   C--
C;c                 D   SnUS:X  a  SnOU(       a  SU S3nS[        [        R                  R                  R	                  5       5       S[        [        R
                  R                  R	                  5       5       SU SU S	U S
[        U R                  5       SU S3$ )N r   z=torch._inductor.config.aot_inductor.dump_aoti_minifier = Truez$torch._dynamo.config.repro_after = "z
"
        z9import torch
import torch._dynamo
import torch._inductor
r   z$
torch._dynamo.config.repro_level = z3
torch._inductor.config.aot_inductor.repro_level = z(
torch._dynamo.config.debug_dir_root = "z"
)r   rD   rE   rF   r]   rG   r?   )r   run_coder   repro_levelrepro_after_lines        r   _gen_test_codeMinifierTestBase._gen_test_code   s    .(O  $%%0M 2	  $$3356 7 8&&5578 9 :  $$/= 133>- @((6t~~(F'G H	
  	r   )r   returnc                   U(       a  SnOUb  US:X  a  SnOSnU R                  XU5      n[        S[        R                  S9  U R	                  XtS9u  pUc.  U R                  UR                  S5        U R                  U	5        g U R                  X8R                  R                  S	5      5        U R                  U	5        [        S
[        R                  S9  U R                  U	UUUS9u  p[        S[        R                  S9  U R                  XS9u  pU R                  X<R                  R                  S	5      5        U R                  UR                  S5        [        XS9$ )Nrg   AccuracyError   rd   zrunning testrj   r   r   rl   zrunning minifier)r   r   r   zrunning repro)r
   r   )r   rR   sysr   r   assertEqual
returncodeassertIsNoneassertInr   r   r   r   assertNotEqualr   )r   r   r   expected_errorr   r   r   	test_code	test_procr   _minifier_procr
   r   r   s                 r   _run_full_testMinifierTestBase._run_full_test	  sH    K#~'HKK''{K	n3::.#2292N	!Y1115i( 	n&6&6&=&=g&FGY' szz2(,(C(C'#	 )D )
% 	oCJJ/!%!L
n&7&7&>&>w&GHJ1115!UUr   )r,   r-   r.   r/   r@   rA   r?   classmethodr;   rT   r`   r   r   r   r   r   r   r   r   r2   __classcell__)rI   s   @r   r4   r4   F   s      "I
 
,     ;? <SB  464(. 04 &$B PR V	$	% V  Vr   r4   )__doc__dataclassesrs   ru   r<   r   rP   r   r   r@   r}   typingr   unittest.mockr   rD   torch._dynamotorch._dynamo.test_casetorch._dynamo.trace_rulesr   torch.utils._tracebackr   	dataclassr   rE   	test_caseTestCaser4   r+   r   r   <module>r      s~     	  	 	   
        4 A 1 1 1>cVu}}..77 cVr   