§
    �ŠtjÚ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 dS )%é    N)Údeque)Ú	dataclass)ÚAnyÚLiteralÚTYPE_CHECKING©Úprofile)Ú
DeviceType)Ú_KinetoEventc                 ó   — | j         S ©N)Úchildren©Úxs    úS/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/torch/profiler/_utils.pyú<lambda>r      s   € °1´:€ ó    FÚreversec              #   óÔ   K  — |rt           nd„ }t           || ¦  «        ¦  «        }|r? ||¦  «        }|V —  | ||¦  «        ¦  «        D ]}|                     |¦  «         Œ|°=d S d S )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¦   è è € ØÐ0�HˆH [ [€EÝ�e�e˜D‘k”kÑ"Ô"€IØ
ð *Ø�W˜YÑ'Ô'ˆ
ØÐÐÐØ ˜5  ¨ZÑ!8Ô!8Ñ9Ô9ð 	*ð 	*ˆKØ×Ò˜[Ñ)Ô)Ð)Ð)ð	 ð *ð *ð *ð *ð *r   c                 ó*   — |                       ¦   «         S r   )Úpopr   s    r   r   r      s   € ¸a¿eºe¹g¼g€ r   T)r   r   c                 ó*   — |                       ¦   «         S r   )Úpopleftr   s    r   r   r      s   €  §¢¡¤€ r   c                   ó^   — 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
dS )ÚEventMetricsr   Úduration_time_nsÚself_time_nsÚidle_time_nsÚqueue_depthc                 ó:   — | j         dk    rdS | j        | j         z  S )Nr   g        )r(   r*   ©Úselfs    r   Úfraction_idle_timezEventMetrics.fraction_idle_time(   s&   € àÔ  AÒ%Ð%Ø�3ØÔ  4Ô#8Ñ8Ð8r   N)Ú__name__Ú
__module__Ú__qualname__r(   ÚintÚ__annotations__r)   r*   r+   Úpropertyr/   r   r   r   r'   r'   !   sp   € € € € € € àÐ�cÐÐÑØ€L�#ÐÐÑØ€L�#ÐÐÑØ€K�ÐÐÑàð9ð 9ñ „Xð9ð 9ð 9r   r'   c                   ó2   — e Zd ZU eed<   eed<   dZeed<   dS )ÚIntervalÚstartÚendr   r+   N)r0   r1   r2   r3   r4   r+   r   r   r   r7   r7   /   s4   € € € € € € à€J€J�JØ	€H€H�HØ€K�ÐÐÑÐÐr   r7   c                   óF   — e Zd Zd	d„Zd„ Zd„ Zdefd„Zdee	         fd„Z
dS )
ÚEventKeyÚreturnNc                 ó   — || _         d S r   ©Úevent)r.   r?   s     r   Ú__init__zEventKey.__init__7   s   € ØˆŒ
ˆ
ˆ
r   c                 ó4   — t          | j        j        ¦  «        S r   )Úhashr?   Úidr-   s    r   Ú__hash__zEventKey.__hash__:   s   € Ý�D”J”MÑ"Ô"Ð"r   c                 ó6   — | j         j        |j         j        k    S r   )r?   rC   )r.   Úothers     r   Ú__eq__zEventKey.__eq__=   s   € ØŒzŒ} ¤¤Ò.Ð.r   c                 ó   — | j         j        › S r   )r?   Únamer-   s    r   Ú__repr__zEventKey.__repr__@   s   € Ø”*”/Ð#Ð#r   Ú	intervalsc                 ób  — d}t          |d„ ¬¦  «        }|rXt          | j        j        |d         j        ¦  «        }t          | j        j        |d         j        ¦  «        }||k     r|||z
  z  }d\  }}|t          |¦  «        k     r¨||         }||         }|dz  }|j        |j        k    r$|j        |j        k    r|dz  }ŒN|j        |_        |}t          | j        j        |j        ¦  «        }t          | j        j        |j        ¦  «        }||k     r|||z
  z  }|t          |¦  «        k     °¨|S )Nr   c                 ó   — | j         S r   ©r8   r   s    r   r   z,EventKey.intervals_overlap.<locals>.<lambda>E   s   € °A´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   sK  € ØˆÝ˜9Ð*;Ð*;Ð<Ñ<Ô<ˆ	àð 	<Ý ¤
Ô 8¸)ÀA¼,Ô:LÑMÔMˆMÝ˜dœjÔ4°iÀ´lÔ6FÑGÔ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¸-Ô:MÑNÔNˆMÝ˜dœjÔ4°mÔ6GÑHÔ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                   óL   — 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dS )ÚBasicEvaluationÚprofr<   Nc                 ó:  — || _         i | _        |                      ¦   «          t          | j                             ¦   «         d„ ¬¦  «        | _        d„ | j        D ¦   «         | _        g | _        |                      ¦   «         | _	        |  
                    ¦   «          d S )Nc                 ó   — | j         j        S r   )r?   rT   r   s    r   r   z*BasicEvaluation.__init__.<locals>.<lambda>j   s   € ¨q¬wÔ/D€ r   rO   c                 ó   — g | ]	}|j         ‘Œ
S r   r>   ©Ú.0Úes     r   ú
<listcomp>z,BasicEvaluation.__init__.<locals>.<listcomp>l   s   € Ð8Ð8Ð8 1�q”wÐ8Ð8Ð8r   )r	   ÚmetricsÚcompute_self_timerR   ÚkeysÚ
event_keysÚeventsÚcuda_eventsÚcompute_queue_depthÚqueue_depth_listÚcompute_idle_time)r.   re   s     r   r@   zBasicEvaluation.__init__e   sœ   € ØˆŒØ57ˆŒØ×ÒÑ Ô Ð Ý ØŒL×ÒÑÔÐ%DÐ%Dð
ñ 
ô 
ˆŒð 9Ð8¨¬Ð8Ñ8Ô8ˆŒØ/1ˆÔØ $× 8Ò 8Ñ :Ô :ˆÔØ×ÒÑ Ô Ð Ð Ð r   c                 ó"  — | j         j        €t          d¦  «        ‚t          | j         j                             ¦   «         ¦  «        }|rÆ|                     ¦   «         }|j        }|j        D ]!}||j        z  }|                     |¦  «         Œ"t          |¦  «        | j
        v rt          d|j        › d|j        › �¦  «        ‚t          |¬¦  «        | j
        t          |¦  «        <   |j        | j
        t          |¦  «                 _        |°ÄdS dS )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;   rm   rC   rI   r'   )r.   Ústackr   Ú	self_timer    s        r   rn   z!BasicEvaluation.compute_self_timeq   s.  € ð Œ<Ô&Ð.Ý Ð!BÑCÔCÐCÝ�d”lÔ1×IÒIÑKÔKÑLÔLˆð ð 	=ØŸš™œˆJØ"Ô3ˆIØ)Ô2ð *ð *�Ø˜[Ô9Ñ9�	Ø—’˜[Ñ)Ô)Ð)Ð)Ý˜
Ñ#Ô# t¤|Ð3Ð3Ý$ØG Z¤]ÐGÐG°j´oÐGÐGñô ð õ 2>È9Ð1UÑ1UÔ1UˆDŒL� *Ñ-Ô-Ñ.ð ",Ô!<ð ŒLÝ˜Ñ$Ô$ôäð ð 	=ð 	=ð 	=ð 	=ð 	=r   c                 ó¤  ‡‡‡— | j         j        €t          d¦  «        ‚| 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 }|	                     |
¬¦  «         |	D �]Þ}t          |d¦  «        rW| 	                    ¦   «         dz  }| 	                    ¦   «         | 
                    ¦   «         z   dz  }||v r||         �||         }t          |d¦  «        rR|                     ¦   «         }|                     ¦   «         |                     ¦   «         z   }||v r||         �||         }nt          |d¦  «        r|j        }|j        }|t          |¦  «        k     rT||                              ¦   «         |k    r6|dz  }|t          |¦  «        k     r||                              ¦   «         |k    °6||z
  dz   }t!          |d¦  «        }t          |d¦  «        st          |d¦  «        r&|                     t%          |||¦  «        ¦  «         �Œ¯t          |d¦  «        r|| 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.
        Nrw   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   óB   •K  — | ]}‰                      |¦  «        V — Œd S r   )Ú
startswith©rj   ÚpatternrI   s     €r   ú	<genexpr>zUBasicEvaluation.compute_queue_depth.<locals>.is_cuda_launch_kernel.<locals>.<genexpr>�   s/   øè è € ÐOÐO°G�t—’ wÑ/Ô/ÐOÐOÐOÐOÐOÐOr   )ra   ÚgetattrÚany)rk   Úlaunch_patternsrI   s     @r   Úis_cuda_launch_kernelzBBasicEvaluation.compute_queue_depth.<locals>.is_cuda_launch_kernel“   sR   ø€ ðð ð ˆOõ •w˜q &¨!Ñ,Ô,Ñ-Ô-ˆDÝÐOÐOÐOÐO¸ÐOÑOÔOÑOÔOÐOr   c                 óì   ‡— |                       ¦   «         t          j        k    rdS t          t	          | d| ¦  «        ¦  «                             ¦   «         Š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 V — Œ	d S r   r   r†   s     €r   rˆ   zNBasicEvaluation.compute_queue_depth.<locals>.is_cuda_kernel.<locals>.<genexpr>ª   s'   øè è € ÐKÐK¨w˜7 d˜?ÐKÐKÐKÐKÐKÐKr   )Údevice_typer
   ÚCUDAra   r‰   ÚlowerrŠ   )rk   Úexclude_patternsrI   s     @r   Úis_cuda_kernelz;BasicEvaluation.compute_queue_depth.<locals>.is_cuda_kernelŸ   sy   ø€ ð �}Š}‰Œ¥*¤/Ò1Ð1Ø�uå•w˜q &¨!Ñ,Ô,Ñ-Ô-×3Ò3Ñ5Ô5ˆDð  ?Ð>Ð>ÐåÐKÐKÐKÐKÐ:JÐKÑKÔKÑKÔKÐKÐKr   c              3   ó2   •K  — | ]} ‰|¦  «        ¯|V — Œd S r   r   )rj   rk   rŒ   s     €r   rˆ   z6BasicEvaluation.compute_queue_depth.<locals>.<genexpr>­   s4   øè è € ÐDÐD�1Ð+@Ð+@ÀÑ+CÔ+CÐDˆQÐDÐDÐDÐDÐDÐDr   c                 ó*   — |                       ¦   «         S r   ©Ústart_nsr   s    r   r   z5BasicEvaluation.compute_queue_depth.<locals>.<lambda>®   ó   € ˜!Ÿ*š*™,œ,€ r   rO   c              3   ó2   •K  — | ]} ‰|¦  «        ¯|V — Œd S r   r   )rj   rk   r—   s     €r   rˆ   z6BasicEvaluation.compute_queue_depth.<locals>.<genexpr>±   s2   øè è € Ð=Ð=�1¨>¨>¸!Ñ+<Ô+<Ð=ˆQÐ=Ð=Ð=Ð=Ð=Ð=r   c                 ó*   — |                       ¦   «         S r   rš   r   s    r   r   z5BasicEvaluation.compute_queue_depth.<locals>.<lambda>²   rœ   r   c                 ó*   — |                       ¦   «         S r   rš   r   s    r   r   z5BasicEvaluation.compute_queue_depth.<locals>.<lambda>¶   s   € À1Ç:Â:Á<Ä<€ r   r   c                 óX   •— |                       ¦   «         ‰                      ¦   «         k    S r   )Úlinked_correlation_id)r   Úcuda_launch_events    €r   r   z5BasicEvaluation.compute_queue_depth.<locals>.<lambda>¾   s'   ø€ ˜!×1Ò1Ñ3Ô3Ø$×:Ò:Ñ<Ô<ò=€ r   rN   éÿÿÿÿc                 óä   — t          | d¦  «        r|                      ¦   «         dz  S t          | d¦  «        r|                      ¦   «         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Ê   su   € Ý�u˜jÑ)Ô)ð /Ø—~’~Ñ'Ô'¨$Ñ.Ð.Ý�u˜jÑ)Ô)ð (Ø—~’~Ñ'Ô'Ð'Ý�u˜oÑ.Ô.ð +ØÔ*Ð*ÝÐ0Ñ1Ô1Ð1r   r¥   r¦   r›   rT   rQ   )r	   rx   ry   rq   rR   rr   Úindex_of_first_matchÚsortr§   r¥   Úduration_usr›   Úduration_nsrT   rV   rW   rS   r   r7   rm   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©   rt   r?   Ú
start_timeÚend_timeÚcurrent_queue_depthr¢   r—   rŒ   s                   @@@r   rs   z#BasicEvaluation.compute_queue_depth‰   s¼  øøø€ ð Œ<Ô&Ð.Ý Ð!BÑCÔCÐCØœ,Ô5×<Ò<Ñ>Ô>ˆð
	Pð 
	Pð 
	Pð	Lð 	Lð 	Lõ $ØDÐDÐDÐD˜ÐDÑDÔDØ&Ð&ð
ñ 
ô 
Ðõ $Ø=Ð=Ð=Ð=˜Ð=Ñ=Ô=Ø&Ð&ð
ñ 
ô 
Ðõ
 "ØÐ!3Ñ3Ð9OÐ9Oð
ñ 
ô 
ˆÔð 35ˆØÐØ!3ð 	Tð 	TÐÝ(Ø"ð=ð =ð =ð =à(ð	ñ ô ˆEð 16ˆNÐ,Ñ-Ø*/Ð*;  ÐASÐÐà ÐØ!Ðà'Ð*<Ñ<¸t¼{ÑJˆ
ð	2ð 	2ð 	2ð ,.ÐØ�ŠÐ4ˆÑ5Ô5Ð5Øð  	Pñ  	PˆEå�u˜jÑ)Ô)ð AØ"Ÿ^š^Ñ-Ô-°Ñ4�
à!ŸNšNÑ,Ô,¨u×/@Ò/@Ñ/BÔ/BÑBÀdÑJ�à˜NÐ*Ð*¨~¸eÔ/DÐ/PØ+9¸%Ô+@Ð(Ý�u˜jÑ)Ô)ð -Ø"Ÿ^š^Ñ-Ô-�
Ø Ÿ>š>Ñ+Ô+¨e×.?Ò.?Ñ.AÔ.AÑA�à˜NÐ*Ð*¨~¸eÔ/DÐ/PØ+9¸%Ô+@Ð(øÝ˜ Ñ0Ô0ð -Ø"Ô0�
Ø Ô,�ð %¥sÐ+=Ñ'>Ô'>Ò>Ð>Ø'Ð(<Ô=×FÒFÑHÔHÈZÒWÐWà$¨Ñ)Ð$ð %¥sÐ+=Ñ'>Ô'>Ò>Ð>Ø'Ð(<Ô=×FÒFÑHÔHÈZÒWÐWð #7Ð9MÑ"MÐPQÑ"QÐÝ"%Ð&9¸1Ñ"=Ô"=Ðå�u˜jÑ)Ô)ð P­W°U¸JÑ-GÔ-Gð PØ ×'Ò'Ý˜Z¨Ð3FÑGÔGñô ð ñ õ ˜ Ñ0Ô0ð PØ<O�”�X e™_œ_Ô-Ô9ùàÐr   c                 óL  — d}d}g }| j         rj| j        rc|t          | j        d         j        | j         d         j        ¦  «        t          | j         d         j        | j        d         j        ¦  «        gz  }| j         D ]O}|j        dk    r|s	|j        }d}|j        dk    r,|r*|                     t          ||j        ¦  «        ¦  «         d}ŒPd„ | j	        D ¦   «         }|D ]A}t          |¦  «                             |¦  «        | j	        t          |¦  «                 _        ŒBdS )z4
        Computes idle time of the profile.
        Fr   r£   Tc                 ó   — g | ]	}|j         ‘Œ
S r   r>   ri   s     r   rl   z5BasicEvaluation.compute_idle_time.<locals>.<listcomp>  s   € Ð4Ð4Ð4 !�a”gÐ4Ð4Ð4r   N)rt   rq   r7   rT   r8   r9   rV   r+   r   rm   r;   r_   r*   )r.   ÚidleÚ
idle_startÚidle_intervalsÚ
data_pointÚ
event_listr?   s          r   ru   z!BasicEvaluation.compute_idle_timeù   sI  € ð
 ˆØˆ
Ø)+ˆØÔ ð 	 T¤[ð 	ØÝ˜œ QœÔ5°tÔ7LÈQÔ7OÔ7UÑVÔVÝ˜Ô.¨rÔ2Ô6¸¼ÀB¼Ô8SÑTÔTðñ ˆNð
 Ô/ð 	ð 	ˆJØÔ%¨Ò*Ð*°4Ð*Ø'œ^�
Ø�ØÔ%¨Ò)Ð)¨dÐ)Ø×%Ò%¥h¨z¸:Ô;KÑ&LÔ&LÑMÔMÐMØ�øà4Ð4 t¤|Ð4Ñ4Ô4ˆ
Øð 	0ð 	0ˆEÝ9AØñ:ô :çÒ Ñ/Ô/ð ŒL� %™œÔ)Ô6Ð6ð	0ð 	0r   c                 ó  ‡ ‡‡— ddl }t          t          ‰ j        ¦  «        ¦  «        }d„ |D ¦   «         }dŠd}g Šd}|t	          |¦  «        k     rÃ||         ‰k    r|dz  }Œ%t          |dz   t	          |¦  «        ¦  «        D ]x}t          |ˆfd„|¬¦  «        }t          |||¬¦  «        }	|	�M||	         |k    rA‰                     t          ||	         j
        ||         j
        ¦  «        ¦  «         |�|n|} nŒy|dz  }|t	          |¦  «        k     °Ãˆfd	„‰ j        D ¦   «         }
|
rà|                     ˆ fd
„|
D ¦   «         |j        ¬¦  «        }|                     ˆ fd„|
D ¦   «         |j        ¬¦  «        }|                     |¦  «        \  }}|                     |¦  «        \  }}||z
  |z  }||z
  |z  }|d|z  z   }d„ t          t!          ||
d¬¦  «        t#          j        d¦  «        d¬¦  «        D ¦   «         }
|
d|…         }
|
S )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   Nc                 ó   — g | ]	}|j         ‘Œ
S r   )r+   ri   s     r   rl   z/BasicEvaluation.rank_events.<locals>.<listcomp>#  s   € Ð=Ð=Ð= q�Q”]Ð=Ð=Ð=r   é   rQ   c                 ó   •— | ‰k    S r   r   )r   Úbottom_threasholds    €r   r   z-BasicEvaluation.rank_events.<locals>.<lambda>1  s   ø€ ¨Ð.?Ò)?€ r   rN   )r8   r9   c                 ó>   •— g | ]}|                      ‰¦  «        ¯|‘ŒS r   )r_   )rj   r?   Údecrease_intervals     €r   rl   z/BasicEvaluation.rank_events.<locals>.<listcomp>@  s>   ø€ ð 
ð 
ð 
àØ×&Ò&Ð'8Ñ9Ô9ð
Øð
ð 
ð 
r   c                 ó4   •— g | ]}‰j         |         j        ‘ŒS r   )rm   r)   ©rj   r?   r.   s     €r   rl   z/BasicEvaluation.rank_events.<locals>.<listcomp>G  s#   ø€ ÐJÐJÐJ°e�”˜eÔ$Ô1ÐJÐJÐJr   )Údtypec                 ó4   •— g | ]}‰j         |         j        ‘ŒS r   )rm   r/   rÉ   s     €r   rl   z/BasicEvaluation.rank_events.<locals>.<listcomp>K  s#   ø€ ÐPÐPÐP¸E�”˜eÔ$Ô7ÐPÐPÐPr   g333333ã?c                 ó   — g | ]\  }}|‘ŒS r   r   )rj   Ú_r?   s      r   rl   z/BasicEvaluation.rank_events.<locals>.<listcomp>U  s,   € ð ð ð á�A�uð ðð ð r   T)Ústrict)rP   r   )Útorchrb   r   rt   rW   Úrangerª   Úargmaxr   r7   r8   rm   ÚtensorÚfloat32Ústd_meanrR   ÚzipÚoperatorÚ
itemgetter)r.   ÚlengthrÏ   rt   Ú	qd_valuesÚtop_threasholdr[   r\   Únext_minimum_idxÚpeak_idxrÀ   r|   Ú	idle_timeÚidle_stdÚ	idle_meanÚself_stdÚ	self_meanÚnormalized_gainÚnormalized_selfÚheuristic_score_listrÅ   rÇ   s   `                   @@r   Úrank_eventszBasicEvaluation.rank_events  sÉ  øøø€ ð 	ˆˆˆå¥¨Ô)>Ñ ?Ô ?Ñ@Ô@ÐØ=Ð=Ð,<Ð=Ñ=Ô=ˆ	àÐØˆØÐØˆØ•#�i‘.”.Ò Ð Ø˜Œ|Ð/Ò/Ð/Ø�Q‘�ØÝ˜1˜q™5¥# i¡.¤.Ñ1Ô1ð ð �õ $8ØÐ?Ð?Ð?Ð?Àqð$ñ $ô $Ð õ " )°1Ð:JÐKÑKÔK�ð Ð'¨I°hÔ,?À>Ò,QÐ,QØ%×,Ò,Ý Ø,¨XÔ6Ô<Ð>NÈqÔ>QÔ>Wñô ñô ð ð
 -=Ð,HÐ(Ð(Èa�AØ�EøØ�‰FˆAð+ •#�i‘.”.Ò Ð ð.
ð 
ð 
ð 
àœð
ñ 
ô 
ˆ
ð
 ð 	-ØŸšØJÐJÐJÐJ¸zÐJÑJÔJØ”mð %ñ ô ˆIð ŸšØPÐPÐPÐPÀZÐPÑPÔPØ”mð %ñ ô ˆIð #(§.¢.°Ñ";Ô";ÑˆH�iØ"'§.¢.°Ñ";Ô";ÑˆH�iØ(¨9Ñ4¸Ñ@ˆOØ(¨9Ñ4¸Ñ@ˆOØ#2°S¸?Ñ5JÑ#JÐ ðð å &ÝÐ,¨jÀÐFÑFÔFÝ Ô+¨AÑ.Ô.Ø ð!ñ !ô !ðñ ô ˆJð $ G V GÔ,ˆJØÐr   rQ   TrØ   Úprint_enablec                 ó°   ‡ — ‰                       |¦  «        }|s|S |rdnd}|d                     ˆ fd„|D ¦   «         ¦  «        z  }|rt          |¦  «         |S )NzOptimizable events:
zNo events to optimize
ú
c                 ó|   •— g | ]8}d › d|› dt          |j        ¦  «        › d‰j        |         j        dz  d›dd › �	‘Œ9S )zP--------------------------------------------------------------------------------z
Event:                z
Source code location: z
Percentage idle time: éd   z.2fz%
)Úsource_code_locationr?   rm   r/   rÉ   s     €r   rl   z:BasicEvaluation.get_optimizable_events.<locals>.<listcomp>g  s‹   ø€ ð ð ð ð ð ð ð Øðð å+¨E¬KÑ8Ô8ðð ð ”| EÔ*Ô=ÀÑCðð ð ð 
ð	ð ðð ð r   )rå   ÚjoinÚprint)r.   rØ   ræ   rÀ   Úoutputs   `    r   Úget_optimizable_eventsz&BasicEvaluation.get_optimizable_events`  s’   ø€ Ø×%Ò% fÑ-Ô-ˆ
Øð 	ØÐØ,6ÐUÐ(Ð(Ð<Uˆà�$—)’)ðð ð ð ð (ðñ ô ñ	
ô 	
ñ 		
ˆð ð 	Ý�&‰MŒMˆMØÐr   r`   )rQ   T)r0   r1   r2   r	   r@   rn   rs   ru   rå   r3   Úboolrï   r   r   r   rd   rd   d   s«   € € € € € ð
!˜Wð 
!¨ð 
!ð 
!ð 
!ð 
!ð=ð =ð =ð =ð0n ð n ð n ð`0ð 0ð 0ð 0ð8Ið Ið IðVð ¨Sð ÀDð ð ð ð ð ð r   rd   c                 óž   — |�|t          | ¦  «        k    rt          | ¦  «        }t          ||¦  «        D ]} || |         ¦  «        r|c S Œd S r   )rW   rÐ   )ÚseqÚ	predicater8   r9   r[   s        r   rª   rª   u  sb   € Ø
€{�c�S ™XœX’o�oÝ�#‰hŒhˆÝ�5˜#ÑÔð ð ˆØˆ9�S˜”VÑÔð 	ØˆHˆHˆHð	àˆ4r   c                 ó   — | S r   r   r   s    r   r   r   ~  s   € ˜a€ r   c                 óŽ   — | ||…         } t          | ¦  «        dk    rd S |                      t          | |¬¦  «        ¦  «        |z   S )Nr   rO   )rW   r³   rS   )rò   rP   r8   r9   s       r   rÑ   rÑ   ~  sG   € Ø
ˆe�CˆiŒ.€CÝ
ˆ3�x„x�1‚}€}ØˆtØ�9Š9•S˜ #Ð&Ñ&Ô&Ñ'Ô'¨%Ñ/Ð/r   c                 ó`   — | �+t          j        d| j        ¦  «        }|€| j        } Œ&| j        S dS )Nz
\.py\(.*\)zNo source code location found)ÚreÚsearchrI   Úparent)r?   Úmatchs     r   rë   rë   …  s8   € Ø
Ð
Ý”	˜-¨¬Ñ4Ô4ˆØˆ=Ø”LˆEØØŒzÐØ*Ð*r   r<   c                  óZ   — ddl m}   | ¦   «         5  	 d d d ¦  «         d S # 1 swxY w Y   d S )Nr   r   )Útorch.autograd.profilerr	   r   s    r   Ú_init_for_cuda_graphsrý   “  s‡   € Ø/Ð/Ð/Ð/Ð/Ð/à	ˆ‰Œð ð Øðð ð ñ ô ð ð ð ð ð ð ð øøøð ð ð ð ð ð s   ‘  $§$c                   ó€   — 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	<   dS )
Ú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ÿ   š  ss   € € € € € € à7Ð7à€N€N�NØÐ1Ô2Ð2Ð2Ñ2ØÐ+Ô,¨tÑ3Ð3Ð3Ñ3Ø�c‘	˜DÑ Ð Ð Ñ Ø��S�Œ>ÐÐÑÐÐr   rÿ   c                   ó^   — 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<   dS )Ú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  ¥  s^   € € € € € € à?Ð?àÐ,Ô-Ð-Ð-Ñ-Ø�c‘	ÐÐÑØ�T‰kÐÐÑØ€Cˆˆt‰ÐÐÑÐÐr   r  c           
      ó6  ‡— ddl m} |                      dg ¦  «        }g Šd„ }ˆfd„}|D ]¦}d|vsd|vrŒ ||¦  «        rb|d         d	d
…         }|                     d¦  «        r |d||¦  «         ŒI	 t	          |¦  «        }n# t
          $ r Y nw xY w |d||¦  «         Œx|d         }‰                     t          |ddd|¦  «        ¦  «         Œ§‰                     d„ ¬¦  «         g }	‰D �]«}
|
j	        xdk    �rv |
j
        €t          d¦  «        ‚|
j        dk    r¢t          |
j
        t          ¦  «        s)t          dt          |
j
        ¦  «        j        › �¦  «        ‚|                     |
j
        ¦  «        }|
j                             d¦  «        }|	                     t%          d|
j
        ||¦  «        ¦  «         ŒÔ|
j        dk    r¥d}|
j                             d¦  «        }t'          |	¦  «        D ]!}|j        dk    r|j        |k    r	|j        } nŒ"|rV|                     di ¦  «        }|
j
        |v r7||
j
                 }|	                     t%          d|
j
        ||¦  «        ¦  «         �Œ†xdk    rf t/          t1          |	¦  «        dz
  dd¦  «        D ]A}|	|         }|
j        |j        k    r'|
j
        |j
        k    r|	                     |¦  «          nŒB�Œòdk    r´d}d}|
j                             d¦  «        }t'          |	¦  «        D ]W}|j        |k    rJ|j        dk    r?|j        r8|j                             dd¦  «        }|j                             dd¦  «        } nŒX|s|r)|
j                             di ¦  «        }|r||d<   |r||d<   �Œ«�Œ­dS )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                 óØ   — |                       d¦  «        dk    oQ|                       dd¦  «                             d¦  «        o(|                       dd¦  «                             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Å  sc   € à�IŠI�eÑÔ Ò(ð 6Ø—	’	˜& "Ñ%Ô%×0Ò0°Ñ7Ô7ð6à—	’	˜& "Ñ%Ô%×.Ò.¨uÑ5Ô5ð	
r   c           	      óÆ   •— |d         }||d         z   }‰                      t          |d| ||¦  «        ¦  «         ‰                      t          |d| ||¦  «        ¦  «         d S )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Ì  s|   ø€ Ø˜”;ˆØ˜E %œLÑ(ˆØ×ÒÝ˜( G¨Z¸ÀUÑKÔKñ	
ô 	
ð 	
ð 	×ÒÝ˜& %¨°ZÀÑGÔ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€ 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  ry   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_tracer8  ¯  sÕ  ø€ ð 9Ð8Ð8Ð8Ð8Ð8à—?’? =°"Ñ5Ô5€Lð +-€Nð
ð 
ð 
ð
ð 
ð 
ð 
ð 
ð ð Yð YˆØ�uÐÐ ¨UÐ 2Ð 2ØàÐ˜eÑ$Ô$ð 	YØ˜F”m A b DÔ)ˆGà×Ò Ñ&Ô&ð BØ&Ð& z°7¸EÑBÔBÐBÐBðÝ!$ W¡¤�J�JøÝ!ð ð ð Ø�Dðøøøà&Ð& v¨z¸5ÑAÔAÐAÐAð ˜T”{ˆHØ×!Ò!¥-°¸)ÀTÈ4ÐQVÑ"WÔ"WÑXÔXÐXÐXð ×ÒÐ1Ð1ÐÑ2Ô2Ð2ð .0€Mð )ð Q>ñ Q>ˆØÔ'Ø�’‘�Ø!Ô,Ð4Ý(Ð)VÑWÔWÐWà!Ô-°Ò;Ð;Ý% nÔ&?ÅÑEÔEð Ý,ðNÝ#'¨Ô(AÑ#BÔ#BÔ#KðNð Nñô ð ð
  5×8Ò8¸Ô9RÑSÔS�HØ(Ô.×2Ò2°5Ñ9Ô9�CØ!×(Ò(Ý)Ø&¨Ô(AÀ8ÈSñô ñô ð ð ð
 $Ô/°6Ò9Ð9à,0Ð)Ø(Ô.×2Ò2°5Ñ9Ô9�CÝ%-¨mÑ%<Ô%<ð "ð "˜	à%Ô2°jÒ@Ð@Ø )¤°Ò 4Ð 4à4=Ô4FÐ1Ø!˜Eøà,ð 
Ø(=×(AÒ(AÀ/ÐSUÑ(VÔ(V˜Ø)Ô4¸ÐEÐEØ5BØ .Ô 9ô6˜Ið *×0Ò0Ý 1Ø$*¨NÔ,EÀyÐRUñ!"ô !"ñô ð ùð �’��å�s =Ñ1Ô1°AÑ5°r¸2Ñ>Ô>ð ð �AØ -¨aÔ 0�Ià&Ô2°iÔ6LÒLÐLØ*Ô5¸Ô9MÒMÐMà%×)Ò)¨!Ñ,Ô,Ð,Ø˜øùà’�ð '+Ð#Ø$(Ð!Ø*Ô0×4Ò4°UÑ;Ô;�	å!)¨-Ñ!8Ô!8ð 
"ð 
"�Ià ”}¨	Ò1Ð1Ø$Ô1°VÒ;Ð;À	Ô@RÐ;Ø2;Ô2D×2HÒ2HØ -Ð/Oñ3ô 3Ð/ð 1:Ô0B×0FÒ0FÀvÈrÑ0RÔ0RÐ-ð "˜Eøð 'ð >Ð*;ð >Ø)Ô/×:Ò:¸6À2ÑFÔF�DØ*ð BØ.A˜˜]Ñ+Ø(ð >Ø,=˜˜[Ñ)ùñ5 ðoQ>ð Q>s   Á4BÂ
BÂB)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  r8  r   r   r   ú<module>rB     s°  ðà Ð Ð Ð Ø €€€Ø 	€	€	€	Ø Ð Ð Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !Ø .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .à +Ð +Ð +Ð +Ð +Ð +Ø %Ð %Ð %Ð %Ð %Ð %ð ð ,Ø+Ð+Ð+Ð+Ð+Ð+ð *>Ð)=Èuð *ð *Èð *ð *ð *ð *ð !ˆyÔ  Ð4EÐ4EÈtÐTÑTÔT€Ø ˆyÔ ØÐ,Ð,°eðñ ô €ð
 ð
9ð 
9ð 
9ð 
9ð 
9ñ 
9ô 
9ñ „ð
9ð ðð ð ð ð ñ ô ñ „ðð+ð +ð +ð +ð +ñ +ô +ð +ð\Nð Nð Nð Nð Nñ Nô Nð Nðbð ð ð ð  �K q¨dð 0ð 0ð 0ð 0ð+ð +ð +ðð ð ð ð ðð ð ð ð ñ ô ñ „ðð ðð ð ð ð ñ ô ñ „ððT>ð T>ð T>ð T>ð T>r   