ó
    "Eñi’V  ã                   ó°  • S SK r S SKrS SKrS SKJr  S SKJr  S SKJrJ	r	J
r
  S SKJr  S SKJr  \
(       a  S SKJr  S S	4S
\4S jjr\ R&                  " \S SS9r\ R&                  " \S S	S9r\ " S S5      5       r\ " S S5      5       r " S S5      r " S S5      rS"S jrS S S4S jrS rS#S jr\ " S S5      5       r\ " S S 5      5       rS! r g)$é    N)Údeque)Ú	dataclass)ÚAnyÚLiteralÚTYPE_CHECKING©Úprofile)Ú
DeviceType)Ú_KinetoEventc                 ó   • U R                   $ ©N)Úchildren©Úxs    ÚR/home/mande/repo/quber/.venv/lib/python3.13/site-packages/torch/profiler/_utils.pyÚ<lambda>r      s   € °1·:²:ó    FÚreversec              #   óÔ   #   • U(       a  [         OS n[        U" U 5      5      nU(       a<  U" U5      nUv •  U" U" U5      5       H  nUR                  U5        M     U(       a  M;  g g 7f)Nc                 ó   • U $ r   © r   s    r   r   Ú_traverse.<locals>.<lambda>   s   € ©qr   )Úreversedr   Úappend)ÚtreeÚnext_fnÚchildren_fnr   ÚorderÚ	remainingÚ
curr_eventÚchild_events           r   Ú	_traverser"      sX   é € Þ�H¡[€EÜ‘e˜D“kÓ"€IÞ
Ù˜YÓ'ˆ
ØÒÙ ¡¨ZÓ!8Ö9ˆKØ×Ñ˜[Ö)ñ :÷ Š)ùs   ‚A"A(Á&A(c                 ó"   • U R                  5       $ r   )Úpopr   s    r   r   r      s
   € ¸a¿e¹e¼gr   T)r   r   c                 ó"   • U R                  5       $ r   )Úpopleftr   s    r   r   r      s
   €  §¡¤r   c                   ó^   • \ rS rSr% Sr\\S'   Sr\\S'   Sr\\S'   Sr	\\S'   \
S 5       rSrg	)
ÚEventMetricsé!   r   Úduration_time_nsÚself_time_nsÚidle_time_nsÚqueue_depthc                 óV   • U R                   S:X  a  gU R                  U R                   -  $ )Nr   g        )r*   r,   ©Úselfs    r   Úfraction_idle_timeÚEventMetrics.fraction_idle_time(   s*   € à× Ñ  AÓ%ØØ× Ñ  4×#8Ñ#8Ñ8Ð8r   r   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r*   ÚintÚ__annotations__r+   r,   r-   Úpropertyr1   Ú__static_attributes__r   r   r   r(   r(   !   s=   ‡ àÐ�cÓØ€L�#ÓØ€L�#ÓØ€K�Óàñ9ó ó9r   r(   c                   ó8   • \ rS rSr% \\S'   \\S'   Sr\\S'   Srg)ÚIntervalé/   ÚstartÚendr   r-   r   N)r3   r4   r5   r6   r7   r8   r-   r:   r   r   r   r<   r<   /   s   ‡ àƒJØ	ƒHØ€K�Ör   r<   c                   óL   • \ rS rSrSS jrS rS rS\4S jrS\	\
   4S	 jrS
rg)ÚEventKeyé6   ÚreturnNc                 ó   • Xl         g r   ©Úevent)r0   rF   s     r   Ú__init__ÚEventKey.__init__7   s   € Ø�
r   c                 ó@   • [        U R                  R                  5      $ r   )ÚhashrF   Úidr/   s    r   Ú__hash__ÚEventKey.__hash__:   s   € Ü�D—J‘J—M‘MÓ"Ð"r   c                 ó\   • U R                   R                  UR                   R                  :H  $ r   )rF   rK   )r0   Úothers     r   Ú__eq__ÚEventKey.__eq__=   s   € Ø�z‰z�}‰} §¡§¡Ñ.Ð.r   c                 ó0   • U R                   R                   $ r   )rF   Únamer/   s    r   Ú__repr__ÚEventKey.__repr__@   s   € Ø—*‘*—/‘/Ð"Ð#r   Ú	intervalsc                 ó¸  • Sn[        US S9nU(       af  [        U R                  R                  US   R                  5      n[        U R                  R                  US   R                  5      nX4:  a  X$U-
  -  nSu  pVU[        U5      :  aÌ  X   nX   nUS-  nUR                  UR                  :”  a4  UR                  UR                  :”  a  US-  nMW  UR                  Ul        Un[        U R                  R                  UR                  5      n[        U R                  R                  UR                  5      nX4:  a  X$U-
  -  nU[        U5      :  a  MÌ  U$ )Nr   c                 ó   • U R                   $ r   ©r>   r   s    r   r   Ú,EventKey.intervals_overlap.<locals>.<lambda>E   s   € °A·G²Gr   ©Úkey)r   é   r]   )	ÚsortedÚmaxrF   Ústart_time_nsr>   ÚminÚend_time_nsr?   Úlen)	r0   rV   Úoverlap_timeÚoverlap_startÚoverlap_endÚiÚjÚprev_intervalÚcurr_intervals	            r   Úintervals_overlapÚEventKey.intervals_overlapC   s<  € ØˆÜ˜9Ñ*;Ñ<ˆ	æÜ §
¡
× 8Ñ 8¸)ÀA¹,×:LÑ:LÓMˆMÜ˜dŸj™j×4Ñ4°iÀ±l×6FÑ6FÓGˆKàÓ*Ø¨mÑ ;Ñ;�à‰ˆØ”#�i“.Ó Ø%™LˆMØ%™LˆMØ�‰FˆAØ× Ñ  =×#6Ñ#6Ó6à ×$Ñ$ }×'8Ñ'8Ó8Ø˜‘F�AÙà*7×*;Ñ*;�MÔ'Ø�Aä §
¡
× 8Ñ 8¸-×:MÑ:MÓNˆMÜ˜dŸj™j×4Ñ4°m×6GÑ6GÓHˆKØÓ*Ø¨mÑ ;Ñ;�ð! ”#�i“.Õ ð$ Ðr   rE   ©rC   N)r3   r4   r5   r6   rG   rL   rP   ÚstrrT   Úlistr<   rk   r:   r   r   r   rA   rA   6   s-   † ôò#ò/ð$˜#ô $ð¨4°©>÷ r   rA   c                   ó\   • \ rS rSrS\SS4S jrSS jrS rSS jrS	 r	SS
\
S\4S jjrSrg)ÚBasicEvaluationéd   ÚprofrC   Nc                 óF  • Xl         0 U l        U R                  5         [        U R                  R	                  5       S S9U l        U R
                   Vs/ s H  o"R                  PM     snU l        / U l        U R                  5       U l
        U R                  5         g s  snf )Nc                 ó.   • U R                   R                  $ r   )rF   r`   r   s    r   r   Ú*BasicEvaluation.__init__.<locals>.<lambda>j   s   € ¨q¯w©w×/DÒ/Dr   r[   )r	   ÚmetricsÚcompute_self_timer^   ÚkeysÚ
event_keysrF   ÚeventsÚcuda_eventsÚcompute_queue_depthÚqueue_depth_listÚcompute_idle_time)r0   rs   Úes      r   rG   ÚBasicEvaluation.__init__e   s�   € ØŒØ57ˆŒØ×ÑÔ Ü Ø�L‰L×ÑÓÑ%Dñ
ˆŒð )-¯ªÓ8ª 1—w”w©Ñ8ˆŒØ/1ˆÔØ $× 8Ñ 8Ó :ˆÔØ×ÑÕ ùò 9s   ÁBc                 óh  • U R                   R                  c  [        S5      e[        U R                   R                  R	                  5       5      nU(       aÜ  UR                  5       nUR                  nUR                   H"  nX4R                  -  nUR                  U5        M$     [        U5      U R                  ;   a%  [        SUR                   SUR                   35      e[        US9U R                  [        U5      '   UR                  U R                  [        U5         l        U(       a  MÛ  gg)z=
Computes event's self time(total time - time in child ops).
Núkineto_results must not be NonezDuplicate id: z, )r+   )r	   Úkineto_resultsÚAssertionErrorr   Úexperimental_event_treer$   r*   r   r   rA   rw   rK   rS   r(   )r0   Ústackr    Ú	self_timer!   s        r   rx   Ú!BasicEvaluation.compute_self_timeq   s   € ð �<‰<×&Ñ&Ñ.Ü Ð!BÓCÐCÜ�d—l‘l×1Ñ1×IÑIÓKÓLˆö ØŸ™›ˆJØ"×3Ñ3ˆIØ)×2Ô2�Ø×9Ñ9Ñ9�	Ø—‘˜[Ö)ñ  3ô ˜
Ó# t§|¡|Ó3Ü$Ø$ Z§]¡] O°2°j·o±oÐ5FÐGóð ô 2>È9Ñ1UˆD�L‰Lœ *Ó-Ñ.ð ",×!<Ñ!<ð �L‰LÜ˜Ó$ñä÷ Šer   c                 ó  ^^^• U R                   R                  c  [        S5      eU R                   R                  R                  5       nS mS m[	        U4S jU 5       S S9n[	        U4S jU 5       S S9n[	        X#-   S	 S9U l        0 nS
nU H  m[        UU4S jUS9nXdT'   Ub  UOUnM     S
nSnX#-   U R                  -   n	S n
/ nU	R                  U
S9  U	 GH©  n[        US5      (       aE  UR                  5       S-  nUR                  5       UR                  5       -   S-  nXÄ;   a	  XL   b  XL   n[        US5      (       a@  UR                  5       nUR                  5       UR                  5       -   nXÄ;   a	  XL   b  XL   nO)[        US5      (       a  UR                  nUR                  nU[        U5      :  aB  X7   R                  5       W::  a,  US-  nU[        U5      :  a  X7   R                  5       U::  a  M,  X‡-
  S-   n[!        US
5      n[        US5      (       d  [        US5      (       a  UR#                  [%        WWU5      5        GMy  [        US5      (       d  GM�  XðR&                  [)        U5         l        GM¬     U$ )zÂ
Computes queue_depth at each event. This will calculate the queue depth data for
All the events in the tree.
This will return a list of Interval of queue depth data of cuda launch and kernels.
rƒ   c                 ób   ^• 1 Skn[        [        U SU 5      5      m[        U4S jU 5       5      $ )z+Check if the event is a CUDA launch kernel.>   ÚcudaLaunchKernelÚ__cudaLaunchKernelÚcudaLaunchKernelExCÚcudaLaunchCooperativeKernelÚ&cudaLaunchCooperativeKernelMultiDevicerS   c              3   óF   >#   • U  H  nTR                  U5      v •  M     g 7fr   )Ú
startswith©Ú.0ÚpatternrS   s     €r   Ú	<genexpr>ÚUBasicEvaluation.compute_queue_depth.<locals>.is_cuda_launch_kernel.<locals>.<genexpr>�   s   øé € ÐOº°G�t—‘ w×/Ð/ºùs   ƒ!)rn   ÚgetattrÚany)r€   Úlaunch_patternsrS   s     @r   Úis_cuda_launch_kernelÚBBasicEvaluation.compute_queue_depth.<locals>.is_cuda_launch_kernel“   s0   ø€ òˆOô ”w˜q &¨!Ó,Ó-ˆDÜÔO¹ÓOÓOÐOr   c                 óÎ   ^• U R                  5       [        R                  :w  a  g[        [	        U SU 5      5      R                  5       m1 Skn[        U4S jU 5       5      (       + $ )z,Check if the event is a CUDA runtime kernel.FrS   >   ÚcpyÚmemÚfreeÚallocc              3   ó,   >#   • U  H	  oT;   v •  M     g 7fr   r   r“   s     €r   r–   ÚNBasicEvaluation.compute_queue_depth.<locals>.is_cuda_kernel.<locals>.<genexpr>ª   s   øé € ÐKÒ:J¨w dž?Ò:Jùs   ƒ)Údevice_typer
   ÚCUDArn   r˜   Úlowerr™   )r€   Úexclude_patternsrS   s     @r   Úis_cuda_kernelÚ;BasicEvaluation.compute_queue_depth.<locals>.is_cuda_kernelŸ   sS   ø€ ð �}‰}‹¤*§/¡/Ó1Øä”w˜q &¨!Ó,Ó-×3Ñ3Ó5ˆDò  ?ÐäÔKÑ:JÓKÓKÔKÐKr   c              3   óF   >#   • U  H  nT" U5      (       d  M  Uv •  M     g 7fr   r   )r”   r€   r›   s     €r   r–   Ú6BasicEvaluation.compute_queue_depth.<locals>.<genexpr>­   s   øé € ÐDš�1Ñ+@À×+C�Q‰Qšùó   ƒ!˜	!c                 ó"   • U R                  5       $ r   ©Ústart_nsr   s    r   r   Ú5BasicEvaluation.compute_queue_depth.<locals>.<lambda>®   ó
   € ˜!Ÿ*™*œ,r   r[   c              3   óF   >#   • U  H  nT" U5      (       d  M  Uv •  M     g 7fr   r   )r”   r€   r¨   s     €r   r–   r«   ±   s   øé € Ð=š�1©>¸!×+<�Q‰Qšùr¬   c                 ó"   • U R                  5       $ r   r®   r   s    r   r   r°   ²   r±   r   c                 ó"   • U R                  5       $ r   r®   r   s    r   r   r°   ¶   s
   € À1Ç:Á:Ä<r   r   c                 óF   >• U R                  5       TR                  5       :H  $ r   )Úlinked_correlation_id)r   Úcuda_launch_events    €r   r   r°   ¾   s   ø€ ˜!×1Ñ1Ó3Ø$×:Ñ:Ó<ò=r   rY   éÿÿÿÿc                 óÜ   • [        U S5      (       a  U R                  5       S-  $ [        U S5      (       a  U R                  5       $ [        U S5      (       a  U R                  $ [	        S5      e)NÚstart_uséè  r¯   r`   zUnknown Event Type)Úhasattrrº   r¯   r`   Ú	ExceptionrE   s    r   Únew_old_event_comparatorÚEBasicEvaluation.compute_queue_depth.<locals>.new_old_event_comparatorÊ   s`   € Ü�u˜j×)Ñ)Ø—~‘~Ó'¨$Ñ.Ð.Ü�u˜j×)Ñ)Ø—~‘~Ó'Ð'Ü�u˜o×.Ñ.Ø×*Ñ*Ð*ÜÐ0Ó1Ð1r   rº   r»   r¯   r`   r]   )r	   r„   r…   r{   r^   r|   Úindex_of_first_matchÚsortr¼   rº   Úduration_usr¯   Úduration_nsr`   rb   rc   r_   r   r<   rw   rA   r-   )r0   Úcuda_event_listÚcuda_launch_eventsÚcuda_kernel_eventsÚkernel_mappingÚlast_mapped_kernelÚindexÚcurrent_kernel_indexÚspawned_kernel_indexÚ
all_eventsr¾   r~   rF   Ú
start_timeÚend_timeÚcurrent_queue_depthr·   r¨   r›   s                   @@@r   r}   Ú#BasicEvaluation.compute_queue_depth‰   s¬  ú€ ð �<‰<×&Ñ&Ñ.Ü Ð!BÓCÐCØŸ,™,×5Ñ5×<Ñ<Ó>ˆò
	Pò	Lô $ÜD™ÓDÙ&ñ
Ðô $Ü=™Ó=Ù&ñ
Ðô
 "ØÑ3Ñ9Oñ
ˆÔð 35ˆØÐÛ!3ÐÜ(Ø"ô=à(ñ	ˆEð 16Ð,Ñ-Ø*/Ñ*;¡ÐASÒñ "4ð  !ÐØ!Ðà'Ñ<¸t¿{¹{ÑJˆ
ò	2ð ,.ÐØ�‰Ð4ˆÑ5ÜˆEä�u˜j×)Ñ)Ø"Ÿ^™^Ó-°Ñ4�
à!ŸN™NÓ,¨u×/@Ñ/@Ó/BÑBÀdÑJ�àÓ*¨~Ñ/DÑ/PØ+9Ñ+@Ð(Ü�u˜j×)Ñ)Ø"Ÿ^™^Ó-�
Ø Ÿ>™>Ó+¨e×.?Ñ.?Ó.AÑA�àÓ*¨~Ñ/DÑ/PØ+9Ñ+@Ð(øÜ˜ ×0Ñ0Ø"×0Ñ0�
Ø ×,Ñ,�ð %¤sÐ+=Ó'>Ó>Ø'Ñ=×FÑFÓHÈZÓWà$¨Ñ)Ð$ð %¤sÐ+=Ó'>Ó>Ø'Ñ=×FÑFÓHÈZÕWð #7Ñ"MÐPQÑ"QÐÜ"%Ð&9¸1Ó"=Ðä�u˜j×)Ñ)¬W°U¸J×-GÑ-GØ ×'Ñ'Ü˜Z¨Ð3FÓG÷ô ˜ ×0Ô0Ø<O—‘œX e›_Ñ-×9ñA  ðD  Ðr   c                 ó  • SnSn/ nU R                   (       aˆ  U R                  (       aw  U[        U R                  S   R                  U R                   S   R                  5      [        U R                   S   R
                  U R                  S   R                  5      /-  nU R                    Hi  nUR                  S:X  a  U(       d  UR
                  nSnUR                  S:”  d  M:  U(       d  MC  UR                  [        X$R                  5      5        SnMk     U R                   Vs/ s H  oUR                  PM     nnU H8  n[        U5      R                  U5      U R                  [        U5         l        M:     gs  snf )z$
Computes idle time of the profile.
Fr   r¸   TN)r~   r{   r<   r`   r>   r?   rb   r-   r   rw   rF   rA   rk   r,   )r0   ÚidleÚ
idle_startÚidle_intervalsÚ
data_pointr€   Ú
event_listrF   s           r   r   Ú!BasicEvaluation.compute_idle_timeù   s9  € ð
 ˆØˆ
Ø)+ˆØ× ×  T§[§[ØÜ˜Ÿ™ Q™×5Ñ5°t×7LÑ7LÈQÑ7O×7UÑ7UÓVÜ˜×.Ñ.¨rÑ2×6Ñ6¸¿¹ÀB¹×8SÑ8SÓTðñ ˆNð
 ×/Ô/ˆJØ×%Ñ%¨Ó*¶4Ø'Ÿ^™^�
Ø�Ø×%Ñ%¨Õ)¯d¨dØ×%Ñ%¤h¨z×;KÑ;KÓ&LÔMØ’ñ 0ð (,§|¢|Ó4¢| !—g”g¡|ˆ
Ð4ÛˆEÜ9AØó:çÑ Ó/ð �L‰Lœ %›Ñ)Ö6ò  ùò 5s   Ä'E=c                 óÔ  ^• SSK n[        [        U R                  5      5      nU Vs/ s H  oDR                  PM     nnSmSn/ nSnU[        U5      :  a¦  XX   T:”  a  US-  nM  [        US-   [        U5      5       He  n	[        UU4S jU	S9n
[        XYU
S9nUc  M!  X[   U:¼  d  M+  UR                  [        X;   R                  X8   R                  5      5        U
b  U
OUn  O   US-  nU[        U5      :  a  M¦  U R                   Vs/ s H  nUR                  U5      (       d  M  UPM     nnU(       Ga  UR                  U Vs/ s H  oÀR                  U   R                  PM     snUR                   S9nUR                  U Vs/ s H  oÀR                  U   R"                  PM     snUR                   S9nXòR%                  U5      -
  UR'                  U5      -  nXâR%                  U5      -
  UR'                  U5      -  nUS	U-  -   n[)        [+        UUS
S9[,        R.                  " S5      S
S9 VVs/ s H  u  nnUPM
     nnnUSU nU$ s  snf s  snf s  snf s  snf s  snnf )zç
Filter and Rank the events based on some heuristics:
1) Events that are in the falling phase of the queue depth.
2) Events that have a high idle_time, self_time difference.

Parameters:
    length: The number of events to return.
r   Né   r]   c                 ó   >• U T:*  $ r   r   )r   Úbottom_threasholds    €r   r   Ú-BasicEvaluation.rank_events.<locals>.<lambda>1  s   ø€ ¨Ð.?Ò)?r   rY   )r>   r?   )Údtypeg333333ã?T)Ústrict)r\   r   )Útorchro   r   r~   r-   rc   ÚrangerÀ   Úargmaxr   r<   r>   rw   rk   Útensorr+   Úfloat32r1   ÚmeanÚstdr^   ÚzipÚoperatorÚ
itemgetter)r0   Úlengthrß   r~   r€   Ú	qd_valuesÚtop_threasholdÚdecrease_intervalrg   rh   Únext_minimum_idxÚpeak_idxrF   rÖ   rˆ   Ú	idle_timeÚnormalized_gainÚnormalized_selfÚheuristic_score_listÚ_rÛ   s                       @r   Úrank_eventsÚBasicEvaluation.rank_events  s’  ø€ ó 	ä¤¨×)>Ñ)>Ó ?Ó@ÐÙ,<Ó=Ò,< q—]”]Ñ,<ˆ	Ð=àÐØˆØÐØˆØ”#�i“.Ó Ø‰|Ð/Ó/Ø�Q‘�ÙÜ˜1˜q™5¤# i£.Ö1�ô $8ØÔ?Àqñ$Ð ô " )Ð:JÑK�ð Ó'¨IÑ,?À>Õ,QØ%×,Ñ,Ü Ø,Ñ6×<Ñ<Ð>NÑ>Q×>WÑ>Wóôð
 -=Ñ,HÑ(Èa�AÙñ! 2ð" �‰FˆAð+ ”#�i“.Õ ð2 Ÿšó
â%�Ø×&Ñ&Ð'8×9÷ Ù%ð 	ð 
÷
 ØŸ™Ù?IÓJºz°e—‘˜eÑ$×1Ô1¹zÑJØ—m‘mð %ð ˆIð Ÿ™ÙEOÓPÂZ¸E—‘˜eÑ$×7Ô7ÁZÑPØ—m‘mð %ð ˆIð  )¯:©:°iÓ+@Ñ@ÀEÇIÁIÈiÓDXÑXˆOØ(¯:©:°iÓ+@Ñ@ÀEÇIÁIÈiÓDXÑXˆOØ#2°S¸?Ñ5JÑ#JÐ ô
 !'ÜÐ,¨jÀÑFÜ ×+Ò+¨AÓ.Ø ò!ôò!‘H�A�uó ñ!ð ñ ð $ G VÐ,ˆJØÐùòs >ùò:
ùò Kùò Qùós#   ¨IÄ
IÄ(IÅ"IÆ"IÈ7I$ré   Úprint_enablec                 ó@  • U R                  U5      nU(       d  U$ U(       a  SOSnUSR                  U Vs/ s HA  nS SU S[        UR                  5       SU R                  U   R
                  S-  S	 S
S 3	PMC     sn5      -  nU(       a  [        U5        U$ s  snf )NzOptimizable events:
zNo events to optimize
Ú
zP--------------------------------------------------------------------------------z
Event:                z
Source code location: z
Percentage idle time: rr   z.2fz%
)rô   ÚjoinÚsource_code_locationrF   rw   r1   Úprint)r0   ré   rö   rÖ   ÚoutputrF   s         r   Úget_optimizable_eventsÚ&BasicEvaluation.get_optimizable_events^  sÄ   € Ø×%Ñ% fÓ-ˆ
ÞØÐÞ,6Ñ(Ð<Uˆà�$—)‘)ñ (óò (�Eð �Jð Ø�gð Ü+¨E¯K©KÓ8Ð9ð :Ø—|‘| EÑ*×=Ñ=ÀÑCÀCÐHð IØ	€
ó	ñ
 (ñó	
ñ 		
ˆö Ü�&ŒMØÐùòs   ¶AB
)r|   rz   r{   rw   r	   r~   rm   )r]   T)r3   r4   r5   r6   r	   rG   rx   r}   r   rô   r7   Úboolrý   r:   r   r   r   rq   rq   d   sE   † ð
!˜Wð 
!¨ô 
!ô=ò0n ô`0ò8GñR¨Sð ÀD÷ ð r   rq   c                 óˆ   • Ub  U[        U 5      :¼  a  [        U 5      n[        X#5       H  nU" X   5      (       d  M  Us  $    g r   )rc   rà   )ÚseqÚ	predicater>   r?   rg   s        r   rÀ   rÀ   s  s@   € Ø
�{�cœS ›X“oÜ�#‹hˆÜ�5ÖˆÙ�S‘V×ÓØŠHñ ð r   c                 ó   • U $ r   r   r   s    r   r   r   |  s   € ™ar   c                 ó`   • XU n [        U 5      S:X  a  g U R                  [        XS95      U-   $ )Nr   r[   )rc   rÉ   r_   )r  r\   r>   r?   s       r   rá   rá   |  s2   € Ø
�Cˆ.€CÜ
ˆ3ƒx�1ƒ}ØØ�9‰9”S˜Ñ&Ó'¨%Ñ/Ð/r   c                 ó†   • U b>  [         R                  " SU R                  5      nUc  U R                  n M5  U R                  $ g)Nz
\.py\(.*\)zNo source code location found)ÚreÚsearchrS   Úparent)rF   Úmatchs     r   rú   rú   ƒ  s:   € Ø
Ñ
Ü—	’	˜-¨¯©Ó4ˆØ‰=Ø—L‘LˆEÙØ�z‰zÐØ*r   c                  óT   • SSK Jn   U " 5           S S S 5        g ! , (       d  f       g = f)Nr   r   )Útorch.autograd.profilerr	   r   s    r   Ú_init_for_cuda_graphsr  ‘  s   € Ý/á	�Ø÷ 
�Žús   Ž™
'c                   ót   • \ rS rSr% Sr\\S'   \S   \S'   \S   S-  \S'   \\-  S-  \S	'   \	\\
4   \S
'   Srg)ÚTimelineEventi˜  z-Represents an event in the profiler timeline.Ú	timestamp)r>   r?   ÚregularÚ
event_type©ÚfilenameÚnodeNÚmarker_typeÚ
identifierrF   r   )r3   r4   r5   r6   Ú__doc__r7   r8   r   rn   Údictr   r:   r   r   r   r  r  ˜  sD   ‡ á7àƒNØÐ1Ñ2Ó2ØÐ+Ñ,¨tÑ3Ó3Ø�c‘	˜DÑ Ó Ø��S�‰>Ör   r  c                   ó^   • \ rS rSr% Sr\S   \S'   \\-  \S'   \	S-  \S'   Sr
\S-  \S'   S	rg)
ÚContextStackEntryi£  z5Represents a context (filename or node) in the stack.r  Úcontext_typer  NÚmetadataÚtidr   )r3   r4   r5   r6   r  r   r8   rn   r7   r  r  r:   r   r   r   r  r  £  s3   ‡ á?àÐ,Ñ-Ó-Ø�c‘	ÓØ�T‰kÓØ€Cˆˆt‰Ör   r  c           
      ó  ^• SSK Jn  U R                  S/ 5      n/ mS nU4S jnU H‚  nSU;  d  SU;  a  M  U" U5      (       aA  US   S	S
 nUR                  S5      (       a  U" SXe5        MG   [	        U5      nU" SWU5        M_  US   nTR                  [        USSSU5      5        M„     TR                  S S9  / n	T GH+  n
U
R                  =S:X  Ga«    U
R                  c  [        S5      eU
R                  S:X  a¨  [        U
R                  [        5      (       d+  [        S[        U
R                  5      R                    35      eUR                  U
R                  5      nU
R"                  R                  S5      nU	R                  [%        SU
R                  X¼5      5        Mç  U
R                  S:X  aÇ  SnU
R"                  R                  S5      n['        U	5       H3  nUR(                  S:X  d  M  UR*                  U:X  d  M'  UR,                  n  O   U(       a^  UR                  S0 5      nU
R                  U;   a9  UU
R                     nU	R                  [%        SU
R                  UU5      5        GM¸  GM»  GM¾  GMÁ  =S:X  at    [/        [1        U	5      S-
  SS5       HS  nU	U   nU
R                  UR(                  :X  d  M$  U
R                  UR                  :X  d  M@  U	R3                  U5          GM6     GM;  S:X  d  GMC  SnSnU
R"                  R                  S5      n['        U	5       Hr  nUR*                  U:X  d  M  UR(                  S:X  d  M'  UR,                  (       d  M:  UR,                  R                  SS5      nUR,                  R                  SS5      n  O   U(       d  U(       a:  U
R"                  R5                  S0 5      nU(       a  UUS'   U(       a  UUS'   GM(  GM+  GM.     g! [
         a     GN…f = f)aF  
Maps recorded profiler events to their corresponding fx nodes and adds stack traces.

Builds a timeline of all events (regular ops and FX markers for filenames/nodes),
sorts by timestamp, then processes chronologically while maintaining a context stack of active
filename/node scopes. Regular events are augmented with stack traces and node names from the
innermost active context. Runtime is O(n log n) for n events.

Args:
    traced_data: Json of profiler events from Chrome trace

Returns:
    Dict mapping recorded event names to their aten operations with added stack traces
r   )Ú_FX_METADATA_REGISTRYÚtraceEventsc                 óÊ   • U R                  S5      S:H  =(       aI    U R                  SS5      R                  S5      =(       a!    U R                  SS5      R                  S5      $ )NÚcatÚcpu_oprS   Ú z## z ##)Úgetr’   ÚendswithrE   s    r   Úis_fx_marker_eventÚLmap_recorded_events_to_aten_ops_with_stack_trace.<locals>.is_fx_marker_eventÃ  sT   € à�I‰I�eÓ Ñ(÷ 6Ø—	‘	˜& "Ó%×0Ñ0°Ó7÷6à—	‘	˜& "Ó%×.Ñ.¨uÓ5ð	
r   c           	      ó’   >• US   nX2S   -   nTR                  [        USXU5      5        TR                  [        USXU5      5        g )NÚtsÚdurr>   r?   )r   r  )r  r  rF   Ústart_tsÚend_tsÚevent_timelines        €r   Úappend_fx_marker_eventÚPmap_recorded_events_to_aten_ops_with_stack_trace.<locals>.append_fx_marker_eventÊ  sR   ø€ Ø˜‘;ˆØ %™LÑ(ˆØ×ÑÜ˜( G¨ZÀUÓKô	
ð 	×ÑÜ˜& %¨ÀÓGõ	
r   r*  r+  rS   é   éýÿÿÿz.pyr  r  r  Nc                 ó   • U R                   $ r   )r  r   s    r   r   ÚBmap_recorded_events_to_aten_ops_with_stack_trace.<locals>.<lambda>ê  s   €  a§k¢kr   r[   r>   z+identifier must not be None for start eventz0identifier must be str for filename marker, got r  Únode_metadatar?   r]   r¸   Ústack_tracezNo model stack trace availabler$  ÚargsÚ	node_name)Útorch.fx.tracebackr  r%  r&  r7   Ú
ValueErrorr   r  rÁ   r  r  r…   r  Ú
isinstancern   Útyper3   rF   r  r   r  r  r  rà   rc   r$   Ú
setdefault)Útraced_datar  Útrace_eventsr'  r/  rF   ÚcontentÚ
node_indexr,  Úcontext_stackÚtimeline_eventr  r  Úcurrent_file_metadataÚ	ctx_entryr5  Ú	node_metarg   Úcurrent_stack_traceÚcurrent_node_nameÚ	event_tidr7  r.  s                         @r   Ú0map_recorded_events_to_aten_ops_with_stack_tracerJ  ­  sÙ  ø€ õ 9à—?‘? =°"Ó5€Lð +-€Nò
õ
ó ˆØ�uÓ ¨UÓ 2Ùá˜e×$Ñ$Ø˜F‘m A bÐ)ˆGà×Ñ ×&Ñ&Ù& z°7ÖBðÜ!$ W£�Jñ ' v¨z¸5ÖAð ˜T‘{ˆHØ×!Ñ!¤-°¸)ÀTÈ4ÐQVÓ"WÖXñ' ð, ×ÑÑ1ÐÑ2ð .0€Mô )ˆØ×'Ñ'ßØ!×,Ñ,Ñ4Ü(Ð)VÓWÐWà!×-Ñ-°Ó;Ü% n×&?Ñ&?Ä×EÑEÜ,ð#Ü#'¨×(AÑ(AÓ#B×#KÑ#KÐ"LðNóð ð
  5×8Ñ8¸×9RÑ9RÓS�HØ(×.Ñ.×2Ñ2°5Ó9�CØ!×(Ñ(Ü)Ø&¨×(AÑ(AÀ8óöð
 $×/Ñ/°6Ó9à,0Ð)Ø(×.Ñ.×2Ñ2°5Ó9�CÜ%-¨mÖ%<˜	à%×2Ñ2°jÕ@Ø )§¡°Õ 4à4=×4FÑ4FÐ1Ù!ñ &=ö -Ø(=×(AÑ(AÀ/ÐSUÓ(V˜Ø)×4Ñ4¸ÓEØ5BØ .× 9Ñ 9ñ6˜Ið *×0Ñ0Ü 1Ø$*¨N×,EÑ,EÀyÐRUó!"÷ò	 Fò -ò :ö0 äœs =Ó1°AÑ5°r¸2Ö>�AØ -¨aÑ 0�Ià&×2Ñ2°i×6LÑ6LÕLØ*×5Ñ5¸×9MÑ9MÕMà%×)Ñ)¨!Ô,Ûô ?÷ ð '+Ð#Ø$(Ð!Ø*×0Ñ0×4Ñ4°UÓ;�	ä!)¨-Ö!8�Ià —}‘}¨	Õ1Ø$×1Ñ1°VÕ;À	×@R×@RÑ@RØ2;×2DÑ2D×2HÑ2HØ -Ð/Oó3Ð/ð 1:×0BÑ0B×0FÑ0FÀvÈrÓ0RÐ-ñ "ñ "9ö 'Ö*;Ø)×/Ñ/×:Ñ:¸6À2ÓF�DÞ*Ø.A˜˜]Ñ+Þ(Ø,=˜˜[Ô)ò )ò	 +<òY )øô! "ó Úðús   Á/O2Ï2
P Ï?P )r   Nrm   )!Ú	functoolsrç   r  Úcollectionsr   Údataclassesr   Útypingr   r   r   r  r	   Útorch.profilerr
   Útorch.autogradr   rÿ   r"   ÚpartialÚtraverse_dfsÚtraverse_bfsr(   r<   rA   rq   rÀ   rá   rú   r  r  r  rJ  r   r   r   Ú<module>rT     s	  ðã Û Û 	Ý Ý !ß .Ñ .å +Ý %ö Ý+ñ *>Èuñ *Èõ *ð × Ò  Ñ4EÈtÑT€Ø× Ò ØÑ,°eñ€ð
 ÷
9ð 
9ó ð
9ð ÷ð ó ð÷+ñ +÷\Lñ Lô^ñ   q¨dô 0ò+ôð ÷ð ó ðð ÷ð ó ðóT>r   