+
    &jV                        ^ RI t ^ RIt^ RIt^ RIHt ^ RIHt ^ RIHtH	t	H
t
 ^ RIHt ^ RIHt ]
'       d   ^ RIHt R R	3R
 R llt] P$                  ! ]R RR7      t] P$                  ! ]R R	R7      t] ! R R4      4       t] ! R R4      4       t ! R R4      t ! R R4      tR#R ltR ^ R3R ltR tR R lt] ! R R4      4       t] ! R  R!4      4       tR" tR# )$    N)deque)	dataclass)AnyLiteralTYPE_CHECKINGprofile)
DeviceType)_KinetoEventc                     V P                   # N)childrenxs   &m/Users/jameslopez/projects/CWCArchive/cwc-podcast/.venv/lib/python3.14/site-packages/torch/profiler/_utils.py<lambda>r      s    1::    Fc                $    V ^8  d   QhR\         /# )   reverse)bool)formats   "r   __annotate__r      s     * * *r   c              #      "   V'       d   \         MR  p\        V! V 4      4      pV'       d5   V! V4      pVx  V! V! V4      4       F  pVP                  V4       K  	  K<  R# 5i)c                     V # r    r   s   &r   r   _traverse.<locals>.<lambda>   s    qr   N)reversedr   append)treenext_fnchildren_fnr   order	remaining
curr_eventchild_events   &&&&    r   	_traverser'      sV     H[EeDk"I
Y'
 Z!89K[) : s
   *A#6A#c                 "    V P                  4       # r   )popr   s   &r   r   r      s
    aeegr   T)r!   r   c                 "    V P                  4       # r   )popleftr   s   &r   r   r      s
    r   c                   L   a  ] tR t^!t o ^ t^ t^ t^ t]R 4       t	V 3R lt
RtV tR# )EventMetricsc                b    V P                   ^ 8X  d   R# V P                  V P                   ,          # )r   g        )duration_time_nsidle_time_nsselfs   &r   fraction_idle_timeEventMetrics.fraction_idle_time(   s*      A%  4#8#888r   c                J   < V ^8  d   Qh/ S[ ;R&   S[ ;R&   S[ ;R&   S[ ;R&   # )r   r/   self_time_nsr0   queue_depthint)r   __classdict__s   "r   r   EventMetrics.__annotate__!   s7         	 
  r   r   N)__name__
__module____qualname____firstlineno__r/   r6   r0   r7   propertyr3   __annotate_func____static_attributes____classdictcell__r:   s   @r   r-   r-   !   s3     LLK9 9  r   r-   c                   0   a  ] tR t^/t o ^ tV 3R ltRtV tR# )Intervalc                >   < V ^8  d   Qh/ S[ ;R&   S[ ;R&   S[ ;R&   # )r   startendr7   r8   )r   r:   s   "r   r   Interval.__annotate__/   s(     J  
H  	 r   r   N)r<   r=   r>   r?   r7   rA   rB   rC   rD   s   @r   rF   rF   /   s      K	  r   rF   c                   b   a  ] tR t^6t o V 3R lR ltR tR tV 3R lR ltV 3R lR ltR	t	V t
R
# )EventKeyc                   < V ^8  d   QhRR/# r   returnNr   )r   r:   s   "r   r   EventKey.__annotate__7   s       r   c                    Wn         R # r   event)r2   rS   s   &&r   __init__EventKey.__init__7   s    
r   c                @    \        V P                  P                  4      # r   )hashrS   idr1   s   &r   __hash__EventKey.__hash__:   s    DJJMM""r   c                \    V P                   P                  VP                   P                  8H  # r   )rS   rX   )r2   others   &&r   __eq__EventKey.__eq__=   s    zz}}..r   c                    < V ^8  d   QhRS[ /# )r   rO   )str)r   r:   s   "r   r   rP   @   s     $ $# $r   c                0    V P                   P                   # r   )rS   namer1   s   &r   __repr__EventKey.__repr__@   s    **//"#r   c                0   < V ^8  d   QhRS[ S[,          /# )r   	intervals)listrF   )r   r:   s   "r   r   rP   C   s      4> r   c                   ^ p\        VR R7      pV'       dx   \        V P                  P                  V^ ,          P                  4      p\        V P                  P                  V^ ,          P                  4      pW48  d   W$V,
          ,          p^ ^reV\        V4      8  d   W,          pW,          pV^,          pVP                  VP                  8  d:   VP                  VP                  8  d   V^,          pKj  VP                  Vn        Tp\        V P                  P                  VP                  4      p\        V P                  P                  VP                  4      pW48  g   K  W$V,
          ,          pK  V# )r   c                     V P                   # r   rH   r   s   &r   r   ,EventKey.intervals_overlap.<locals>.<lambda>E   s    AGGr   key)	sortedmaxrS   start_time_nsrH   minend_time_nsrI   len)	r2   rf   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MMdjj44il6F6FGK*m ;;!1#i. %LM%LMFA  =#6#66 $$}'8'88FA*7*;*;M'A

 8 8-:M:MNMdjj44m6G6GHK*m ;;r   rR   N)r<   r=   r>   r?   rT   rY   r]   rc   r{   rB   rC   rD   s   @r   rL   rL   6   s-      #/$ $ r   rL   c                   x   a  ] tR t^dt o V 3R lR ltV 3R lR ltR tV 3R lR ltR tRV 3R	 lR
 llt	Rt
V tR# )BasicEvaluationc                $   < V ^8  d   QhRS[ RR/# )r   profrO   Nr   )r   r:   s   "r   r   BasicEvaluation.__annotate__e   s     
! 
!W 
! 
!r   c                L   Wn         / V n        V P                  4        \        V P                  P	                  4       R  R7      V n        V P
                   Uu. uF  q"P                  NK  	  upV n        . V n        V P                  4       V n
        V P                  4        R# u upi )c                 .    V P                   P                  # r   )rS   rp   r   s   &r   r   *BasicEvaluation.__init__.<locals>.<lambda>j   s    qww/D/Dr   rl   N)r	   metricscompute_self_timern   keys
event_keysrS   eventscuda_eventscompute_queue_depthqueue_depth_listcompute_idle_time)r2   r   es   && r   rT   BasicEvaluation.__init__e   s    57  LL%D
 )-81ww8/1 $ 8 8 :  9s   B!c                   < V ^8  d   QhRR/# rN   r   )r   r:   s   "r   r   r   q   s     = =4 =r   c                v   V P                   P                  f   \        R4      h\        V P                   P                  P	                  4       4      pV'       d   VP                  4       pVP                  pVP                   F&  pW4P                  ,          pVP                  V4       K(  	  \        V4      V P                  9   d&   \        RVP                   RVP                   24      h\        VR7      V P                  \        V4      &   VP                  V P                  \        V4      ,          n        K  R# )z=
Computes event's self time(total time - time in child ops).
Nkineto_results must not be NonezDuplicate id: z, )r6   )r	   kineto_resultsAssertionErrorr   experimental_event_treer)   r/   r   r   rL   r   rX   rb   r-   )r2   stackr%   	self_timer&   s   &    r   r   !BasicEvaluation.compute_self_timeq   s     <<&&. !BCCdll11IIKL J"33I)22999	[)  3 
#t||3$$Z]]O2joo5FG  2>91UDLL*-. ",!<!< LL$ r   c                  aaa V P                   P                  f   \        R4      hV P                   P                  P                  4       pR oR o\	        V3R lV 4       R R7      p\	        V3R lV 4       R R7      p\	        W#,           R	 R7      V n        / p^ pV F!  o\        VV3R
 lVR7      pWdS&   Ve   TMTpK#  	  ^ pRpW#,           V P                  ,           p	R p
. pV	P                  V
R7       V	 EF  p\        VR4      '       d\   VP                  4       R,          pVP                  4       VP                  4       ,           R,          pW9   d   WL,          e	   WL,          p\        VR4      '       dO   VP                  4       pVP                  4       VP                  4       ,           pW9   d   WL,          e	   WL,          pM*\        VR4      '       d   VP                  pVP                  pV\        V4      8  d'   W7,          P                  4       X8:  d   V^,          pK6  W,
          ^,           p\!        V^ 4      p\        VR4      '       g   \        VR4      '       d    VP#                  \%        XXV4      4       EK  \        VR4      '       g   EK  WP&                  \)        V4      ,          n        EK  	  V# )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                   a 0 Rmp\        \        V RV 4      4      o\        ;QJ d    V3R lV 4       F  '       g   K   R# 	  R# ! V3R lV 4       4      # )z+Check if the event is a CUDA launch kernel.rb   c              3   F   <"   T F  pSP                  V4      x  K  	  R # 5ir   )
startswith.0patternrb   s   & r   	<genexpr>UBasicEvaluation.compute_queue_depth.<locals>.is_cuda_launch_kernel.<locals>.<genexpr>   s     OGtw//s   !TF>   cudaLaunchKernel__cudaLaunchKernelcudaLaunchKernelExCcudaLaunchCooperativeKernel&cudaLaunchCooperativeKernelMultiDevice)r`   getattrany)r   launch_patternsrb   s   & @r   is_cuda_launch_kernelBBasicEvaluation.compute_queue_depth.<locals>.is_cuda_launch_kernel   sH    O wq&!,-D3OO33O3O3OOOOr   c                0  a V P                  4       \        P                  8w  d   R# \        \	        V RV 4      4      P                  4       o0 Rmp\        ;QJ d)    V3R lV 4       F  '       g   K   R'       * # 	  R'       * # ! V3R lV 4       4      '       * # )z,Check if the event is a CUDA runtime kernel.Frb   c              3   ,   <"   T F	  qS9   x  K  	  R # 5ir   r   r   s   & r   r   NBasicEvaluation.compute_queue_depth.<locals>.is_cuda_kernel.<locals>.<genexpr>   s     K:Jwd?:Js   T>   cpymemfreealloc)device_typer
   CUDAr`   r   lowerr   )r   exclude_patternsrb   s   & @r   is_cuda_kernel;BasicEvaluation.compute_queue_depth.<locals>.is_cuda_kernel   sr     }}*//1wq&!,-335D  ?sK:JKssKKsKKsK:JKKKKr   c              3   H   <"   T F  pS! V4      '       g   K  Vx  K  	  R # 5ir   r   )r   r   r   s   & r   r   6BasicEvaluation.compute_queue_depth.<locals>.<genexpr>   s     D1+@+CQQ   "
"c                 "    V P                  4       # r   start_nsr   s   &r   r   5BasicEvaluation.compute_queue_depth.<locals>.<lambda>   
    !**,r   rl   c              3   H   <"   T F  pS! V4      '       g   K  Vx  K  	  R # 5ir   r   )r   r   r   s   & r   r   r      s     =1>!+<QQr   c                 "    V P                  4       # r   r   r   s   &r   r   r      r   r   c                 "    V P                  4       # r   r   r   s   &r   r   r      s
    1::<r   c                 F   < V P                  4       SP                  4       8H  # r   )linked_correlation_id)r   cuda_launch_events   &r   r   r      s    !113$::<=r   rj   c                     \        V R 4      '       d   V P                  4       R,          # \        V R4      '       d   V P                  4       # \        V R4      '       d   V P                  # \	        R4      h)start_us  r   rp   zUnknown Event Type)hasattrr   r   rp   	ExceptionrR   s   &r   new_old_event_comparatorEBasicEvaluation.compute_queue_depth.<locals>.new_old_event_comparator   s`    uj))~~'$..uj))~~''uo..***011r   r   r   r   rp   )r	   r   r   r   rn   r   index_of_first_matchsortr   r   duration_usr   duration_nsrp   rr   rs   ro   r   rF   r   rL   r7   )r2   cuda_event_listcuda_launch_eventscuda_kernel_eventskernel_mappinglast_mapped_kernelindexcurrent_kernel_indexspawned_kernel_index
all_eventsr   r   rS   
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&
 $==&

 "39O
 35!3("=(	E 16,-*/*;AS "4  !!'<t{{J
	2 ,.45Euj))"^^-4
!NN,u/@/@/BBdJ*~/D/P+9+@(uj))"^^-
 >>+e.?.?.AA*~/D/P+9+@(00"00
 ,, %s+='>>'=FFHZW$)$"6"MPQ"Q"%&91"=uj))WUJ-G-G ''Z3FG 00<OXe_-9A  D  r   c                   < V ^8  d   QhRR/# rN   r   )r   r:   s   "r   r   r      s     0 04 0r   c                @   Rp^ p. pV P                   '       d   V P                  '       d   V\        V P                  ^ ,          P                  V P                   ^ ,          P                  4      \        V P                   R,          P
                  V P                  R,          P                  4      .,          pV P                    Fm  pVP                  ^ 8X  d   V'       g   VP
                  pRpVP                  ^ 8  g   K=  V'       g   KG  VP                  \        W$P                  4      4       RpKo  	  V P                   Uu. uF  qUP                  NK  	  ppV F<  p\        V4      P                  V4      V P                  \        V4      ,          n        K>  	  R# u upi )z$
Computes idle time of the profile.
FTNr   )r   r   rF   rp   rH   rI   rr   r7   r   r   rS   rL   r{   r0   )r2   idle
idle_startidle_intervals
data_pointr   
event_listrS   s   &       r   r   !BasicEvaluation.compute_idle_time   s>   
 
)+   T[[[Q55t7L7LQ7O7U7UV..r266B8S8ST N
 //J%%*4'^^
%%)dd%%hz;K;K&LM 0 (,||4|!gg|
4E9A:/ LL%)6   5s   Fc                V  a ^ RI p\        \        V P                  4      4      pV Uu. uF  qDP                  NK  	  pp^ o^p. p^ pV\        V4      8  d   WX,          S8  d   V^,          pK(  \        V^,           \        V4      4       Fz  p	\        VV3R lV	R7      p
\        WYV
R7      pVf   K(  W[,          V8  g   K7  VP                  \        W;,          P                  W8,          P                  4      4       V
e   T
MTp M	  V^,          pK  V P                   Uu. uF  pVP                  V4      '       g   K  VNK   	  ppV'       Ed@   TP                  V Uu. uF  qP                  V,          P                  NK!  	  upVP                   R7      pTP                  V Uu. uF  qP                  V,          P"                  NK!  	  upVP                   R7      pWP%                  V4      ,
          VP'                  V4      ,          pWP%                  V4      ,
          VP'                  V4      ,          pVRV,          ,           p\)        \+        VVRR7      \,        P.                  ! ^ 4      RR	7       UUu. uF  w  ppVNK
  	  pppVRV pV# u upi u upi u upi u upi u uppi )
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.
Nc                    < V S8*  # r   r   )r   bottom_threasholds   &r   r   -BasicEvaluation.rank_events.<locals>.<lambda>1  s    .?)?r   rj   )rH   rI   )dtypeg333333?T)strict)rm   r   )torchrg   r   r   r7   rs   ranger   argmaxr   rF   rH   r   r{   tensorr6   float32r3   meanstdrn   zipoperator
itemgetter)r2   lengthr   r   r   	qd_valuestop_threasholddecrease_intervalrw   rx   next_minimum_idxpeak_idxrS   r   r   	idle_timenormalized_gainnormalized_selfheuristic_score_list_r   s   &&                  @r   rank_eventsBasicEvaluation.rank_events  s    	)>)> ?@,<=,<q]],<	=#i. |//Q1q5#i.1 $8?q$  "):JK 'I,?>,Q%,, ,6<<>N>Q>W>W
 -=,H(aA! 2" FA 
%&&'89 E% 	 

 :?IJzee$11zJmm % I EOPZEe$77ZPmm % I  )::i+@@EIIiDXXO(::i+@@EIIiDXXO#2S?5J#J 
 !',jF ++A. !!HAu !   $GV,Js >:
 K Qs#   J!J?J%J&%J 9J%c                &   < V ^8  d   QhRS[ RS[/# )r   r   print_enable)r9   r   )r   r:   s   "r   r   r   ^  s      S D r   c                \   V P                  V4      pV'       g   V# V'       d   R MRpTRP                  V Uu. uFI  pR RV R\        VP                  4       RV P                  V,          P
                  ^d,          R RR 2	NKK  	  up4      ,          pV'       d   \        V4       V# u upi )	zOptimizable events:
zNo events to optimize

z
Event:                z
Source code location: z
Percentage idle time: z.2fz%
zP--------------------------------------------------------------------------------)r  joinsource_code_locationrS   r   r3   print)r2   r   r  r   outputrS   s   &&&   r   get_optimizable_events&BasicEvaluation.get_optimizable_events^  s    %%f-
,6(<U$)) ( (E J g +EKK89 :||E*==CCH I	
	
 (	
 		
 &Ms   AB)
)r   r   r   r   r	   r   N)   T)r<   r=   r>   r?   rT   r   r   r   r  r  rB   rC   rD   s   @r   r~   r~   d   s@     
! 
!= =0n `0 08GR  r   r~   c                     Ve   V\        V 4      8  d   \        V 4      p\        W#4       F  pV! W,          4      '       g   K  Vu # 	  R # r   )rs   r   )seq	predicaterH   rI   rw   s   &&&& r   r   r   s  s@    
{cSXo#h5SVH  r   c                     V # r   r   r   s   &r   r   r   |  s    ar   c                 r    WV p \        V 4      ^ 8X  d   R# V P                  \        WR7      4      V,           # )r   Nrl   )rs   r   ro   )r  rm   rH   rI   s   &&&&r   r   r   |  s2    
C.C
3x1}99S&'%//r   c                     V e@   \         P                  ! RV P                  4      pVf   V P                  p K7  V P                  # R# )Nz
\.py\(.*\)zNo source code location found)researchrb   parent)rS   matchs   & r   r
  r
    s:    

		-4=LLEzz*r   c                    V ^8  d   QhRR/# rN   r   )r   s   "r   r   r     s      t r   c                  l    ^ RI Hp  V ! 4       ;_uu_ 4         RRR4       R#   + '       g   i     R# ; i)r   r   N)torch.autograd.profilerr	   r   s    r   _init_for_cuda_graphsr    s    /	 
s   "3	c                   0   a  ] tR tRt o RtV 3R ltRtV tR# )TimelineEventi  z-Represents an event in the profiler timeline.c                   < V ^8  d   Qh/ S[ ;R&   S[R,          ;R&   S[R,          R,          ;R&   S[S[ ,          R,          ;R&   S[S[S[3,          ;R&   # )	r   	timestamp
event_typeNmarker_type
identifierrS   )rH   rI   regularfilenamenode)r9   r   r`   dictr   )r   r:   s   "r   r   TimelineEvent.__annotate__  sg      N	 
 122  +,t33  c	D    S> r   r   N)r<   r=   r>   r?   __doc__rA   rB   rC   rD   s   @r   r  r    s     7  r   r  c                   4   a  ] tR tRt o RtRtV 3R ltRtV tR# )ContextStackEntryi  z5Represents a context (filename or node) in the stack.Nc                   < V ^8  d   Qh/ S[ R,          ;R&   S[S[,          ;R&   S[R,          ;R&   S[R,          ;R&   # )r   context_typer$  Nmetadatatidr&  )r   r`   r9   r)  )r   r:   s   "r   r   ContextStackEntry.__annotate__  sK      ,--	 
 c	  Tk  
t r   r   )	r<   r=   r>   r?   r+  r1  rA   rB   rC   rD   s   @r   r-  r-    s     ?
 C  r   r-  c           
     h  a ^ RI Hp V P                  R. 4      p. oR pV3R lpV F  pRV9  g   RV9  d   K  V! V4      '       dG   VR,          ^R pVP                  R4      '       d   V! R	We4       KO   \	        V4      pV! R
XV4       Kg  VR,          pSP                  \        VRRRV4      4       K  	  SP                  R R7       . p	S EFK  p
V
P                  ;R8X  Ed    V
P                  f   \        R4      hV
P                  R	8X  d   \        V
P                  \        4      '       g,   \        R\        V
P                  4      P                    24      hVP                  V
P                  4      pV
P"                  P                  R4      pV	P                  \%        R	V
P                  W4      4       K  V
P                  R
8X  d   RpV
P"                  P                  R4      p\'        V	4       F5  pVP(                  R	8X  g   K  VP*                  V8X  g   K)  VP,                  p M	  V'       dd   VP                  R/ 4      pV
P                  V9   d>   VV
P                  ,          pV	P                  \%        R
V
P                  VV4      4       EK  EK  EK  EK  ;R8X  d    \/        \1        V	4      ^,
          RR4       FY  pV	V,          pV
P                  VP(                  8X  g   K)  V
P                  VP                  8X  g   KF  V	P3                  V4        EKN  	  EKS  R8X  g   EK\  RpRpV
P"                  P                  R4      p\'        V	4       Fu  pVP*                  V8X  g   K  VP(                  R
8X  g   K)  VP,                  '       g   K=  VP,                  P                  RR4      pVP,                  P                  RR4      p M	  V'       g	   V'       d=   V
P"                  P5                  R/ 4      pV'       d   VVR&   V'       d	   VVR&   EKH  EKK  EKN  	  R#   \
         d     ELi ; i)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
)_FX_METADATA_REGISTRYtraceEventsc                     V P                  R 4      R8H  ;'       dK    V P                  RR4      P                  R4      ;'       d"    V P                  RR4      P                  R4      # )catcpu_oprb    z## z ##)getr   endswithrR   s   &r   is_fx_marker_eventLmap_recorded_events_to_aten_ops_with_stack_trace.<locals>.is_fx_marker_event  s^    IIe( 6 6		&"%0076 6		&"%..u5	
r   c           	         < VR ,          pW2R,          ,           pSP                  \        VRWV4      4       SP                  \        VRWV4      4       R# )tsdurrH   rI   N)r   r  )r"  r$  rS   start_tsend_tsevent_timelines   &&&  r   append_fx_marker_eventPmap_recorded_events_to_aten_ops_with_stack_trace.<locals>.append_fx_marker_event  sR    ;%L((GZUK	
 	&%G	
r   r?  r@  rb   z.pyr'  r(  r%  Nc                     V P                   # r   )r!  r   s   &r   r   Bmap_recorded_events_to_aten_ops_with_stack_trace.<locals>.<lambda>  s    akkr   rl   rH   z+identifier must not be None for start eventz0identifier must be str for filename marker, got r1  node_metadatarI   stack_tracezNo model stack trace availabler9  args	node_namer   )torch.fx.tracebackr4  r:  r;  r9   
ValueErrorr   r  r   r"  r$  r   r#  
isinstancer`   typer<   rS   r-  r   r/  r1  r0  r   rs   r)   
setdefault)traced_datar4  trace_eventsr<  rD  rS   content
node_indexrA  context_stacktimeline_eventr0  r1  current_file_metadata	ctx_entryrH  	node_metarw   current_stack_tracecurrent_node_name	event_tidrJ  rC  s   &                     @r   0map_recorded_events_to_aten_ops_with_stack_tracer^    s    9??="5L +-N

 uU 2e$$FmAb)G&&&z7B!$WJ 'vz5A T{H!!-)T4QV"WX' , 12 .0M )''!,,4()VWW!--;%n&?&?EE,##'(A(A#B#K#K"LN 
  5889R9RSH(..2259C!(()&(A(A8
 $//69,0)(..2259C%-m%<	%22j@ ) 44=4F4F1! &= -(=(A(A/SU(V)44E5B . 9 96I *00 1$*N,E,EyRU!"	 F - :0 s=1A5r2>A -a 0I&22i6L6LL*559M9MM%))!, ?  '+#$(!*0044U;	!)-!8I }}	1$11V;	@R@R@R2;2D2D2H2H -/O3/ 1:0B0B0F0Fvr0R- " "9 '*;)//::62FD*.A]+(,=[) )	 +<Y )! " s   7P""P10P1)r   N) 	functoolsr   r  collectionsr   dataclassesr   typingr   r   r   r  r	   torch.profilerr
   torch.autogradr   r'   partialtraverse_dfstraverse_bfsr-   rF   rL   r~   r   r   r
  r  r  r-  r^  r   r   r   <module>rh     s     	  ! . . + % + *>u *   4EtT  ,e
 
9 
9 
9   + +\L L^  qd 0+      T>r   