§
    ŠŠtjUñ  ã                   ó¼  — U d dl Z d dlZd dlZd dlZd dlmZmZ d dlmZ d dl	m
Z
 d dlmZmZ d dlmZ d dlZd dlmZ g d¢Z G d	„ d
e¦  «        Zd„ Zd„ Zd„ Zd„ Z G d„ d¦  «        Z G d„ d¦  «        Z edg d¢¦  «        Z G d„ de¦  «        Zdedefd„Zdede fd„Z!i dde"f“dde"f“ddej#        f“d d ej#        f“d!d!e"f“d"d#e$f“d$d%e$f“d&d'e$f“d(d(ej#        f“d)d)e"f“d*d+e"f“d,d-e"f“d.d.e"f“d/d/e"f“d0d0e"f“d1d1e"f“d2d2e"f“i d3d4e$f“d5d6ef“d7d7ef“d8d9e"f“d:d;e"f“d<d=ef“d>d?ef“d@dAe"f“dBdCe"f“dDdEe"f“dFdGef“dHdIef“dJdKef“dLdMe"f“dNdOe"f“dPdQe"f“dRdSe"f“¥dTdUe!fi¥Z%e&ee'eeegef         f         f         e(dV<   dW„ Z) G dX„ dYe¦  «        Z* G dZ„ d[e¦  «        Z+ G d\„ d]e¦  «        Z, G d^„ d_¦  «        Z-d`„ Z.daZ/dbZ0dc„ Z1dlde„Z2	 	 	 	 	 	 	 	 	 	 dmdj„Z3dk„ Z4dS )né    N)ÚdefaultdictÚ
namedtuple)ÚCallable)Ú
attrgetter)ÚAnyÚ
NamedTuple)Ú
deprecated)Ú
DeviceType)	Ú	EventListÚEventMetadataÚFormattedTimesMixinÚIntervalÚKernelÚFunctionEventÚFunctionEventAvgÚStringTableÚMemRecordsAccc                   óž   ‡ — e Zd ZdZˆ fd„Zd„ Zd„ Zd„ Zd„ Zd„ Z	e
d„ ¦   «         Z	 	 	 	 	 	 	 	 dd„Zd„ Zd„ Zdedefd„Z	 	 	 dd„Zd„ Zˆ xZS )r   a>
  A list of profiling events with helper methods for analysis and visualization.

    EventList extends the standard Python list to provide specialized methods for
    working with profiling events (FunctionEvent or FunctionEventAvg objects).
    It includes utilities for aggregating statistics, formatting output tables,
    and exporting profiling data.

    This class is typically returned by profiler methods and should not be
    instantiated directly by users.

    Args:
        *args: Standard list arguments.
        use_device (str, optional): Device type for profiling ("cuda", "xpu", etc.).
        profile_memory (bool, optional): Whether memory profiling was enabled. Default: False.
        with_flops (bool, optional): Whether to include FLOP counts. Default: False.

    Attributes:
        _use_device (str): Device type being profiled.
        _profile_memory (bool): Whether memory profiling is enabled.
        _with_flops (bool): Whether FLOP counting is enabled.
        _tree_built (bool): Whether the event tree structure has been built.

    Key Methods:
        table(...): Format events as a table string for display.
        export_chrome_trace(path): Export to Chrome tracing format.
        export_stacks(path, metric): Export stack traces with metrics.
        key_averages(...): Compute averaged statistics grouped by operation name.
        total_average(): Compute aggregate totals across all events (sums, not averages).

    Properties:
        self_cpu_time_total: Sum of self CPU time across all events.

    Example::

        import torch
        from torch.profiler import profile, ProfilerActivity

        with profile(activities=[ProfilerActivity.CPU]) as prof:
            x = torch.randn(100, 100)
            y = torch.matmul(x, x)

        # EventList is returned by prof.events()
        events = prof.events()

        # Display as formatted table
        print(
            events.table(
                sort_by="cpu_time_total", row_limit=20, top_level_events_only=False
            )
        )

        # Export to Chrome tracing format
        events.export_chrome_trace("trace.json")

        # Get averaged statistics
        avg_events = events.key_averages()
        print(avg_events.table())

        # Export stack traces
        events.export_stacks("stacks.txt", "self_cpu_time_total")

    See Also:
        - :class:`FunctionEvent`: Individual profiling event
        - :class:`FunctionEventAvg`: Averaged profiling statistics
        - :meth:`table`: Format events as a readable table
        - :meth:`key_averages`: Aggregate events by operation name
    c                 óö   •— |                      dd ¦  «        }|                      dd¦  «        }|                      dd¦  «        } t          ¦   «         j        |i |¤Ž || _        || _        d| _        || _        d S )NÚ
use_deviceÚprofile_memoryFÚ
with_flops)ÚpopÚsuperÚ__init__Ú_use_deviceÚ_profile_memoryÚ_tree_builtÚ_with_flops)ÚselfÚargsÚkwargsr   r   r   Ú	__class__s         €úZ/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/torch/autograd/profiler_util.pyr   zEventList.__init__b   s   ø€ Ø—Z’Z ¨dÑ3Ô3ˆ
ØŸšÐ$4°eÑ<Ô<ˆØ—Z’Z ¨eÑ4Ô4ˆ
à�‰ŒÔ˜$Ð) &Ð)Ð)Ð)Ø%ˆÔØ-ˆÔØ ˆÔØ%ˆÔÐÐó    c                 óŒ   — |                       ¦   «          |                      ¦   «          |                      ¦   «          d| _        d S )NT)Ú_populate_cpu_childrenÚ_remove_dup_nodesÚ_set_backward_stacktracesr   ©r    s    r$   Ú_build_treezEventList._build_treem   sF   € Ø×#Ò#Ñ%Ô%Ð%Ø×ÒÑ Ô Ð Ø×&Ò&Ñ(Ô(Ð(ØˆÔÐÐr%   c                 ó*   — |                       ¦   «         S ©N)Útabler*   s    r$   Ú__str__zEventList.__str__s   s   € Ø�zŠz‰|Œ|Ðr%   c                 óš  ‡— 	 t          ¦   «         Št          t          | ¦  «        ¦  «        D ]Ä}| |         j        �µ| |         j        j        | |         j        k    r”t          | |         j        j        ¦  «        dk    rq| |         j        | |         j        _        | |         j        | |         j        _        | |         j        D ]}| |         j        |_        Œ‰                     |¦  «         ŒÅt          ‰¦  «        dk    rd S ˆfd„t          | ¦  «        D ¦   «         }|  	                    ¦   «          |  
                    |¦  «         �ŒJ)NTé   r   c                 ó"   •— g | ]\  }}|‰v¯	|‘ŒS © r3   )Ú.0ÚindÚevÚ	to_deletes      €r$   ú
<listcomp>z/EventList._remove_dup_nodes.<locals>.<listcomp>ˆ   s'   ø€ ÐRÐRÐR™w˜s B¸SÈ	Ð=QÐ=Q˜Ð=QÐ=QÐ=Qr%   )ÚsetÚrangeÚlenÚ
cpu_parentÚnameÚcpu_childrenÚkernelsÚaddÚ	enumerateÚclearÚextend)r    ÚidxÚchÚnew_evtsr7   s       @r$   r(   zEventList._remove_dup_nodesv   s1  ø€ ð	"Ý™œˆIå�S ™YœYÑ'Ô'ð 
'ð 
'�à˜”IÔ(Ð4Ø˜Sœ	Ô,Ô1°T¸#´Y´^ÒCÐCÝ˜D œIÔ0Ô=Ñ>Ô>À!ÒCÐCà8<¸S¼	Ô8N�D˜”IÔ(Ô5Ø37¸´9Ô3D�D˜”IÔ(Ô0Ø" 3œiÔ4ð =ð =˜Ø(,¨S¬	Ô(<˜œ˜Ø—M’M #Ñ&Ô&Ð&øÝ�9‰~Œ~ Ò"Ð"Ø�àRÐRÐRÐR­)°D©/¬/ÐRÑRÔRˆHà�JŠJ‰LŒLˆLà�KŠK˜Ñ!Ô!Ð!ñ+	"r%   c                 ót  — d„ | D ¦   «         }t          |t          d¦  «        ¬¦  «        }t          j        |d„ ¬¦  «        }|D ]ó\  }}t          |d„ ¬¦  «        }g }|D ]×}t	          |¦  «        dk    r­|d         }	|j        j        |	j        j        k    s|j        j        |	j        j        k    r|                     ¦   «          nI|	 	                    |¦  «         |j
        �t          d	|j        › �¦  «        ‚|                     |	¦  «         nt	          |¦  «        dk    °­|                     |¦  «         ŒØŒôdS )
a4  Populate child events into each underlying FunctionEvent object.

        One event is a child of another if [s1, e1) is inside [s2, e2). Where
        s1 and e1 would be start and end of the child event's interval. And
        s2 and e2 start and end of the parent event's interval

        Example: In event list [[0, 10], [1, 3], [3, 4]] would have make [0, 10]
        be a parent of two other intervals.

        If for any reason two intervals intersect only partially, this function
        will not record a parent child relationship between then.
        c                 óJ   — g | ] }|j         s|j        t          j        k    ¯|‘Œ!S r3   )Úis_asyncÚdevice_typer
   ÚCPU©r4   Úevts     r$   r8   z4EventList._populate_cpu_children.<locals>.<listcomp>ž   s=   € ð 
ð 
ð 
àØ”<ð
ð %(¤Oµz´~Ò$EÐ$Eð à$EÐ$EÐ$Er%   Úthread©Úkeyc                 ó   — | j         | j        fS r-   )rN   Únode_id©Úevents    r$   ú<lambda>z2EventList._populate_cpu_children.<locals>.<lambda>«   s   €  u¤|°U´]Ð&C€ r%   c                 ó4   — | j         j        | j         j         gS r-   )Ú
time_rangeÚstartÚendrS   s    r$   rU   z2EventList._populate_cpu_children.<locals>.<lambda>½   s   €  5Ô#3Ô#9¸EÔ<LÔ<PÐ;PÐ"Q€ r%   r   éÿÿÿÿNz(There is already a CPU parent event for )Úsortedr   Ú	itertoolsÚgroupbyr;   rW   rX   rY   r   Úappend_cpu_childr<   ÚAssertionErrorrP   Úset_cpu_parentÚappend)
r    Úsync_eventsÚeventsÚthreadsÚ
_thread_idÚthread_eventsÚthread_events_Úcurrent_eventsrT   Úparents
             r$   r'   z EventList._populate_cpu_childrenŽ   s£  € ð 
ð 
àð
ñ 
ô 
ˆõ
 ØÝ˜8Ñ$Ô$ð
ñ 
ô 
ˆõ Ô#ØÐCÐCð
ñ 
ô 
ˆð  *1ð 	-ð 	-Ñ%ˆJ˜Ý#ØØQÐQðñ ô ˆNð 35ˆNØ'ð -ð -�Ý˜.Ñ)Ô)¨AÒ-Ð-Ø+¨BÔ/�FàÔ(Ô.°&Ô2CÔ2GÒGÐGØ Ô+Ô/°&Ô2CÔ2GÒGÐGð '×*Ò*Ñ,Ô,Ð,Ð,à×/Ò/°Ñ6Ô6Ð6Ø Ô+Ð7Ý"0Ø VÈ5Ì9Ð VÐ Vñ#ô #ð ð ×,Ò,¨VÑ4Ô4Ð4Øõ ˜.Ñ)Ô)¨AÒ-Ð-ð" ×%Ò% eÑ,Ô,Ð,Ð,ð%-ð	-ð 	-r%   c                 ó  ‡— ˆfd„Ši }| D ]0} ‰|¦  «        €#|j         �|j        |j        f}||vr
|j         ||<   Œ1| D ]N} ‰|¦  «        }|�?|j        €t	          d¦  «        ‚|j        |j        f}|                     |g ¦  «        |_         ŒOd S )Nc                 óF   •— | €d S | j         dk    r| S  ‰| j        ¦  «        S ©Nr1   )Úscoper<   )rM   Ú	bw_parents    €r$   rn   z6EventList._set_backward_stacktraces.<locals>.bw_parentÕ   s/   ø€ Øˆ{Ø�tØ”˜a’�Ø�
à �y ¤Ñ0Ô0Ð0r%   z1Expected fwd_thread to be set for backward parent)ÚstackÚsequence_nrrN   Ú
fwd_threadr_   Úget)r    Ú
fwd_stacksrM   ÚtÚprn   s        @r$   r)   z#EventList._set_backward_stacktracesÔ   sÚ   ø€ ð	1ð 	1ð 	1ð 	1ð 	1ð ˆ
Øð 	.ð 	.ˆCØˆy˜‰~Œ~Ð%¨#¬)Ð*?Ø”_ c¤jÐ1�Ø˜JÐ&Ð&Ø$'¤I�J˜q‘Møàð 	2ð 	2ˆCØ�	˜#‘”ˆAØˆ}Ø”<Ð'Ý(ØKñô ð ð ”] A¤LÐ1�Ø&ŸNšN¨1¨bÑ1Ô1�”	øð	2ð 	2r%   c                 ó4   — t          d„ | D ¦   «         ¦  «        S )Nc              3   ó$   K  — | ]}|j         V — Œd S r-   )Úself_cpu_time_total©r4   rT   s     r$   ú	<genexpr>z0EventList.self_cpu_time_total.<locals>.<genexpr>ð   s%   è è € Ð?Ð?°�5Ô,Ð?Ð?Ð?Ð?Ð?Ð?r%   )Úsumr*   s    r$   rx   zEventList.self_cpu_time_totalî   s   € åÐ?Ð?¸$Ð?Ñ?Ô?Ñ?Ô?Ð?r%   Néd   éK   é7   éP   Fc	                 óJ   — t          | ||||||| j        | j        ||¬¦  «        S )a¿  Print an EventList as a nicely formatted table.

        Args:
            sort_by (str, optional): Attribute used to sort entries. By default
                they are printed in the same order as they were registered.
                Valid keys include: ``cpu_time``, ``cuda_time``, ``xpu_time``,
                ``cpu_time_total``, ``cuda_time_total``, ``xpu_time_total``,
                ``cpu_memory_usage``, ``cuda_memory_usage``, ``xpu_memory_usage``,
                ``self_cpu_memory_usage``, ``self_cuda_memory_usage``,
                ``self_xpu_memory_usage``, ``count``.
            top_level_events_only(bool, optional): Boolean flag to determine the
                selection of events to display. If true, the profiler will only
                display events at top level like top-level invocation of python
                `lstm`, python `add` or other functions, nested events like low-level
                cpu/cuda/xpu ops events are omitted for profiler result readability.
            time_unit(str, optional): A time unit to be used for all values in the
                table. Valid options are: ``s``, ``ms`` and ``us``.

        Returns:
            A string containing the table.
        )
Úsort_byÚ	row_limitÚmax_src_column_widthÚmax_name_column_widthÚmax_shapes_column_widthÚheaderr   r   Útop_level_events_onlyÚ	time_unit)Ú_build_tabler   r   )	r    r�   r‚   rƒ   r„   r…   r†   r‡   rˆ   s	            r$   r.   zEventList.tableò   sC   € õ@ ØØØØ!5Ø"7Ø$;ØØÔ/ØÔ'Ø"7Øð
ñ 
ô 
ð 	
r%   c                 ó  — ddl }| j        sdn| j        }t          |d¦  «        5 }d}|                     d¦  «         | D ]Â}|j        €Œ
|                     d                     |j        |j        j        |j                             ¦   «         |j	        s|j
        nd|j        › d|j
        › d	�¦  «        ¦  «         |j        D ]@}|                     d
|j        › d|j        j        › d|j
        › d|› d|› d�¦  «         |dz  }ŒAŒÃt          | ¦  «        dk    rD|                     |                     ¦   «         dz
  |j        ¦  «         |                     ¦   «          |                     d¦  «         ddd¦  «         dS # 1 swxY w Y   dS )zãExport an EventList as a Chrome tracing tools file.

        The checkpoint can be later loaded and inspected under ``chrome://tracing`` URL.

        Args:
            path (str): Path where the trace will be written.
        r   NÚcudaÚwú[zc{{"name": "{}", "ph": "X", "ts": {}, "dur": {}, "tid": {}, "pid": "CPU functions", "args": {{}}}}, z
" node_id:z, thread_id:z "z
{"name": "z", "ph": "s", "ts": z	, "tid": z , "pid": "CPU functions", "id": z, "cat": "cpu_to_z", "args": {}}, r1   é   ú])Úosr   ÚopenÚwriteÚ
trace_nameÚformatrW   rX   Ú
elapsed_usÚ	is_remoterN   rR   r?   r;   ÚseekÚtellÚSEEK_SETÚtruncate)r    Úpathr�   Údevice_nameÚfÚnext_idrM   Ú_s           r$   Úexport_chrome_tracezEventList.export_chrome_trace   s  € ð 	ˆ	ˆ	ˆ	à$(Ô$4ÐJ�f�f¸$Ô:JˆÝ�$˜‰_Œ_ð +	 ØˆGð �GŠG�C‰LŒLˆLØð !!ð !!�Ø”>Ð)ØØ—’ð'÷ (.¢vØœØœÔ,Øœ×1Ò1Ñ3Ô3à"œ}ðR˜œ
˜
àQ¨#¬+ÐQÐQÀ3Ä:ÐQÐQÐQñ(ô (ñô ð ð  œð !ð !�Að —G’Gð( c¤nð (ð (à!$¤Ô!5ð(ð (ð #&¤*ð(ð (ð
 ")ð(ð (ð +6ð(ð (ð (ñ	ô 	ð 	ð ˜q‘L�G�Gð!õ �4‰yŒy˜1Š}ˆ}à—’�q—v’v‘x”x !‘| R¤[Ñ1Ô1Ð1Ø—
’
‘”�Ø�GŠG�C‰LŒLˆLðW+	ð +	ð +	ñ +	ô +	ð +	ð +	ð +	ð +	ð +	ð +	ð +	øøøð +	ð +	ð +	ð +	ð +	ð +	s   ¥E	E;Å;E?ÆE?c                 ó
   — g d¢S )N)rx   Úself_cuda_time_totalÚself_xpu_time_totalÚself_privateuse1_time_totalr3   r*   s    r$   Úsupported_export_stacks_metricsz)EventList.supported_export_stacks_metricsX  s   € ð
ð 
ð 
ð 	
r%   r›   Úmetricc           	      ó  — ||                       ¦   «         vr1t          dt          |                       ¦   «         ¦  «        z   ¦  «        ‚t                               dd¦  «        }t	          |d¦  «        5 }| D ]ø}|j        rït          |j        ¦  «        dk    r×t          ||                     dd¦  «                             dd¦  «                             d	d¦  «        ¦  «        }t          |¦  «        dk    rxd
}t          |j        ¦  «        D ]}||                     |¦  «        z  }|dz  }Œ |d d…         dz   t          t          |¦  «        ¦  «        z   }|                     |dz   ¦  «         Œù	 d d d ¦  «         d S # 1 swxY w Y   d S )Nzmetric should be one of: z ;	
Ú____rŒ   r   r‹   ÚdeviceÚxpuÚprivateuse1Ú ú;rZ   ú ú
)r¥   Ú
ValueErrorÚstrÚ	maketransr‘   ro   r;   ÚgetattrÚreplaceÚintÚreversedÚ	translater’   )	r    r›   r¦   Útranslate_tabler�   rM   Úmetric_valueÚ	stack_strÚentrys	            r$   Úexport_stackszEventList.export_stacks`  sÓ  € Ø˜×=Ò=Ñ?Ô?Ð?Ð?ÝØ+Ý�d×:Ò:Ñ<Ô<Ñ=Ô=ñ>ñô ð õ Ÿ-š-¨°&Ñ9Ô9ˆÝ�$˜‰_Œ_ð 	2 Øð 2ð 2�Ø”9ð 2¥ S¤Y¡¤°!Ò!3Ð!3Ý#*ØØŸš v¨xÑ8Ô8ß š ¨Ñ1Ô1ß š °Ñ9Ô9ñ	$ô $�Lõ ˜<Ñ(Ô(¨1Ò,Ð,Ø$&˜	Ý%-¨c¬iÑ%8Ô%8ð -ð -˜EØ%¨¯ª¸Ñ)IÔ)IÑI˜IØ%¨Ñ,˜I˜IØ$-¨c¨r¨c¤N°SÑ$8½3½sÀ<Ñ?PÔ?PÑ;QÔ;QÑ$Q˜	ØŸš 	¨DÑ 0Ñ1Ô1Ð1øð2ð	2ð 	2ð 	2ñ 	2ô 	2ð 	2ð 	2ð 	2ð 	2ð 	2ð 	2ð 	2øøøð 	2ð 	2ð 	2ð 	2ð 	2ð 	2s   Á3C<E=Å=FÆFr   c                 ó¦  ‡— | j         st          d¦  «        ‚t          t          ¦  «        }dt          t
          df         fˆfd„}| D ])Š| |‰|||¦  «                                      ‰¦  «         Œ*t          |                     ¦   «         | j	        | j
        | j        ¬¦  «        }|D ](Š‰j        d|…         ‰_        |sd‰_        |sd‰_        Œ)|S )aî  Averages all function events over their keys.

        Args:
            group_by_input_shapes: group entries by
                (event name, input shapes) rather than just event name.
                This is useful to see which input shapes contribute to the runtime
                the most and may help with size-specific optimizations or
                choosing the best candidates for quantization (aka fitting a roof line)

            group_by_stack_n: group by top n stack trace entries

            group_by_overload_name: Differentiate operators by their overload name e.g. aten::add.Tensor
            and aten::add.out will be aggregated separately

        Returns:
            An EventList containing FunctionEventAvg objects.
        z5Expected tree to be built before calling key_averagesÚreturn.c                 óž  •— t          | j        ¦  «        t          | j        ¦  «        t          | j        ¦  «        t          | j        ¦  «        t          | j        ¦  «        g}|r|                     ‰j        ¦  «         |r'|                     t          | j        ¦  «        ¦  «         |dk    r|| j	        d |…         z  }t          |¦  «        S ©Nr   )r±   rP   rR   rJ   Ú	is_legacyÚis_user_annotationra   Úoverload_nameÚinput_shapesro   Útuple)rT   Úgroup_by_input_shapesÚgroup_by_stack_nÚgroup_by_overload_namerP   rM   s        €r$   Úget_keyz'EventList.key_averages.<locals>.get_key•  sÀ   ø€ õ �E”I‘”Ý�E”MÑ"Ô"Ý�EÔ%Ñ&Ô&Ý�E”OÑ$Ô$Ý�EÔ,Ñ-Ô-ðˆCð &ð .Ø—
’
˜3Ô,Ñ-Ô-Ð-Ø$ð 4Ø—
’
�3˜uÔ1Ñ2Ô2Ñ3Ô3Ð3Ø !Ò#Ð#Ø�u”{Ð#4Ð$4Ð#4Ô5Ñ5�Ý˜‘:”:Ðr%   ©r   r   r   Nr¬   )r   r_   r   r   rÅ   r±   r@   r   Úvaluesr   r   r   ro   rÄ   rÃ   )r    rÆ   rÇ   rÈ   ÚstatsrÉ   Úavg_listrM   s          @r$   Úkey_averageszEventList.key_averagesx  s&  ø€ ð. Ôð 	Ý ØGñô ð õ :EÕEUÑ9VÔ9Vˆð	å•3˜�8Œ_ð	ð 	ð 	ð 	ð 	ð 	ð$ ð 	ð 	ˆCØØ�ØÐ.Ð0@ÐBXñô ô÷ Šc�#‰hŒhˆhˆhåØ�LŠL‰NŒNØÔ'ØÔ/ØÔ'ð	
ñ 
ô 
ˆð ð 	'ð 	'ˆCØœ	Ð"3Ð#3Ð"3Ô4ˆCŒIØ(ð &Ø#%�Ô Ø)ð 'Ø$&�Ô!øØˆr%   c                 óR   — t          ¦   «         }| D ]}||z  }d|_        Œd|_        |S )a,  Compute aggregate statistics across all events.

        Accumulates statistics from all events into a single FunctionEventAvg object.
        This is primarily useful for computing total metrics (total CPU time, total
        memory usage, etc.) across the entire profiling session, regardless of
        operation type.

        Note:
            This sums up times and counts across ALL different operations, so the
            "average" metrics (like cpu_time) represent the average time per operation
            call across the entire session, mixing all operation types together.
            For per-operation averages, use :meth:`key_averages` instead.

        Returns:
            FunctionEventAvg: A single aggregate object with key="Total" containing
                accumulated statistics.

        NÚTotal)r   rP   )r    Ú
total_statrM   s      r$   Útotal_averagezEventList.total_average¼  s>   € õ& &Ñ'Ô'ˆ
Øð 	"ð 	"ˆCØ˜#ÑˆJØ!ˆJŒNˆNØ ˆ
ŒØÐr%   )Nr|   r}   r~   r   NFN)Fr   F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r+   r/   r(   r'   r)   Úpropertyrx   r.   r    r¥   r±   r¼   rÎ   rÒ   Ú__classcell__)r#   s   @r$   r   r      sU  ø€ € € € € ðBð BðH	&ð 	&ð 	&ð 	&ð 	&ð ð  ð  ðð ð ð"ð "ð "ð0D-ð D-ð D-ðL2ð 2ð 2ð4 ð@ð @ñ „Xð@ð
 ØØØ Ø "ØØ#Øð,
ð ,
ð ,
ð ,
ð\6ð 6ð 6ðp
ð 
ð 
ð2 #ð 2¨sð 2ð 2ð 2ð 2ð4 $ØØ$ð	Bð Bð Bð BðHð ð ð ð ð ð r%   r   c                 óR   — d}d}| |k    r	| |z  d›d�S | |k    r	| |z  d›d�S | d›d�S )ú+Define how to format time in FunctionEvent.ç    €„.Aç     @�@ú.3fÚsÚmsÚusr3   )Útime_usÚUS_IN_SECONDÚUS_IN_MSs      r$   Ú_format_timerä   ×  sb   € à"€LØ€HØ�,ÒÐØ˜LÑ(Ð/Ð/Ð/Ð/Ð/Ø�(ÒÐØ˜HÑ$Ð,Ð,Ð,Ð,Ð,ØÐÐÐÐÐr%   c                 óZ   — |dk    r| dk    rt          d| › �¦  «        ‚dS | dz  |z  d›d�S )rÚ   r   zExpected time_us == 0 but got ÚNaNg      Y@ú.2fú%)r_   )rá   Útotal_time_uss     r$   Ú_format_time_sharerê   â  sM   € à˜ÒÐØ�aŠ<ˆ<Ý Ð!KÀ'Ð!KÐ!KÑLÔLÐLØˆuØ˜‰o Ñ-Ð4Ð4Ð4Ð4Ð4r%   c                 óø   — d}d|z  }d|z  }t          | ¦  «        |k    r| dz  |z  d›d�S t          | ¦  «        |k    r| dz  |z  d›d�S t          | ¦  «        |k    r| dz  |z  d›d�S t          | ¦  «        dz   S )z&Return a formatted memory size string.i   ç      ð?rç   z GBz MBz KBz B)Úabsr±   )ÚnbytesÚKBÚMBÚGBs       r$   Ú_format_memoryrò   ë  s®   € à	€BØ	�‰€BØ	�‰€BÝ
ˆ6�{„{�bÒÐØ˜3‘, Ñ#Ð,Ð,Ð,Ð,Ð,Ý	ˆV‰Œ˜Ò	Ð	Ø˜3‘, Ñ#Ð,Ð,Ð,Ð,Ð,Ý	ˆV‰Œ˜Ò	Ð	Ø˜3‘, Ñ#Ð,Ð,Ð,Ð,Ð,å�6‰{Œ{˜TÑ!Ð!r%   c                 ó(   ‡ — t          ˆ fd„¦  «        S )Nc                 ó>   •— t          t          | ‰¦  «        ¦  «        S r-   )rä   r³   )r    r=   s    €r$   rU   z!_attr_formatter.<locals>.<lambda>û  s   ø€ ¥­g°d¸DÑ.AÔ.AÑ!BÔ!B€ r%   )r×   ©r=   s   `r$   Ú_attr_formatterrö   ú  s   ø€ ÝÐBÐBÐBÐBÑCÔCÐCr%   c                   óþ   — e Zd ZdZ ed¦  «        Z ed¦  «        Z ed¦  «        Z ed¦  «        Z ed¦  «        Z	 ed¦  «        Z
ed„ ¦   «         Zed	„ ¦   «         Ze ed
e¬¦  «        d„ ¦   «         ¦   «         ZdS )r   z{Helpers for FunctionEvent and FunctionEventAvg.

    The subclass should define `*_time_total` and `count` attributes.
    Úcpu_timeÚdevice_timeÚcpu_time_totalÚdevice_time_totalrx   Úself_device_time_totalc                 ó@   — | j         dk    rdnd| j        z  | j         z  S ©Nr   g        rì   )Úcountrú   r*   s    r$   rø   zFormattedTimesMixin.cpu_time  s%   € à”j A’o�oˆsˆs¨3°Ô1DÑ+DÀtÄzÑ+QÐQr%   c                 ó@   — | j         dk    rdnd| j        z  | j         z  S rþ   )rÿ   rû   r*   s    r$   rù   zFormattedTimesMixin.device_time  s%   € à”j A’o�oˆsˆs¨3°Ô1GÑ+GÈ$Ì*Ñ+TÐTr%   z<`cuda_time` is deprecated, please use `device_time` instead.©Úcategoryc                 ó   — | j         S r-   )rù   r*   s    r$   Ú	cuda_timezFormattedTimesMixin.cuda_time  s   € ð ÔÐr%   N)rÓ   rÔ   rÕ   rÖ   rö   Úcpu_time_strÚdevice_time_strÚcpu_time_total_strÚdevice_time_total_strÚself_cpu_time_total_strÚself_device_time_total_strr×   rø   rù   r	   ÚFutureWarningr  r3   r%   r$   r   r   þ  sû   € € € € € ðð ð
 #�? :Ñ.Ô.€LØ%�o mÑ4Ô4€OØ(˜Ð)9Ñ:Ô:ÐØ+˜OÐ,?Ñ@Ô@ÐØ-˜oÐ.CÑDÔDÐØ!0 Ð1IÑ!JÔ!JÐàðRð Rñ „XðRð ðUð Uñ „XðUð Ø€ZØFØðñ ô ð ð  ñ	ô ñ „Xð
 ð  ð  r%   r   c                   ó   — e Zd Zd„ Zd„ ZdS )r   c                 ó"   — || _         || _        d S r-   )rX   rY   )r    rX   rY   s      r$   r   zInterval.__init__  s   € ØˆŒ
ØˆŒˆˆr%   c                 ó    — | j         | j        z
  S )z4
        Returns the length of the interval
        )rY   rX   r*   s    r$   r•   zInterval.elapsed_us!  s   € ð Œx˜$œ*Ñ$Ð$r%   N)rÓ   rÔ   rÕ   r   r•   r3   r%   r$   r   r     s2   € € € € € ðð ð ð%ð %ð %ð %ð %r%   r   r   )r=   r©   Údurationc                   óh  — e Zd ZU edz  ed<   edz  ed<   ee         dz  ed<   ee         dz  ed<   edz  ed<   edz  ed<   edz  ed<   eee	f         dz  ed	<   edz  ed
<   edz  ed<   edz  ed<   edz  ed<   edz  ed<   edz  ed<   edz  ed<   edz  ed<   edz  ed<   edz  ed<   edz  ed<   edz  ed<   edz  ed<   edz  ed<   edz  ed<   edz  ed<   edz  ed<   edz  ed<   edz  ed<   edz  ed<   edz  ed<   edz  ed<   edz  ed <   edz  ed!<   edz  ed"<   edz  ed#<   e
dz  ed$<   dS )%r   NÚregisters_per_threadÚshared_memoryÚgridÚblockÚpriorityÚblocks_per_smÚwarps_per_smÚ	occupancyÚest_occupancy_pctÚqueuedÚgraph_idÚgraph_node_idÚstreamÚcontextÚchannelÚchannel_typeÚbytesÚbandwidth_gb_sÚcollective_nameÚdtypeÚin_msg_nelemsÚout_msg_nelemsÚin_split_sizeÚout_split_sizeÚglobal_rank_startÚglobal_rank_strideÚ
group_sizeÚprocess_group_nameÚprocess_group_descÚgroup_ranksÚrankÚsrc_rankÚdst_rankÚseqrI   )rÓ   rÔ   rÕ   rµ   Ú__annotations__ÚlistÚfloatÚdictr±   r   Úboolr3   r%   r$   r   r   +  sR  € € € € € € à ™*Ð$Ð$Ñ$Ø˜‘:ÐÐÑØ
ˆsŒ)�dÑ
ÐÐÑØ�Œ9�tÑÐÐÑØ�D‰jÐÐÑØ˜4‘<ÐÐÑØ˜$‘,ÐÐÑØ�C˜�HŒ~ Ñ$Ð$Ð$Ñ$Ø˜t‘|Ð#Ð#Ñ#Ø�$‰JÐÐÑØ�D‰jÐÐÑØ˜‘:ÐÐÑØ�$‰JÐÐÑØ�4‰ZÐÐÑØ�4‰ZÐÐÑØ˜‘*ÐÐÑà�‰:ÐÐÑØ˜D‘LÐ Ð Ñ à˜4‘ZÐÐÑØ�‰:ÐÐÑØ˜‘:ÐÐÑØ˜$‘JÐÐÑØ˜‘:ÐÐÑØ˜$‘JÐÐÑØ˜T‘zÐ!Ð!Ñ!Ø˜d™
Ð"Ð"Ñ"Ø�d‘
ÐÐÑØ˜d™
Ð"Ð"Ñ"Ø˜d™
Ð"Ð"Ñ"Ø�t‘ÐÐÑØ
�‰*ÐÐÑØ�D‰jÐÐÑØ�D‰jÐÐÑØ	ˆt‰€O€O�OØ�T‰kÐÐÑÐÐr%   r   Úvr¾   c                 ó,   — |                       d¦  «        S )Nú"©Ústrip©r8  s    r$   Ú_to_strr>  T  s   € Ø�7Š7�3‰<Œ<Ðr%   c                 ó
   — | dv S )N)Ú1Útruer3   r=  s    r$   Ú_to_boolrB  X  s   € Ø�ÐÐr%   zregisters per threadr  zshared memoryr  r  r  r  zblocks per SMr  zwarps per SMr  zest. achieved occupancy %r  r  r  zgraph idr  zgraph node idr  r  r  r  r   r!  zmemory bandwidth (GB/s)r"  zCollective namer#  r$  zIn msg nelemsr%  zOut msg nelemsr&  zIn split sizer'  zOut split sizer(  zGlobal rank startr)  zGlobal rank strider*  z
Group sizer+  zProcess Group Namer,  zProcess Group Descriptionr-  zProcess Group Ranksr.  ÚRankr/  zSrc Rankr0  zDst Rankr1  ÚSeqr2  zIs asynchronized oprI   Ú_EVENT_METADATA_KEYSc                 óÈ   — i }d}t                                ¦   «         D ]5\  }\  }}|                      |¦  «        }|� ||¦  «        ||<   d}Œ0d ||<   Œ6|rt          di |¤Žnd S )NFTr3   )rE  Úitemsrr   r   )Ú
extra_metaÚfieldsÚany_populatedÚ
kineto_keyÚ
field_nameÚconvertr8  s          r$   Ú_build_metadatarN  „  s‹   € Ø€FØ€MÝ-A×-GÒ-GÑ-IÔ-Ið &ð &Ñ)ˆ
Ñ)�Z Ø�NŠN˜:Ñ&Ô&ˆØˆ=Ø!( ¨¡¤ˆF�:ÑØ ˆMˆMà!%ˆF�:ÑÐØ&3Ð=�=Ð"Ð"˜6Ð"Ð"Ð"¸Ð=r%   c            $       ó  — e Zd ZdZddddddddddddej        dddddddddddddddddddddddf$d„Zd„ Zd„ Zd	„ Z	e
d
„ ¦   «         Ze
d„ ¦   «         Ze
 ede¬¦  «        d„ ¦   «         ¦   «         Ze
 ede¬¦  «        d„ ¦   «         ¦   «         Ze
d„ ¦   «         Ze
d„ ¦   «         Ze
d„ ¦   «         Ze
 ede¬¦  «        d„ ¦   «         ¦   «         Ze
d„ ¦   «         Ze
 ede¬¦  «        d„ ¦   «         ¦   «         Ze
d„ ¦   «         Zd„ ZdS )r   a   Profiling information about a single function.

    FunctionEvent records the execution of a single operation during profiling.
    These events are obtained from the profiler/kineto and contain detailed
    timing and memory usage information.

    .. note::
        FunctionEvent objects are typically created by the profiler/kineto and should not
        be instantiated directly by users. Access them through the profiler's output.

    Attributes:
        id (int): Unique identifier for this event.
        node_id (int): Node identifier for distributed profiling (-1 if not applicable).
        name (str): Name of the profiled function/operator.
        overload_name (str): Overload name for the operator (requires _ExperimentalConfig(capture_overload_names=True) set).
        trace_name (str): Same as name, just changes ProfilerStep* to ProfilerStep#
        time_range (Interval): Time interval containing start and end timestamps in microseconds.
        thread (int): Thread ID where the operation started.
        fwd_thread (int): Thread ID of the corresponding forward operation.
        kernels (List[Kernel]): List of device kernels launched by this operation.
        count (int): Number of times this event was called (usually 1).
        cpu_children (List[FunctionEvent]): Direct CPU child operations.
        cpu_parent (FunctionEvent): Direct CPU parent operation.
        input_shapes (List[List[int]]): Shapes of input tensors (requires record_shapes=True).
            For plain tensor inputs, each entry is a list of dimensions (e.g. ``[16, 16]``).
            TensorList inputs are represented as an empty list ``[]``; use
            ``structured_input_shapes`` to get per-element shapes for TensorList inputs.
        concrete_inputs (List[Any]): Concrete input values (requires record_shapes=true).
        kwinputs (Dict[str, Any]): Keyword arguments (requires record_shapes=true).
        stack (List[str]): Python stack trace where the operation was called (requires with_stack=true).
        scope (int): at::RecordScope identifier (0=forward, 1=backward, etc.).
        use_device (str): Device type being profiled ("cuda", "xpu", etc.).
        cpu_memory_usage (int): CPU memory allocated in bytes.
        device_memory_usage (int): Device memory allocated in bytes.
        is_async (bool): Whether this is an asynchronous operation.
        is_remote (bool): Whether this operation occurred on a remote node.
        sequence_nr (int): Sequence number for autograd operations.
        device_type (DeviceType): Type of device (CPU, CUDA, XPU, PrivateUse1, etc.).
        device_index (int): Index of the device (e.g., GPU 0, 1, 2).
        device_resource_id (int): Resource ID on the device (ie. stream ID).
        is_legacy (bool): Whether this is from the legacy profiler.
        flops (int): Estimated floating point operations.
        is_user_annotation (bool): Whether this is a user-annotated region.
        metadata_json (str): Deprecated. Use event_metadata instead.
        event_metadata (EventMetadata): Additional metadata in structured format.
        structured_input_shapes (List[List[int] | List[List[int]]]): Like ``input_shapes``
            but distinguishes TensorList inputs.  Plain tensor inputs are ``List[int]``;
            TensorList inputs are ``List[List[int]]`` containing one shape per tensor in the list.
            Matches the ``"Input Dims"`` field in the Chrome trace JSON.
        structured_input_strides (List[List[int] | List[List[int]]]): Strides of input
            tensors in the same format as ``structured_input_shapes`` (requires
            record_shapes=True).

    Properties:
        cpu_time_total (float): Total CPU time in microseconds.
        device_time_total (float): Total device (CUDA/XPU/etc) time in microseconds.
        self_cpu_time_total (float): CPU time excluding child operations.
        self_device_time_total (float): Device time excluding child operations.
        self_cpu_memory_usage (int): CPU memory usage excluding child operations.
        self_device_memory_usage (int): Device memory usage excluding child operations.
        cpu_time (float): Average CPU time per call.
        device_time (float): Average device time per call.
        key (str): Key used for grouping events (usually same as name).

    See Also:
        - :class:`torch.profiler.profile`: Context manager for profiling
        - :class:`EventList`: List container for FunctionEvent objects with helper methods
        - :class:`FunctionEventAvg`: Averaged statistics over multiple FunctionEvent objects
    Nr   FrZ   c*                 óÞ  — || _         || _        || _        || _        || _        t          ||¦  «        | _        || _        || _        g | _	        d| _
        g | _        d | _        || _        || _        || _        |	| _        |
| _        || _        || _        || _        || _        || _        || _        || _        || _        |€|n|| _        || _        || _        || _        || _        || _        d| _         d| _!        d| _"        || _#        || _$        || _%        | | _&        |!| _'        |"| _(        |#rtS          |#¦  «        nd | _*        |$| _+        |%| _,        |&| _-        |'| _.        |(| _/        |)| _0        d S )Nr1   rZ   )1ÚidrR   r=   rÃ   r“   r   rW   rN   rq   r?   rÿ   r>   r<   rÄ   Úconcrete_inputsÚkwinputsro   rm   r   Úcpu_memory_usageÚdevice_memory_usagerI   r–   rp   rJ   Údevice_indexÚdevice_resource_idrÁ   ÚflopsrÂ   Úis_python_functionÚactivity_typeÚself_cpu_percentÚtotal_cpu_percentÚtotal_device_percentÚ_metadata_jsonÚflow_idÚ	flow_typeÚ
flow_startÚexternal_idÚlinked_correlation_idrN  Úevent_metadataÚstructured_input_shapesÚstructured_input_stridesÚinput_dtypesÚ	python_idÚpython_parent_idÚpython_module_id)*r    rQ  r=   rN   Ústart_usÚend_usrÃ   rq   rÄ   ro   rm   r   rT  rU  rI   r–   rp   rR   rJ   rV  rW  rÁ   rX  r“   rR  rS  rÂ   rY  rZ  Úmetadata_jsonr_  r`  ra  rb  rc  rH  re  rf  rg  rh  ri  rj  s*                                             r$   r   zFunctionEvent.__init__Ø  sž  € ðX ˆŒØ#ˆŒØˆŒ	à"/ˆÔà)ˆŒÝ$,¨X°vÑ$>Ô$>ˆŒØ!ˆŒØ&0ˆŒØ%'ˆŒØˆŒ
Ø13ˆÔØ04ˆŒà-9ˆÔà*9ˆÔà(0ˆŒà ˆŒ
ØˆŒ
Ø&0ˆŒØ%5ˆÔØ(;ˆÔ Ø&ˆŒØ(ˆŒØ +ˆÔØ'2ˆÔØ!-ˆÔà(Ð0ˆFˆFÐ6Hð 	Ôð  )ˆŒØ!&ˆŒ
Ø/AˆÔØ(:ˆÔØ)6ˆÔØ "ˆÔØ!#ˆÔØ$&ˆÔ!Ø+ˆÔØ#*ˆŒØ%.ˆŒØ'1ˆŒØ +ˆÔØ*?ˆÔ"à+5Ð?�O˜JÑ'Ô'Ð'¸4ð 	Ôð .EˆÔ$à.FˆÔ%à'3ˆÔØ'ˆŒØ%5ˆÔØ%5ˆÔÐÐr%   c                 ó    — | j         t          j        k    rt          d¦  «        ‚| j                             t          |||¦  «        ¦  «         d S )NúExpected device_type to be CPU)rJ   r
   rK   r_   r?   ra   r   )r    r=   r©   r  s       r$   Úappend_kernelzFunctionEvent.append_kernelA  sI   € ØÔ�zœ~Ò-Ð-Ý Ð!AÑBÔBÐBØŒ×Ò�F 4¨°Ñ:Ô:Ñ;Ô;Ð;Ð;Ð;r%   c                 ó  — | j         t          j        k    rt          d¦  «        ‚t	          |t
          ¦  «        st          d¦  «        ‚|j         t          j        k    rt          d¦  «        ‚| j                             |¦  «         dS )z­Append a CPU child of type FunctionEvent.

        One is supposed to append only direct children to the event to have
        correct self cpu time being reported.
        ro  z$Expected child to be a FunctionEventz$Expected child device_type to be CPUN)rJ   r
   rK   r_   Ú
isinstancer   r>   ra   )r    Úchilds     r$   r^   zFunctionEvent.append_cpu_childF  s�   € ð Ô�zœ~Ò-Ð-Ý Ð!AÑBÔBÐBÝ˜%¥Ñ/Ô/ð 	IÝ Ð!GÑHÔHÐHØÔ¥
¤Ò.Ð.Ý Ð!GÑHÔHÐHØÔ× Ò  Ñ'Ô'Ð'Ð'Ð'r%   c                 óì   — | j         t          j        k    rt          d¦  «        ‚t	          |t
          ¦  «        st          d¦  «        ‚|j         t          j        k    rt          d¦  «        ‚|| _        dS )a$  Set the immediate CPU parent of type FunctionEvent.

        One profiling FunctionEvent should have only one CPU parent such that
        the child's range interval is completely inside the parent's. We use
        this connection to determine the event is from top-level op or not.
        ro  z%Expected parent to be a FunctionEventz%Expected parent device_type to be CPUN)rJ   r
   rK   r_   rr  r   r<   )r    ri   s     r$   r`   zFunctionEvent.set_cpu_parentT  so   € ð Ô�zœ~Ò-Ð-Ý Ð!AÑBÔBÐBÝ˜&¥-Ñ0Ô0ð 	JÝ Ð!HÑIÔIÐIØÔ¥¤Ò/Ð/Ý Ð!HÑIÔIÐIØ ˆŒˆˆr%   c                 óŠ   — | j         s| j        t          j        k    rdS | j        t          d„ | j        D ¦   «         ¦  «        z
  S )Nr   c              3   ó$   K  — | ]}|j         V — Œd S r-   )rT  ©r4   rs  s     r$   rz   z6FunctionEvent.self_cpu_memory_usage.<locals>.<genexpr>i  s6   è è € ð +
ð +
Ø',ˆEÔ"ð+
ð +
ð +
ð +
ð +
ð +
r%   )rI   rJ   r
   rK   rT  r{   r>   r*   s    r$   Úself_cpu_memory_usagez#FunctionEvent.self_cpu_memory_usagee  s[   € àŒ=ð 	˜DÔ,µ
´Ò>Ð>Ø�1ØÔ$¥sð +
ð +
Ø04Ô0Að+
ñ +
ô +
ñ (
ô (
ñ 
ð 	
r%   c                 óŠ   — | j         s| j        t          j        k    rdS | j        t          d„ | j        D ¦   «         ¦  «        z
  S )Nr   c              3   ó$   K  — | ]}|j         V — Œd S r-   )rU  rw  s     r$   rz   z9FunctionEvent.self_device_memory_usage.<locals>.<genexpr>q  s6   è è € ð .
ð .
Ø*/ˆEÔ%ð.
ð .
ð .
ð .
ð .
ð .
r%   )rI   rJ   r
   rK   rU  r{   r>   r*   s    r$   Úself_device_memory_usagez&FunctionEvent.self_device_memory_usagem  s[   € àŒ=ð 	˜DÔ,µ
´Ò>Ð>Ø�1ØÔ'­#ð .
ð .
Ø37Ô3Dð.
ñ .
ô .
ñ +
ô +
ñ 
ð 	
r%   z<`metadata_json` is deprecated. Use `event_metadata` instead.r  c                 ó   — | j         S r-   )r^  r*   s    r$   rm  zFunctionEvent.metadata_jsonu  s   € ð Ô"Ð"r%   zO`self_cuda_memory_usage` is deprecated. Use `self_device_memory_usage` instead.c                 ó   — | j         S r-   ©r{  r*   s    r$   Úself_cuda_memory_usagez$FunctionEvent.self_cuda_memory_usage}  s   € ð Ô,Ð,r%   c                 ób   — | j         t          j        k    r| j                             ¦   «         S dS rÀ   )rJ   r
   rK   rW   r•   r*   s    r$   rú   zFunctionEvent.cpu_time_total…  s+   € àÔ�zœ~Ò-Ð-Ø”?×-Ò-Ñ/Ô/Ð/à�1r%   c                 óŠ   — | j         s| j        t          j        k    rdS | j        t          d„ | j        D ¦   «         ¦  «        z
  S )Nr   c              3   ó$   K  — | ]}|j         V — Œd S r-   )rú   rw  s     r$   rz   z4FunctionEvent.self_cpu_time_total.<locals>.<genexpr>�  s6   è è € ð )
ð )
Ø%*ˆEÔ ð)
ð )
ð )
ð )
ð )
ð )
r%   )rI   rJ   r
   rK   rú   r{   r>   r*   s    r$   rx   z!FunctionEvent.self_cpu_time_totalŒ  s[   € àŒ=ð 	˜DÔ,µ
´Ò>Ð>Ø�1ØÔ"¥Sð )
ð )
Ø.2Ô.?ð)
ñ )
ô )
ñ &
ô &
ñ 
ð 	
r%   c                 óð  — | j         s| j        sdS | j        t          j        k    rb| j        s=t          d„ | j        D ¦   «         ¦  «        t          d„ | j        D ¦   «         ¦  «        z   S t          d„ | j        D ¦   «         ¦  «        S | j        t          j	        t          j
        t          j        t          j        t          j        fvrt          d| j        › �¦  «        ‚| j                             ¦   «         S )Nr   c              3   ó$   K  — | ]}|j         V — Œd S r-   ©r  ©r4   Úkinfos     r$   rz   z2FunctionEvent.device_time_total.<locals>.<genexpr>›  ó$   è è € ÐDÐD¨e˜5œ>ÐDÐDÐDÐDÐDÐDr%   c              3   ó$   K  — | ]}|j         V — Œd S r-   ©rû   )r4   rE   s     r$   rz   z2FunctionEvent.device_time_total.<locals>.<genexpr>›  s>   è è € ð Kð KØ-/�BÔ(ðKð Kð Kð Kð Kð Kr%   c              3   ó$   K  — | ]}|j         V — Œd S r-   r…  r†  s     r$   rz   z2FunctionEvent.device_time_total.<locals>.<genexpr>   rˆ  r%   úHExpected device_type to be CUDA, PrivateUse1, MTIA, HPU or XPU, but got )rI   r   rJ   r
   rK   rÁ   r{   r?   r>   ÚCUDAÚPrivateUse1ÚMTIAÚHPUÚXPUr_   rW   r•   r*   s    r$   rû   zFunctionEvent.device_time_total”  s  € àŒ=ð 	 ¤ð 	Ø�1ØÔ�zœ~Ò-Ð-Ø”>ð EåÐDÐD°t´|ÐDÑDÔDÑDÔDÅsð Kð KØ37Ô3DðKñ Kô Kñ Hô Hñ ð õ
 ÐDÐD°t´|ÐDÑDÔDÑDÔDÐDàÔÝ”ÝÔ&Ý”Ý”Ý”ð(ð ð õ %ØqÐ_cÔ_oÐqÐqñô ð ð ”?×-Ò-Ñ/Ô/Ð/r%   zA`cuda_time_total` is deprecated. Use `device_time_total` instead.c                 ó   — | j         S r-   rŠ  r*   s    r$   Úcuda_time_totalzFunctionEvent.cuda_time_total®  s   € ð Ô%Ð%r%   c                 óT  — | j         s| j        sdS | j        t          j        k    r&| j        t          d„ | j        D ¦   «         ¦  «        z
  S | j        t          j        t          j	        t          j
        t          j        t          j        fvrt          d| j        › �¦  «        ‚| j        S )Nr   c              3   ó$   K  — | ]}|j         V — Œd S r-   rŠ  rw  s     r$   rz   z7FunctionEvent.self_device_time_total.<locals>.<genexpr>»  s6   è è € ð 0ð 0Ø,1�Ô'ð0ð 0ð 0ð 0ð 0ð 0r%   rŒ  )rI   r   rJ   r
   rK   rû   r{   r>   r�  rŽ  r�  r�  r‘  r_   r*   s    r$   rü   z$FunctionEvent.self_device_time_total¶  sÄ   € àŒ=ð 	 ¤ð 	Ø�1ØÔ�zœ~Ò-Ð-ØÔ)­Cð 0ð 0Ø59Ô5Fð0ñ 0ô 0ñ -ô -ñ ð ð ÔÝ”ÝÔ&Ý”Ý”Ý”ð(ð ð õ %ØqÐ_cÔ_oÐqÐqñô ð ð Ô)Ð)r%   zK`self_cuda_time_total` is deprecated. Use `self_device_time_total` instead.c                 ó   — | j         S r-   ©rü   r*   s    r$   r¢   z"FunctionEvent.self_cuda_time_totalË  s   € ð Ô*Ð*r%   c                 ó   — | j         S r-   rõ   r*   s    r$   rP   zFunctionEvent.keyÓ  s
   € àŒyÐr%   c                 ó2  — | j         }| j        }| j        }d                     g d‘| j        › ‘d‘| j        › ‘d‘| j        › ‘d‘| j        › ‘d‘| j        › ‘d‘| j	        › ‘d‘| j
        j        › ‘d	‘| j
        j        › ‘d
‘t          d„ | j        D ¦   «         ¦  «        › ‘d‘|› ‘d‘|› ‘d‘| j        › ‘d‘| j        › ‘d‘t          | j        ¦  «        › ‘d‘| j        › ‘d‘|› ‘d‘|› ‘d‘| j        › ‘d‘| j        › ‘d‘| j        › ‘d‘| j        › ‘d‘¦  «        S )Nr¬   z<FunctionEvent id=z name=z overload_name=z device_type=z	 node_id=ú
 cpu_time=z
 start_us=z end_us=z cpu_children=c                 ó   — g | ]	}|j         ‘Œ
S r3   )rQ  rw  s     r$   r8   z*FunctionEvent.__repr__.<locals>.<listcomp>ß  s   € Ð IÐ IÐ I¨e ¤Ð IÐ IÐ Ir%   r®   ú_time=z thread=ú input_shapes=ú cpu_memory_usage=ú_memory_usage=z
 is_async=z is_remote=z seq_nr=z is_legacy=ú>)r   r  rU  ÚjoinrQ  r=   rÃ   rJ   rR   r  rW   rX   rY   r±   r>   rN   rÄ   rT  rI   r–   rp   rÁ   )r    rœ   rù   rU  s       r$   Ú__repr__zFunctionEvent.__repr__×  sù  € Ø”oˆØÔ*ˆØ"Ô6Ððy÷ yò yð yð yð y ¤ð yð yð yð y°´	ð yð yð yð yÈ$ÔJ\ð yð yð yð yØÔ+ðyð yð yð yØ6:´lðyð yð yð yØNRÔN_ðyð yð yð yàœÔ-ðyð yð yð yà7;´Ô7Jðyð yð yð yõ  Ð IÐ I°tÔ7HÐ IÑ IÔ IÑJÔJðyð yð yð yð NYðyð yð yð yð alðyð yð yð yð ”Ið	yð yð yð yð (,¤{ð	yð yð yð yõ CFÀdÔFWÑBXÔBXð	yð yð yð yð
 !%Ô 5ðyð yð yð yð
 9Dðyð yð yð yð
 Tgðyð yð yð yð œðyð yð yð yð 37´.ðyð yð yð yð KOÔJZðyð yð yð yð hlÔguðyð yð yð yñ yô yð	
r%   )rÓ   rÔ   rÕ   rÖ   r
   rK   r   rp  r^   r`   r×   rx  r{  r	   r  rm  r  rú   rx   rû   r“  rü   r¢   rP   r¢  r3   r%   r$   r   r   ‘  s   € € € € € ðDð DðZ ØØØØØØØØØØØØ”NØØØØØØØØ Ø ØØØØØØØØØ $Ø!%ØØØØðUg6ð g6ð g6ð g6ðR<ð <ð <ð
(ð (ð (ð!ð !ð !ð" ð
ð 
ñ „Xð
ð ð
ð 
ñ „Xð
ð Ø€ZØFØðñ ô ð#ð #ñ	ô ñ „Xð
#ð Ø€ZØYØðñ ô ð-ð -ñ	ô ñ „Xð
-ð ðð ñ „Xðð ð
ð 
ñ „Xð
ð ð0ð 0ñ „Xð0ð2 Ø€ZØKØðñ ô ð&ð &ñ	ô ñ „Xð
&ð ð*ð *ñ „Xð*ð( Ø€ZØUØðñ ô ð+ð +ñ	ô ñ „Xð
+ð ðð ñ „Xðð
ð 
ð 
ð 
ð 
r%   r   c                   ó,   — e Zd ZdZdd„Zd„ Zd„ Zd„ ZdS )	r   a�
  Averaged profiling statistics over multiple FunctionEvent objects.

    FunctionEventAvg aggregates statistics from multiple FunctionEvent objects
    with the same key (typically same operation name). This is useful for getting
    average performance metrics across multiple invocations of the same operation.

    This class is typically created by calling :meth:`EventList.key_averages()` on
    a profiler's event list.

    Attributes:
        key (str): Grouping key for the events (typically operation name).
        count (int): Total number of events aggregated.
        node_id (int): Node identifier for distributed profiling (-1 if not applicable).
        is_async (bool): Whether the operations are asynchronous.
        is_remote (bool): Whether the operations occurred on a remote node.
        use_device (str): Device type being profiled ("cuda", "xpu", etc.).
        cpu_time_total (int): Accumulated total CPU time in microseconds.
        device_time_total (int): Accumulated total device time in microseconds.
        self_cpu_time_total (int): Accumulated self CPU time (excluding children) in microseconds.
        self_device_time_total (int): Accumulated self device time (excluding children) in microseconds.
        input_shapes (List[List[int]]): Input tensor shapes (requires record_shapes=true).
        overload_name (str): Operator overload name (requires _ExperimentalConfig(capture_overload_names=True) set).
        stack (List[str]): Python stack trace where the operation was called (requires with_stack=true).
        scope (int): at::RecordScope identifier (0=forward, 1=backward, etc.).
        cpu_memory_usage (int): Accumulated CPU memory usage in bytes.
        device_memory_usage (int): Accumulated device memory usage in bytes.
        self_cpu_memory_usage (int): Accumulated self CPU memory usage in bytes.
        self_device_memory_usage (int): Accumulated self device memory usage in bytes.
        cpu_children (List[FunctionEvent]): CPU child events.
        cpu_parent (FunctionEvent): CPU parent event.
        device_type (DeviceType): Type of device (CPU, CUDA, XPU, PrivateUse1, etc.).
        is_legacy (bool): Whether from legacy profiler.
        flops (int): Total floating point operations.
        is_user_annotation (bool): Whether this is a user-annotated region.

    Properties:
        cpu_time (float): Average CPU time per invocation.
        device_time (float): Average device time per invocation.

    See Also:
        - :class:`EventList.key_averages`: Method that creates FunctionEventAvg objects
        - :class:`FunctionEvent`: Individual profiling event
        - :class:`EventList`: Container for profiling events
    r¾   Nc                 ó\  — d | _         d| _        d| _        d| _        d| _        d | _        d| _        d| _        d| _        d| _	        d | _
        d | _        d | _        d | _        d| _        d| _        d| _        d| _        d | _        d | _        t(          j        | _        d| _        d| _        d S )Nr   F)rP   rÿ   rR   rI   r–   r   rú   rû   rx   rü   rÄ   rÃ   ro   rm   rT  rU  rx  r{  r>   r<   r
   rK   rJ   rÁ   rX  r*   s    r$   r   zFunctionEventAvg.__init__  sµ   € Ø#ˆŒØˆŒ
ØˆŒØ#ˆŒØ$ˆŒØ&*ˆŒØ#$ˆÔØ&'ˆÔØ()ˆÔ Ø+,ˆÔ#Ø48ˆÔØ)-ˆÔØ"&ˆŒ
Ø!%ˆŒ
Ø%&ˆÔØ()ˆÔ Ø*+ˆÔ"Ø-.ˆÔ%Ø8<ˆÔØ04ˆŒÝ'1¤~ˆÔØ$ˆŒØˆŒ
ˆ
ˆ
r%   c                 óò  — | j         €¨|j         | _         |j        | _        |j        | _        |j        | _        |j        | _        |j        | _        |j        | _        |j        | _        |j        | _        |j	        | _	        |j
        | _
        |j        | _        |j        | _        |j        | _        t          |t          t           f¦  «        st#          d¦  «        ‚|j         | j         k    rt#          d|j         › d| j         › �¦  «        ‚| xj        |j        z  c_        | xj        |j        z  c_        | xj        |j        z  c_        | xj        |j        z  c_        | xj        |j        z  c_        | xj        |j        z  c_        | xj        |j        z  c_        | xj        |j        z  c_        | xj        |j        z  c_        | j        €|j        | _        n|j        �| xj        |j        z  c_        | S )Nz8Expected other to be a FunctionEvent or FunctionEventAvgz Expected keys to match, but got z vs )rP   rR   rI   r–   r<   r>   rÃ   rÄ   ro   rm   rJ   rÁ   r   rÂ   rr  r   r   r_   rú   rû   rx   rü   rT  rU  rx  r{  rÿ   rX  ©r    Úothers     r$   r@   zFunctionEventAvg.add-  sû  € ØŒ8Ðð ”yˆDŒHØ œ=ˆDŒLØ!œNˆDŒMØ"œ_ˆDŒNØ#Ô.ˆDŒOØ %Ô 2ˆDÔà!&Ô!4ˆDÔØ %Ô 2ˆDÔØœˆDŒJØœˆDŒJØ$Ô0ˆDÔØ"œ_ˆDŒNØ#Ô.ˆDŒOØ&+Ô&>ˆDÔ#å˜%¥-Õ1AÐ!BÑCÔCð 	Ý ØJñô ð ð Œ9˜œÒ Ð Ý ØL°5´9ÐLÐLÀ$Ä(ÐLÐLñô ð ð 	ÐÔ˜uÔ3Ñ3ÐÔØÐÔ %Ô"9Ñ9ÐÔØÐ Ô  EÔ$=Ñ=Ð Ô ØÐ#Ô# uÔ'CÑCÐ#Ô#ØÐÔ Ô!7Ñ7ÐÔØÐ Ô  EÔ$=Ñ=Ð Ô ØÐ"Ô" eÔ&AÑAÐ"Ô"ØÐ%Ô%¨Ô)GÑGÐ%Ô%Øˆ
Œ
�e”kÑ!ˆ
Œ
ØŒ:ÐàœˆDŒJˆJØŒ[Ð$ØˆJŒJ˜%œ+Ñ%ˆJŒJØˆr%   c                 ó,   — |                       |¦  «        S r-   )r@   r¦  s     r$   Ú__iadd__zFunctionEventAvg.__iadd__Z  s   € Ø�xŠx˜‰ŒÐr%   c                 óà   — | j         sdn| j         }| j        }| j        }| j        }d| j        › d| j        › d| j        › d|› d|› d|› d|› dt          | j        ¦  «        › d	| j	        › d|› d
|› d�S )Nr‹   z<FunctionEventAvg key=z self_cpu_time=rš  z  self_rœ  r®   r�  rž  rŸ  r   )
r   r
  r  rU  rP   r	  r  r±   rÄ   rT  )r    rœ   Úself_device_timerù   Údevice_memorys        r$   r¢  zFunctionEventAvg.__repr__]  sø   € Ø$(¤OÐH�f�f¸¼ˆØÔ:ÐØÔ*ˆØÔ0ˆðd T¤Xð dð d¸dÔ>Zð dð dÐfjÔfwð dð dØ ðdð dØ(8ðdð dØ;Fðdð dØNYðdð dÝilÐmqÔm~ÑiÔiðdð dà $Ô 5ðdð dà8Cðdð dàS`ðdð dð dð	
r%   )r¾   N)rÓ   rÔ   rÕ   rÖ   r   r@   r©  r¢  r3   r%   r$   r   r   æ  sa   € € € € € ð+ð +ðZð ð ð ð2+ð +ð +ðZð ð ð	
ð 	
ð 	
ð 	
ð 	
r%   r   c                   ó   — e Zd Zd„ ZdS )r   c                 ó€   — t          |¦  «        dk    rt          j                             |¦  «        n|| |<   | |         S rl   )r;   ÚtorchÚ_CÚ	_demangle)r    rP   s     r$   Ú__missing__zStringTable.__missing__j  s:   € õ 03°3©x¬x¸!ª|¨|•E”H×&Ò& sÑ+Ô+Ð+ÀˆˆS‰	Ø�CŒyÐr%   N)rÓ   rÔ   rÕ   r²  r3   r%   r$   r   r   i  s#   € € € € € ðð ð ð ð r%   r   c                   ó   — e Zd ZdZd„ Zd„ ZdS )r   z=Acceleration structure for accessing mem_records in interval.c                 óÒ   — || _         g | _        g | _        t          |¦  «        dk    r>t	          d„ t          |¦  «        D ¦   «         ¦  «        }t          |Ž \  | _        | _        d S d S )Nr   c                 óL   — g | ]!\  }}|d                                ¦   «         |f‘Œ"S ©r   )Ústart_ns)r4   ÚiÚrs      r$   r8   z*MemRecordsAcc.__init__.<locals>.<listcomp>z  s-   € ÐRÐRÐR±4°1°a˜1˜Qœ4Ÿ=š=™?œ?¨AÐ.ÐRÐRÐRr%   )Ú_mem_recordsÚ_start_nsesÚ_indicesr;   r[   rA   Úzip)r    Úmem_recordsÚtmps      r$   r   zMemRecordsAcc.__init__u  so   € Ø'ˆÔØ&(ˆÔØ#%ˆŒÝˆ{ÑÔ˜aÒÐÝÐRÐR½9À[Ñ;QÔ;QÐRÑRÔRÑSÔSˆCÝ.1°3¨iÑ+ˆDÔ˜dœm˜m˜mð  Ðr%   c              #   óÌ   K  — t          j        | j        |¦  «        }t          j        | j        |¦  «        }t	          ||¦  «        D ]}| j        | j        |                  V — ŒdS )z:
        Return all records in the given interval
        N)ÚbisectÚbisect_leftr»  Úbisect_rightr:   rº  r¼  )r    r·  Úend_nsÚ	start_idxÚend_idxr¸  s         r$   Úin_intervalzMemRecordsAcc.in_interval}  ss   è è € õ Ô& tÔ'7¸ÑBÔBˆ	ÝÔ% dÔ&6¸Ñ?Ô?ˆÝ�y 'Ñ*Ô*ð 	6ð 	6ˆAØÔ# D¤M°!Ô$4Ô5Ð5Ð5Ð5Ð5ð	6ð 	6r%   N)rÓ   rÔ   rÕ   rÖ   r   rÇ  r3   r%   r$   r   r   r  s8   € € € € € ØGÐGð8ð 8ð 8ð6ð 6ð 6ð 6ð 6r%   r   c                 óB   ‡ — g d¢}t          ˆ fd„|D ¦   «         ¦  «        S )N))úautograd/__init__Ú_make_grads)rÉ  Úbackward)ztorch/tensorrË  )ú_internal/common_utilsÚprof_callable)rÌ  Úprof_func_call)rÌ  Úprof_meth_callc              3   óB   •K  — | ]}|d          ‰v o	|d         ‰v  V — ŒdS )r   r1   Nr3   )r4   r�   r»   s     €r$   rz   z&_filter_stack_entry.<locals>.<genexpr>�  s;   øè è € ÐOÐO¸�A�a”D˜E�MÐ3 a¨¤d¨e mÐ4ÐOÐOÐOÐOÐOÐOr%   )Úall)r»   Úfiltered_entriess   ` r$   Ú_filter_stack_entryrÓ  ‡  s;   ø€ ðð ð Ðõ ÐOÐOÐOÐOÐ>NÐOÑOÔOÑOÔOÐOr%   z[memory]z[OutOfMemory]c                 ó2   — t           t          ddddddg}| |v S )Nz profiler::_record_function_enterz$profiler::_record_function_enter_newzprofiler::_record_function_exitzaten::is_leafzaten::output_nrzaten::_version)ÚMEMORY_EVENT_NAMEÚOUT_OF_MEMORY_EVENT_NAME)r=   Úfiltered_out_namess     r$   Ú_filter_namerØ  —  s2   € õ 	Ý Ø*Ø.Ø)ØØØð	Ðð Ð%Ð%Ð%r%   Fc                 ód   — t          ¦   «         }||          } |r|                      d¦  «        rd} | S )NzProfilerStep#zProfilerStep*)r   Ú
startswith)r=   Úwith_wildcardÚstring_tables      r$   Ú_rewrite_namerÝ  ª  s;   € Ý‘=”=€LØ˜Ô€DØð #Ø�?Š?˜?Ñ+Ô+ð 	#Ø"ˆDØ€Kr%   r|   r}   r~   r   c                 óÀ  ‡‡0‡1‡2‡3‡4— t          | ¦  «        dk    rdS t          d„ | D ¦   «         ¦  «        }t          d„ | D ¦   «         ¦  «        }| d         j        }|s|rt          d¦  «        ‚t          d„ | D ¦   «         ¦  «        }t          d„ | D ¦   «         ¦  «        }‰�&t	          t          | ˆfd	„d
¬¦  «        |||¬¦  «        } t          d„ | D ¦   «         ¦  «        dz   }|�t          ||¦  «        }t          d„ | D ¦   «         ¦  «        dz   }|�t          ||¦  «        }d}|}d}d„ | D ¦   «         }t          |¦  «        dk    }|r.t          d„ |D ¦   «         ¦  «        dz   }|�t          ||¦  «        }dg}|r|                     d¦  «         |g d¢z  }|�| 	                    ¦   «         nd}|r&| 
                    d|› �d|› d�|› d�|› d�g¦  «         |r9| 
                    ddg¦  «         |r |r| 
                    |› d�d|› d�g¦  «         |                     d¦  «         t          d„ | D ¦   «         ¦  «        }|r|                     d ¦  «         d!Š0dgŠ4dgŠ1‰0 gŠ2d8ˆ0ˆ1ˆ2ˆ4fd#„	}d$„ } ||¦  «         |r ||¦  «         |d%|z   d…         D ]} ||¦  «         Œ|r |                     d&¦  «          ||¦  «         |r"|                     d'¦  «          ||d(¬)¦  «         |r`d*„ | D ¦   «         }t          |¦  «        dk    r? |t          |¦  «        ¦  «        \  }}|                     d+|› �¦  «          ||¦  «         nd,}‰4d         } ‰1d         }!‰2d         }"d}g Š3ˆ3fd-„}#d}$d}%| D ]y}&|$|&j        z  }$|&j        t          j        k    r|&j        r|%|&j        z  }%Œ3|&j        t          j        t          j        t          j        t          j        fv r|&j        s
|%|&j        z  }%Œz|� |#d.|"z  ¦  «          |#|¦  «         |	r |#d.|"z  ¦  «          |#d/¦  «          |#|!¦  «          |# | j        |Ž ¦  «          |#|!¦  «         d0„ }'d1„ }(d})| D �]€}&|)|k    r �nv|	r|&j        �Œ|)d%z  })|&j        }*|�&t          |*¦  «        |d2z
  k    r|*d|d2z
  …         d3z   }*t3          |&j        |$¦  «        |&_        |&j        st3          |&j        |$¦  «        nd|&_        |*g}+|r5|&j        },|�&t          |,¦  «        |d2z
  k    r|,d|d2z
  …         d3z   },|+|,gz  }+|+|&j         |(|&j        |&j        |
¦  «        |&j         |(|&j        |&j         |
¦  «         |(|&j!        |&j"        |
¦  «        gz  }+|rwt3          |&j        |%¦  «        |&_#        |+ 
                     |(|&j        |&j$        |
¦  «        |&j#         |(|&j%        |&j&        |
¦  «         |(|&j'        |&j(        |
¦  «        g¦  «         |rz|+ 
                    tS          |&j*        ¦  «        tS          |&j+        ¦  «        g¦  «         |r=|r;|+ 
                    tS          |&j,        ¦  «        tS          |&j-        ¦  «        g¦  «         |+                     |&j.        ¦  «         |r|+                     |&j/        ¦  «         |r/|+                     ta          |&j1        ¦  «        d|…         ¦  «         |r@|&j2        dk    r|+                     d4¦  «         n|+                     |&j2        |z  d5›¦  «         |rFd}-t          |&j3        ¦  «        dk    r |'|&j3        d         |¦  «        }-|+                     |-¦  «          |# | j        |+Ž ¦  «         |rqdgt          |¦  «        d%z
  z  }.|&j3        d%d…         D ]#}/ |# | j        |. |'|/|¦  «        gz   Ž ¦  «         Œ$|.                     d¦  «          |# | j        |.Ž ¦  «         �Œ‚ |#|!¦  «          |#d6 |(|$ti          |$¦  «        |
¦  «        › �¦  «         |r? |#d|�| 	                    ¦   «         nd› d7 |(|%ti          |%¦  «        |
¦  «        › �¦  «         d 5                    ‰3¦  «        S )9zUPrint a summary of events (which can be a list of FunctionEvent or FunctionEventAvg).r   r¬   c              3   ó,   K  — | ]}|j         d k    V — ŒdS ©r   Nr—  ry   s     r$   rz   z_build_table.<locals>.<genexpr>Ä  s*   è è € ÐOÐO¸u˜%Ô6¸Ò:ÐOÐOÐOÐOÐOÐOr%   c              3   ó,   K  — | ]}|j         d k    V — ŒdS rà  r~  ry   s     r$   rz   z_build_table.<locals>.<genexpr>Å  s*   è è € ÐPÐPÀ˜Ô7¸!Ò;ÐPÐPÐPÐPÐPÐPr%   z9use_device is None, but there is device performance data.c              3   óX   K  — | ]%}|j         d uot          |j         ¦  «        dk    V — Œ&d S rÀ   )rÄ   r;   ry   s     r$   rz   z_build_table.<locals>.<genexpr>Í  sS   è è € ð ð àð 
Ô	 4Ð	'Ð	G­C°Ô0BÑ,CÔ,CÀaÒ,Gðð ð ð ð ð r%   c              3   óX   K  — | ]%}|j         d uot          |j         ¦  «        dk    V — Œ&d S rÀ   )rÃ   r;   ry   s     r$   rz   z_build_table.<locals>.<genexpr>Ò  sS   è è € ð ð àð 
Ô	 DÐ	(Ð	I­S°Ô1DÑ-EÔ-EÈÒ-Iðð ð ð ð ð r%   Nc                 óœ   •— t          | ‰                     dd¦  «                             dd¦  «                             dd¦  «        ¦  «        S )Nr‹   r©   rª   r«   )r³   r´   )rM   r�   s    €r$   rU   z_build_table.<locals>.<lambda>Û  sC   ø€ ¥ØØ—O’O F¨HÑ5Ô5ß’W˜U HÑ-Ô-ß’W˜]¨HÑ5Ô5ñ	!ô !€ r%   T)rP   ÚreverserÊ   c              3   ó>   K  — | ]}t          |j        ¦  «        V — Œd S r-   )r;   rP   rL   s     r$   rz   z_build_table.<locals>.<genexpr>è  s*   è è € Ð;Ð;¨S�C ¤™LœLÐ;Ð;Ð;Ð;Ð;Ð;r%   é   c              3   óX   K  — | ]%}t          t          |j        ¦  «        ¦  «        V — Œ&d S r-   )r;   r±   rÄ   rL   s     r$   rz   z_build_table.<locals>.<genexpr>ì  s5   è è € ÐKÐK¸S�c¥# cÔ&6Ñ"7Ô"7Ñ8Ô8ÐKÐKÐKÐKÐKÐKr%   é   c                 óZ   — g | ](}|j         ®	t          |j         ¦  «        dk    ¯!|j         ‘Œ)S rÀ   )ro   r;   rL   s     r$   r8   z _build_table.<locals>.<listcomp>ô  s;   € ð ð ð Ø s¤yÐ'<ÅÀSÄYÁÄÐRSÒASÐASˆŒ	ÐASÐASÐASr%   c              3   óH   K  — | ]}t          d „ |D ¦   «         ¦  «        V — ŒdS )c              3   ó4   K  — | ]}t          |¦  «        V — Œd S r-   ©r;   )r4   r»   s     r$   rz   z)_build_table.<locals>.<genexpr>.<genexpr>ú  s(   è è € Ð2Ð2 5•C˜‘J”JÐ2Ð2Ð2Ð2Ð2Ð2r%   N)Úmax)r4   ro   s     r$   rz   z_build_table.<locals>.<genexpr>ú  s9   è è € ÐGÐG°u•Ð2Ð2¨EÐ2Ñ2Ô2Ñ2Ô2ÐGÐGÐGÐGÐGÐGr%   ÚNamezOverload Name)z
Self CPU %zSelf CPUzCPU total %z	CPU totalzCPU time avgÚNonezSelf z %z totalz	 time avgzCPU MemzSelf CPU Memz Memz
# of Callsc              3   ó,   K  — | ]}|j         d k    V — ŒdS )rZ   N)rR   rL   s     r$   rz   z_build_table.<locals>.<genexpr>$  s)   è è € Ð=Ð=¨s˜œ¨Ò*Ð=Ð=Ð=Ð=Ð=Ð=r%   zNode IDrŽ   r   c                 ó¸   •— ‰dxx         d|z   t          | ¦  «        z   dz   d‰z  z   z  cc<   ‰dxx         d| z  d‰z  z   z  cc<   ‰dxx         | ‰z   z  cc<   d S )Nr   z{: Ú}r®   ú-)r±   )ÚpaddingÚtext_dirÚSPACING_SIZEÚheader_sep_lstÚline_length_lstÚrow_format_lsts     €€€€r$   Ú
add_columnz _build_table.<locals>.add_column-  s”   ø€ Ø�qÐÐÔØ�HÑ�s 7™|œ|Ñ+¨cÑ1°S¸<Ñ5GÑHñ	
ÐÐÑð 	�qÐÐÔ˜S 7™]¨c°LÑ.@ÑAÑAÐÐÑØ˜ÐÐÔ˜g¨Ñ4Ñ4ÐÐÑÐÐr%   c                 óÄ  — g d¢}| dk    rt          d| › �¦  «        ‚t          dt          t          j        | ¦  «        dz  t          t          |¦  «        dz
  ¦  «        ¦  «        ¦  «        }|dk    r|t          |¦  «        k     s"t          dt          |¦  «        › d|› �¦  «        ‚t          dt          j        |¦  «        d	z  ¦  «        |t          |¦  «                 fS )
N)ÚFLOPsÚKFLOPsÚMFLOPsÚGFLOPsÚTFLOPsÚPFLOPsr   z'Expected flops to be positive, but got é   r1   z&Expected log_flops to be in range [0, z), but got é
   g      À)
r_   rî  ÚminÚmathÚlog10r5  r;   ÚpowÚfloorrµ   )rX  Úflop_headersÚ	log_flopss      r$   Úauto_scale_flopsz&_build_table.<locals>.auto_scale_flops4  sí   € ð
ð 
ð 
ˆð �AŠ:ˆ:Ý Ð!RÈ5Ð!RÐ!RÑSÔSÐSå˜�3�tœz¨%Ñ0Ô0°1Ñ4µe½CÀÑ<MÔ<MÐPQÑ<QÑ6RÔ6RÑSÔSÑTÔTˆ	Ø˜Q’� 9­s°<Ñ/@Ô/@Ò#@Ð#@Ý Øb½¸\Ñ9JÔ9JÐbÐbÐW`ÐbÐbñô ð õ �B�œ IÑ.Ô.°Ñ5Ñ7Ô7¸ÅcÈ)ÁnÄnÔ9UÐVÐVr%   r1   zInput ShapeszSource Locationú<)rö  c                 ó2   — g | ]}|j         d k    ¯|j         ‘ŒS r¶  )rX  rL   s     r$   r8   z _build_table.<locals>.<listcomp>W  s!   € ÐBÐBÐB 3°C´IÀ²M°M�S”Y°M°M°Mr%   zTotal Fc                 ó\   •— ‰                      | ¦  «         ‰                      d¦  «         d S )Nr¯   )ra   )rÞ   Úresults    €r$   ra   z_build_table.<locals>.appendf  s-   ø€ Ø�Š�aÑÔÐØ�Š�dÑÔÐÐÐr%   ú=z1This report only display top-level ops statisticsc                 ó¤   — t          | ¦  «        |k    r<t          | ¦  «        |z
  }| |d …         } t          | ¦  «        dk    rd| dd …         z   } | S )Nr  ú...rí  )r›   Úsrc_column_widthÚoffsets      r$   Ú	trim_pathz_build_table.<locals>.trim_pathŠ  sX   € Ýˆt‰9Œ9Ð'Ò'Ð'Ý˜‘Y”YÐ!1Ñ1ˆFØ˜˜˜”=ˆDÝ�4‰yŒy˜1Š}ˆ}Ø˜t A B BœxÑ'�Øˆr%   c                 ób   — d}d}|dk    r	| |z  d›d�S |dk    r	| |z  d›d�S |dk    r| d›d�S |S )NrÛ   rÜ   rÞ   rÝ   rß   rà   r3   )rá   Údefault_strrˆ   râ   rã   s        r$   Úoverride_time_unitz(_build_table.<locals>.override_time_unit’  ss   € Ø&ˆØˆØ˜ÒÐØ Ñ,Ð3Ð3Ð3Ð3Ð3Ø˜$ÒÐØ Ñ(Ð0Ð0Ð0Ð0Ð0Ø˜$ÒÐØÐ%Ð%Ð%Ð%Ð%àÐr%   r  r  z--z8.3fzSelf CPU time total: z time total: )r   )6r;   Úanyr   ÚRuntimeErrorr   r[   rî  r  ra   ÚupperrC   rx   rJ   r
   rK   rÁ   rü   r�  rŽ  r�  r‘  rÂ   r”   r<   rP   rê   r[  rI   rú   r\  rÃ   r	  r  rø   r  r]  r
  rû   r  rù   r  rò   rT  rx  rU  r{  rÿ   rR   r±   rÄ   rX  ro   rä   r¡  )5rc   r�   r†   r‚   rƒ   r„   r…   r   r   r‡   rˆ   Úhas_device_timeÚhas_device_memr   Úhas_input_shapesÚhas_overload_namesÚname_column_widthÚshapes_column_widthÚDEFAULT_COLUMN_WIDTHÚflops_column_widthr  ÚstacksÚ	has_stackÚheadersrœ   Úappend_node_idrû  r  rŸ   Ú	raw_flopsÚflops_scaleÚflops_headerÚ
row_formatÚ
header_sepÚline_lengthra   Úsum_self_cpu_time_totalÚsum_self_device_time_totalrM   r  r  Úevent_limitr=   Ú
row_valuesrÃ   Ú	src_fieldÚempty_headersr»   r÷  rø  rù  r  rú  s5    `                                              @@@@@r$   r‰   r‰   ³  s(  øøøøøø€ õ ˆ6�{„{�aÒÐØˆråÐOÐOÈÐOÑOÔOÑOÔO€OÝÐPÐPÈÐPÑPÔPÑPÔP€NØ˜”Ô%€Jð ð X˜/ð XÝÐVÑWÔWÐWåð ð àðñ ô ñ ô Ðõ
 ð ð àðñ ô ñ ô Ðð
 ÐÝÝØðð ð ð ð ð	ñ 	ô 	ð "Ø)Ø!ð
ñ 
ô 
ˆõ  Ð;Ð;°FÐ;Ñ;Ô;Ñ;Ô;¸aÑ?ÐØÐ(ÝÐ 1Ð3HÑIÔIÐåÐKÐKÀFÐKÑKÔKÑKÔKÈaÑOÐØÐ*Ý!Ð"5Ð7NÑOÔOÐàÐØ-ÐàÐðð Ø#ðñ ô €Fõ �F‘”˜a’€IØð KåÐGÐGÀÐGÑGÔGÑGÔGÈ!ÑKð 	ð  Ð+Ý"Ð#3Ð5IÑJÔJÐàˆh€GØð (Ø�Š�Ñ'Ô'Ð'Øð ð ð ñ €Gð )3Ð(>�*×"Ò"Ñ$Ô$Ð$ÀF€KØð 
Ø�Šà%˜Ð%Ð%Ø'˜Ð'Ð'Ð'ØÐ&Ð&Ð&ØÐ)Ð)Ð)ð	ñ	
ô 	
ð 	
ð ð Ø�ŠàØðñ	
ô 	
ð 	
ð ð 	˜.ð 	Ø�NŠNà"Ð(Ð(Ð(Ø-˜KÐ-Ð-Ð-ðñô ð ð ‡N‚N�<Ñ Ô Ð åÐ=Ð=°fÐ=Ñ=Ô=Ñ=Ô=€NØð "Ø�Š�yÑ!Ô!Ð!à€LØ�T€NØ�T€NØ$�}�o€Oð5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ðWð Wð Wð& €JÐ Ñ!Ô!Ð!Øð &Øˆ
Ð$Ñ%Ô%Ð%Ø�QÐ+Ñ+Ð-Ð-Ô.ð )ð )ˆØˆ
Ð'Ñ(Ô(Ð(Ð(àð (Ø�Š�~Ñ&Ô&Ð&Øˆ
Ð&Ñ'Ô'Ð'àð 3Ø�ŠÐ(Ñ)Ô)Ð)Øˆ
Ð#¨cÐ2Ñ2Ô2Ð2àð àBÐB¨&ÐBÑBÔBˆ	Ýˆy‰>Œ>˜QÒÐØ*:Ð*:½3¸y¹>¼>Ñ*JÔ*JÑ'ˆ[˜,Ø�NŠNÐ2 LÐ2Ð2Ñ3Ô3Ð3ØˆJÐ)Ñ*Ô*Ð*Ð*àˆJà Ô"€JØ Ô"€JØ! !Ô$€KØ€Jà€Fðð ð ð ð ð  ÐØ!"ÐØð Eð EˆØ 3Ô#:Ñ:ÐØŒ?�jœnÒ,Ð,°´Ð,à&¨#Ô*DÑDÐ&Ð&àŒOå”ÝÔ&Ý”Ý”ð	ðð ð Ô*ðð '¨#Ô*DÑDÐ&øð ÐØˆˆs�[Ñ Ñ!Ô!Ð!Øˆˆv‰ŒˆØð DØˆˆs�[Ñ Ñ!Ô!Ð!ØˆÐBÑCÔCÐCØ
€Fˆ:ÑÔÐØ
€FÐˆ:Ô˜gÐ&Ñ'Ô'Ð'à
€Fˆ:ÑÔÐðð ð ð
ð 
ð 
ð €KØð p6ñ p6ˆØ˜)Ò#Ð#Ø‰EØ ð 	 S¤^Ð%?Øà˜1ÑˆKØŒwˆØ Ð,µ°T±´Ð>SÐVWÑ>WÒ1WÐ1WØÐ5Ð0°1Ñ4Ð5Ô6¸Ñ>ˆDå1ØÔ#Ð%<ñ 
ô  
ˆÔð
 ”<ðÕ˜sÔ1Ð3JÑKÔKÐKàð 	Ôð �Vˆ
Øð 	*ØÔ-ˆMà%Ð1Ý˜Ñ&Ô&Ð*?À!Ñ*CÒCÐCà -Ð.KÐ1FÈÑ1JÐ.KÔ LÈuÑ T�Ø˜=˜/Ñ)ˆJØàÔ ØÐØÔ'¨Ô)DÀiñô ð Ô!ØÐØÔ" CÔ$:¸Iñô ð ÐØ”˜cÔ.°	ñô ð
ñ 	
ˆ
ð ð 	Ý'9ØÔ*Ð,Fñ(ô (ˆCÔ$ð ×Òà&Ð&ØÔ2ØÔ6Ø!ñô ð Ô,Ø&Ð&ØÔ-¨sÔ/HÈ)ñô ð 'Ð&Øœ¨Ô)<¸iñô ðñô ð ð" ð 	Ø×Òõ # 3Ô#7Ñ8Ô8å" 3Ô#<Ñ=Ô=ð	ñô ð ð ð ˜nð Ø×!Ò!õ ' sÔ'>Ñ?Ô?å& sÔ'CÑDÔDð	ñô ð ð 	×ÒØŒIñ	
ô 	
ð 	
ð ð 	+Ø×Ò˜cœkÑ*Ô*Ð*Øð 	KØ×Ò�c #Ô"2Ñ3Ô3Ð4HÐ5HÐ4HÔIÑJÔJÐJØð 	EØŒy˜AŠ~ˆ~Ø×!Ò! $Ñ'Ô'Ð'Ð'à×!Ò! S¤Y°Ñ%<Ð"CÐ"CÑDÔDÐDØð 	)ØˆIÝ�3”9‰~Œ~ Ò!Ð!Ø%˜I c¤i°¤lÐ4DÑEÔE�	Ø×Ò˜iÑ(Ô(Ð(ØˆÐ ˆzÔ  *Ð-Ñ.Ô.Ð.àð 		6Ø˜D¥C¨¡L¤L°1Ñ$4Ñ5ˆMØœ 1 2 2œð ð �Ø�Ø%�JÔ%Ø'¨9¨9°UÐ<LÑ+MÔ+MÐ*NÑNðñô ð ð ð
 × Ò  Ñ$Ô$Ð$ØˆFÐ$�:Ô$ mÐ4Ñ5Ô5Ð5ùà
€Fˆ:ÑÔÐØ
€FØÐ 2Ð 2Ð3JÍLÐYpÑLqÔLqÐs|Ñ }Ô }ÐÐñô ð ð ð 
ØˆðA¨*Ð*@�J×$Ò$Ñ&Ô&Ð&Àfð Að AØ-Ð-Ð.HÍ,ÐWqÑJrÔJrÐt}Ñ~Ô~ðAð Añ	
ô 	
ð 	
ð �7Š7�6‰?Œ?Ðr%   c           
      óL  — g }| D ]½}|                      dd¦  «        }|d                               dd¦  «        }|d                               dd¦  «        }d„ |                     d¦  «        D ¦   «         }d„ |D ¦   «         }|r|d	         nd}|                     |d
d…         |||                      dd¦  «        dœ¦  «         Œ¾|                     d„ ¬¦  «         g }|D ]2}|                     d|d         › d|d         › d|d         › �¦  «         Œ3d                     |¦  «        S )zk
    Extract and format all events with stack traces in a canonical way
    for deterministic testing.
    r=   r¬   r!   Ú	node_nameÚstack_tracec                 ó^   — g | ]*}|                      ¦   «         ¯|                      ¦   «         ‘Œ+S r3   r;  ©r4   rÞ   s     r$   r8   z1_canonicalize_profiler_events.<locals>.<listcomp>0  s-   € ÐIÐIÐI˜q¸q¿wºw¹y¼yÐI�—’‘”ÐIÐIÐIr%   r¯   c                 óZ   — g | ](}t          |¦  «                             h d £¦  «        °&|‘Œ)S )>   r®   ú^ú~)r9   Úissubsetr9  s     r$   r8   z1_canonicalize_profiler_events.<locals>.<listcomp>1  s3   € ÐQÐQÐQ˜aµ°A±´·²ÀÀÀÑ0PÔ0PÐQ˜ÐQÐQÐQr%   rZ   Né   Útsr   )Ú
event_namer6  r7  Ú
start_timec                 ó   — | d         S )NrA  r3   )Úxs    r$   rU   z/_canonicalize_profiler_events.<locals>.<lambda>>  s
   € ¨!¨L¬/€ r%   rO   zevent=r@  z node=z stack_trace=)rr   Úsplitra   Úsortr¡  )	rc   Úevents_with_tracesrT   r@  r6  r7  ÚlinesÚsource_linesrM   s	            r$   Ú_canonicalize_profiler_eventsrI    s  € ð
 Ðàð 
ð 
ˆà—Y’Y˜v rÑ*Ô*ˆ
Ø˜&”M×%Ò% k°2Ñ6Ô6ˆ	Ø˜F”m×'Ò'¨°rÑ:Ô:ˆð JÐI K×$5Ò$5°dÑ$;Ô$;ÐIÑIÔIˆØQÐQ 5ÐQÑQÔQˆØ*6Ð>�l 2Ô&Ð&¸Bˆà×!Ò!à(¨¨"¨œoØ&Ø*Ø#Ÿiši¨¨aÑ0Ô0ð	ð ñ	
ô 	
ð 	
ð 	
ð ×ÒÐ 9Ð 9ÐÑ:Ô:Ð:ð €EØ!ð 
ð 
ˆØ�ŠØa�S˜Ô&ÐaÐa¨c°+Ô.>ÐaÐaÈSÐQ^ÔM_ÐaÐañ	
ô 	
ð 	
ð 	
ð �9Š9�UÑÔÐr%   )F)
NNr|   r}   r~   r   FFFN)5rÁ  r\   Újsonr  Úcollectionsr   r   Úcollections.abcr   Úoperatorr   Útypingr   r   Útyping_extensionsr	   r¯  Útorch.autogradr
   Ú__all__r4  r   rä   rê   rò   rö   r   r   r   r   r±   r>  r7  rB  rµ   Úloadsr5  rE  r6  rÅ   r3  rN  r   r   r   r   rÓ  rÕ  rÖ  rØ  rÝ  r‰   rI  r3   r%   r$   ú<module>rS     s:  ðà €€€€Ø Ð Ð Ð Ø €€€Ø €€€Ø /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ø $Ð $Ð $Ð $Ð $Ð $Ø Ð Ð Ð Ð Ð Ø "Ð "Ð "Ð "Ð "Ð "Ð "Ð "Ø (Ð (Ð (Ð (Ð (Ð (à €€€Ø %Ð %Ð %Ð %Ð %Ð %ð
ð 
ð 
€ðwð wð wð wð w�ñ wô wð wðtð ð ð5ð 5ð 5ð"ð "ð "ðDð Dð Dð ð  ð  ð  ð  ñ  ô  ð  ð<	%ð 	%ð 	%ð 	%ð 	%ñ 	%ô 	%ð 	%ð 
ˆ�HÐ<Ð<Ð<Ñ	=Ô	=€ð&ð &ð &ð &ð &�Jñ &ô &ð &ðRˆsð �sð ð ð ð ð�ð ˜ð ð ð ð ð
$EØÐ3°SÐ9ð$Eà�o sÐ+ð$Eð ˆV�T”ZÐ ð$Eð ˆg�t”zÐ"ð	$Eð
 �˜SÐ!ð$Eð �o uÐ-ð$Eð �^ UÐ+ð$Eð  Ð"5°uÐ!=ð$Eð �+˜tœzÐ*ð$Eð ˆx˜ˆoð$Eð �˜SÐ!ð$Eð �o sÐ+ð$Eð ˆx˜ˆoð$Eð �	˜3Ðð$Eð �	˜3Ðð$Eð  �^ SÐ)ð!$Eð" ˆg�sˆ^ð#$Eð $Eð$ Ð 0°%Ð8ð%$Eð& Ð)¨7Ð3ð'$Eð( ˆg�wÐð)$Eð* �o sÐ+ð+$Eð, Ð'¨Ð-ð-$Eð. �o wÐ/ð/$Eð0 Ð'¨Ð1ð1$Eð2 Ð-¨sÐ3ð3$Eð4 Ð/°Ð5ð5$Eð6 �< Ð%ð7$Eð8 Ð/°Ð9ð9$Eð:  Ð"6¸Ð!@ð;$Eð< ˜M¨7Ð3ð=$Eð> ˆV�SˆMð?$Eð@ �˜SÐ!ðA$EðB �˜SÐ!ðC$EðD 
ˆE�3ˆ<ðE$Eð $EðF ˜J¨Ð1ðG$Eð $EÐ �d˜3  c¨8°S°E¸3°JÔ+?Ð&?Ô @Ð@ÔAð $ð $ñ $ðN
>ð 
>ð 
>ðR
ð R
ð R
ð R
ð R
Ð'ñ R
ô R
ð R
ðj
@
ð @
ð @
ð @
ð @
Ð*ñ @
ô @
ð @
ðFð ð ð ð �+ñ ô ð ð6ð 6ð 6ð 6ð 6ñ 6ô 6ð 6ð*	Pð 	Pð 	Pð Ð Ø*Ð ð&ð &ð &ð&ð ð ð ð ØØØØØØØØØðgð gð gð gðV)ð )ð )ð )ð )r%   