Ë
    L²j;  ã                  óŒ   — d Z ddlmZ ddlmZ ddlmZmZ erddlZe G d„ d«      «       Z	e G d„ d	«      «       Z
 G d
„ d«      Zy)a  
Dynamo Profiler - tracks where Dynamo spends time during compilation.

This module provides profiling functionality for Dynamo tracing, showing per-function
cumtime (inclusive) and tottime (exclusive) in a cProfile-compatible format.
The output can be visualized with tools like snakeviz.

Usage:
    # Enable via config (prints pstats output):
    torch._dynamo.config.dynamo_profiler = True

    # Or save to file for snakeviz:
    torch._dynamo.config.dynamo_profiler = "/tmp/dynamo.prof"
    # Then: snakeviz /tmp/dynamo.prof
é    )Úannotations)Ú	dataclass)ÚAnyÚTYPE_CHECKINGNc                  ó  — e Zd ZU dZded<   ded<   ded<   ded<   ded<   ded	<   ded
<   dZded<   dZded<   dZded<   dZded<   dZ	ded<   e
dd„«       Ze
dd„«       Ze
dd„«       Ze
dd„«       Ze
d d„«       Ze
d!d„«       Zd"d„Zy)#ÚFunctionTraceTiminga+  
    Timing data for a single inlined function trace.

    Follows cProfile conventions:
    - cumtime: total time in function including all subcalls (inclusive)
    - tottime: time in function excluding subcalls (exclusive)
    - caller info: who called this function (for building call graph)
    ÚstrÚ	func_nameÚfilenameÚintÚfirstlinenoÚ
cumtime_nsÚ
tottime_nsÚbytecode_countÚinline_depthNú
str | NoneÚcaller_func_nameÚcaller_filenamez
int | NoneÚcaller_firstlinenoTÚboolÚis_primitive_call© ú tuple[tuple[str, str, int], ...]Ú
call_stackc                ó   — | j                   S ©N©r   ©Úselfs    ú\/var/www/html/ia-enhanced/venv/lib/python3.12/site-packages/torch/_dynamo/dynamo_profiler.pyÚtrace_time_nsz!FunctionTraceTiming.trace_time_ns=   s   € à�‰Ðó    c                ó    — | j                   dz  S ©Ng    €„.Ar   r   s    r    Útrace_time_msz!FunctionTraceTiming.trace_time_msA   ó   € à�‰ Ñ$Ð$r"   c                ó    — | j                   dz  S r$   r   r   s    r    Ú
cumtime_mszFunctionTraceTiming.cumtime_msE   r&   r"   c                ó    — | j                   dz  S r$   )r   r   s    r    Ú
tottime_mszFunctionTraceTiming.tottime_msI   r&   r"   c                ór   — | j                   �+| j                  xs d| j                  xs d| j                   fS y)z/Return caller as a pstats-compatible key tuple.NÚ r   )r   r   r   r   s    r    Ú
caller_keyzFunctionTraceTiming.caller_keyM   sD   € ð × Ñ Ð,à×$Ñ$Ò*¨Ø×'Ñ'Ò,¨1Ø×%Ñ%ðð ð
 r"   c                óH   — | j                   | j                  | j                  fS )z6Return this function as a pstats-compatible key tuple.)r   r   r
   r   s    r    Úfunc_keyzFunctionTraceTiming.func_keyX   s   € ð —‘˜t×/Ñ/°·±Ð@Ð@r"   c                óÂ   — d| j                   › d| j                  › d| j                  › d| j                  d›d| j                  d›d| j
                  › d| j                  › d	�S )
NzFunctionTraceTiming(z at ú:z
, cumtime=ú.2fzms, tottime=zms, bytecode=z, depth=ú))r
   r   r   r(   r*   r   r   r   s    r    Ú__repr__zFunctionTraceTiming.__repr__]   sp   € à" 4§>¡>Ð"2°$°t·}±}°oÀQÀt×GWÑGWÐFXð YØ—‘ sÐ+¨<¸¿¹ÈÐ7Lð MØ×+Ñ+Ð,¨H°T×5FÑ5FÐ4GÀqðJð	
r"   )Úreturnr   )r5   Úfloat)r5   ztuple[str, int, str] | None)r5   ztuple[str, int, str])r5   r	   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   r   r   r   r   Úpropertyr!   r%   r(   r*   r-   r/   r4   r   r"   r    r   r      sè   … ñð ƒNØƒMØÓàƒOØƒOàÓàÓà#'Ð�jÓ'Ø"&€O�ZÓ&Ø%)Ð˜
Ó)ð #Ð�tÓ"ð 46€JÐ0Ó5ð òó ðð ò%ó ð%ð ò%ó ð%ð ò%ó ð%ð òó ðð òAó ðAô
r"   r   c                  óR   — e Zd ZU dZded<   ded<   ded<   ded<   ded<   d	Zd
ed<   y)ÚProfilerStackEntryz@Stack entry for tracking function timing in the Dynamo profiler.r	   r
   r   r   r   Ústart_time_nsÚchild_time_nsTr   r   N)r7   r8   r9   r:   r;   r   r   r"   r    r>   r>   e   s,   … áJàƒNØƒMØÓØÓØÓØ"Ð�tÔ"r"   r>   c                  ó¦   — e Zd ZdZdd„Zdd„Zdd„Z	 	 	 	 	 	 	 	 	 	 dd„Zdd„Zdd„Z	dd„Z
dd	„Z	 d	 	 	 	 	 dd„Z	 d	 	 	 	 	 dd„Z	 d	 	 	 	 	 dd„Zy
)ÚDynamoProfilerStatez:State for Dynamo profiler tracking function trace timings.c                ó    — g | _         g | _        y r   )ÚtimingsÚstackr   s    r    Ú__init__zDynamoProfilerState.__init__t   s   € Ø24ˆŒØ/1ˆ�
r"   c                ó:   — | j                   j                  |«       y)z)Record timing data for a traced function.N)rD   Úappend)r   Útimings     r    Úrecord_timingz!DynamoProfilerState.record_timingx   s   € à�‰×Ñ˜FÕ#r"   c                ó   — | j                   S )zGet all recorded timings.)rD   r   s    r    Úget_timingszDynamoProfilerState.get_timings|   s   € à�|‰|Ðr"   c           
     ó    ‡‡‡— t        ˆˆˆfd„| j                  D «       «       }| j                  j                  t        ‰‰‰|d|¬«      «       y)z'Push a new entry onto the timing stack.c              3  ó€   •K  — | ]5  }|j                   ‰k(  xr  |j                  ‰k(  xr |j                  ‰k(  –— Œ7 y ­wr   ©r
   r   r   )Ú.0Úentryr   r   r
   s     €€€r    ú	<genexpr>z+DynamoProfilerState.push.<locals>.<genexpr>…   sM   øè ø€ ò 
ð ð �O‰O˜yÑ(ò 1Ø—‘ (Ñ*ò1à×!Ñ! [Ñ0ó1ñ
ùs   ƒ;>r   )r
   r   r   r?   r@   r   N)ÚanyrE   rH   r>   )r   r
   r   r   r?   Úis_primitives    ```  r    ÚpushzDynamoProfilerState.push€   sU   ú€ ô
 õ 
ð Ÿ™ô	
ó 
ð 
ˆð 	�
‰
×ÑÜØ#Ø!Ø'Ø+ØØ".ôõ		
r"   c                óP   — | j                   r| j                   j                  «       S y)z(Pop the top entry from the timing stack.N)rE   Úpopr   s    r    rW   zDynamoProfilerState.pop–   s   € à�:Š:Ø—:‘:—>‘>Ó#Ð#Ør"   c                ób   — | j                   r#| j                   d   xj                  |z  c_        yy)zGAdd the child's cumulative time to the parent's child_time accumulator.éÿÿÿÿN)rE   r@   )r   Úchild_cumtime_nss     r    Úadd_child_timez"DynamoProfilerState.add_child_timeœ   s(   € à�:Š:Ø�J‰J�r‰N×(Ò(Ð,<Ñ<Ö(ð r"   c                ó€   — | j                   r2| j                   d   }|j                  |j                  |j                  fS y)zLGet the current caller (top of stack) as (func_name, filename, firstlineno).rY   N)rE   r
   r   r   )r   rQ   s     r    Úget_current_callerz&DynamoProfilerState.get_current_caller¡   s4   € à�:Š:Ø—J‘J˜r‘NˆEØ—O‘O U§^¡^°U×5FÑ5FÐGÐGØr"   c                ó:   — t        d„ | j                  D «       «      S )zOGet the full current call stack as tuple of (func_name, filename, firstlineno).c              3  ób   K  — | ]'  }|j                   |j                  |j                  f–— Œ) y ­wr   rO   )rP   rQ   s     r    rR   z5DynamoProfilerState.get_call_stack.<locals>.<genexpr>ª   s*   è ø€ ò 
ØEJˆU�_‰_˜eŸn™n¨e×.?Ñ.?Ô@ñ
ùs   ‚-/)ÚtuplerE   r   s    r    Úget_call_stackz"DynamoProfilerState.get_call_stack¨   s    € äñ 
ØNRÏjÉjô
ó 
ð 	
r"   Nc                óB  — ddl }ddl}ddl}ddl}|j	                  t
        «      }i }i }	| j                  D �]H  }
|
j                  |
j                  |
j                  f}||vrdddddœ||<   i |	|<   ||   }|dxx   dz  cc<   |dxx   |
j                  dz  z  cc<   |
j                  r'|d	xx   dz  cc<   |d
xx   |
j                  dz  z  cc<   |
j                  €Œ¦|
j                  |
j                  xs d|
j                  xs df}||	|   vrdddddœ|	|   |<   |	|   |   }|dxx   dz  cc<   |dxx   |
j                  dz  z  cc<   |d
xx   |
j                  dz  z  cc<   |
j                  s�Œ<|d	xx   dz  cc<   �ŒK |�rt!        |j#                  «       d„ d¬«      }t%        d«       t%        dd›dd	d›ddd›dd
d›d�«       t%        d«       d}d}|D ]k  \  \  }}}}|d   }|d	   }|d   dz  }|d
   dz  }||z  }||z  }d|v r|j'                  d«      d   n|}t%        |d›d|d›d|d›d|d›d|› d|› d|› d�«       Œm t%        d«       t%        dt)        | j                  «      › dt)        |«      › �«       t%        d |d!›d"|d!›d#�«       t+        |	j-                  «       «      D ]   }|	|   D ]  }||vsŒdddddœ||<   i |	|<   Œ Œ" i }|j#                  «       D ]M  \  }}i }|	|   j#                  «       D ]  \  }}|d   |d	   |d   |d
   f||<   Œ |d	   |d   |d   |d
   |f||<   ŒO |j/                  «       }|j1                  «        |j3                  «         |j4                  ||j7                  «       ¬$«      }||_        t;        d%„ |j=                  «       D «       «      |_        t;        d&„ |j=                  «       D «       «      |_         t;        d'„ |j=                  «       D «       «      |_!        |r$|jE                  |«       |jG                  d(||«       |S ))zØGenerate pstats.Stats object from recorded timings.

        Args:
            output_file: Optional file path to save the stats.
            print_raw: If True, print raw aggregate timings before returning.
        r   Ng        )ÚncallsÚpcallsÚtottimeÚcumtimerc   é   re   g    eÍÍArd   rf   r,   c                ó   — | d   d   S )Nrg   rf   r   )Úxs    r    ú<lambda>z5DynamoProfilerState.generate_pstats.<locals>.<lambda>ò   s   € °!°A±$°y±/€ r"   T)ÚkeyÚreversez 
=== Aggregate Timings (raw) ===z>8ú z>12z
  functionzP--------------------------------------------------------------------------------iè  ú/rY   z>10.2fzms zms  z (r1   r3   zTotal timings: z, unique functions: zSum tottime: r2   zms, Sum cumtime: Úms)Ústreamc              3  ó&   K  — | ]	  }|d    –— Œ y­w)rg   Nr   ©rP   Úss     r    rR   z6DynamoProfilerState.generate_pstats.<locals>.<genexpr>;  s   è ø€ ÒB¨  !¥ÑBùó   ‚c              3  ó&   K  — | ]	  }|d    –— Œ y­w)r   Nr   rr   s     r    rR   z6DynamoProfilerState.generate_pstats.<locals>.<genexpr><  s   è ø€ ÒA¨˜q �tÑAùrt   c              3  ó&   K  — | ]	  }|d    –— Œ y­w)é   Nr   rr   s     r    rR   z6DynamoProfilerState.generate_pstats.<locals>.<genexpr>=  s   è ø€ Ò? a˜Q˜q�TÑ?ùrt   z/Saved pstats to %s. Visualize with: snakeviz %s)$ÚcProfileÚioÚloggingÚpstatsÚ	getLoggerr7   rD   r   r   r
   r   r   r   r   r   r   ÚsortedÚitemsÚprintÚsplitÚlenÚlistÚkeysÚProfileÚenableÚdisableÚStatsÚStringIOÚstatsÚsumÚvaluesÚtotal_callsÚ
prim_callsÚtotal_ttÚ
dump_statsÚinfo)r   Úoutput_fileÚ	print_rawrx   ry   rz   r{   ÚlogÚ
aggregatedÚcaller_edgesÚtrk   Úaggr-   ÚedgeÚsorted_itemsÚtotal_cumtimeÚtotal_tottimer   Úlinenor
   rc   rd   re   rf   Ú
short_fileÚ
stats_dictÚcallersÚdummy_profiler‰   s                                 r    Úgenerate_pstatsz#DynamoProfilerState.generate_pstats®   sú  € ó 	ÛÛÛà×Ñ¤Ó)ˆð BDˆ
ð ð 	ð —‘ó )	(ˆAØ—:‘:˜qŸ}™}¨a¯k©kÐ:ˆCà˜*Ñ$àØØ"Ø"ñ	#�
˜3‘ð %'�˜SÑ!à˜S‘/ˆCØ�‹M˜QÑ‹MØ�	‹N˜aŸl™l¨SÑ0Ñ0‹Nà×"Ò"Ø�H“ Ñ"“Ø�I“ !§,¡,°Ñ"4Ñ4“ð × Ñ Ñ,à×%Ñ%Ø×(Ñ(Ò-¨AØ×&Ñ&Ò,¨"ð�
ð
  \°#Ñ%6Ñ6à"#Ø"#Ø#&Ø#&ñ	5�L Ñ% jÑ1ð $ CÑ(¨Ñ4�Ø�X“ !Ñ#“Ø�Y“ 1§<¡<°#Ñ#5Ñ5“ð �Y“ 1§<¡<°#Ñ#5Ñ5“Ø×&Ô&Ø˜“N aÑ'•NðS)	(òV Ü!Ø× Ñ Ó"Ñ(AÈ4ôˆLô Ð5Ô6ÜØ˜B�-˜q ¨" ¨Q¨y¸¨o¸Q¸yÈ¸oÈZÐXôô �(ŒOØˆMØˆMØ6Bò Ñ2Ñ-�˜6 9¨sØ˜X™�Ø˜X™�Ø˜i™.¨4Ñ/�Ø˜i™.¨4Ñ/�Ø Ñ(�Ø Ñ(�Ø8;¸x¹˜XŸ^™^¨CÓ0°Ò4ÈX�
ÜØ˜b�k  6¨" +¨Q¨w°vÐ.>¸cÀ'È&ÐAQÐQUØ �k  J <¨q°°¸ð;õðô �(ŒOÜØ!¤# d§l¡lÓ"3Ð!4Ð4HÌÈZËÐHYÐZôô Ø ¨cÐ2Ð2CÀMÐRUÐCVÐVXÐYôô ˜×)Ñ)Ó+Ó,ò 		2ˆCØ*¨3Ñ/ò 2�
Ø ZÒ/à"#Ø"#Ø#&Ø#&ñ	.�J˜zÑ*ð 02�L Ò,ñ2ð		2ð ð 	ð #×(Ñ(Ó*ò 	‰HˆC�ØQSˆGØ$0°Ñ$5×$;Ñ$;Ó$=ò Ñ �
˜Dà˜‘NØ˜‘NØ˜‘OØ˜‘Oð	'�˜
Ò#ðð �H‘Ø�H‘Ø�I‘Ø�I‘ØðˆJ�sŠOð	ð& !×(Ñ(Ó*ˆØ×ÑÔØ×ÑÔØ�—‘˜]°2·;±;³=ÔAˆà ˆŒÜÑB¨j×.?Ñ.?Ó.AÔBÓBˆÔÜÑA¨Z×->Ñ->Ó-@ÔAÓAˆÔÜÑ?¨:×+<Ñ+<Ó+>Ô?Ó?ˆŒáØ×Ñ˜[Ô)Ø�H‰HØAØØôð ˆr"   c           	     ó|  — ddl }ddl}ddl}|j                  d«      st	        d«       y|j                  d«      st	        d«       y|€|j                  dd«      d   d	z   }	 |j                  dd
dddd|g|j                  |j                  ¬«      }|j                  ddd|g|j                  |j                  |j                  ¬«      }|j                  j                  «        |j                  «       \  }}	|j                  «       \  }}
|j                  dk7  rt	        d|
j                  «       › �«       y|j                  dk7  rt	        d|	j                  «       › �«       y|j                  j                  |«      st	        d|› �«       yt	        d|› �«       |S # t        $ r}t	        d|› �«       Y d}~yd}~ww xY w)a{  Generate an SVG call graph from a profile file using gprof2dot and graphviz.

        Args:
            profile_file: Path to the pstats profile file.
            svg_file: Optional path for the output SVG. If not provided, uses
                profile_file with .svg extension.

        Returns:
            Path to the generated SVG file, or None if generation failed.
        r   NÚ	gprof2dotz8gprof2dot not found. Install with: pip install gprof2dotÚdotz3graphviz 'dot' not found. Install graphviz package.ú.rg   z.svgz-fr{   z"--node-label=total-time-percentagez!--node-label=self-time-percentagez--node-label=total-time)ÚstdoutÚstderrz-Tsvgz-o)Ústdinr¦   r§   zgprof2dot failed: zgraphviz dot failed: zSVG file was not created: zSVG call graph saved to: zFailed to generate SVG: )ÚosÚshutilÚ
subprocessÚwhichr   ÚrsplitÚPopenÚPIPEr¦   ÚcloseÚcommunicateÚ
returncodeÚdecodeÚpathÚisfileÚ	Exception)r   Úprofile_fileÚsvg_filer©   rª   r«   r£   r¤   Ú_Údot_errÚgprof2dot_errÚes               r    Úgenerate_svgz DynamoProfilerState.generate_svgI  sÅ  € ó 	ÛÛà�|‰|˜KÔ(ÜÐLÔMØà�|‰|˜EÔ"ÜÐGÔHØàÐØ#×*Ñ*¨3°Ó2°1Ñ5¸Ñ>ˆHð,	à"×(Ñ(àØØØ8Ø7Ø-Ø ðð "—‘Ø!—‘ð )ó ˆIð ×"Ñ"Ø˜  xÐ0Ø×&Ñ&Ø!—‘Ø!—‘ð	 #ó ˆCð ×Ñ×"Ñ"Ô$ØŸ™Ó*‰JˆAˆwØ(×4Ñ4Ó6ÑˆAˆ}à×#Ñ# qÒ(ÜØ(¨×)=Ñ)=Ó)?Ð(@ÐAôð à�~‰~ Ò"ÜÐ-¨g¯n©nÓ.>Ð-?Ð@ÔAØà—7‘7—>‘> (Ô+ÜÐ2°8°*Ð=Ô>ØäÐ-¨h¨ZÐ8Ô9ØˆOøäò 	ÜÐ,¨Q¨CÐ0Ô1Üûð	ús+   Á"CF Ä4+F Å )F Æ
F Æ	F;Æ#F6Æ6F;c                ó(  — ddl }| j                  sy| j                  |d¬«      }t        d«       |j                  |_        |j                  d«      j                  «        |r1t        d|› �«       t        d|› �«       |r| j                  |«       yyy)	a#  Print profiler stats to stdout and optionally save to file.

        Args:
            output_file: Optional path to save the pstats profile.
            generate_svg: If True and output_file is provided, also generate an SVG
                call graph using gprof2dot and graphviz.
        r   NT)r’   z!
=== Dynamo Profiler (pstats) ===Ú
cumulativez
Profile saved to: zVisualize with: snakeviz )	ÚsysrD   r¡   r   r¦   rp   Ú
sort_statsÚprint_statsr½   )r   r‘   r½   rÀ   r‰   s        r    r�   zDynamoProfilerState.dump_stats“  s�   € ó 	à�|Š|Øà×$Ñ$ [¸DÐ$ÓAˆÜÐ2Ô3Ø—z‘zˆŒØ×Ñ˜Ó&×2Ñ2Ô4áÜÐ(¨¨Ð6Ô7ÜÐ-¨k¨]Ð;Ô<áØ×!Ñ! +Õ.ð ð	 r"   )r5   ÚNone)rI   r   r5   rÃ   )r5   zlist[FunctionTraceTiming])
r
   r	   r   r	   r   r   r?   r   r5   rÃ   )r5   zProfilerStackEntry | None)rZ   r   r5   rÃ   )r5   ztuple[str, str, int] | None)r5   r   )NF)r‘   r   r’   r   r5   zpstats.Statsr   )r·   r	   r¸   r   r5   r   )NT)r‘   r   r½   r   r5   rÃ   )r7   r8   r9   r:   rF   rJ   rL   rU   rW   r[   r]   ra   r¡   r½   r�   r   r"   r    rB   rB   q   sÉ   „ ÙDó2ó$óð
Øð
Ø(+ð
Ø:=ð
ØNQð
à	ó
ó,ó=ó
ó
ð AFðYØ%ðYØ9=ðYà	óYðx 9=ðHØðHØ+5ðHà	óHðV DHð/Ø%ð/Ø<@ð/à	ô/r"   rB   )r:   Ú
__future__r   Údataclassesr   Útypingr   r   r{   r   r>   rB   r   r"   r    ú<module>rÇ      s_   ðñõ  #å !ß %ñ Ûð ÷F
ð F
ó ðF
ðR ÷#ð #ó ð#÷{/ò {/r"   