ó
    "Eñiæ  ã                   ó�  • % 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J	r	  SSK
JrJr  SSKrSSKJr  SSKJrJr  SSKJr  SSKJr  SS	KJrJrJr  SS
KJrJrJrJrJ r   SSK!J"r"  SSK#J$r$  \(       a  SSK%J&r&  SSK'J(r(  \RR                  " \*5      r+SS/r,Sr-/ q.\/\	   \0S'   / q1\/\	   \0S'   / q2\/\	   \0S'   Sq3Sq4Sq5Sq6Sq7S\84S jr9S\84S jr:S\84S jr;S\84S jr<S\84S jr= " S S5      r>SFS\84S jjr?SFS\84S jjr@SGS \R‚                  S!\BS\R‚                  \C-  4S" jjrDS# rESGS \R‚                  S!\BS\R‚                  \F-  4S$ jjrGS\84S% jrHS&\8S\8S-  4S' jrIS\8S-  4S( jrJS\84S) jrKSqLS* rM " S+ S,5      rN " S- S.\N5      rO " S/ S0\N5      rP " S1 S2\N5      rQ " S3 S4\N5      rR " S5 S6\N5      rSS7 rTS8\NSS4S9 jrUS8\NSS4S: jrVS8\NS\84S; jrW\R°                  R³                  S<S=S>9S?\8SS4S@ j5       rZ\ZR¶                  S?\8SS4SA j5       r\ " SB SC\Rº                  R¼                  5      r_ " SD S\5      r`S\`S-  4SE jrag)Ha”  
DebugMode is a debugging TorchDispatchMode that intercepts and logs runtime calls
to a hierarchical string dump. It logs real tensor, DTensor, and optionally FakeTensor
operations, with some additional handling for DTensor internals.

An example dump from an eager mode DTensor matmul:

    torch.mm(dt$0: f32[8, 8]| S(0), dt$1: f32[8, 32]| S(0))  ->  dt$6: f32[8, 32]| S(0)
      aten::mm(dt$0: f32[8, 8]| S(0), dt$1: f32[8, 32]| S(0))
        redistribute_input(1, S(0) -> R)
          redistribute_input(t$2: f32[1, 32], trace: S(0)->R)
            _c10d_functional::all_gather_into_tensor(t$2: f32[1, 32], 8, 0)  ->  t$3: f32[8, 32]
            _c10d_functional::wait_tensor(t$3: f32[8, 32])  ->  t$3: f32[8, 32]
        aten::mm(t$4: f32[1, 8], t$3: f32[8, 32])  ->  t$5: f32[1, 32]

This mode runs "under" compile, which means it hides itself during compilation, and is re-enabled
at runtime, and DebugMode-related operations won't show up in the compiled region.
DebugMode also provides some visibility into non-torch-dispatch calls (e.g. DTensor redistribute calls,
inductor-generated triton kernels), but requires special handling for these, since dispatch modes
can't intercept them by default.

The mode also provides some extensions for custom debugging (e.g. adding custom dispatch call hooks
via dispatch_hooks), or numerics debugging (e.g. tensor hashing for bitwise equivalence/closeness,
via log_tensor_hashes). These decorators allow annotating string dumps with additional per-call information,
for any region of runtime code.

Usage::

    with DebugMode() as debug_mode:
        result = some_pytorch_operation(tensor_input)
    print(debug_mode.debug_string())
é    N)ÚCallable)ÚAnyÚTYPE_CHECKING)Úwarning_once)Ú
FakeTensorÚFakeTensorMode)Ú_parse_stack_trace)Údtype_abbrs)Ú_get_current_dispatch_modeÚ _get_current_dispatch_mode_stackÚTorchDispatchMode)ÚkeystrÚtree_allÚtree_mapÚtree_map_onlyÚtree_map_with_path)ÚCapturedTraceback)Ú	WeakIdRef)ÚDeviceInterface©Ú
ModTrackerÚ	DebugModeÚget_active_debug_modeÚredistribute_inputÚ_DISPATCH_RECORD_HOOKSÚ_DISPATCH_LOG_HOOKSÚ_DISPATCH_PRE_LOG_HOOKSFÚreturnc           	      ój   • SSR                  U  Vs/ s H  n[        U5      PM     sn5       S3$ s  snf ©NÚ[ú, Ú]©ÚjoinÚstr)ÚshapeÚxs     ÚT/home/mande/repo/quber/.venv/lib/python3.13/site-packages/torch/utils/_debug_mode.pyÚ_stringify_shaper*   _   s1   € Øˆt�y‰y©%Ó0ª% Qœ#˜až&©%Ñ0Ó1Ð2°!Ð4Ð4ùÒ0ó   ‘0
c           	      ó~   • SSR                  U R                   Vs/ s H  n[        U5      PM     sn5       S3$ s  snf )NzDM(r"   Ú))r%   r'   r&   )ÚmeshÚss     r)   Ú_stringify_device_meshr0   c   s5   € Ø�—‘¨D¯JªJÓ7ªJ qœC žF©JÑ7Ó8Ð9¸Ð;Ð;ùÒ7s   ›:
c           	      ój   • SSR                  U  Vs/ s H  n[        U5      PM     sn5       S3$ s  snf r    r$   )Ú	placementÚps     r)   Ú_stringify_placementr4   g   s1   € Øˆt�y‰y©)Ó4ª) Qœ#˜až&©)Ñ4Ó5Ð6°aÐ8Ð8ùÒ4r+   c           
      óü   • 0 nU H"  n[        X5      (       d  M  [        X5      X#'   M$     [        U5      S:X  a  gSSR                  UR	                  5        VVs/ s H  u  pEU SU 3PM     snn5       S3$ s  snnf )Nr   Ú Ú{r"   Ú=Ú})ÚhasattrÚgetattrÚlenr%   Úitems)ÚtensorÚ
attributesÚpairsÚattrÚkÚvs         r)   Ú_stringify_attributesrD   k   su   € Ø€EÛˆÜ�6× Ó Ü! &Ó/ˆE‹Kñ ô ˆ5ƒz�QƒØØ�—	‘	°%·+±+´-Ô@²-©$¨!˜a˜S  ! ›:±-Ò@ÓAÐBÀ"ÐEÐEùÓ@s   ÁA8c                 óZ   • SSK Jn  UR                  U R                  U R                  5      $ )Nr   ©ÚDTensorSpec)Ú&torch.distributed.tensor._dtensor_specrG   Úformat_shard_order_strÚ
placementsÚshard_order)ÚspecrG   s     r)   Ú_stringify_dtensor_specrM   u   s"   € ÝBà×-Ñ-¨d¯o©o¸t×?OÑ?OÓPÐPó    c                   ó,   • \ rS rSrSS jrS\4S jrSrg)ÚTensorIdTrackeré{   r   Nc                 ó    • 0 U l         SU l        g ©Nr   )Útensor_memoÚnext_tensor_id©Úselfs    r)   Ú__init__ÚTensorIdTracker.__init__|   s   € Ø13ˆÔØˆÕrN   c                 óf  ^ ^• [         R                  R                  5          [        U5      mSUU 4S jjn[        R
                  " X5        TT R                  ;  a.  T R                  T R                  T'   T =R                  S-  sl        T R                  T   sS S S 5        $ ! , (       d  f       g = f)Nc                  ó>   >• TR                   R                  T S 5        g ©N)rT   Úpop)ÚorW   s   €€r)   Údel_memoÚ%TensorIdTracker._id.<locals>.del_memo„   s   ø€ Ø× Ñ ×$Ñ$ Q¨Õ-rN   é   ©r   N)ÚtorchÚ_CÚ_DisablePythonDispatcherr   ÚweakrefÚfinalizerT   rU   )rW   r>   r_   r^   s   `  @r)   Ú_idÚTensorIdTracker._id€   s†   ù€ Ü�X‰X×.Ñ.Õ0Ü˜&Ó!ˆA÷.ð .ô ×Ò˜VÔ.Ø˜×(Ñ(Ó(Ø&*×&9Ñ&9�× Ñ  Ñ#Ø×#Ò# qÑ(Õ#Ø×#Ñ# AÑ&÷ 1×0×0ús   ¡A7B"Â"
B0)rU   rT   rb   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__rX   Úintrh   Ú__static_attributes__© rN   r)   rP   rP   {   s   † ô ð'˜S÷ 'rN   rP   c                 óö  • [        U [        R                  5      (       aÄ  [        U R                      [        U R                  5       [        X5       3nUb  SUR                  U 5       3OSn[        U [        R                  R                  R                  5      (       a  SU SU S[        U R                  5       3$ [        U [        5      (       a  SU SU 3$ SU SU 3$ [        S[!        U 5       35      e)	z.Convert tensor to debug string representation.Ú$r6   Údtú: z| ÚftÚtzUnsupported tensor type: )Ú
isinstancerc   ÚTensorr
   Údtyper*   r'   rD   rh   Údistributedr>   ÚDTensorrM   Ú_specr   ÚRuntimeErrorÚtype)r>   r?   rT   Útensor_debug_strÚid_strs        r)   Ú_tensor_debug_stringr�   Ž   s   € ô �&œ%Ÿ,™,×'Ñ'Ü)¨&¯,©,Ñ7Ð8Ô9IÈ&Ï,É,Ó9WÐ8XÔYnÐouó  ZCð  YDð  EÐØ2=Ñ2I�1�[—_‘_ VÓ,Ð-Ñ.ÈrˆÜ�fœe×/Ñ/×6Ñ6×>Ñ>×?Ñ?à˜�x˜rÐ"2Ð!3°2Ô6MÈfÏlÉlÓ6[Ð5\Ð]Ð]Ü˜¤
×+Ñ+Ø˜�x˜rÐ"2Ð!3Ð4Ð4à�v�h˜bÐ!1Ð 2Ð3Ð3äÐ6´t¸F³|°nÐEÓFÐFrN   c                 óP   ^^^• SSK Jm  UUU4S jn[        X05      n [        U 5      $ )Nr   rF   c                 ó˜   >• [        U [        R                  5      (       a  [        U TT5      $ [        U T5      (       a  [	        U 5      $ U $ r\   )rw   rc   rx   r�   rM   )r(   rG   r?   rT   s    €€€r)   Úto_strÚ_arg_to_str.<locals>.to_str¢   s@   ø€ Ü�aœŸ™×&Ñ&Ü'¨¨:°{ÓCÐCÜ˜˜;×'Ñ'Ü*¨1Ó-Ð-ØˆrN   )rH   rG   r   r&   )Úargr?   rT   r„   rG   s    `` @r)   Ú_arg_to_strr‡   Ÿ   s    ú€ ÝB÷ô �6Ó
€CÜˆs‹8€OrN   rv   Ú
use_scalarc                 ó
  • [         R                  R                  5          U R                  5       (       d%  U R	                  5       (       d  U R                  5       n U R                  5       n U R	                  5       (       a  U R                  [         R                  S9nOU R                  [         R                  S9nUR                  SS9nU(       a  UR                  5       sSSS5        $ UsSSS5        $ ! , (       d  f       g= f)a  
from Observer. Computes a hash for a tensor by converting it to float (if needed), making it contiguous,
replacing NaN/inf values with fixed numbers, and then computing the L1 norm in float64 or complex128.
This is used to generate a deterministic summary value for tensor comparison.
©ry   ra   )r3   N)rc   rd   re   Úis_floating_pointÚ
is_complexÚfloatÚ
contiguousÚtoÚ
complex128Úfloat64ÚnormÚitem)rv   rˆ   Út_floatÚouts       r)   Únorm_hash_fnr–   ­   s­   € ô 
�‰×	*Ñ	*Õ	,Ø×#Ñ#×%Ñ%¨¯©¯©Ø—‘“	ˆAØ�L‰L‹Nˆà�<‰<�>‰>Ø—d‘d¤×!1Ñ!1�dÐ2‰Gà—d‘d¤§¡�dÐ/ˆGà�l‰l˜QˆlÐˆÞØ—8‘8“:÷ 
-Ñ	,ð ÷ 
-×	,×	,ús   ŸC C4Ã)C4Ã4
Dc                 ób   • [        X-
  5      n[        [        U 5      [        U5      S5      nX#-  $ )Ng»½×Ùß|Û=)ÚabsÚmax)Úhash1Úhash2Ú	numeratorÚdenominators       r)   Ú_compute_rel_diffrž   Ã   s-   € ä�E‘MÓ"€IÜ”c˜%“j¤# e£*¨eÓ4€KØÑ"Ð"rN   c                 ó¬  • [        U [        R                  R                  R                  5      (       a  U R                  5       n U R                  5       (       a  U R                  [        R                  S9nOmU R                  5       (       a;  U R                  [        R                  S9R                  [        R                  5      nOU R                  [        R                  S9nU R                  5       S:”  a  [        R                  " U5      nO.[        R                  " SUR                   [        R"                  S9nU(       a  UR%                  5       $ U$ )z 
wrapper over torch.hash_tensor
rŠ   r   rp   )Údevicery   )rw   rc   rz   r>   r{   Úto_localr‹   r�   r‘   rŒ   r�   ÚviewÚint64ÚnumelÚhash_tensorÚzerosr    Úuint64r“   )rv   rˆ   Út_cleanr•   s       r)   Úhash_tensor_fnr©   Ê   sà   € ô �!”U×&Ñ&×-Ñ-×5Ñ5×6Ñ6Ø�J‰J‹Lˆà×Ñ×ÑØ—$‘$œUŸ]™]�$Ð+‰Ø	
�‰�‰Ø—$‘$œU×-Ñ-�$Ð.×3Ñ3´E·M±MÓB‰à—$‘$œUŸ[™[�$Ð)ˆà‡w�wƒy�1ƒ}Ü×Ò Ó(‰ä�kŠk˜" W§^¡^¼5¿<¹<ÑHˆæØ�x‰x‹zÐØ€JrN   c                  ó4  • SSK Jn   [        R                  " 5       R	                  5       nUS S nU Vs/ s H  o"R
                  U " 5       ;  d  M  UPM     nn[        R                  R                  U5      nSR                  UR                  5       5      $ s  snf )Nr   )Úuninteresting_fileséüÿÿÿr6   )Ú%torch.fx.experimental.symbolic_shapesr«   r   ÚextractÚsummaryÚfilenameÚ	tracebackÚStackSummaryÚ	from_listr%   Úformat)r«   r¯   Úframes      r)   Ú_get_stack_tracer¶   â   sƒ   € ÝIä×'Ò'Ó)×1Ñ1Ó3€GØ�c�rˆl€Gá"óÚ"�%§n¡nÑ<OÓ<QÑ&Q�™7ð ð ô ×$Ñ$×.Ñ.¨wÓ7€GØ�7‰7�7—>‘>Ó#Ó$Ð$ùò	s   ³BÁBÚstack_trace_strc                 ó  ^• [         R                  R                  [        R                  " [
        5      5      mU4S jn[        XS9nU(       a6  SUR                   SUR                   SUR                   SUR                   3$ g )Nc                 óf   >• U R                  T[        R                  R                  -   5      (       + $ r\   )Ú
startswithÚosÚpathÚsep)ÚfileÚnameÚcodeÚ	torch_dirs      €r)   Ú<lambda>Ú'_get_user_stack_trace.<locals>.<lambda>ñ   s   ø€ ¨T¯_©_¸YÌÏÉÏÉÑ=TÓ-UÕ)UrN   )Ú	filter_fnzFile: Ú:z in z, code: )r»   r¼   ÚdirnameÚinspectÚgetfilerc   r	   r¾   Úlinenor¿   rÀ   )r·   rÄ   ÚtracerÁ   s      @r)   Ú_get_user_stack_tracerË   î   sb   ø€ ä—‘—‘¤§¢´Ó 6Ó7€IÜU€IÜ˜ÑD€EÞØ˜Ÿ
™
�| 1 U§\¡\ N°$°u·z±z°lÀ(È5Ï:É:È,ÐWÐWØrN   c                  óà   • [         R                  R                  5       bO  [         R                  R                  5       R                  R	                  S5      n U (       a  SR                  U 5      $ g )NÚ
traceback_r6   )rc   rd   Ú_current_autograd_nodeÚmetadataÚgetr%   )Útbs    r)   Ú_maybe_get_autograd_tracerÒ   ø   sL   € Ü‡x�x×&Ñ&Ó(Ñ4Ü�X‰X×,Ñ,Ó.×7Ñ7×;Ñ;¸LÓIˆÞØ—7‘7˜2“;ÐØrN   c                 ó  • [        U [        R                  R                  5      (       a  U R                  nU$ [        U S5      (       a.  [        U S5      (       a  U R                   SU R                   3nU$ [        U 5      nU$ )Nrk   rj   Ú.)	rw   rc   Ú_opsÚ
OpOverloadrl   r:   rk   rj   r&   )ÚopÚop_names     r)   Ú_get_op_namerÙ      ss   € Ü�"”e—j‘j×+Ñ+×,Ñ,Ø—/‘/ˆð
 €Nô	 
��\×	"Ñ	"¤w¨r°:×'>Ñ'>Ø—]‘]�O 1 R§[¡[ MÐ2ˆð €Nô �b“'ˆØ€NrN   c                  ó’  • [         (       d¼  [        R                  R                  [        R
                  5      [        l        SSKJn   U R                  [        R                  R                  R                  R                  5        SSKJn  U" [        R                  R                  R                  5      S[        SS4S j5       nSq gg)	zr
Lazily apply dont_skip_tracing decorator to DebugMode._annotate, to avoid circular import/initialization issues.
r   )Ú_side_effectful_functions)Úregister_loweringÚtagr   Nc                 ó$   • [        [        S5        g )Nz7DebugMode._annotate() is a no-op for backend="inductor")r   Úlog©rÝ   s    r)   Ú_annotate_loweringÚ6_ensure_annotate_decorated.<locals>._annotate_lowering  s   € äœÐWÔXØrN   T)Ú_annotate_decoratedrc   Ú_dynamoÚdont_skip_tracingr   Ú	_annotateÚtorch.fx.noderÛ   ÚaddÚopsÚdebug_mode_opsÚannotateÚdefaultÚtorch._inductor.loweringrÜ   r&   )rÛ   rÜ   rá   s      r)   Ú_ensure_annotate_decoratedrî     s—   € ÷
 ÒÜ#Ÿm™m×=Ñ=¼i×>QÑ>QÓRŒ	Ôõ 	<à!×%Ñ%¤e§i¡i×&>Ñ&>×&GÑ&G×&OÑ&OÔPõ 	?á	œ5Ÿ9™9×3Ñ3×<Ñ<Ó	=ð	¤Cð 	¨Dó 	ó 
>ð	ð #Ñð! rN   c                   óÚ   • \ rS rSrSr   SS\S\\\4   S-  S\\\4   S-  S\	SS4
S	 jjr
 SS
\\   S\S-  SS4S jjr SS\S
\\   S\S-  SS4S jjrS
\\   S\4S jrS\4S jrSrg)Ú
_DebugCalli%  z3Base class for tracking operator calls in DebugModeNÚ
call_depthÚrecordrß   Ústackr   c                 ó€   • Xl         U(       a  [        5       U l        [        5       U l        X l        X0l        S U l        g r\   )rñ   r¶   Ústack_tracerÒ   Úfwd_stack_tracerò   rß   Ú
output_str)rW   rñ   rò   rß   ró   s        r)   rX   Ú_DebugCall.__init__(  s5   € ð %ŒÞÜ/Ó1ˆDÔÜ#<Ó#>ˆDÔ ð ŒØŒØ&*ˆ�rN   r?   rT   c                 ó   • [        S5      e)zy
To reduce memory consumption, this method stringifies args/kwargs, stores the result, and deletes original args/kwargs.
z9Subclasses must implement stringify_args(), even if no-op©ÚNotImplementedError©rW   r?   rT   s      r)   Ústringify_argsÚ_DebugCall.stringify_args9  s   € ô "ØGó
ð 	
rN   Úoutputc                 óv   ^^• [        S U5      (       a  g[        UU4S jU5      nS[        U5       3U l        g)z;Store stringified version of call output in self.output_strc                 ó
   • U S L $ r\   rp   ©r(   s    r)   rÂ   Ú-_DebugCall.stringify_output.<locals>.<lambda>J  s   € ˜a 4™irN   Nc                 ó   >• [        U TT5      $ r\   ©r‡   )r(   r?   rT   s    €€r)   rÂ   r  L  s   ø€ ¬°A°zÀ;Ô(OrN   z  ->  )r   r   r&   r÷   )rW   rÿ   r?   rT   r÷   s     `` r)   Ústringify_outputÚ_DebugCall.stringify_outputC  s7   ù€ ô Ñ'¨×0Ñ0ØÜÕOÐQWÓXˆ
Ø"¤3 z£?Ð"3Ð4ˆ�rN   c                 ó   • [        S5      e)Nz)Subclasses must implement string render()rú   ©rW   r?   s     r)   ÚrenderÚ_DebugCall.renderO  s   € Ü!Ð"MÓNÐNrN   c                 ó$   • U R                  / 5      $ r\   )r
  rV   s    r)   Ú__repr__Ú_DebugCall.__repr__R  s   € Ø�{‰{˜2‹ÐrN   )rñ   rö   rß   r÷   rò   rõ   )NNFr\   )rj   rk   rl   rm   Ú__doc__rn   Údictr&   r   ÚboolrX   ÚlistrP   rý   r  r
  r  ro   rp   rN   r)   rð   rð   %  së   † Ù=ð
 )-Ø%)Øñ+àð+ð �S˜#�X‘ Ñ%ð+ð �#�s�(‰^˜dÑ"ð	+ð
 ð+ð 
õ+ð$ LPñ
Ø˜s™)ð
Ø2AÀDÑ2Hð
à	õ
ð /3ñ	
5àð
5ð ˜‘Ið
5ð % tÑ+ð	
5ð
 
õ
5ðO  c¡ð O¨sô Oð˜#÷ rN   rð   c                   ó�   ^ • \ rS rSrSr SS\S\S\S\SS4
U 4S	 jjjr	 SS
\
\   S\S-  SS4S jjrS
\
\   S\4S jrS rSrU =r$ )Ú_OpCalliV  zNormal operator callÚargsÚkwargsrñ   ró   r   Nc                 ó`   >• [         TU ]  XES9  Xl        X l        X0l        S U l        S U l        g ©N©ró   )ÚsuperrX   r×   r  r  Úargs_strÚ
kwargs_str)rW   r×   r  r  rñ   ró   Ú	__class__s         €r)   rX   Ú_OpCall.__init__Y  s2   ø€ ô 	‰Ñ˜ÐÑ1ØŒØŒ	ØŒà$(ˆŒØ&*ˆ�rN   r?   rT   c                 ó  ^^• SR                  UU4S jU R                   5       5      U l        U R                  (       a=  SSR                  UU4S jU R                  R	                  5        5       5      -   U l        OSU l        U ?U ?g )Nr"   c              3   ó>   >#   • U  H  n[        UTT5      v •  M     g 7fr\   r  )Ú.0r†   r?   rT   s     €€r)   Ú	<genexpr>Ú)_OpCall.stringify_args.<locals>.<genexpr>l  s    øé € ð "
ÚAJ¸#ŒK˜˜Z¨×5Ð5Âùs   ƒc              3   óL   >#   • U  H  u  pU S [        UTT5       3v •  M     g7f©r8   Nr  ©r!  rB   rC   r?   rT   s      €€r)   r"  r#  p  s/   øé € ð /â/‘D�Að �#�Q”{ 1 j°+Ó>Ð?Õ@Ú/ùó   ƒ!$r6   )r%   r  r  r  r=   r  rü   s    ``r)   rý   Ú_OpCall.stringify_argsi  ss   ù€ ð Ÿ	™	õ "
ØAEÇÂó"
ó 
ˆŒð �;�;Ø" T§Y¡Yõ /à ŸK™K×-Ñ-Ô/ó/ó &ñ ˆD�Oð
 !ˆDŒOØˆIØ‰KrN   c                 óp  ^• U R                   b  U R                   nO%SR                  U4S jU R                   5       5      nU R                  b  U R                  nOJU R                  (       a7  SSR                  U4S jU R                  R                  5        5       5      -   nOSn[        U R                  [        R                  R                  5      (       a  U R                  R                  nO{[        U R                  S5      (       aK  [        U R                  S5      (       a0  U R                  R                   SU R                  R                   3nO[        U R                  5      nU SU U S	3nU R                   (       a  XPR                   -  nU R"                  (       a  US
U R"                   3-  nU$ )Nr"   c              3   ó<   >#   • U  H  n[        UT5      v •  M     g 7fr\   r  )r!  r†   r?   s     €r)   r"  Ú!_OpCall.render.<locals>.<genexpr>}  s   øé € Ð SÊÀ#¤¨S°*×!=Ð!=Êùs   ƒc              3   óJ   >#   • U  H  u  pU S [        UT5       3v •  M     g7fr%  r  )r!  rB   rC   r?   s      €r)   r"  r+  ƒ  s*   øé € ð .ÚDW¹D¸A�q�c˜œ; q¨*Ó5Ð6Õ7ÒDWùs   ƒ #r6   rk   rj   rÔ   Ú(r-   z  # )r  r%   r  r  r  r=   rw   r×   rc   rÕ   rÖ   rl   r:   rk   rj   r&   r÷   rß   )rW   r?   r  r  rØ   Úbase_strs    `    r)   r
  Ú_OpCall.rendery  sF  ø€ Ø�=‰=Ñ$Ø—}‘}‰Hà—y‘yÔ SÈÏÊÓ SÓSˆHà�?‰?Ñ&ØŸ™‰Jà�{�{Ø! D§I¡Iô .ØDHÇKÁK×DUÑDUÔDWó.ó %ñ ‘
ð  �
ä�d—g‘gœuŸz™z×4Ñ4×5Ñ5Ø—g‘g×*Ñ*‰GÜ�T—W‘W˜l×+Ñ+´¸¿¹À×0LÑ0LØŸ™×+Ñ+Ð,¨A¨d¯g©g×.>Ñ.>Ð-?Ð@‰Gä˜$Ÿ'™'“lˆGà�Y˜a ˜z¨*¨°QÐ7ˆà�?�?ØŸ™Ñ'ˆHØ�8�8Ø˜$˜tŸx™x˜jÐ)Ñ)ˆHØˆrN   c              #   ó  #   • U R                   b7  U R                  U R                   U R                  U R                  / S h  v•N   g U R                  U R                  U R
                  U R                  / S h  v•N   g  N< N7fr\   )r  r×   r  rñ   r  r  rV   s    r)   Ú__iter__Ú_OpCall.__iter__˜  s\   é € à�=‰=Ñ$ØŸ™ §¡°·±ÀÇÁÐQ×QÑQàŸ™ §¡¨D¯K©K¸¿¹ÐI×IÑIñ RáIùs#   ‚?BÁA>Á6BÁ8B Á9BÂ B)r  r  r  r  r×   ©Fr\   )rj   rk   rl   rm   r  Útupler  rn   r  rX   r  r&   rP   rý   r
  r1  ro   Ú__classcell__©r  s   @r)   r  r  V  s—   ø† Ùð ñ+ð ð+ð ð	+ð
 ð+ð ð+ð 
÷+ð +ð" LPñØ˜s™)ðØ2AÀDÑ2Hðà	õð   c¡ð ¨sô ÷>Jð JrN   r  c                   ó|   ^ • \ rS rSr  S SU 4S jjjr SS\\   S\S-  SS4S jjrS\\   S\4S jr	S	 r
S
rU =r$ )Ú_RedistributeCalli   r   Nc                 ó”   >• [         TU ]  XVS9  Xl        X l        X0l        X@l        Xpl        [        U[        5      U l	        S U l
        g r  )r  rX   r†   Úsrc_placementÚdst_placementÚtransform_info_strÚis_explicitrw   rn   Úis_outer_callÚarg_str)	rW   r†   r:  r;  r<  rñ   ró   r=  r  s	           €r)   rX   Ú_RedistributeCall.__init__¡  sH   ø€ ô 	‰Ñ˜ÐÑ1ØŒØ*ÔØ*ÔØ"4ÔØ&ÔÜ'¨¬SÓ1ˆÔà#'ˆ�rN   r?   rT   c                 ó@   • [        U R                  X5       U l        U ?g r\   )r‡   r†   r?  rü   s      r)   rý   Ú _RedistributeCall.stringify_argsµ  s   € ô & d§h¡h°
ÓHÐIˆŒØ‰HrN   c                 ó¼  • U R                   b  U R                   nO[        U R                  U5       nU R                  b  SU R                   3nO3[        U R                  U5      n[        U R
                  U5      nU SU 3nU R                  (       a  SnOU R                  (       a  SnOSn[         U SU SU S3nU R                  (       a  XpR                  -  nU$ )	Nztrace: z -> z [implicit] z [explicit] r6   r-  r"   r-   )
r?  r‡   r†   r<  r:  r;  r>  r=  ÚREDISTRIBUTE_FUNCr÷   )rW   r?   r?  Úplacement_strÚsrc_placement_strÚdst_placement_strÚ
annotationr.  s           r)   r
  Ú_RedistributeCall.render»  sØ   € Ø�<‰<Ñ#Ø—l‘l‰Gä$ T§X¡X¨zÓ:Ð;ˆGà×"Ñ"Ñ.Ø% d×&=Ñ&=Ð%>Ð?‰Mä +¨D×,>Ñ,>À
Ó KÐÜ +¨D×,>Ñ,>À
Ó KÐØ0Ð1°Ð6GÐ5HÐIˆMð
 ××Ø'‰JØ××Ø'‰JàˆJä'Ð(¨¨°A°g°Y¸bÀÀÈqÐQˆØ�?�?ØŸ™Ñ'ˆHØˆrN   c              #   ó  #   • U R                   b  U R                   nOU R                  n[        v •  U R                  (       a  XR                  /v •  OXR                  U R
                  /v •  0 v •  U R                  v •  g 7fr\   )r?  r†   rD  r<  r:  r;  rñ   )rW   r†   s     r)   r1  Ú_RedistributeCall.__iter__×  se   é € à�<‰<Ñ#Ø—,‘,‰Cà—(‘(ˆCäÒØ×"×"Ø×/Ñ/Ð0Ó0à×*Ñ*¨D×,>Ñ,>Ð?Ò?ØŠØ�o‰oÓùs   ‚A=A?)r†   r?  r;  r=  r>  r:  r<  )FFrb   r\   )rj   rk   rl   rm   rX   r  r&   rP   rý   r
  r1  ro   r5  r6  s   @r)   r8  r8     sm   ø† ð Øð(ð 
÷(ð (ð* LPñØ˜s™)ðØ2AÀDÑ2Hðà	õð  c¡ð ¨sô ÷8ð rN   r8  c                   ó|   ^ • \ rS rSrSrS\S\SS4U 4S jjr SS\\   S	\	S-  SS4S
 jjr
S\\   S\4S jrSrU =r$ )Ú_OutputPlacementCalliç  z*Records output placement for a DTensor op.Úplacements_strrñ   r   Nc                 ó0   >• [         TU ]  U5        Xl        g r\   )r  rX   rN  )rW   rN  rñ   r  s      €r)   rX   Ú_OutputPlacementCall.__init__ê  s   ø€ Ü‰Ñ˜Ô$Ø,ÕrN   r?   rT   c                 ó   • g r\   rp   rü   s      r)   rý   Ú#_OutputPlacementCall.stringify_argsî  s   € ð 	rN   c                 ó    • SU R                    3$ )Nz-> output: ©rN  r	  s     r)   r
  Ú_OutputPlacementCall.renderó  s   € Ø˜T×0Ñ0Ð1Ð2Ð2rN   rT  r\   )rj   rk   rl   rm   r  r&   rn   rX   r  rP   rý   r
  ro   r5  r6  s   @r)   rM  rM  ç  si   ø† Ù4ð- sð -¸ð -À÷ -ð
 LPñØ˜s™)ðØ2AÀDÑ2Hðà	õð
3  c¡ð 3¨s÷ 3ò 3rN   rM  c                   ó–   ^ • \ rS rSrSrS\S\\\4   S\4U 4S jjr	 SS\
\   S	\S-  S
S4S jjrS\
\   S
\4S jrSS jrS rSrU =r$ )Ú_TritonKernelCalli÷  z Triton kernel call from InductorÚkernel_namer  rñ   c                 óf   >• [         TU ]  U5        Xl        X l        S U l        S U l        S U l        g r\   )r  rX   rX  r  r  Ú
pre_hashesÚpost_hashes)rW   rX  r  rñ   r  s       €r)   rX   Ú_TritonKernelCall.__init__ú  s3   ø€ ô 	‰Ñ˜Ô$Ø&ÔØŒØ&*ˆŒà15ˆŒØ26ˆÕrN   Nr?   rT   r   c                 óˆ  ^^• [         =n(       a[  U R                  R                  5        VVs0 s H.  u  pE[        U[        R
                  5      (       d  M&  XC" U5      _M0     snnU l        U R                  (       a:  SR                  UU4S jU R                  R                  5        5       5      U l        g SU l        g s  snnf )Nr"   c              3   óL   >#   • U  H  u  pU S [        UTT5       3v •  M     g7fr%  r  r&  s      €€r)   r"  Ú3_TritonKernelCall.stringify_args.<locals>.<genexpr>  s/   øé € ð (â/‘D�Að �#�Q”{ 1 j°+Ó>Ð?Õ@Ú/ùr'  r6   )	Ú_TRITON_INPUT_HASH_FNr  r=   rw   rc   rx   rZ  r%   r  )rW   r?   rT   Úhash_fnrB   rC   s    ``   r)   rý   Ú _TritonKernelCall.stringify_args  s™   ù€ ô
 ,Ð+ˆ7Õ+ð !ŸK™K×-Ñ-Ô/ôâ/‘D�AÜ˜a¤§¡×.ó ��7˜1“:’Ù/òˆDŒOð �;�;Ø"Ÿi™iõ (à ŸK™K×-Ñ-Ô/ó(ó ˆD�Oð
 !ˆD�Oùós   ­%B>ÁB>c                 óÂ  • SU R                    SU R                   S3nU R                  (       aJ  SR                  S U R                  R	                  5        5       5      nSSU R
                  -  -   SU S	3-   nOS
nU R                  (       aJ  SR                  S U R                  R	                  5        5       5      nSSU R
                  -  -   SU S	3-   nOS
nU U U S3$ )Nz	[triton] r-  r-   r"   c              3   ó4   #   • U  H  u  pU S U 3v •  M     g7f©rt   Nrp   ©r!  rB   rC   s      r)   r"  Ú+_TritonKernelCall.render.<locals>.<genexpr>  s   é € Ð&WÒ?V±t°q¨!¨¨B¨q¨c¥{Ò?Vùó   ‚z
  ú  z# pre-kernel hashes: {r9   r6   c              3   ó4   #   • U  H  u  pU S U 3v •  M     g7fre  rp   rf  s      r)   r"  rg  (  s    é € ð (Ú(@¡ �1�#�R˜�s•Ò(@ùrh  z# post-kernel hashes: {Ú
)rX  r  rZ  r%   r=   rñ   r[  )rW   r?   r.  Úpre_hashes_strÚpost_hashes_strs        r)   r
  Ú_TritonKernelCall.render  sû   € Ø˜t×/Ñ/Ð0°°$·/±/Ð1BÀ!ÐDˆØ�?�?Ø!ŸY™YÑ&W¸t¿¹×?TÑ?TÔ?VÓ&WÓWˆNàØ˜Ÿ™Ñ(ñ)à+¨NÐ+;¸2Ð>ñ?ñ ð  ˆNØ××Ø"Ÿi™iñ (Ø(,×(8Ñ(8×(>Ñ(>Ô(@ó(ó ˆOð Ø˜Ÿ™Ñ(ñ)à,¨_Ð,=¸RÐ@ñAñ ð !ˆOØ�˜NÐ+¨OÐ+<¸BÐ?Ð?rN   c           
      ó  • UR                  UR                  5       5        [        (       af  SU R                  R	                  5        VVs0 s H7  u  p#U[        U[        R                  5      (       a  UR                  5       OU_M9     snn0U l	        [        =n(       a[  U R                  R	                  5        VVs0 s H.  u  p#[        U[        R                  5      (       d  M&  X$" U5      _M0     snnU l        U ?g s  snnf s  snnf )Nrÿ   )ÚsynchronizeÚcurrent_deviceÚ_RECORD_TRITON_OUTPUTSr  r=   rw   rc   rx   Úclonerò   Ú_TRITON_OUTPUT_HASH_FNr[  )rW   Údevice_interfacerB   rC   ra  s        r)   rg   Ú_TritonKernelCall.finalize4  sÜ   € ð 	×$Ñ$Ð%5×%DÑ%DÓ%FÔGß!Ò!àà $§¡× 1Ñ 1Ô 3ôâ 3™˜ð ¤J¨q´%·,±,×$?Ñ$?�q—w‘w”yÀQÒFÙ 3òðˆDŒKô -Ð,ˆ7Õ,ð !ŸK™K×-Ñ-Ô/ô â/‘D�AÜ˜a¤§¡×.ó ��7˜1“:’Ù/ò ˆDÔð ‰Kùóùó s   Á	>C<Â;%DÃ$Dc              #   óh   #   • U R                   SU R                  U R                  / S h  v•N   g  N7f)Nrp   )rX  r  rñ   rV   s    r)   r1  Ú_TritonKernelCall.__iter__I  s%   é € Ø×$Ñ$ b¨$¯/©/¸4¿?¹?ÐK×KÓKùs   ‚(2ª0«2)rX  r  r  r[  rZ  rò   r\   )ru  r   )rj   rk   rl   rm   r  r&   r  r   rn   rX   r  rP   rý   r
  rg   r1  ro   r5  r6  s   @r)   rW  rW  ÷  s‡   ø† Ù*ð7àð7ð �S˜#�X‘ð7ð ÷	7ð LPñ!Ø˜s™)ð!Ø2AÀDÑ2Hð!à	õ!ð(@  c¡ð @¨sô @ô0÷*Lð LrN   rW  c                   óh   ^ • \ rS rSrSr SS\S\S\S\SS4
U 4S	 jjjr	S
\
\   S\4S jrS rSrU =r$ )Ú_AnnotateCalliM  zCustom annotation callrÝ   Úheaderrñ   ró   r   Nc                 ó8   >• [         TU ]  X4S9  Xl        X l        g r  )r  rX   rÝ   r{  )rW   rÝ   r{  rñ   ró   r  s        €r)   rX   Ú_AnnotateCall.__init__P  s   ø€ ô 	‰Ñ˜ÐÑ1ØŒØ�rN   r?   c                 ó:   • SU R                    SU R                   3$ )Nr!   ú] ©r{  rÝ   r	  s     r)   r
  Ú_AnnotateCall.renderW  s   € Ø�4—;‘;�-˜r $§(¡( Ð,Ð,rN   c              #   ót   #   • SU R                    SU R                   3S0 U R                  / S h  v•N   g  N7f)Nr!   r  rp   )r{  rÝ   rñ   rV   s    r)   r1  Ú_AnnotateCall.__iter__Z  s9   é € à�—‘ˆ}˜B˜tŸx™x˜jÐ)ØØØ�O‰Oð	
÷ 	
ó 	
ùs   ‚.8°6±8r€  r3  )rj   rk   rl   rm   r  r   r&   rn   r  rX   r  r
  r1  ro   r5  r6  s   @r)   rz  rz  M  s`   ø† Ù ð EJñØðØ #ðØ14ðØ=Aðà	÷ð ð-  c¡ð -¨sô -÷
ð 
rN   rz  c                 ó‚   • U " U6 nUb6  [        U[        5      (       d!  [        S[        U5      R                   35      eU$ )Nz#hook must return None or dict, got )rw   r  ÚAssertionErrorr~   rj   )Úhookr  r•   s      r)   Ú	_run_hookr‡  c  s?   € Ù
�ˆ+€CØ
�œz¨#¬t×4Ñ4ÜÐBÄ4ÈÃ9×CUÑCUÐBVÐWÓXÐXØ€JrN   Úcallc           	      ó¸   • [         (       aO  [          HD  n[        XQX#X@5      nUc  M  U R                  c  0 U l        U R                  R                  U5        MF     g g r\   )r   r‡  rß   Úupdate)rˆ  ÚfuncÚtypesr  r  r†  Úhook_outs          r)   Ú_run_dispatch_pre_log_hooksrŽ  j  sL   € çÒß+ˆDÜ  ¨U¸&ÓGˆHØÓ#à—8‘8Ñ#Ø!�D”HØ—‘—‘ Ö)ò ,ð rN   c           	      óL  • [         (       a?  0 n[          H&  n[        XqX#XE5      nUc  M  UR                  U5        M(     U(       a  X`l        [        (       aO  U R
                  c  0 U l        [         H0  n[        XqX#XE5      nUc  M  U R
                  R                  U5        M2     g g r\   )r   r‡  rŠ  rò   r   rß   )	rˆ  r‹  rŒ  r  r  Úresultrò   r†  r�  s	            r)   Ú_run_dispatch_hooksr‘  v  s‹   € çÒØˆß*ˆDÜ  ¨U¸&ÓIˆHØÓ#Ø—‘˜hÖ'ñ +ö Ø ŒKçÒà�8‰8ÑØˆDŒHß'ˆDÜ  ¨U¸&ÓIˆHØÓ#Ø—‘—‘ Ö)ò (ð	 rN   c                 óF  • [        U [        5      (       a  [        U R                  5      $ [        U [        5      (       a  U R
                  $ [        U [        5      (       a  SU R                   SU R                   3$ [        U [        5      (       a  [        $ [        U 5      $ )z>String identifying _DebugCall (e.g. func, kernel, module name)r!   r  )rw   r  rÙ   r×   rW  rX  rz  r{  rÝ   r8  rD  r&   )rˆ  s    r)   Ú_get_call_namer“  ‹  s~   € ä�$œ× Ñ Ü˜DŸG™GÓ$Ð$Ü	�DÔ+×	,Ñ	,Ø×ÑÐÜ	�Dœ-×	(Ñ	(Ø�4—;‘;�-˜r $§(¡( Ð,Ð,Ü	�DÔ+×	,Ñ	,Ü Ð ä�4‹yÐrN   zdebug_mode_ops::annotaterp   )Úmutates_argsrÝ   c                 ó   • g r\   rp   rà   s    r)   ræ   ræ   ™  s   € ð rN   c                 ó   • g r\   rp   rà   s    r)   Ú_annotate_faker—  Ÿ  s   € àrN   c                   óx   ^ • \ rS rSrSrU 4S jrS\R                  R                  S\	4U 4S jjr
U 4S jrSrU =r$ )	ÚDebugInterpreteri¤  ah  
Interpreter class for running aot_eager compiled regions when DebugMode is active,
instead of using the compiled code. This gives us access to fx.Node metadata to decorate
and contextualize DebugMode logs (e.g. nn_module_stack, stack_trace, compiled region boundaries).

Note: this is currently only enabled with DebugMode(run_compile_with_interpreter=True).
c                 óh  >• [         TU ]  U5        [        5       U l        U R                  c  [	        S5      e[        U R                  R                  5      U l        X l        U R                  R                  R                  [        SU R                   S3U R                  R                  5      5        g )Nú No DebugMode is currently activeÚenterú region (compile))r  rX   r   Úmoder}   r  Úcurrent_nn_module_stackÚbase_nn_module_stackÚbackendÚ	operatorsÚappendrz  rñ   )rW   Úmoduler¡  r  s      €r)   rX   ÚDebugInterpreter.__init__­  s�   ø€ Ü‰Ñ˜Ô Ü)Ó+ˆŒ	Ø�9‰9ÑÜÐAÓBÐBô %)¨¯©×)JÑ)JÓ$KˆÔ!ð ŒØ�	‰	×Ñ×"Ñ"ÜØ˜DŸL™L˜>Ð):Ð;¸T¿Y¹Y×=QÑ=Qóõ	
rN   Únr   c                 ó|  >• U R                   c  [        S5      eU R                   R                  (       ak  UR                  S;  a[  U R                   R	                  U R
                  UR                  R                  S0 5      UR                  R                  S0 5      5        U R                   R                  (       ac  UR                  S;  aS  UR                  R                  SS 5      =nb4  U R                   R                  U5         [        TU ]-  U5      sS S S 5        $ [        TU ]-  U5      $ ! , (       d  f       g = f)Nr›  )Úplaceholderrÿ   Únn_module_stackÚfwd_nn_module_stackrõ   )rž  r}   Úrecord_nn_moduler×   Ú_handle_fx_nn_module_stackr   ÚmetarÐ   Úrecord_stack_traceÚset_fx_stack_tracer  Úrun_node)rW   r¦  rõ   r  s      €r)   r°  ÚDebugInterpreter.run_node¾  sí   ø€ Ø�9‰9ÑÜÐAÓBÐBð �9‰9×%×%¨!¯$©$Ð6OÓ*OØ�I‰I×0Ñ0Ø×)Ñ)Ø—‘—
‘
Ð,¨bÓ1Ø—‘—
‘
Ð0°"Ó5ôð �I‰I×(×(Ø—‘Ð5Ó5Ø !§¡§
¡
¨=¸$Ó ?Ð?�ÑLà—‘×-Ñ-¨kÕ:Ü‘wÑ'¨Ó*÷ ;Ñ:ô ‘7Ñ# AÓ&Ð&÷ ;Õ:ús   ÄD-Ä-
D;c                 ó�  >• U R                   c  [        S5      e[        TU ]  " U6 n[	        U R                   R
                  5      [	        U R                  5      :  a  [        [        S5        [	        U R                   R
                  5      [	        U R                  5      :”  aR  U R                   R                  5         [	        U R                   R
                  5      [	        U R                  5      :”  a  MR  U R                   R                  R                  [        SU R                   S3U R                   R                  5      5        U$ )Nr›  z:unexpected handling of nn_module_stack in DebugInterpreterÚexitr�  )rž  r}   r  Úrunr<   rŸ  r   r   rß   Ú_exit_nn_module_callr¢  r£  rz  r¡  rñ   )rW   r  r  r�  r  s       €r)   r´  ÚDebugInterpreter.runÕ  s÷   ø€ Ø�9‰9ÑÜÐAÓBÐBÜ‘’˜dÐ#ˆô ˆt�y‰y×0Ñ0Ó1´C¸×8QÑ8QÓ4RÓRÜÜÐQôô �$—)‘)×3Ñ3Ó4´s¸4×;TÑ;TÓ7UÓUØ�I‰I×*Ñ*Ô,ô �$—)‘)×3Ñ3Ó4´s¸4×;TÑ;TÓ7UÕUð 	�	‰	×Ñ×"Ñ"ÜØ˜4Ÿ<™<˜.Ð(9Ð:¸D¿I¹I×<PÑ<Póô	
ð ˆrN   )r¡  r   rž  )rj   rk   rl   rm   r  rX   rc   ÚfxÚNoder   r°  r´  ro   r5  r6  s   @r)   r™  r™  ¤  s2   ø† ñõ
ð"'˜%Ÿ(™(Ÿ-™-ð '¨C÷ '÷.ó rN   r™  c                   ó@  ^ • \ rS rSrSSSSSSSSSSSSS. S6U 4S jjjrS6S jrS6S	 jr\S\4S
 j5       r	S6S jr
S6S jrS7S jrS rS rS7S jrU 4S jrU 4S jr\R&                  S 5       rS rS rS6S jrS\\   S\\\\\4   4   S-  S\\\\\4   4   S-  SS4S jr\R&                    S8S\S-  S\4S jj5       rS6S jrS\S \\\4   S\ 4S! jr!S9S"\S-  S\4S# jjr"\#\R&                     S:S$\$S-  S%\$S-  S&\$S-  4S' jj5       5       r%\#\R&                  S( 5       5       r&\#\R&                   S;S)\$\-  \\   -  S*\4S+ jj5       5       r'\#\R&                  S, 5       5       r(\)S- 5       r*S. r+\#S/\SS4S0 j5       r,\# S<S1\S2\S3\S\\   4S4 jj5       r-S5r.U =r/$ )=r   iì  FTN)Úrecord_torchfunctionÚrecord_faketensorÚrecord_realtensorÚrecord_tensor_attributesr«  Ústore_original_argsr®  Úrecord_outputÚ
record_idsÚrecord_profiler_contextÚrecord_localtensorÚrun_compile_with_interpreterr   c                ó`  >• [         TU ]  5         SS Kn[        5         SU l        Xl        X l        X0l        X°l        U=(       d    / U l	        XPl
        S U l        U R                  (       a  U R                  5         X`l        Xpl        X€l        X�l        X l        XÀl        U R'                  5         g )Nr   T)r  rX   Útorch.distributed.tensorrî   Úsupports_higher_order_operatorsrº  r»  r¼  rÂ  r½  r«  Úmodule_trackerÚmodule_tracker_setupr¾  r®  r¿  rÀ  rÁ  rÃ  Úreset)rW   rº  r»  r¼  r½  r«  r¾  r®  r¿  rÀ  rÁ  rÂ  rÃ  rc   r  s                 €r)   rX   ÚDebugMode.__init__í  s°   ø€ ô  	‰ÑÔÛ'ä"Ô$Ø/3ˆÔ,ð %9Ô!ð "3Ôð "3Ôð #5Ôð )A×(FÀBˆÔ%ð !1Ôà15ˆÔØ× × Ø×%Ñ%Ô'ð $7Ô ð #5Ôð $1Ôð !+Œð .EÔ$ð 3OÔ)à�
‰
�rN   c                 óv   • / U l         SU l        [        5       U l        0 U l        SU l        / U l        S U l        g rS   )r¢  rñ   rP   Ú_tensor_memoÚ_output_infoÚignored_record_functionsrŸ  Úfx_stack_tracerV   s    r)   rÉ  ÚDebugMode.reset5  s;   € ØˆŒØˆŒÜ+Ó-ˆÔØ/1ˆÔØ()ˆÔ%Ø')ˆÔ$Ø"ˆÕrN   c                 ó    • X R                   U'   g)z5Assign IDs to output tensors and store in output_infoN)rÍ  )rW   Úop_indexr�  s      r)   Ú_track_op_outputÚDebugMode._track_op_output>  s   € à&,×Ñ˜(Ò#rN   c                 ó   • g)NTrp   )Úclss    r)   Úignore_compile_internalsÚ"DebugMode.ignore_compile_internalsE  s   € àrN   c                 óx  • [         (       a  g [        U5      R                  S5      (       a  g U R                  (       d9  UR	                  U R
                  U R                  (       a  U R                  OS 5        U R                  (       a  U R                  =Ul	        Ul
        U R                  R                  U5        g )Nzprofiler::_record_function)Ú_IN_INDUCTOR_BENCHMARKr&   rº   r¾  rý   r½  rÀ  rÌ  rÏ  rõ   rö   r¢  r£  )rW   rˆ  s     r)   Ú_record_callÚDebugMode._record_callI  sˆ   € ç!Ò!Øäˆt‹9×ÑÐ <×=Ñ=Øà×'×'Ø×ÑØ×-Ñ-Ø%)§_§_�×!Ò!¸$ôð ××Ø6:×6IÑ6IÐIˆDÔ˜tÔ3Ø�‰×Ñ˜dÕ#rN   c                 ó¦   • U R                   (       d  g UR                  UU R                  U R                  (       a  U R                  5        g S 5        g r\   )r¿  r  r½  rÀ  rÌ  )rW   rˆ  rÿ   s      r)   Ú_record_call_outputÚDebugMode._record_call_outputZ  sA   € Ø×!×!ØØ×ÑØØ×)Ñ)Ø!%§§ˆD×Ñõ	
ð 7;õ	
rN   c                 ó,  • Uc  0 n[        XX@R                  U R                  S9nU R                  U5         U =R                  S-  sl        U" U0 UD6nU R	                  XV5        UU =R                  S-  sl        $ ! U =R                  S-  sl        f = f)Nr  ra   )r  rñ   r®  rÛ  rÞ  )rW   r‹  rŒ  r  r  rˆ  r�  s          r)   Ú__torch_function__ÚDebugMode.__torch_function__c  s‡   € Ø‰>ØˆFäØ˜§¡°t×7NÑ7Nñ
ˆð 	×Ñ˜$Ôð	!Ø�OŠO˜qÑ �OÙ˜4Ð* 6Ñ*ˆFØ×$Ñ$ TÔ2Øà�OŠO˜qÑ ŽOøˆD�OŠO˜qÑ ŽOús   ·/A< Á<Bc                 ó  ^• [        U4S jS 5       5      (       a  U =R                  S-  sl        g [        TSU R                  U R                  S9nU R
                  R                  U5        U =R                  S-  sl        g )Nc              3   óF   >#   • U  H  nTR                  U5      v •  M     g 7fr\   )rº   )r!  ÚprefixrÝ   s     €r)   r"  Ú3DebugMode._maybe_record_function.<locals>.<genexpr>v  s(   øé € ð 	
ò�ð �N‰N˜6×"Ð"òùs   ƒ!)zCachingAutotuner.zInductorBenchmarker.zcompile_fx.<locals>.ra   zrecord functionr  )ÚanyrÎ  rz  rñ   r®  r¢  r£  ©rW   rÝ   rˆ  s    ` r)   Ú_maybe_record_functionÚ DebugMode._maybe_record_functiont  su   ø€ äô 	
ñó	
÷ 	
ñ 	
ð ×)Ò)¨QÑ.Õ)ØäØÐ" D§O¡O¸4×;RÑ;Rñ
ˆð 	�‰×Ñ˜dÔ#Ø�Š˜1ÑŽrN   c                 óÊ   • U R                   S:  a  [        SU R                    35      eU R                   S:”  a  U =R                   S-  sl         g U =R                  S-  sl        g )Nr   z&ignored_record_functions is negative: ra   )rÎ  r…  rñ   rV   s    r)   Ú_maybe_exit_record_functionÚ%DebugMode._maybe_exit_record_function‰  s]   € Ø×(Ñ(¨1Ó,Ü Ø8¸×9VÑ9VÐ8WÐXóð ð ×(Ñ(¨1Ó,Ø×)Ò)¨QÑ.Ö)à�OŠO˜qÑ ŽOrN   c                 ó8  • Uc  0 nU R                   (       a¯  U[        R                  R                  R                  R
                  :X  a;  [        U5      S:w  a  [        S[        U5       35      eU R                  US   5        OBU[        R                  R                  R                  R                  :X  a  U R                  5         U[        R                  R                  R                  R
                  L a;  [        U5      S:w  a  [        S[        U5       35      eU R                  US   5        g SSKJn  S n[        R"                  R$                  R&                  U;   a6  [)        XX@R*                  U R,                  S9nU R/                  U5        [0        $ [2        U;   d  [5        [7        5       [8        5      (       ay  U R:                  (       ag  U[        R                  R<                  R>                  R
                  :w  a5  [)        UUUU R*                  S-   U R,                  S9nU R/                  U5        O¡XR;   aG  U R@                  (       a5  [)        UUUU R*                  S-   U R,                  S9nU R/                  U5        OU[        U5      S:X  aF  U RB                  (       a5  [)        UUUU R*                  S-   U R,                  S9nU R/                  U5        U(       a  [E        XaX#U5        U" U0 UD6nU(       a  U RG                  Xg5        [I        XaX#XG5        U$ )Nra   zexpected 1 arg, got r   )ÚLocalTensorr  )%rÁ  rc   ré   ÚprofilerÚ_record_function_enter_newrì   r<   r…  ré  Ú_record_function_exitÚ_RecordFunctionrì  rê   rë   Ú_handle_annotateÚtorch.distributed._local_tensorrï  rz   r>   r{   r  rñ   r®  rÛ  ÚNotImplementedr   rw   r   r   r»  Úprimr    rÂ  r¼  rŽ  rÞ  r‘  )rW   r‹  rŒ  r  r  rï  rˆ  r�  s           r)   Ú__torch_dispatch__ÚDebugMode.__torch_dispatch__“  s‘  € Ø‰>ØˆFð ×'×'Ø”u—y‘y×)Ñ)×DÑD×LÑLÓLÜ�t“9 “>Ü(Ð+?ÄÀDÃ	¸{Ð)KÓLÐLØ×+Ñ+¨D°©GÕ4ØœŸ™×+Ñ+×AÑA×QÑQÓQØ×0Ñ0Ô2ð ”5—9‘9×+Ñ+×4Ñ4×<Ñ<Ò<Ü�4‹y˜A‹~Ü$Ð';¼CÀ»I¸;Ð%GÓHÐHØ×!Ñ! $ q¡'Ô*Øå?ð ˆÜ×Ñ×#Ñ#×+Ñ+¨uÓ4ÜØ˜F§O¡O¸4×;RÑ;RñˆDð ×Ñ˜dÔ#Ü!Ð!Ü˜5Ó ¤JÜ&Ó(¬.÷%
ñ %
ð ×%×%Øœ5Ÿ9™9Ÿ>™>×0Ñ0×8Ñ8Ó8Ü"ØØØØŸ™¨!Ñ+Ø"×5Ñ5ñ�Dð ×%Ñ% dÔ+øàÓ!Ø×&×&ÜØØØØ—O‘O aÑ'Ø×1Ñ1ñ�ð ×!Ñ! $Ô'øÜ�‹Z˜1‹_Ø×%×%ÜØØØØ—O‘O aÑ'Ø×1Ñ1ñ�ð ×!Ñ! $Ô'ö
 Ü'¨°EÀÔHá�tÐ&˜vÑ&ˆÞØ×$Ñ$ TÔ2Ü ¨E¸ÔHàˆrN   c                 óˆ  >• [         S-  q U R                  (       a  [        R                  R	                  U 5        [
        TU ]  5         U R                  (       a  U R                  R                  5         U R                  (       a=  [        R                  R                  SSS9U l        U R                  R                  5         U $ )Nra   TF)Ú	check_nan)Ú_ACTIVE_DEBUG_MODE_COUNTrº  rc   rd   Ú_push_on_torch_function_stackr  Ú	__enter__r«  rÇ  r®  ÚautogradÚset_detect_anomalyÚanomaly_for_traces)rW   r  s    €r)   rþ  ÚDebugMode.__enter__á  s“   ø€ ä  AÑ%Ð Ø×$×$Ü�H‰H×2Ñ2°4Ô8ä‰ÑÔØ× × Ø×Ñ×)Ñ)Ô+à×"×"Ü&+§n¡n×&GÑ&GØ ð 'Hð 'ˆDÔ#ð ×#Ñ#×-Ñ-Ô/ØˆrN   c                 ó<  >• [         S-  q [        TU ]  " U6   U R                  (       a  U R                  R                  5         U R
                  (       a  [        R                  R                  5         U R                  (       a  U R                  R                  " U6   g g ©Nra   )rü  r  Ú__exit__r«  rÇ  rº  rc   rd   Ú_pop_torch_function_stackr®  r  )rW   r  r  s     €r)   r  ÚDebugMode.__exit__ó  sq   ø€ ä  AÑ%Ð Ü‰Ò˜$ÑØ× × Ø×Ñ×(Ñ(Ô*Ø×$×$Ü�H‰H×.Ñ.Ô0Ø×"×"Ø×#Ñ#×,Ò,¨dÒ3ð #rN   c              #   óH   #   • Xl          S v •  S U l         g ! S U l         f = f7fr\   )rÏ  )rW   rõ   s     r)   r¯  ÚDebugMode.set_fx_stack_traceþ  s#   é € à)Ôð	'Ûà"&ˆDÕø $ˆDÕüs   ‚"Š Ž"–	Ÿ"c                 óÞ   • [        XU R                  S-   U R                  S9nU R                  R	                  U5        U R
                  R	                  U5        U =R                  S-  sl        g )Nra   r  )rz  rñ   r®  r¢  r£  rŸ  )rW   Úfqnr{  rˆ  s       r)   Ú_enter_nn_module_callÚDebugMode._enter_nn_module_call  sX   € ÜØ˜Ÿ™¨1Ñ,°D×4KÑ4Kñ
ˆð 	�‰×Ñ˜dÔ#Ø×$Ñ$×+Ñ+¨CÔ0Ø�Š˜1ÑŽrN   c                 ób   • U =R                   S-  sl         U R                  R                  5         g r  )rñ   rŸ  r]   rV   s    r)   rµ  ÚDebugMode._exit_nn_module_call  s"   € Ø�Š˜1Ñ�Ø×$Ñ$×(Ñ(Õ*rN   c                 ó€   ^ • SSK Jn  U" 5       T l        SU 4S jjnSU 4S jjnT R                  R                  X#5        g )Nr   r   c                 ó`   >• TR                   R                  U 5      nTR                  US5        g )Nznn.Mod)rÇ  Ú_get_mod_namer  )r¤  Úinputr  rW   s      €r)   Úpre_fw_hookÚ3DebugMode.module_tracker_setup.<locals>.pre_fw_hook  s)   ø€ Ø×%Ñ%×3Ñ3°FÓ;ˆCØ×&Ñ& s¨HÕ5rN   c                 ó&   >• TR                  5         g r\   )rµ  )r¤  r  rÿ   rW   s      €r)   Úpost_fw_hookÚ4DebugMode.module_tracker_setup.<locals>.post_fw_hook  s   ø€ Ø×%Ñ%Õ'rN   rb   )Ú$torch.distributed._tools.mod_trackerr   rÇ  Úregister_user_hooks)rW   r   r  r  s   `   r)   rÈ  ÚDebugMode.module_tracker_setup  s0   ø€ ÝCá(›lˆÔ÷	6÷
	(ð 	×Ñ×/Ñ/°ÕJrN   Ú
base_stackr©  rª  c                 ó  • U=(       d    0 nU=(       d    0 nU(       a  U(       a  [        S5      eUnU(       a  UOUnU R                  nXR                  5        Vs/ s H  owS   PM	     sn-   n[        U5      [        U5      -
  n	[        U5      [        U5      -
  n
U
 H  nU R	                  5         M     U R
                  S:  a  [        S5      e[        U	5       H  nU R                  XÄ(       a  SOS5        M     X€l        gs  snf )a7  
Called when DebugInterpreter observes nn_module_stack or fwd_nn_module_stack metadata
from executing the compiled GraphModule.

If the current module stack is mismatched with what's currently tracked in DebugMode
(current_nn_module_stack), we adjust call depth and add new [nn.Module] log entries accordingly.
zAExpecting at most one of nn_module_stack and fwd_nn_module_stack.r   z.Unexpectedly, DebugMode call_depth is negativeznn.Mod (compile)znn.Mod (compile bwd)N)r…  rŸ  ÚvaluesÚsetrµ  rñ   Úsortedr  )rW   r  r©  rª  Úis_fwdró   Úcurrent_stackrC   Ú	new_stackÚenteredÚexitedÚ_r  s                r)   r¬  Ú$DebugMode._handle_fx_nn_module_stack"  sù   € ð *×/¨RˆØ1×7°RÐÞÖ2Ü ØSóð ð !ˆÞ#)‘Ð/Bˆð ×4Ñ4ˆØ·±´Ó!?²¨1 A¤$±Ñ!?Ñ?ˆ	ä�i“.¤3 }Ó#5Ñ5ˆÜ�]Ó#¤c¨)£nÑ4ˆó ˆAØ×%Ñ%Ö'ñ à�?‰?˜QÓÜ Ð!QÓRÐRô ˜'–?ˆCØ×&Ñ&Ø­6Ñ'Ð7Möñ #ð
 (1Õ$ùò# "@s   ÁDr<  r=  c              #   ó  #   •  U R                  [        UUUUU R                  S-   U R                  US95        U =R                  S-  sl        S v •  U =R                  S-  sl        g ! U =R                  S-  sl        f = f7f)Nra   )r:  r;  r<  rñ   ró   r=  )rÛ  r8  rñ   r®  )rW   r†   r:  r;  r<  r=  s         r)   Úrecord_redistribute_callsÚ#DebugMode.record_redistribute_callsO  ss   é € ð	!Ø×ÑÜ!ØØ"/Ø"/Ø'9Ø#Ÿ™°Ñ2Ø×1Ñ1Ø +ñô
ð �OŠO˜qÑ �OÛà�OŠO˜qÑ ŽOøˆD�OŠO˜qÑ ŽOüs   ‚B„AA( ÁBÁ(A?Á?Bc                 óº   • U R                   (       d  gSSKJn  [        [	        U[
        U5      5      n[        X0R                  S-   5      nU R                  U5        g)z=Record output placements for a DTensor op as a separate line.Nr   rF   ra   )	r¿  rH   rG   r&   r   rM   rM  rñ   rÛ  )rW   Úoutput_specrG   rN  rˆ  s        r)   Úrecord_output_placementsÚ"DebugMode.record_output_placementsi  sK   € à×!×!ØÝFäÜ˜+Ô'>ÀÓLó
ˆô $ N·O±OÀaÑ4GÓHˆØ×Ñ˜$ÕrN   rX  r  c                 ó¤   • [        XU R                  S-   5      nUR                  U R                  5        U R                  R                  U5        U$ r  )rW  rñ   rý   r½  r¢  r£  )rW   rX  r  rˆ  s       r)   Úrecord_triton_kernelÚDebugMode.record_triton_kernelu  sD   € ô ! °d·o±oÈÑ6IÓJˆØ×Ñ˜D×9Ñ9Ô:Ø�‰×Ñ˜dÔ#ØˆrN   Úshow_stack_tracec                 ó\  ^ • Uc  T R                   OUn[        R                  R                  5          U(       d0  SR	                  U 4S jT R
                   5       5      nUsSSS5        $ / nSnT R
                   GH  nSn[        US5      (       a  UR                  (       a  UR                  nO.[        US5      (       a  UR                  (       a  UR                  nSnU(       a  [        U5      nU(       aH  Xt:w  aC  U(       a  UR                  S5        SUR                  S-   -  nUR                  US	-   U-   5        UnSSUR                  -  -   UR                  T R                  5      -   n	UR                  U	5        GM     SR	                  U5      sSSS5        $ ! , (       d  f       g= f)
a  
show_stack_trace: option to display one-line stack trace summaries above groups
                of operations (similar to gm.print_readable() style).
                Requires record_stack_trace=True.
                if None, uses self.record_stack_trace, otherwise overrides it.
Nrk  c              3   ó€   >#   • U  H3  nS S UR                   -  -   UR                  TR                  5      -   v •  M5     g7f)ri  N)rñ   r
  r½  )r!  r×   rW   s     €r)   r"  Ú)DebugMode.debug_string.<locals>.<genexpr>Š  sD   øé € ð #ò -˜ð Ø˜RŸ]™]Ñ*ñ+à—i‘i × =Ñ =Ó>ö?ò -ùs   ƒ;>rö   rõ   r6   ri  ra   z# )r®  rc   rd   ÚDisableTorchFunctionr%   r¢  r:   rö   rõ   rË   r£  rñ   r
  r½  )
rW   r2  r�  ÚlinesÚprev_stack_summaryr×   rõ   Ústack_summaryÚindentÚlines
   `         r)   Údebug_stringÚDebugMode.debug_string}  sm  ø€ ð (8Ñ'?ˆD×#Ò#ÐEUð 	ô �X‰X×*Ñ*Õ,Þ#ØŸ™ô #ð #Ÿnšnó	#ó �ð ÷ -Ñ,ð ˆEØ!%Ðà—n•n�à"�Ü˜2Ð0×1Ñ1°b×6H×6HØ"$×"4Ñ"4‘KÜ˜R ×/Ñ/°B·N·NØ"$§.¡.�Kà $�ÞÜ$9¸+Ó$F�Mæ  ]Ó%HæØŸ™ RÔ(Ø! R§]¡]°QÑ%6Ñ7�FØ—L‘L ¨$¡°Ñ!>Ô?Ø)6Ð&ð Ø˜RŸ]™]Ñ*ñ+à—i‘i × =Ñ =Ó>ñ?ð ð
 —‘˜T×"ñ5 %ð8 —9‘9˜UÓ#÷U -×,×,ús   ±.FÁ)D*FÆ
F+Úrecord_hookÚlog_hookÚpre_log_hookc              #   ó  #   • U (       a  [         R                  U 5        U(       a  [        R                  U5        U(       a  [        R                  U5         Sv •  U (       a  [         R	                  5         U(       a  [        R	                  5         U(       a  [        R	                  5         gg! U (       a  [         R	                  5         U(       a  [        R	                  5         U(       a  [        R	                  5         f f = f7f)a!  
Allows installing post-hooks on arguments to intercepted __torch_dispatch__ calls;
hook signatures are expected as (func, types, args, kwargs, result),
i.e. __torch_dispatch__ args + return value.

Logging hook outputs are stored in call.log and annotate calls in debug_string(),
while recording hook outputs are just stored in call.record.
For now hooks are expected to return dictionaries.

pre_log_hook signature is (func, types, args, kwargs, call) and is executed before
the operation. It allows capturing state before in-place mutations.
N)r   r£  r   r   r]   )r>  r?  r@  s      r)   Údispatch_hooksÚDebugMode.dispatch_hooks´  s©   é € ö* Ü"×)Ñ)¨+Ô6ÞÜ×&Ñ& xÔ0ÞÜ#×*Ñ*¨<Ô8ð	.ÛæÜ&×*Ñ*Ô,ÞÜ#×'Ñ'Ô)ÞÜ'×+Ñ+Õ-ð øö	 Ü&×*Ñ*Ô,ÞÜ#×'Ñ'Ô)ÞÜ'×+Ñ+Õ-ð üs    ‚ADÁB/ ÁADÂ/ADÄDc               #   ó˜   #   • S n  [         nSq [        R                  U S9   Sv •  SSS5        Uq g! , (       d  f       N= f! Wq f = f7f)z>
Hook for storing cloned output tensors in .record["output"].
c                 ó$   • [        S U5      nSU0$ )Nc                 ód   • [        U [        R                  5      (       a  U R                  5       $ U $ r\   )rw   rc   rx   rs  r  s    r)   rÂ   ÚADebugMode.record_outputs.<locals>.dispatch_hook.<locals>.<lambda>â  s"   € ¤z°!´U·\±\×'BÑ'B˜!Ÿ'™'›)ÐIÈÐIrN   rÿ   ©r   )r‹  rŒ  r  r  r�  r•   s         r)   Údispatch_hookÚ/DebugMode.record_outputs.<locals>.dispatch_hookà  s   € ÜÙIÈ6óˆCð ˜c�?Ð"rN   T)r>  N)rr  r   rB  )rI  Ú_old_record_tritons     r)   Úrecord_outputsÚDebugMode.record_outputsÙ  sO   é € ò	#ð	8Ü!7ÐØ%)Ð"Ü×)Ñ)°mÐ)ÒDÛ÷ Eð &8Ñ"÷ EÕDûð &8Ñ"üs.   ‚A
‡A ¢2§A ¯A
²
A ¼A ÁAÁA
ra  Úhash_inputsc              #   ó  ^^^^	#   • S n[        U 5      (       a  U mOi[        U [        5      (       a	  U" U 5      mOK[        U [        5      (       a  U  Vs/ s H
  o2" U5      PM     snm	U	4S jmO[	        S[        U 5       35      eU4S jmUU4S jnU4S jn T(       a  [        nTq[        nTq[        R                  UT(       a  UOSS9   Sv •  SSS5        T(       a  WqUqgs  snf ! , (       d  f       N= f! T(       a  WqWqf = f7f)	a  
Installs hook for tensor hash logging.

hash_fn: One of:
    - Custom-defined hash function
    - String: one of ("norm", "hash_tensor")
        - "norm": uses norm_hash_fn; basically tensor's L1 norm
        - "hash_tensor": uses torch.hash_tensor (XOR sum reduction)
    - List of strings: returns tuple of hashes from above options
hash_inputs: if True, also hashes tensors in (args, kwargs), storing them in "input_hash".
Input hashes are captured before the operation executes, so they reflect the state before
any in-place mutations.
c                 ó¦   • [        U [        5      (       a  U S;  a  [        SU < 35      e[        R                  " U S:X  a	  [
        SS9$ [        SS9$ )N)r’   r¥   z/hash_type must be 'norm' or 'hash_tensor', got r’   T)rˆ   )rw   r&   r…  Ú	functoolsÚpartialr–   r©   )Ú	hash_types    r)   Úhash_fn_optionÚ3DebugMode.log_tensor_hashes.<locals>.hash_fn_option  sg   € Ü˜i¬×-Ñ-°ð Có 2ô %ØEÀiÁ]ÐSóð ô ×$Ò$Ø )¨VÓ 3”ÐTXñð Ü9GÐTXñð rN   c                 ó0   >^ • [        U 4S jT 5       5      $ )Nc              3   ó2   >#   • U  H  o" T5      v •  M     g 7fr\   rp   )r!  Úfnr(   s     €r)   r"  Ú@DebugMode.log_tensor_hashes.<locals>.<lambda>.<locals>.<genexpr>  s   øé € Ð 5²¨2  A§ ²ùs   ƒ)r4  )r(   Úfnss   `€r)   rÂ   Ú-DebugMode.log_tensor_hashes.<locals>.<lambda>  s   ù€ œ5Ô 5±Ó 5Ô5rN   zRlog_tensor_hashes() expected hash_fn to be callable, str, or list[str], but found c                 ó$   >• [        U4S jU 5      $ )Nc                 óV   >• [        U [        R                  5      (       a  T" U 5      $ S $ r\   )rw   rc   rx   )r(   rX  s    €r)   rÂ   ÚADebugMode.log_tensor_hashes.<locals>._tree_hash.<locals>.<lambda>  s!   ø€ ¤:¨a´·±×#>Ñ#>™"˜Q›%ÐHÀDÐHrN   rH  )ÚobjrX  s    €r)   Ú
_tree_hashÚ/DebugMode.log_tensor_hashes.<locals>._tree_hash  s   ø€ ÜÜHÈ#óð rN   c                 ó�   >• S[        U 5      ;   d  S[        U 5      ;   a  gT(       a  T" X#45      n[        S U5      (       d  SU0$ g)z:Pre-hook to capture input hashes before operation executesÚemptyrð  Nc                 ó
   • U S L $ r\   rp   r  s    r)   rÂ   ÚMDebugMode.log_tensor_hashes.<locals>._dispatch_pre_log_hook.<locals>.<lambda>'  s   € ¨!¨t©)rN   Ú
input_hash)r&   r   )r‹  rŒ  r  r  rˆ  rf  r`  rN  s         €€r)   Ú_dispatch_pre_log_hookÚ;DebugMode.log_tensor_hashes.<locals>._dispatch_pre_log_hook  sH   ø€ àœ#˜d›)Ó# z´S¸³YÓ'>Øæá'¨¨Ó7�
ÜÑ 3°Z×@Ñ@Ø(¨*Ð5Ð5ØrN   c                 ó¢   >• S[        U 5      ;   d  S[        U 5      ;   a  g0 nT" U5      US'   [        S UR                  5       5      (       a  gU$ )z;Post-hook to capture output hashes after operation executesrc  rð  NÚhashc                 ó
   • U S L $ r\   rp   r  s    r)   rÂ   ÚJDebugMode.log_tensor_hashes.<locals>._dispatch_post_hook.<locals>.<lambda>3  s   €  ! t¡)rN   )r&   r   r  )r‹  rŒ  r  r  r�  r•   r`  s         €r)   Ú_dispatch_post_hookÚ8DebugMode.log_tensor_hashes.<locals>._dispatch_post_hook+  sL   ø€ àœ#˜d›)Ó# z´S¸³YÓ'>ØàˆCÙ$ VÓ,ˆC�‰KäÑ+¨S¯Z©Z«\×:Ñ:ØØˆJrN   N)r?  r@  )
Úcallablerw   r&   r  rû   r~   r`  rt  r   rB  )
ra  rN  rT  rX  rg  rm  Ú_old_input_hfnÚ_old_output_hfnr`  rZ  s
    ` `    @@r)   Úlog_tensor_hashesÚDebugMode.log_tensor_hashesï  s  ûé € ò&
	ô �G×ÑØ‰BÜ˜¤×%Ñ%Ù Ó(‰BÜ˜¤×&Ñ&Ù07Ó8²¨"�> "Ö%±Ñ8ˆCÜ5‰Bä%ØdÔeiÐjqÓerÐdsÐtóð õ	ö

	õ
	ð	5ÞÜ!6�Ø(*Ð%Ü4ˆOØ%'Ð"Ü×)Ñ)Ø,Þ7BÑ3Èð *ò ó ÷	ö Ø(6Ð%Ø%4Ñ"ùòg 9÷Võ ûö Ø(6Ð%Ø%4Ñ"üsB   †ADÁC'Á%4DÂ4C= ÃC,ÃC= ÃDÃ,
C:Ã6C= Ã=D
Ä
Dc               #   ó,   #   •  Sq Sv •  Sq g! Sq f = f7f)z�
Context manager for disabling logging during inductor benchmarking,
so logs don't contain all kernels launched from autotuning.
TNF)rÚ  rp   rN   r)   Ú_benchmarking_inductorÚ DebugMode._benchmarking_inductorH  s   é € ð	+Ø%)Ð"Ûà%*Ñ"ø UÑ"üs   ‚„ Š�‘c                 ó,   • [        U R                  5      $ r\   )r  r¢  rV   s    r)   ÚlogsÚDebugMode.logsV  s   € ä�D—N‘NÓ#Ð#rN   c                 ó~   • [        USU R                  U R                  5      nU R                  R	                  U5        g)zHandles DebugMode._annotate()rë   N)rz  rñ   r®  r¢  r£  rè  s      r)   rô  ÚDebugMode._handle_annotateZ  s.   € ä˜S *¨d¯o©o¸t×?VÑ?VÓWˆØ�‰×Ñ˜dÕ#rN   rÝ   c                 óV   • [         R                  R                  R                  U 5        g)z�
If an active DebugMode exists, adds an "[annotate] <tag>" entry to the logs. Useful for contextualizing logs.
Implemented with a custom op.
N)rc   ré   rê   rë   rà   s    r)   ræ   ÚDebugMode._annotate_  s   € ô 	�	‰	× Ñ ×)Ñ)¨#Õ.rN   Úlogs1Úlogs2Úcompare_inputsc                 óü  ^^• [        U 5      [        U5      :w  a#  [        S[        U 5       S[        U5       35      e/ m[        [        X5      5       GH£  u  nu  pE[	        U5      R
                  n[	        U5      R
                  nXg:w  a  [        SU SU SU 35      eUn[        U5      [        U5      p©Xš:w  a  [        SU SU SU	 SU SU
 S35      eU	mUR                  UR                  :w  a.  [        S	U ST S
U SUR                   SUR                   3
5      e[        U[        5      (       a/  [        U5      [        U5      :w  a  [        SU SU SU 35      eGM  [        U[        5      (       Ga.  UR                  UR                  :w  a5  [        SUR                   SU SUR                   SUR                   35      eUU4S jnUR                  SLUR                  SLpÜXÍ:w  a!  [        SUR                   SU SU SU 35      eU(       a  U" UR                  UR                  SS9  U(       aj  UR                  SLUR                  SLpþXï:w  a!  [        SUR                   SU SU SU 35      eU(       a  U" UR                  UR                  SS9  GMO  GMR  GMU  [        U[         5      (       d  GMm  UU4S jnUR"                  SL=(       a    SUR"                  ;   nUR"                  SL=(       a    SUR"                  ;   nUU:w  a  [        SU ST SU SU S U 3
5      eU(       a"  U" UR"                  S   UR"                  S   SS9  U(       d  GM  UR"                  SL=(       a    S!UR"                  ;   nUR"                  SL=(       a    S!UR"                  ;   nUU:w  a  [        S"U ST SU S#U S$U 3
5      eU(       d  GM�  U" UR"                  S!   UR"                  S!   SS9  GM¦     T$ )%aš  
Compares tensor hashes between two DebugMode runs, for checking run-to-run numerical divergence.

This first validates the two log sequences have identical structure (same operations, input shapes/dtypes, etc.),
then compares tensor hash values, and returns a list of call outputs where mismatches were found.
Expects input logs to have been run with log_tensor_hashes, and looks for hashes in .log["hash"] & .log["input_hash"]
(or .post_hashes & .pre_hashes for triton kernels).

note: skips checking log pairs where hashes aren't present, but will raise if present in one & not the other.

Args:
    logs1: logs from the first DebugMode run (from debug_mode.logs)
    logs2: logs from the second DebugMode run
    compare_inputs: If True, also compare input tensor hashes (default: only output checking)

Returns:
    List of dictionaries describing hash mismatches. Each dict contains:
        - call_type: "torch op" or "triton kernel"
        - call: Operator/kernel name
        - arg_name: For triton kernels, the argument name; None for torch ops
        - pytree_path: For torch ops, the pytree path to the differing tensor; None for kernels
        - hash1: Hash value from the first run
        - hash2: Hash value from the second run
        - rel_diff: Relative difference between hash values
        - is_input_hash: True if this is an input hash, False for output hash

Raises:
    ValueError: If logs have different lengths, call types, operator names, or call depths

Usage::

    # Run model first time
    with DebugMode() as debug_mode, DebugMode.log_tensor_hashes():
        model(x)
        logs1 = debug_mode.logs

    # Run again, in exactly the same way
    with DebugMode() as debug_mode, DebugMode.log_tensor_hashes():
        model(x)
        logs2 = debug_mode.logs

    mismatches = DebugMode.check_hash_mismatches(logs1, logs2)
    for m in mismatches:
        print(f"{m['call']}: hash diff {m['rel_diff']:.2e}")
zLog lengths don't match: ú vs z Call types don't match at index rt   zOperators don't match at index r!   z] vs r#   zCall depths for z] don't match at index z(Redistribute calls don't match at index z(Triton kernel call args don't match for z
 at index z	:

log1: z

log2: c                 ón  >• [        U R                  5       5      [        UR                  5       5      :w  a?  [        S[        U R                  5       5       S[        UR                  5       5       35      eU  H;  nX   X   :w  d  M  TR                  STUS X   X   [	        X   X   5      US.5        M=     g )Nzhash key mismatch: r‚  ztriton kernel©Ú	call_typerˆ  Úarg_nameÚpytree_pathrš   r›   Úrel_diffÚis_input_hash)r  Úkeysr…  r£  rž   )Úhashes1Úhashes2Úis_inputÚkeyÚdifference_inforØ   s       €€r)   Úcompare_triton_hashesÚ>DebugMode.check_hash_mismatches.<locals>.compare_triton_hashesÃ  s­   ø€ Ü˜7Ÿ<™<›>Ó*¬c°'·,±,³.Ó.AÓAÜ,Ø1´#°g·l±l³nÓ2EÐ1FÀdÌ3ÈwÏ|É|Ë~ÓK^ÐJ_Ð`óð ó  '˜Ø"™<¨7©<Õ7Ø+×2Ñ2à1@Ø,3Ø03Ø37Ø-4©\Ø-4©\Ü0AØ(/©°g±ló1&ð 6>ñ!"öò  'rN   Nz2Triton kernel post-hash presence inconsistent for z: log1 has post_hashes=z, log2 has post_hashes=F)r�  z1Triton kernel pre-hash presence inconsistent for z: log1 has pre_hashes=z, log2 has pre_hashes=Tc                 ó0   >^• UUU4S jn[        X0U5        g )Nc                 ój   >• X:w  a-  TR                  STS [        U 5      UU[        X5      TS.5        g g )Nztorch opr„  )r£  r   rž   )Úkeypathrš   r›   r�  r�  rØ   s      €€€r)   Ú_helperÚKDebugMode.check_hash_mismatches.<locals>.compare_op_hashes.<locals>._helperþ  sA   ø€ Ø ›>Ø+×2Ñ2à1;Ø,3Ø04Ü39¸'³?Ø-2Ø-2Ü0AÀ%Ó0OØ5=ñ	!"õð *rN   )r   )r‹  rŒ  r�  r•  r�  rØ   s     ` €€r)   Úcompare_op_hashesÚ:DebugMode.check_hash_mismatches.<locals>.compare_op_hashesý  s   ù€ ÷ô ' w¸ÕArN   rj  z4Output hash presence inconsistent for triton kernel z] at index z: log1 has hash=z, log2 has hash=rf  z3Input hash presence inconsistent for triton kernel z: log1 has input_hash=z, log2 has input_hash=)r<   Ú
ValueErrorÚ	enumerateÚzipr~   rj   r“  rñ   rw   r8  r4  rW  r  rX  r[  rZ  r  rß   )r~  r  r€  ÚiÚlog1Úlog2Ú
call1_typeÚ
call2_typer…  Úop1_nameÚop2_namer�  Ú
has_post_1Ú
has_post_2Ú	has_pre_1Ú	has_pre_2r—  Ú	has_hash1Ú	has_hash2r�  rØ   s                      @@r)   Úcheck_hash_mismatchesÚDebugMode.check_hash_mismatchesg  s’  ù€ ôb ˆu‹:œ˜U›Ó#ÜÐ8¼¸U»¸ÀDÌÈUËÈÐUÓVÐVàˆÜ(¬¨UÓ):×;‰OˆA‰|�ä˜d›×,Ñ,ˆJÜ˜d›×,Ñ,ˆJØÓ'Ü Ø6°q°c¸¸J¸<ÀtÈJÈ<ÐXóð ð #ˆIô "0°Ó!5´~ÀdÓ7K�hØÓ#Ü Ø5°a°S¸¸9¸+ÀQÀxÀjÐPUÐV_ÐU`Ð`aÐbjÐakÐklÐmóð ð ˆGð �‰ $§/¡/Ó1Ü Ø& y k°°7°)Ð;RÐSTÐRUÐUWÐX\×XgÑXgÐWhÐhlÐmq×m|Ñm|Ðl}Ð~óð ô
 ˜$Ô 1×2Ñ2Ü˜“;¤%¨£+Ó-Ü$ØBÀ1À#ÀRÈÀvÈTÐRVÐQWÐXóð ò .ô ˜DÔ"3×4Ò4Ø—?‘? d§o¡oÓ5Ü$ØBÀ4×CSÑCSÐBTÐT^Ð_`Ð^að b%Ø%)§_¡_Ð$5°ZÀÇÁÐ?PðRóð ö
ð0 ×$Ñ$¨DÐ0Ø×$Ñ$¨DÐ0ð 'ð Ó+Ü$ØLÈT×M]ÑM]ÐL^ð _$Ø$% 3Ð&=¸j¸\ÐI`ÐakÐ`lðnóð ö
 Ù)Ø×(Ñ(¨$×*:Ñ*:ÀUòö
 "àŸ™¨tÐ3ØŸ™¨tÐ3ð  )ð !Ó-Ü(ØOÐPT×P`ÑP`ÐOað b(Ø() sÐ*@ÀÀÐKaÐbkÐalðnóð ö
 !Ù-Ø ŸO™O¨T¯_©_Àtõò !ò "ô" ˜D¤'×*Ô*öBð& !ŸH™H¨DÐ0×G°V¸t¿x¹xÑ5G�	Ø ŸH™H¨DÐ0×G°V¸t¿x¹xÑ5G�	Ø 	Ó)Ü$ØNÈyÈkÐYZÐ[bÐZcð d$Ø$% 3Ð&6°y°kÐAQÐR[ÐQ\ð^óð ö
 Ù%ØŸ™ Ñ(ØŸ™ Ñ(Ø!&ò÷ "‘>Ø $§¡°Ð 4× Q¸ÈÏÉÑ9Q�IØ $§¡°Ð 4× Q¸ÈÏÉÑ9Q�IØ  IÓ-Ü(ØQÐR[ÐQ\Ð\]Ð^eÐ]fð g(Ø() sÐ*@ÀÀÐKaÐbkÐalðnóð ÷
 !‘yÙ)Ø ŸH™H \Ñ2Ø ŸH™H \Ñ2Ø%)õñ]  <ðh ÐrN   )rÍ  rÌ  r  rñ   rŸ  rÏ  rÎ  rÇ  r¢  r»  rÀ  rÂ  r«  r¿  rÁ  r¼  r®  r½  rº  rÃ  r¾  rÆ  rb   )rp   N)NFr\   )NNN)r’   Fr3  )0rj   rk   rl   rm   rX   rÉ  rÓ  Úclassmethodr  r×  rÛ  rÞ  rá  ré  rì  rø  rþ  r  Ú
contextlibÚcontextmanagerr¯  r  rµ  rÈ  r  r&   r  r4  r   r¬  r)  r-  rW  r0  r<  Ústaticmethodr   rB  rL  rr  ru  Úpropertyrx  rô  ræ   r©  ro   r5  r6  s   @r)   r   r   ì  sí  ø† ð #ØØØ!%ØØ!Ø ØØØ $ØØ%*ñFð 
÷Fð FôP#ô-ð ð¨ó ó ðô$ô"
ô!ò"ò*!ôLõ\õ$	4ð ×Ññ'ó ð'òò+ôKð +1à˜‘Ið+1ð ˜c 5¨¨c¨¡?Ð2Ñ3°dÑ:ð+1ð " # u¨S°#¨X¡Ð"6Ñ7¸$Ñ>ð	+1ð
 
ô+1ðZ ×Ñð *.Ø!ñ!ð
   $™Jð!ð ô!ó ð!ô2
 ðØðØ(,¨S°#¨X©ðà	ôñ5$¨T°D©[ð 5$ÀCõ 5$ðn Ø×Ñà'+Ø$(Ø(,ñ!.Ø ‘_ð!.à˜T‘/ð!.ð  ‘oô!.ó ó ð!.ðF Ø×Ññ8ó ó ð8ð( Ø×ÑàJOñU5Ø˜C‘ $ s¡)Ñ+ðU5ØCGôU5ó ó ðU5ðn Ø×Ññ
+ó ó ð
+ð ñ$ó ð$ò$ð
 ð/�sð /˜tó /ó ð/ð à9>ñHØðHØ ðHØ26ðHà	ˆd‰ôHó öHrN   c                  óv   • [         S:X  a  g S n [        5        H  n[        U[        5      (       d  M  Un   U $    U $ rS   )rü  r   rw   r   )Ú
debug_moderž  s     r)   r   r   3  sB   € ä 1Ó$ØØ€JÜ0Ö2ˆÜ�dœI×&Ó&ØˆJØØÐñ	 3ð ÐrN   r\   r3  )br  r¬  rQ  rÇ   Úloggingr»   r±   rf   Úcollections.abcr   Útypingr   r   rc   Útorch._loggingr   Útorch._subclasses.fake_tensorr   r   Útorch.fx.graphr	   Útorch.utils._dtype_abbrsr
   Útorch.utils._python_dispatchr   r   r   Útorch.utils._pytreer   r   r   r   r   Útorch.utils._tracebackr   Útorch.utils.weakr   Útorch._dynamo.device_interfacer   r  r   Ú	getLoggerrj   rß   Ú__all__rD  r   r  Ú__annotations__r   r   rÚ  rr  rt  r`  rü  r&   r*   r0   r4   rD   rM   rP   r�   r‡   rx   r  r�   r–   rž   rn   r©   r¶   rË   rÒ   rÙ   rã   rî   rð   r  r8  rM  rW  rz  r‡  rŽ  r‘  r“  ÚlibraryÚ	custom_opræ   Úregister_faker—  r·  ÚInterpreterr™  r   r   rp   rN   r)   Ú<module>rÅ     s  ðòóB Û Û Û Û 	Û Û Ý $ß %ã Ý 'ß DÝ -Ý 0÷ñ ÷
õ õ 5Ý &ö Ý>Ý?ð ×Ò˜Ó!€àÐ/Ð
0€ð )Ð à)+Ð ˜˜X™Ó +Ø&(Ð �T˜(‘^Ó (Ø*,Ð ˜˜h™Ó ,ð Ð ð Ð àÐ àÐ àÐ ð5˜sô 5ð< Cô <ð9 sô 9ðF°ô FðQ Sô Q÷'ñ 'ñ&GÀ#õ Gñ"°cõ ñ�E—L‘Lð ¨dð ¸u¿|¹|ÈeÑ?Sõ ò,#ñ�e—l‘lð °ð ÀÇÁÐPSÑASõ ð0	%˜#ô 	%ð¨3ð °3¸±:ô ð 3¨¡:ô ð˜ô ð Ð ò#÷0.ñ .ôbGJˆjô GJôTD˜
ô DôN3˜:ô 3ô SL˜
ô SLôl
�Jô 
ò,ð	* jð 	*ÐPTô 	*ð*˜jð *ÐPTô *ð*˜ð ¨ô ð ‡�×ÑÐ3À"ÐÐEð�3ð ˜4ó ó Fðð
 ×Ñð˜ð  ó ó ðôE�u—x‘x×+Ñ+ô EôPDÐ!ô DðN	˜y¨4Ñ/õ 	rN   