Ë
    3êñi’V  ã                   ó¨  — d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZm	Z	m
Z
 d dlmZ d dlmZ e
rd dlmZ d„ d	fd
efd„Z e j&                  ed„ d¬«      Z e j&                  ed„ d	¬«      Ze G d„ d«      «       Ze G d„ d«      «       Z G d„ d«      Z G d„ d«      Zd"d„Zd„ d dfd„Zd„ Zd#d„Ze G d„ d«      «       Ze G d„ d «      «       Zd!„ Z y)$é    N)Údeque)Ú	dataclass)ÚAnyÚLiteralÚTYPE_CHECKING©Úprofile)Ú
DeviceType)Ú_KinetoEventc                 ó   — | j                   S ©N)Úchildren©Úxs    úW/var/www/pod-logistic/pod-ai/venv/lib/python3.12/site-packages/torch/profiler/_utils.pyú<lambda>r      s
   € °1·:±:€ ó    FÚreversec              #   ó°   K  — |rt         nd„ }t         || «      «      }|r4 ||«      }|–—  | ||«      «      D ]  }|j                  |«       Œ |rŒ3y y ­w)Nc                 ó   — | S r   © r   s    r   r   z_traverse.<locals>.<lambda>   s   € ¨q€ r   )Úreversedr   Úappend)ÚtreeÚnext_fnÚchildren_fnr   ÚorderÚ	remainingÚ
curr_eventÚchild_events           r   Ú	_traverser!      s\   è ø€ Ù�H¡[€EÜ‘e˜D“kÓ"€IÙ
Ù˜YÓ'ˆ
ØÒÙ ¡¨ZÓ!8Ó9ò 	*ˆKØ×Ñ˜[Õ)ð	*ô ùs   ‚AAÁAc                 ó"   — | j                  «       S r   )Úpopr   s    r   r   r      s   € ¸a¿e¹e»g€ r   T)r   r   c                 ó"   — | j                  «       S r   )Úpopleftr   s    r   r   r      s   €  §¡£€ r   c                   óV   — e Zd ZU dZeed<   dZeed<   dZeed<   dZeed<   e	d„ «       Z
y)ÚEventMetricsr   Úduration_time_nsÚself_time_nsÚidle_time_nsÚqueue_depthc                 óT   — | j                   dk(  ry| j                  | j                   z  S )Nr   g        )r(   r*   ©Úselfs    r   Úfraction_idle_timezEventMetrics.fraction_idle_time(   s*   € à× Ñ  AÒ%ØØ× Ñ  4×#8Ñ#8Ñ8Ð8r   N)Ú__name__Ú
__module__Ú__qualname__r(   ÚintÚ__annotations__r)   r*   r+   Úpropertyr/   r   r   r   r'   r'   !   s=   … àÐ�cÓØ€L�#ÓØ€L�#ÓØ€K�Óàñ9ó ñ9r   r'   c                   ó0   — e Zd ZU eed<   eed<   dZeed<   y)ÚIntervalÚstartÚendr   r+   N)r0   r1   r2   r3   r4   r+   r   r   r   r7   r7   /   s   … àƒJØ	ƒHØ€K�Ôr   r7   c                   ó>   — e Zd Zd	d„Zd„ Zd„ Zdefd„Zdee	   fd„Z
y)
ÚEventKeyÚreturnNc                 ó   — || _         y r   ©Úevent)r.   r?   s     r   Ú__init__zEventKey.__init__7   s	   € Øˆ�
r   c                 ó@   — t        | j                  j                  «      S r   )Úhashr?   Úidr-   s    r   Ú__hash__zEventKey.__hash__:   s   € Ü�D—J‘J—M‘MÓ"Ð"r   c                 ó\   — | j                   j                  |j                   j                  k(  S r   )r?   rC   )r.   Úothers     r   Ú__eq__zEventKey.__eq__=   s   € Ø�z‰z�}‰} §¡§¡Ñ.Ð.r   c                 ó0   — | j                   j                  › S r   )r?   Únamer-   s    r   Ú__repr__zEventKey.__repr__@   s   € Ø—*‘*—/‘/Ð"Ð#r   Ú	intervalsc                 ó²  — d}t        |d„ ¬«      }|rgt        | j                  j                  |d   j                  «      }t        | j                  j                  |d   j                  «      }||k  r|||z
  z  }d\  }}|t        |«      k  rÊ||   }||   }|dz  }|j                  |j                  kD  r2|j                  |j                  kD  r|dz  }ŒU|j                  |_        |}t        | j                  j                  |j                  «      }t        | j                  j                  |j                  «      }||k  r|||z
  z  }|t        |«      k  rŒÊ|S )Nr   c                 ó   — | j                   S r   ©r8   r   s    r   r   z,EventKey.intervals_overlap.<locals>.<lambda>E   s
   € °A·G±G€ r   ©Úkey)r   é   rQ   )	ÚsortedÚmaxr?   Ústart_time_nsr8   ÚminÚend_time_nsr9   Úlen)	r.   rK   Úoverlap_timeÚoverlap_startÚoverlap_endÚiÚjÚprev_intervalÚcurr_intervals	            r   Úintervals_overlapzEventKey.intervals_overlapC   sJ  € ØˆÜ˜9Ñ*;Ô<ˆ	áÜ §
¡
× 8Ñ 8¸)ÀA¹,×:LÑ:LÓMˆMÜ˜dŸj™j×4Ñ4°iÀ±l×6FÑ6FÓGˆKà˜{Ò*Ø ¨mÑ ;Ñ;�à‰ˆˆ1Ø”#�i“.Ò Ø% a™LˆMØ% a™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   ©r<   N)r0   r1   r2   r@   rD   rG   ÚstrrJ   Úlistr7   r_   r   r   r   r;   r;   6   s-   „ óò#ò/ð$˜#ó $ð¨4°©>ô r   r;   c                   óJ   — e Zd Zdeddfd„Zdd„Zd„ Zdd„Zd„ Zdd	e	d
e
fd„Zy)ÚBasicEvaluationÚprofr<   Nc                 óJ  — || _         i | _        | j                  «        t        | j                  j	                  «       d„ ¬«      | _        | j
                  D �cg c]  }|j                  ‘Œ c}| _        g | _        | j                  «       | _
        | j                  «        y c c}w )Nc                 ó.   — | j                   j                  S r   )r?   rT   r   s    r   r   z*BasicEvaluation.__init__.<locals>.<lambda>j   s   € ¨q¯w©w×/DÑ/D€ r   rO   )r	   ÚmetricsÚcompute_self_timerR   ÚkeysÚ
event_keysr?   ÚeventsÚcuda_eventsÚcompute_queue_depthÚqueue_depth_listÚcompute_idle_time)r.   re   Úes      r   r@   zBasicEvaluation.__init__e   s�   € ØˆŒØ57ˆŒØ×ÑÔ Ü Ø�L‰L×ÑÓÑ%Dô
ˆŒð )-¯©Ö8 1�q—w“wÒ8ˆŒØ/1ˆÔØ $× 8Ñ 8Ó :ˆÔØ×ÑÕ ùò 9s   ÁB c                 óP  — | j                   j                  €t        d«      ‚t        | j                   j                  j	                  «       «      }|rÖ|j                  «       }|j                  }|j                  D ]"  }||j                  z  }|j                  |«       Œ$ t        |«      | j                  v r%t        d|j                  › d|j                  › �«      ‚t        |¬«      | j                  t        |«      <   |j                  | j                  t        |«         _        |rŒÕyy)zM
        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   r;   rh   rC   rI   r'   )r.   Ústackr   Ú	self_timer    s        r   ri   z!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�	Ø—‘˜[Õ)ð*ô ˜
Ó# t§|¡|Ñ3Ü$Ø$ Z§]¡] O°2°j·o±oÐ5FÐGóð ô 2>È9Ô1UˆD�L‰Lœ *Ó-Ñ.ð ",×!<Ñ!<ð �L‰LÜ˜Ó$ñäô r   c                 óì  ‡‡‡— | j                   j                  €t        d«      ‚| j                   j                  j                  «       }d„ Šd„ Št	        ˆfd„|D «       d„ ¬«      }t	        ˆfd„|D «       d„ ¬«      }t	        ||z   d	„ ¬«      | _        i }d
}|D ]  Št        |ˆfd„|¬«      }||‰<   |�|n|}Œ  d
}d}||z   | j                  z   }	d„ }
g }|	j                  |
¬«       |	D �]‡  }t        |d«      rE|j                  «       dz  }|j                  «       |j                  «       z   dz  }||v r
||   �||   }t        |d«      r@|j                  «       }|j                  «       |j                  «       z   }||v r/||   �*||   }n$t        |d«      r|j                  }|j                  }|t        |«      k  r@||   j                  «       k  r*|dz  }|t        |«      k  r||   j                  «       |k  rŒ*||z
  dz   }t!        |d
«      }t        |d«      st        |d«      r|j#                  t%        |«      «       �Œ]t        |d«      s�Œk|| j&                  t)        |«         _        �ŒŠ |S )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.
        rs   c                 ó`   ‡— h d£}t        t        | d| «      «      Št        ˆfd„|D «       «      S )z+Check if the event is a CUDA launch kernel.>   ÚcudaLaunchKernelÚ__cudaLaunchKernelÚcudaLaunchKernelExCÚcudaLaunchCooperativeKernelÚ&cudaLaunchCooperativeKernelMultiDevicerI   c              3   ó@   •K  — | ]  }‰j                  |«      –— Œ y ­wr   )Ú
startswith©Ú.0ÚpatternrI   s     €r   ú	<genexpr>zUBasicEvaluation.compute_queue_depth.<locals>.is_cuda_launch_kernel.<locals>.<genexpr>�   s   øè ø€ ÒO°G�t—‘ w×/ÑOùs   ƒ)ra   ÚgetattrÚany)rq   Úlaunch_patternsrI   s     @r   Úis_cuda_launch_kernelzBBasicEvaluation.compute_queue_depth.<locals>.is_cuda_launch_kernel“   s0   ø€ òˆOô ”w˜q &¨!Ó,Ó-ˆDÜÓO¸ÔOÓOÐOr   c                 óÂ   ‡— | j                  «       t        j                  k7  ryt        t	        | d| «      «      j                  «       Šh d£}t        ˆfd„|D «       «       S )z,Check if the event is a CUDA runtime kernel.FrI   >   ÚcpyÚmemÚfreeÚallocc              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wr   r   r‚   s     €r   r…   zNBasicEvaluation.compute_queue_depth.<locals>.is_cuda_kernel.<locals>.<genexpr>ª   s   øè ø€ ÒK¨w˜7 dœ?ÑKùs   ƒ)Údevice_typer
   ÚCUDAra   r†   Úlowerr‡   )rq   Úexclude_patternsrI   s     @r   Úis_cuda_kernelz;BasicEvaluation.compute_queue_depth.<locals>.is_cuda_kernelŸ   sS   ø€ ð �}‰}‹¤*§/¡/Ò1Øä”w˜q &¨!Ó,Ó-×3Ñ3Ó5ˆDò  ?ÐäÓKÐ:JÔKÓKÐKÐKr   c              3   ó4   •K  — | ]  } ‰|«      sŒ|–— Œ y ­wr   r   )rƒ   rq   r‰   s     €r   r…   z6BasicEvaluation.compute_queue_depth.<locals>.<genexpr>­   s   øè ø€ ÒD�1Ñ+@ÀÕ+CŒQÑDùó   ƒ‘c                 ó"   — | j                  «       S r   ©Ústart_nsr   s    r   r   z5BasicEvaluation.compute_queue_depth.<locals>.<lambda>®   ó   € ˜!Ÿ*™*›,€ r   rO   c              3   ó4   •K  — | ]  } ‰|«      sŒ|–— Œ y ­wr   r   )rƒ   rq   r”   s     €r   r…   z6BasicEvaluation.compute_queue_depth.<locals>.<genexpr>±   s   øè ø€ Ò=�1©>¸!Õ+<ŒQÑ=ùr–   c                 ó"   — | j                  «       S r   r˜   r   s    r   r   z5BasicEvaluation.compute_queue_depth.<locals>.<lambda>²   rš   r   c                 ó"   — | j                  «       S r   r˜   r   s    r   r   z5BasicEvaluation.compute_queue_depth.<locals>.<lambda>¶   s   € À1Ç:Á:Ã<€ r   r   c                 óF   •— | j                  «       ‰j                  «       k(  S r   )Úlinked_correlation_id)r   Úcuda_launch_events    €r   r   z5BasicEvaluation.compute_queue_depth.<locals>.<lambda>¾   s!   ø€ ˜!×1Ñ1Ó3Ø$×:Ñ:Ó<ñ=€ r   rN   éÿÿÿÿc                 ó¾   — t        | d«      r| j                  «       dz  S t        | d«      r| j                  «       S t        | d«      r| j                  S t	        d«      ‚)NÚstart_uséè  r™   rT   zUnknown Event Type)Úhasattrr£   r™   rT   Ú	Exceptionr>   s    r   Únew_old_event_comparatorzEBasicEvaluation.compute_queue_depth.<locals>.new_old_event_comparatorÊ   sW   € Ü�u˜jÔ)Ø—~‘~Ó'¨$Ñ.Ð.Ü�u˜jÔ)Ø—~‘~Ó'Ð'Ü�u˜oÔ.Ø×*Ñ*Ð*ÜÐ0Ó1Ð1r   r£   r¤   r™   rT   rQ   )r	   rt   ru   rl   rR   rm   Úindex_of_first_matchÚsortr¥   r£   Úduration_usr™   Úduration_nsrT   rV   rW   rS   r   r7   rh   r;   r+   )r.   Úcuda_event_listÚcuda_launch_eventsÚcuda_kernel_eventsÚkernel_mappingÚlast_mapped_kernelÚindexÚcurrent_kernel_indexÚspawned_kernel_indexÚ
all_eventsr§   ro   r?   Ú
start_timeÚend_timeÚcurrent_queue_depthr    r”   r‰   s                   @@@r   rn   z#BasicEvaluation.compute_queue_depth‰   sÆ  ú€ ð �<‰<×&Ñ&Ð.Ü Ð!BÓCÐCØŸ,™,×5Ñ5×<Ñ<Ó>ˆò
	Pò	Lô $ÛD˜ÔDÙ&ô
Ðô $Û=˜Ô=Ù&ô
Ðô
 "ØÐ!3Ñ3Ñ9Oô
ˆÔð 35ˆØÐØ!3ò 	TÐÜ(Ø"ó=à(ô	ˆEð 16ˆNÐ,Ñ-Ø*/Ð*;¡ÐASÑð	Tð  !ÐØ!Ðà'Ð*<Ñ<¸t¿{¹{ÑJˆ
ò	2ð ,.ÐØ�‰Ð4ˆÔ5Øó  	PˆEä�u˜jÔ)Ø"Ÿ^™^Ó-°Ñ4�
à!ŸN™NÓ,¨u×/@Ñ/@Ó/BÑBÀdÑJ�à˜NÑ*¨~¸eÑ/DÐ/PØ+9¸%Ñ+@Ð(Ü�u˜jÔ)Ø"Ÿ^™^Ó-�
Ø Ÿ>™>Ó+¨e×.?Ñ.?Ó.AÑA�à˜NÑ*¨~¸eÑ/DÐ/PØ+9¸%Ñ+@Ñ(Ü˜ Ô0Ø"×0Ñ0�
Ø ×,Ñ,�ð %¤sÐ+=Ó'>Ò>Ø'Ð(<Ñ=×FÑFÓHÈZÒWà$¨Ñ)Ð$ð %¤sÐ+=Ó'>Ò>Ø'Ð(<Ñ=×FÑFÓHÈZÓWð #7Ð9MÑ"MÐPQÑ"QÐÜ"%Ð&9¸1Ó"=Ðä�u˜jÔ)¬W°U¸JÔ-GØ ×'Ñ'Ü˜Z¨Ð3FÓGöô ˜ Ö0Ø<O�—‘œX e›_Ñ-Ö9ðA 	PðD  Ðr   c                 óÊ  — d}d}g }| j                   rƒ| j                  rw|t        | j                  d   j                  | j                   d   j                  «      t        | j                   d   j
                  | j                  d   j                  «      gz  }| j                   D ][  }|j                  dk(  r|s|j
                  }d}|j                  dkD  sŒ2|sŒ5|j                  t        ||j                  «      «       d}Œ] | j                  D �cg c]  }|j                  ‘Œ }}|D ]7  }t        |«      j                  |«      | j                  t        |«         _        Œ9 yc c}w )z4
        Computes idle time of the profile.
        Fr   r¡   TN)ro   rl   r7   rT   r8   r9   rV   r+   r   rh   r?   r;   r_   r*   )r.   ÚidleÚ
idle_startÚidle_intervalsÚ
data_pointrq   Ú
event_listr?   s           r   rp   z!BasicEvaluation.compute_idle_timeù   sD  € ð
 ˆØˆ
Ø)+ˆØ× Ò  T§[¢[ØÜ˜Ÿ™ Q™×5Ñ5°t×7LÑ7LÈQÑ7O×7UÑ7UÓVÜ˜×.Ñ.¨rÑ2×6Ñ6¸¿¹ÀB¹×8SÑ8SÓTðñ ˆNð
 ×/Ñ/ò 	ˆJØ×%Ñ%¨Ò*±4Ø'Ÿ^™^�
Ø�Ø×%Ñ%¨Ó)ªdØ×%Ñ%¤h¨z¸:×;KÑ;KÓ&LÔMØ‘ð	ð (,§|¡|Ö4 !�a—g“gÐ4ˆ
Ð4Øò 	0ˆEÜ9AØó:çÑ Ó/ð �L‰Lœ %›Ñ)Õ6ñ	0ùò 5s   ÄE c                 ó¼  ‡— ddl }t        t        | j                  «      «      }|D �cg c]  }|j                  ‘Œ }}dŠd}g }d}|t        |«      k  r¦||   ‰kD  r|dz  }Œt        |dz   t        |«      «      D ]i  }	t        |ˆfd„|	¬«      }
t        ||	|
¬«      }|€Œ%||   |k\  sŒ.|j                  t        ||   j                  ||   j                  «      «       |
�|
n|} n |dz  }|t        |«      k  rŒ¦| j                  D �cg c]  }|j                  |«      r|‘Œ }}|�r|j                  |D �cg c]  }| j                  |   j                  ‘Œ c}|j                   ¬«      }|j                  |D �cg c]  }| j                  |   j"                  ‘Œ c}|j                   ¬«      }||j%                  |«      z
  |j'                  |«      z  }||j%                  |«      z
  |j'                  |«      z  }|d	|z  z   }t)        t+        ||d
¬«      t-        j.                  d«      d
¬«      D ��cg c]  \  }}|‘Œ	 }}}|d| }|S c c}w c c}w c c}w c c}w c c}}w )a  
        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é   rQ   c                 ó   •— | ‰k  S r   r   )r   Úbottom_threasholds    €r   r   z-BasicEvaluation.rank_events.<locals>.<lambda>1  s   ø€ ¨Ð.?Ñ)?€ r   rN   )r8   r9   )Údtypeg333333ã?T)Ústrict)rP   r   )Útorchrb   r   ro   r+   rW   Úranger¨   Úargmaxr   r7   r8   rh   r_   Útensorr)   Úfloat32r/   ÚmeanÚstdrR   ÚzipÚoperatorÚ
itemgetter)r.   ÚlengthrÄ   ro   rq   Ú	qd_valuesÚtop_threasholdÚdecrease_intervalr[   r\   Únext_minimum_idxÚpeak_idxr?   r½   rx   Ú	idle_timeÚnormalized_gainÚnormalized_selfÚheuristic_score_listÚ_rÁ   s                       @r   Úrank_eventszBasicEvaluation.rank_events  s–  ø€ ó 	ä¤¨×)>Ñ)>Ó ?Ó@ÐØ,<Ö= q�Q—]“]Ð=ˆ	Ð=àÐØˆØÐØˆØ”#�i“.Ò Ø˜‰|Ð/Ò/Ø�Q‘�ØÜ˜1˜q™5¤# i£.Ó1ò �ô $8ØÓ?Àqô$Ð ô " )°1Ð:JÔK�ð Ñ'¨I°hÑ,?À>Ó,QØ%×,Ñ,Ü Ø,¨XÑ6×<Ñ<Ð>NÈqÑ>Q×>WÑ>Wóôð
 -=Ð,HÑ(Èa�AÙð!ð" �‰FˆAð+ ”#�i“.Ó ð2 Ÿ™ö
àØ×&Ñ&Ð'8Ô9ò ð
ˆ
ð 
ò
 ØŸ™Ø?IÖJ°e�—‘˜eÑ$×1Ó1ÒJØ—m‘mð %ó ˆIð Ÿ™ØEOÖP¸E�—‘˜eÑ$×7Ó7ÒPØ—m‘mð %ó ˆIð  )¨5¯:©:°iÓ+@Ñ@ÀEÇIÁIÈiÓDXÑXˆOØ(¨5¯:©:°iÓ+@Ñ@ÀEÇIÁIÈiÓDXÑXˆOØ#2°S¸?Ñ5JÑ#JÐ ô
 !'ÜÐ,¨jÀÔFÜ ×+Ñ+¨AÓ.Ø ô!÷á�A�uò ðˆJñ ð $ G VÐ,ˆJØÐùòs >ùò:
ùò Kùò Qùós   ¨IÄI	Ä5 IÅ7 IÈ.IrÎ   Úprint_enablec                 ó  — | j                  |«      }|s|S |rdnd}|dj                  |D �cg c]@  }d› d|› dt        |j                  «      › d| j                  |   j
                  dz  d	›d
d› �	‘ŒB c}«      z  }|rt        |«       |S c c}w )NzOptimizable events:
zNo events to optimize
ú
zP--------------------------------------------------------------------------------z
Event:                z
Source code location: z
Percentage idle time: éd   z.2fz%
)rÙ   ÚjoinÚsource_code_locationr?   rh   r/   Úprint)r.   rÎ   rÚ   r½   Úoutputr?   s         r   Úget_optimizable_eventsz&BasicEvaluation.get_optimizable_events^  s½   € Ø×%Ñ% fÓ-ˆ
ÙØÐÙ,6Ñ(Ð<Uˆà�$—)‘)ð (öð ð �Jð Ø�gð Ü+¨E¯K©KÓ8Ð9ð :Ø—|‘| EÑ*×=Ñ=ÀÑCÀCÐHð IØ	€
ò	òó	
ñ 		
ˆñ Ü�&ŒMØÐùòs   ¬AB	
r`   )rQ   T)r0   r1   r2   r	   r@   ri   rn   rp   rÙ   r3   Úboolrâ   r   r   r   rd   rd   d   s@   „ ð
!˜Wð 
!¨ó 
!ó=ò0n ó`0ò8GñR¨Sð ÀDô r   rd   c                 óz   — |�|t        | «      k\  rt        | «      }t        ||«      D ]  } || |   «      sŒ|c S  y r   )rW   rÅ   )ÚseqÚ	predicater8   r9   r[   s        r   r¨   r¨   s  sF   € Ø
€{�cœS ›X’oÜ�#‹hˆÜ�5˜#Óò ˆÙ�S˜‘VÕØŠHðð r   c                 ó   — | S r   r   r   s    r   r   r   |  s   € ˜a€ r   c                 óh   — | || } t        | «      dk(  ry | j                  t        | |¬«      «      |z   S )Nr   rO   )rW   r±   rS   )rå   rP   r8   r9   s       r   rÆ   rÆ   |  s6   € Ø
ˆe�Cˆ.€CÜ
ˆ3ƒx�1‚}ØØ�9‰9”S˜ #Ô&Ó'¨%Ñ/Ð/r   c                 ó~   — | �;t        j                  d| j                  «      }|€| j                  } Œ1| j                  S y)Nz
\.py\(.*\)zNo source code location found)ÚreÚsearchrI   Úparent)r?   Úmatchs     r   rß   rß   ƒ  s:   € Ø
Ð
Ü—	‘	˜-¨¯©Ó4ˆØˆ=Ø—L‘LˆEØØ�z‰zÐØ*r   c                  óJ   — ddl m}   | «       5  	 d d d «       y # 1 sw Y   y xY w)Nr   r   )Útorch.autograd.profilerr	   r   s    r   Ú_init_for_cuda_graphsrð   ‘  s"   € Ý/á	‹ñ Ø÷÷ ñ ús   Ž™"c                   ól   — e Zd ZU dZeed<   ed   ed<   ed   dz  ed<   eez  dz  ed<   eee	f   ed	<   y)
ÚTimelineEventz-Represents an event in the profiler timeline.Ú	timestamp)r8   r9   ÚregularÚ
event_type©ÚfilenameÚnodeNÚmarker_typeÚ
identifierr?   )
r0   r1   r2   Ú__doc__r3   r4   r   ra   Údictr   r   r   r   rò   rò   ˜  sD   … á7àƒNØÐ1Ñ2Ó2ØÐ+Ñ,¨tÑ3Ó3Ø�c‘	˜DÑ Ó Ø��S�‰>Ôr   rò   c                   óV   — e Zd ZU dZed   ed<   eez  ed<   edz  ed<   dZ	edz  ed<   y)ÚContextStackEntryz5Represents a context (filename or node) in the stack.rö   Úcontext_typerú   NÚmetadataÚtid)
r0   r1   r2   rû   r   r4   ra   r3   rü   r  r   r   r   rþ   rþ   £  s3   … á?àÐ,Ñ-Ó-Ø�c‘	ÓØ�T‰kÓØ€Cˆˆt‰Ôr   rþ   c           
      óV  ‡— ddl m} | j                  dg «      }g Šd„ }ˆfd„}|D ]q  }d|vsd|vrŒ ||«      r;|d   d	d
 }|j                  d«      r |d||«       Œ8	 t	        |«      } |d|«       ŒO|d   }‰j                  t        |ddd|«      «       Œs ‰j                  d„ ¬«       g }	‰D �]å  }
|
j                  xdk(  �r’ |
j                  €t        d«      ‚|
j                  dk(  r£t        |
j                  t        «      s+t        dt        |
j                  «      j                   › �«      ‚|j                  |
j                  «      }|
j"                  j                  d«      }|	j                  t%        d|
j                  ||«      «       Œß|
j                  dk(  sŒïd}|
j"                  j                  d«      }t'        |	«      D ]/  }|j(                  dk(  sŒ|j*                  |k(  sŒ#|j,                  } n |s�ŒM|j                  di «      }|
j                  |v s�Œo||
j                     }|	j                  t%        d|
j                  ||«      «       �Œ§xdk(  rm t/        t1        |	«      dz
  dd«      D ]N  }|	|   }|
j                  |j(                  k(  sŒ"|
j                  |j                  k(  sŒ<|	j3                  |«        �Œ �Œdk(  s�Œd}d}|
j"                  j                  d«      }t'        |	«      D ]h  }|j*                  |k(  sŒ|j(                  dk(  sŒ#|j,                  sŒ0|j,                  j                  dd«      }|j,                  j                  dd«      } n |s|s�Œº|
j"                  j5                  di «      }|r||d<   |s�Œá||d<   �Œè y# t
        $ r Y �Œ=w xY w)an  
    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                 ó¶   — | j                  d«      dk(  xrD | j                  dd«      j                  d«      xr! | j                  dd«      j                  d«      S )NÚcatÚcpu_oprI   Ú z## z ##)Úgetr�   Úendswithr>   s    r   Úis_fx_marker_eventzLmap_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           	      ó˜   •— |d   }||d   z   }‰j                  t        |d| ||«      «       ‰j                  t        |d| ||«      «       y )NÚtsÚdurr8   r9   )r   rò   )rõ   rú   r?   Ústart_tsÚend_tsÚevent_timelines        €r   Úappend_fx_marker_eventzPmap_recorded_events_to_aten_ops_with_stack_trace.<locals>.append_fx_marker_eventÊ  sX   ø€ Ø˜‘;ˆØ˜E %™LÑ(ˆØ×ÑÜ˜( G¨Z¸ÀUÓKô	
ð 	×ÑÜ˜& %¨°ZÀÓGõ	
r   r  r  rI   é   éýÿÿÿz.pyr÷   rø   rô   Nc                 ó   — | j                   S r   )ró   r   s    r   r   zBmap_recorded_events_to_aten_ops_with_stack_trace.<locals>.<lambda>ê  s
   €  a§k¡k€ r   rO   r8   z+identifier must not be None for start eventz0identifier must be str for filename marker, got r  Únode_metadatar9   rQ   r¡   Ústack_tracezNo model stack trace availabler  ÚargsÚ	node_name)Útorch.fx.tracebackr  r	  r
  r3   Ú
ValueErrorr   rò   r©   rõ   rú   ru   rù   Ú
isinstancera   Útyper0   r?   rþ   r   rÿ   r  r   rÅ   rW   r#   Ú
setdefault)Útraced_datar  Útrace_eventsr  r  r?   ÚcontentÚ
node_indexr  Úcontext_stackÚtimeline_eventr   r  Úcurrent_file_metadataÚ	ctx_entryr  Ú	node_metar[   Úcurrent_stack_traceÚcurrent_node_nameÚ	event_tidr  r  s                         @r   Ú0map_recorded_events_to_aten_ops_with_stack_tracer+  ­  sÔ  ø€ õ 9à—?‘? =°"Ó5€Lð +-€Nò
ô
ð ò YˆØ�uÑ ¨UÑ 2Øá˜eÔ$Ø˜F‘m A bÐ)ˆGà×Ñ Ô&Ù& z°7¸EÕBðÜ!$ W£�Jñ ' v¨z¸5ÕAð ˜T‘{ˆHØ×!Ñ!¤-°¸)ÀTÈ4ÐQVÓ"WÕXð'Yð, ×ÑÑ1ÐÔ2ð .0€Mð )ó Q>ˆØ×'Ñ'ÞØ!×,Ñ,Ð4Ü(Ð)VÓWÐWà!×-Ñ-°Ò;Ü% n×&?Ñ&?ÄÔEÜ,ð#Ü#'¨×(AÑ(AÓ#B×#KÑ#KÐ"LðNóð ð
  5×8Ñ8¸×9RÑ9RÓS�HØ(×.Ñ.×2Ñ2°5Ó9�CØ!×(Ñ(Ü)Ø&¨×(AÑ(AÀ8ÈSóõð
 $×/Ñ/°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ó!"öõ äœ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Ø2;×2DÑ2D×2HÑ2HØ -Ð/Oó3Ð/ð 1:×0BÑ0B×0FÑ0FÀvÈrÓ0RÐ-ñ "ð
"ñ 'Ó*;Ø)×/Ñ/×:Ñ:¸6À2ÓF�DÙ*Ø.A˜˜]Ñ+Û(Ø,=˜˜[Ó)ñcQ>øô! "ò Úðús   ÁNÎ	N(Î'N()r   Nr`   )!Ú	functoolsrÌ   rê   Úcollectionsr   Údataclassesr   Útypingr   r   r   rï   r	   Útorch.profilerr
   Útorch.autogradr   rã   r!   ÚpartialÚtraverse_dfsÚtraverse_bfsr'   r7   r;   rd   r¨   rÆ   rß   rð   rò   rþ   r+  r   r   r   ú<module>r5     s  ðã Û Û 	Ý Ý !ß .Ñ .å +Ý %ñ Ý+ñ *>Èuñ *Èó *ð !ˆy× Ñ  Ñ4EÈtÔT€Ø ˆy× Ñ ØÑ,°eô€ð
 ÷
9ð 
9ó ð
9ð ÷ð ó ð÷+ñ +÷\Lñ Ló^ñ   q¨dó 0ò+óð ÷ð ó ðð ÷ð ó ðóT>r   