Ë
    ÃÓ^jj3  ã                   ó0  — d 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
Z
ddlm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 ddlmZ ej0                   G d„ d	«      «       Z G d
„ dej4                  j6                  j8                  «      Zy)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)ÚSequence)ÚAny)Úpatch)Ú_as_posix_path)Úreport_compile_source_on_errorc                   ó\   — e Zd ZU eed<   eed<   dedefd„Zdedz  fd„Zdefd„Zdefd	„Zy)
ÚMinifierTestResultÚminifier_codeÚ
repro_codeÚtÚreturnc                 ó  — t        j                  d|«      }|€t        d«      ‚|j                  d«      }t        j                  dd|t         j
                  ¬«      }t        j                  dd|«      }|j                  «       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)Úselfr   ÚmatchÚrs       úm/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torch/_dynamo/test_minifier_common.pyÚ_get_modulezMinifierTestResult._get_module*   sh   € Ü—	‘	ÐPÐRSÓTˆØˆ=Ü Ð!8Ó9Ð9Ø�K‰K˜‹NˆÜ�F‰F�7˜D !¬2¯<©<Ô8ˆÜ�F‰F�9˜f aÓ(ˆØ�w‰w‹yÐó    Nc                 ór   — d}t        j                  || j                  «      }|r|j                  d«      }|S y )Nz,torch\.export\.load\(\s*["\'](.*?)["\']\s*\)é   )r   r   r   r   )r   Úpatternr   Ú	file_paths       r   Úget_exported_program_pathz,MinifierTestResult.get_exported_program_path3   s7   € ð Bˆä—	‘	˜' 4§?¡?Ó3ˆáØŸ™ A›ˆIØÐØr   c                 ó8   — | j                  | j                  «      S ©N)r   r
   ©r   s    r   Úminifier_modulez"MinifierTestResult.minifier_module?   s   € Ø×Ñ × 2Ñ 2Ó3Ð3r   c                 ó8   — | j                  | j                  «      S r$   )r   r   r%   s    r   Úrepro_modulezMinifierTestResult.repro_moduleB   s   € Ø×Ñ §¡Ó0Ð0r   )	Ú__name__Ú
__module__Ú__qualname__ÚstrÚ__annotations__r   r"   r&   r(   © r   r   r	   r	   %   sH   … àÓØƒOð˜Sð  Só ð
¨3°©:ó 
ð4 ó 4ð1˜cô 1r   r	   c                   óÖ  ‡ — e Zd Z ej                  «       Zedˆ fd„«       Zedd„«       Zde	de	de	fd„Z
ddœd	ee   d
ede	dz  dej                  e   fd„Zde	d
edeej                  e   e	ez  f   fd„Zdddœde	d
edee   de	dz  deej                  e   e	f   f
d„Zddœde	d
edeej                  e   e	f   fd„Zde	de	dede	fd„Zddœde	de	de	dz  d
edee   dedz  fd„Zˆ xZS )ÚMinifierTestBaser   Nc                 óÌ  •— t         ‰| �  «        t        j                  j	                  | j
                  «      st        j                  «       | _        | j                  j                  t        j                  j                  j                  | j
                  ¬«      «       | j                  j                  t        j                  j                  j                  ddddœ«      «       y )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   r6   zMinifierTestBase.setUpClassI   sŸ   ø€ ä‰ÑÔÜ�w‰w�~‰~˜cŸm™mÔ,Ü$×,Ñ,Ó.ˆCŒMØ�‰×%Ñ%Ü�M‰M× Ñ ×&Ñ&°c·m±mÐ&ÓDô	
ð
 	�‰×%Ñ%Ü�O‰O×"Ñ"×(Ñ(ð (-à'(à&+ñó	õ	
r   c                 óÚ   — t        j                  dd«      dk7  r t        j                  | j                  «       nt        d| j                  › �«       | j                  j                  «        y )NÚPYTORCH_KEEP_TMPDIRÚ0Ú1z%test_minifier_common tmpdir kept at: )r7   ÚgetenvÚshutilÚrmtreer:   Úprintr=   Úclose)rC   s    r   ÚtearDownClasszMinifierTestBase.tearDownClass`   sJ   € ä�9‰9Ð*¨CÓ0°CÒ7Ü�M‰M˜#Ÿ-™-Õ(äÐ9¸#¿-¹-¸ÐIÔJØ�‰×ÑÕr   ÚdeviceÚbug_typec                 óè   — |dvrt        d|›�«      ‚t        j                  j                  j	                  «       › dt        j
                  j                  j	                  «       › d|dk(  rdnd› d|›d�S )	N)Úcompile_errorÚruntime_errorÚaccuracyzDbug_type must be one of compile_error, runtime_error, accuracy, got r   z
torch._inductor.config.ÚcpuÚcppÚtritonz .inject_relu_bug_TESTING_ONLY = )r   r?   r@   rA   Úcodegen_configrB   )r   rO   rP   s      r   Ú_gen_codegen_fn_patch_codez+MinifierTestBase._gen_codegen_fn_patch_codeh   s‰   € ØÐIÑIÜ ØVÐW_ÐVbÐcóð ô ‡�×Ñ×$Ñ$Ó&Ð 'ð (Ü‡�×Ñ×&Ñ&Ó(Ð )ð *Ø!'¨5¢™°hÐ?Ð?_Ð`hÐ_kð lðð 	r   )ÚcwdÚargsÚisolaterZ   c                ój  — ddl m} |�s”t        |«      dk  rt        d|› �«      ‚|d   dk7  rt        d|› �«      ‚|d   dk(  r%t        |«      d	k7  rt        d
|› �«      ‚|d   }dg}nNt        |«      dk  rt        d|› �«      ‚t	        |d   «      5 } ||j                  «       «      }d d d «       |dd  }t        j                  j                  j                  «       }t        j                  j                  j                  «       }	 t        j                  «       }	t        j                  |	«      }
t        j                  d«      }|j!                  |
«       	 t#        t%        j&                  «       «      }|� t#        |«      }t%        j(                  |«       t+        d|«      5  t-        «       5  t/        d|dœ«       d d d «       d d d «       d}|j7                  |
«       |�t%        j(                  «       t        j                  j9                  «        	 t        j                  j                  j;                  |«       t        j                  j                  j;                  |«       t=        j>                  ||d|	jA                  «       jC                  d«      «      S |�t#        |«      }t=        jD                  |d|d¬«      S # 1 sw Y   �ŒxY w# 1 sw Y   �ŒxY w# 1 sw Y   �ŒxY w# t0        $ r d}t3        j4                  |	¬«       Y �Œ?w xY w# |j7                  |
«       |�t%        j(                  «       t        j                  j9                  «        w xY w# t        j                  j                  j;                  |«       t        j                  j                  j;                  |«       w xY w)Nr   )Únormalize_path_separatoré   zexpected at least 2 args, got Úpython3z&expected args[0] to be 'python3', got r   ú-cé   z)expected exactly 3 args for -c mode, got ztorch._dynamozsys.argvÚ__main__)r)   Ú__compile_source__©Úfiler   úutf-8TF)Úcapture_outputrZ   Úcheck)#Útorch._inductor.cpp_builderr^   Úlenr   ÚopenÚreadr?   r@   rA   Úget_config_copyrB   ÚioÚStringIOÚloggingÚStreamHandlerÚ	getLoggerÚ
addHandlerr   r7   ÚgetcwdÚchdirr   r   ÚexecÚ	ExceptionÚ	tracebackÚ	print_excÚremoveHandlerÚresetÚload_configÚ
subprocessÚCompletedProcessÚgetvalueÚencodeÚrun)r   r[   r\   rZ   r^   ÚcodeÚfÚdynamo_configÚinductor_configÚstderrÚlog_handlerÚlogÚprev_cwdÚrcs                 r   Ú_maybe_subprocess_runz&MinifierTestBase._maybe_subprocess_runs   s!  € õ 	IâÜ�4‹y˜1Š}Ü$Ð'EÀdÀVÐ%LÓMÐMØ�A‰w˜)Ò#Ü$Ð'MÈdÈVÐ%TÓUÐUØ�A‰w˜$ŠÜ�t“9 ’>Ü(ØCÀDÀ6ÐJóð ð ˜A‘w�Ø�v‘ä�t“9˜q’=Ü(Ð+IÈ$ÈÐ)PÓQÐQÜ˜$˜q™'“]ð > aá3°A·F±F³HÓ=�D÷>ð ˜A˜B�x�ô "ŸM™M×0Ñ0×@Ñ@ÓBˆMÜ#Ÿo™o×4Ñ4×DÑDÓFˆOðDÜŸ™›�Ü%×3Ñ3°FÓ;�Ü×'Ñ'¨Ó8�Ø—‘˜{Ô+ð*Ü-¬b¯i©i«kÓ:�HØ�Ü,¨SÓ1˜ÜŸ™ œÜ˜z¨4Ó0ñ YÔ2PÓ2Rñ YÜ˜T°
ÐRVÑ#WÔX÷Y÷ Yà�Bð
 ×%Ñ% kÔ2Ø�ÜŸ™ Ô*ô —M‘M×'Ñ'Õ)ä—‘×$Ñ$×0Ñ0°Ô?Ü—‘×&Ñ&×2Ñ2°?ÔCô ×.Ñ.ØØØØ—‘Ó!×(Ñ(¨Ó1ó	ð ð ˆÜ$ SÓ)�Ü—>‘> $°tÀÈEÔRÐR÷g>ñ >ú÷0Yñ Yú÷ Yñ Yûô !ò 5Ø�BÜ×'Ñ'¨V×4Ð4ð5ûð ×%Ñ% kÔ2Ø�ÜŸ™ Ô*ô —M‘M×'Ñ'Õ)ûä—‘×$Ñ$×0Ñ0°Ô?Ü—‘×&Ñ&×2Ñ2°?ÕCús}   ÂKÄAM ÅAK+ Æ#KÆ.KÆ>KÇ
K+ ÇAM ËKËK	ËKËK(Ë#K+ Ë+!LÌL ÌLÌL ÌAMÍM ÍAN2rƒ   c                óh  — | j                  dd|g|| j                  ¬«      }t        d|j                  j	                  d«      «       t        d|j
                  j	                  d«      «       t        j                  d|j
                  j	                  d«      «      }|�||j                  d«      fS |d fS )	Nr`   ra   ©r\   rZ   ztest stdout:rg   ztest stderr:z(\S+)minifier_launcher.pyr   )	rŒ   r:   rL   ÚstdoutÚdecoder‡   r   r   r   )r   rƒ   r\   ÚprocÚrepro_dir_matchs        r   Ú_run_test_codezMinifierTestBase._run_test_code¿   s©   € ð ×)Ñ)Ø˜˜dÐ#¨W¸$¿.¹.ð *ó 
ˆô 	ˆn˜dŸk™k×0Ñ0°Ó9Ô:Üˆn˜dŸk™k×0Ñ0°Ó9Ô:ÜŸ)™)Ø(¨$¯+©+×*<Ñ*<¸WÓ*Eó
ˆð Ð&Ø˜×.Ñ.¨qÓ1Ð1Ð1Ø�TˆzÐr   r.   )Úminifier_argsÚrepro_afterÚ	repro_dirr”   r•   c                ó\  — | j                  |«       t        t        j                  j	                  |d«      «      }t        |«      5 }|j                  «       }d d d «       | j                  t        j                  j                  |«      «       d|dg|¢}|s|dk7  r|j                  d«       | j                  |||¬«      }	t        d|	j                  j                  d«      «       |	j                  j                  d«      }
t        d	|
«       | j                  d
|
«       |	fS # 1 sw Y   ŒÌxY w)Nzminifier_launcher.pyr`   ÚminifyÚaot_inductorz--no-isolaterŽ   zminifier stdout:rg   zminifier stderr:z#Input graph did not fail the tester)ÚassertIsNotNoner   r7   r8   Újoinrl   rm   Ú
assertTruer9   ÚappendrŒ   rL   r�   r�   r‡   ÚassertNotIn)r   r–   r\   r”   r•   Úlaunch_filer„   Úlaunch_coder[   Úlaunch_procr‡   s              r   Ú_run_minifier_launcherz'MinifierTestBase._run_minifier_launcherÐ   s
  € ð 	×Ñ˜YÔ'Ü$¤R§W¡W§\¡\°)Ð=SÓ%TÓUˆÜ�+Óð 	# !ØŸ&™&›(ˆK÷	#ð 	�‰œŸ™Ÿ™ {Ó3Ô4à˜;¨ÐA°=ÐAˆÙ˜;¨.Ò8ð �K‰K˜Ô'Ø×0Ñ0°¸wÈIÐ0ÓVˆÜÐ  +×"4Ñ"4×";Ñ";¸GÓ"DÔEØ×#Ñ#×*Ñ*¨7Ó3ˆÜÐ  &Ô)à×ÑÐ>ÀÔGà˜KÐ'Ð'÷#	#ð 	#ús   ÁD"Ä"D+T©r\   c                óú  — | j                  |«       t        t        j                  j	                  |d«      «      }t        |«      5 }|j                  «       }d d d «       | j                  t        j                  j                  |«      «       | j                  d|g||¬«      }t        d|j                  j                  d«      «       t        d|j                  j                  d«      «       |fS # 1 sw Y   Œ›xY w)Nzrepro.pyr`   rŽ   zrepro stdout:rg   zrepro stderr:)rš   r   r7   r8   r›   rl   rm   rœ   r9   rŒ   rL   r�   r�   r‡   )r   r–   r\   Ú
repro_filer„   r   Ú
repro_procs          r   Ú
_run_reprozMinifierTestBase._run_reproî   sÔ   € ð 	×Ñ˜YÔ'Ü#¤B§G¡G§L¡L°¸JÓ$GÓHˆ
Ü�*Óð 	" ØŸ™›ˆJ÷	"ð 	�‰œŸ™Ÿ™ zÓ2Ô3à×/Ñ/Ø˜
Ð#¨W¸)ð 0ó 
ˆ
ô 	ˆo˜z×0Ñ0×7Ñ7¸Ó@ÔAÜˆo˜z×0Ñ0×7Ñ7¸Ó@ÔAØ˜:Ð%Ð%÷	"ð 	"ús   ÁC1Ã1C:Úrun_codeÚrepro_levelc                 ó8  — d}|dk(  rd}n|rd|› d�}dt        t        j                  j                  j	                  «       «      › dt        t        j
                  j                  j	                  «       «      › d|› d|› d	|› d
t        | j                  «      › d|› d�S )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   r?   r@   rA   rX   rB   r:   )r   r¨   r•   r©   Úrepro_after_lines        r   Ú_gen_test_codezMinifierTestBase._gen_test_code  sÊ   € ØÐØ˜.Ò(àOñ ñ ð$%Ø%0 Mð 2	ð Ððô ”—‘×$Ñ$×3Ñ3Ó5Ó6Ð 7ð 8Ü”—‘×&Ñ&×5Ñ5Ó7Ó8Ð 9ð :ØÐ ð $Ø$/ =ð 13Ø3>°-ð @(Ü(6°t·~±~Ó(FÐ'Gð HØ	€
ð ðð 	r   )r”   Úexpected_errorc                óô  — |rd}n|�|dk(  rd}nd}| j                  |||«      }t        dt        j                  ¬«       | j	                  ||¬«      \  }}	|€.| j                  |j                  d«       | j                  |	«       y | j                  ||j                  j                  d	«      «       | j                  |	«       t        d
t        j                  ¬«       | j                  |	|||¬«      \  }
}t        dt        j                  ¬«       | j                  |	|¬«      \  }}| j                  ||j                  j                  d	«      «       | j                  |j                  d«       t        ||¬«      S )Nrb   ÚAccuracyErroré   r_   zrunning testre   r£   r   rg   zrunning minifier)r\   r”   r•   zrunning repro)r
   r   )r­   rL   Úsysr‡   r“   ÚassertEqualÚ
returncodeÚassertIsNoneÚassertInr�   rš   r¢   r§   ÚassertNotEqualr	   )r   r¨   r•   r®   r\   r”   r©   Ú	test_codeÚ	test_procr–   Ú_minifier_procr
   r¦   r   s                 r   Ú_run_full_testzMinifierTestBase._run_full_test#  sZ  € ñ Ø‰KØÐ# ~¸Ò'HØ‰KàˆKØ×'Ñ'¨°+¸{ÓKˆ	Üˆn¤3§:¡:Õ.Ø#×2Ñ2°9ÀgÐ2ÓNÑˆ	�9ØÐ!à×Ñ˜Y×1Ñ1°1Ô5à×Ñ˜iÔ(Øð 	�‰�n i×&6Ñ&6×&=Ñ&=¸gÓ&FÔGà×Ñ˜YÔ'ÜÐ ¤s§z¡zÕ2Ø(,×(CÑ(CØØØ'Ø#ð	 )Dó )
Ñ%ˆ˜ô 	ˆo¤C§J¡JÕ/Ø!%§¡°ÀG Ó!LÑˆ
�Jà�‰�n j×&7Ñ&7×&>Ñ&>¸wÓ&GÔHØ×Ñ˜J×1Ñ1°1Ô5Ü!°È*ÔUÐUr   )r   N)r)   r*   r+   r;   r<   r:   Úclassmethodr6   rN   r,   rY   r   r   Úboolr~   r   ÚbytesrŒ   Útupler“   r¢   r§   Úintr­   r	   r»   Ú__classcell__)rD   s   @r   r0   r0   F   sß  ø„ Ø �× Ñ Ó"€Iàô
ó ð
ð, ò ó ð ð	°ð 	Àð 	Èó 	ð HLòGSØ˜S‘MðGSØ/3ðGSØ:=À¹*ðGSà	×	$Ñ	$ UÑ	+óGSðXØðØ%)ðà	ˆz×*Ñ*¨5Ñ1°3¸±9Ð<Ñ	=óð, (*Ø"&ò(àð(ð ð(ð
   ‘}ð(ð ˜4‘Zð(ð 
ˆz×*Ñ*¨5Ñ1°3Ð6Ñ	7ó(ð> 26ò&Øð&Ø*.ð&à	ˆz×*Ñ*¨5Ñ1°3Ð6Ñ	7ó&ð* sð ¸ð È3ð ÐSVó ðN (*ò*Vàð*Vð ð*Vð ˜d™
ð	*Vð ð*Vð   ‘}ð*Vð 
˜dÑ	"÷*Vr   r0   )Ú__doc__Údataclassesro   rq   r7   r   rJ   r~   r²   r;   ry   Úcollections.abcr   Útypingr   Úunittest.mockr   r?   Útorch._dynamoÚtorch._dynamo.test_caseÚtorch._dynamo.trace_rulesr   Útorch.utils._tracebackr   Ú	dataclassr	   r@   Ú	test_caseÚTestCaser0   r.   r   r   ú<module>rÎ      s‚   ðñó Û 	Û Û 	Û 	Û Û Û 
Û Û Ý $Ý Ý ã Û Û Ý 4Ý Að ×Ñ÷1ð 1ó ð1ô@GV�u—}‘}×.Ñ.×7Ñ7õ GVr   