Ë
    L²j¸"  ã                  ó  — U d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	m
Z
mZ ddlmZ e
rddlmZ ddlmZ  ej"                  e«      Z G d	„ d
«      Zeeeeee	f   ee   dz  edz  gdf   Zded<    G d„ d«      Z G d„ d«      Zy)a[  Metrics collection and management system for Dynamo.

This module provides context managers for gathering and reporting metrics during
compilation and runtime.

It includes two main components:
- MetricsContext: A context manager for collecting metrics during compilation, supporting
  nested contexts and various metric types (counters, sets, key-value pairs)
- RuntimeMetricsContext: A specialized context for runtime metrics collection that doesn't
  require explicit context management

The metrics system enables comprehensive monitoring and analysis of both compilation and
execution performance.
é    )ÚannotationsN)ÚCallable)ÚAnyÚTYPE_CHECKINGÚ	TypeAlias)ÚSelf)ÚIterator)ÚCapturedTracebackc                  ó2   — e Zd ZdZddd„Zd	d„Zd
d„Zdd„Zy)ÚTopNz_
    Helper to record a list of metrics, keeping only the top N "most expensive" elements.
    c                ó    — || _         g | _        y ©N)Úat_mostÚheap)Úselfr   s     ú\/var/www/html/ia-enhanced/venv/lib/python3.12/site-packages/torch/_dynamo/metrics_context.pyÚ__init__zTopN.__init__(   s   € ØˆŒØ+-ˆ�	ó    c                ó²   — t        | j                  «      | j                  k  rt        j                  nt        j
                  } || j                  ||f«       y r   )Úlenr   r   ÚheapqÚheappushÚheappushpop)r   ÚkeyÚvalÚfns       r   ÚaddzTopN.add,   s8   € ä" 4§9¡9›~°·±Ò<ŒU�^Š^Ä%×BSÑBSˆÙ
ˆ4�9‰9�s˜C�jÕ!r   c                ó,   — t        | j                  «      S r   )r   r   ©r   s    r   Ú__len__zTopN.__len__1   s   € Ü�4—9‘9‹~Ðr   c                ó>   — d„ t        | j                  d¬«      D «       S )Nc              3  ó*   K  — | ]  \  }}||f–— Œ y ­wr   © )Ú.0r   r   s      r   ú	<genexpr>z TopN.__iter__.<locals>.<genexpr>5   s   è ø€ ÒK™x˜s C��c”
ÑKùs   ‚T)Úreverse)Úsortedr   r   s    r   Ú__iter__zTopN.__iter__4   s   € ÙK¬6°$·)±)ÀTÔ+JÔKÐKr   N)é   )r   ÚintÚreturnÚNone)r   r   r   r*   r+   r,   )r+   r*   )r+   zIterator[tuple[Any, int]])Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r    r(   r#   r   r   r   r   #   s   „ ñô.ó"ó
ôLr   r   r   Ú
OnExitTypec                  ó€   — e Zd Zdd„Zdd„Z	 	 	 	 	 	 	 	 dd„Zdd„Zdd„Zdd„Zddd„Z	dd„Z
ddd	„Zdd
„Zdd„Zdd„Zy)ÚMetricsContextc                óJ   — || _         i | _        d| _        d| _        g | _        y)aQ  
        Use this class as a contextmanager to create a context under which to accumulate
        a set of metrics, e.g., metrics gathered during a compilation. On exit of the
        contextmanager, call the provided 'on_exit' function and pass a dictionary of
        all metrics set during the lifetime of the contextmanager.
        r   N)Ú_on_exitÚ_metricsÚ_start_time_nsÚ_levelÚ_edits©r   Úon_exits     r   r   zMetricsContext.__init__?   s(   € ð  ˆŒØ(*ˆŒØ#$ˆÔØˆŒØ@Bˆ�r   c                óŽ   — | j                   dk(  r i | _        t        j                  «       | _        | xj                   dz  c_         | S )z/
        Initialize metrics recording.
        r   é   )r8   r6   ÚtimeÚtime_nsr7   r   s    r   Ú	__enter__zMetricsContext.__enter__L   s8   € ð �;‰;˜!ÒàˆDŒMÜ"&§,¡,£.ˆDÔà�Š�qÑ�Øˆr   c                ó4  — | xj                   dz  c_         | j                   dk\  sJ ‚| j                   dk(  r?	 t        j                  «       }| j                  | j                  || j
                  ||«       yy# t        $ r t        j                  d«       Y yw xY w)z>
        At exit, call the provided on_exit function.
        r=   r   z0Unexpected exception logging compilation metricsN)	r8   r>   r?   r5   r7   r6   Ú	ExceptionÚlogÚ	exception)r   Úexc_typeÚ	exc_valueÚ
_tracebackÚend_time_nss        r   Ú__exit__zMetricsContext.__exit__X   s‡   € ð 	�Š�qÑ�Ø�{‰{˜aÒÐÐØ�;‰;˜!ÒðRÜ"Ÿl™l›n�Ø—‘Ø×'Ñ'¨°d·m±mÀXÈyõð øô ò RÜ—‘ÐPÖQðRús   ·=A6 Á6BÂBc                ó    — | j                   dkD  S )z4
        True if we've entered the context.
        r   )r8   r   s    r   Úin_progresszMetricsContext.in_progressl   s   € ð �{‰{˜Q‰Ðr   c                ó¨   — | j                   dk(  rt        d|› d�«      ‚|| j                  vrd| j                  |<   | j                  |xx   |z  cc<   y)ú7
        Increment a metric by a given amount.
        r   zCannot increment ú outside of a MetricsContextN©r8   ÚRuntimeErrorr6   ©r   ÚmetricÚvalues      r   Ú	incrementzMetricsContext.incrementr   sT   € ð �;‰;˜!ÒÜÐ!2°6°(Ð:VÐWÓXÐXØ˜Ÿ™Ñ&Ø$%ˆD�M‰M˜&Ñ!Ø�‰�fÓ Ñ&Ôr   c                óR   ‡— ddj                  ˆfd„| j                  D «       «      z   S )Nz

c              3  ór   •K  — | ].  \  }}|‰z  r$d dj                  |j                  «       «      z   –— Œ0 y­w)zPrevious Traceback:
Ú N)ÚjoinÚformat)r$   ÚeÚkÚpreds      €r   r%   z/MetricsContext._render_edits.<locals>.<genexpr>}   s8   øè ø€ ò $
á��1Ø�4Šxð $ b§g¡g¨a¯h©h«jÓ&9Õ9ñ$
ùs   ƒ47)rX   r9   )r   r\   s    `r   Ú_render_editszMetricsContext._render_edits|   s,   ø€ Ø˜Ÿ™ó $
àŸ™ô$
ó 
ñ 
ð 	
r   c                ó&  — | j                   dk(  rt        d|› d�«      ‚|| j                  v r$|s"t        | j                  |h«      d|› d�z   «      ‚| j                  j                  t        j                  d¬«      |hf«       || j                  |<   y)	z‚
        Set a metric to a given value. Raises if the metric has been assigned previously
        in the current context.
        r   úCannot set rN   z

RuntimeError: Metric 'z]' has already been set in the current context (see above for current and previous traceback).r=   ©ÚskipN)r8   rP   r6   r]   r9   Úappendr
   Úextract)r   rR   rS   Ú	overwrites       r   ÚsetzMetricsContext.setƒ   sž   € ð
 �;‰;˜!ÒÜ ¨V¨HÐ4PÐQÓRÐRØ�T—]‘]Ñ"©9ÜØ×"Ñ" F 8Ó,Ø.¨v¨hð 7Bð BñBóð ð
 	�‰×ÑÔ-×5Ñ5¸1Ô=À¸xÐHÔIØ %ˆ�‰�fÒr   c                óž   — | j                   dk(  rt        d|› d�«      ‚|| j                  vri | j                  |<   || j                  |   |<   y)a=  
        Treats a give metric as a dictionary and set the k and value within it.
        Note that the metric must be a dictionary or not present.

        We allow this to be called multiple times (i.e. for features, it's not uncommon
        for them to be used multiple times within a single compilation).
        r   r_   rN   NrO   )r   rR   r   rS   s       r   Úset_key_valuezMetricsContext.set_key_value“   sR   € ð �;‰;˜!ÒÜ ¨V¨HÐ4PÐQÓRÐRØ˜Ÿ™Ñ&Ø$&ˆD�M‰M˜&Ñ!Ø%*ˆ�‰�fÑ˜cÒ"r   c                óÌ  — | j                   dk(  rt        d«      ‚| j                  j                  «       |j                  «       z  }|r:|s8t        | j	                  t        |j                  «       «      «      d|› d�z   «      ‚| j                  j                  t        j                  d¬«      t        |j                  «       «      f«       | j                  j                  |«       y)zË
        Set multiple metrics directly. This method does NOT increment. Raises if any
        metric has been assigned previously in the current context and overwrite is
        not set to True.
        r   ú1Cannot update metrics outside of a MetricsContextz

RuntimeError: Metric(s) z_ have already been set in the current context.  (see above for current and previous traceback).r=   r`   N)r8   rP   r6   Úkeysr]   re   r9   rb   r
   rc   Úupdate)r   Úvaluesrd   Úexistings       r   rk   zMetricsContext.update¡   s¿   € ð �;‰;˜!ÒÜÐRÓSÐSØ—=‘=×%Ñ%Ó'¨&¯+©+«-Ñ7ˆÙ™IÜØ×"Ñ"¤3 v§{¡{£}Ó#5Ó6Ø0°°
ð ;Bð BñBóð ð
 	�‰×ÑÔ-×5Ñ5¸1Ô=¼sÀ6Ç;Á;Ã=Ó?QÐRÔSØ�‰×Ñ˜VÕ$r   c                óz   — | j                   dk(  rt        d«      ‚| j                   dk(  r| j                  |«       yy)zA
        Update, but only when at the outermost context.
        r   ri   r=   N)r8   rP   rk   )r   rl   s     r   Úupdate_outerzMetricsContext.update_outer³   s9   € ð �;‰;˜!ÒÜÐRÓSÐSØ�;‰;˜!ÒØ�K‰K˜Õð r   c                óÆ   — | j                   dk(  rt        d|› d�«      ‚|| j                  vrt        «       | j                  |<   | j                  |   j	                  |«       y)z8
        Records a metric as a set() of values.
        r   zCannot add rN   N)r8   rP   r6   re   r   rQ   s      r   Ú
add_to_setzMetricsContext.add_to_set¼   sX   € ð �;‰;˜!ÒÜ ¨V¨HÐ4PÐQÓRÐRØ˜Ÿ™Ñ&Ü$'£EˆD�M‰M˜&Ñ!Ø�‰�fÑ×!Ñ! %Õ(r   c                ó¬   — | j                   dk(  ry|| j                  vrt        «       | j                  |<   | j                  |   j                  ||«       y)z;
        Records a metric as a TopN set of values.
        r   N)r8   r6   r   r   )r   rR   r   r   s       r   Ú	add_top_nzMetricsContext.add_top_nÆ   sH   € ð �;‰;˜!ÒØØ˜Ÿ™Ñ&Ü$(£FˆD�M‰M˜&Ñ!Ø�‰�fÑ×!Ñ! # sÕ+r   N©r;   r1   r+   r,   )r+   r   )rE   ztype[BaseException] | NonerF   zBaseException | NonerG   r   r+   r,   )r+   Úbool)rR   ÚstrrS   r*   r+   r,   )r\   zset[str]r+   rv   )F)rR   rv   rS   r   rd   ru   r+   r,   )rR   rv   r   rv   rS   r   r+   r,   )rl   údict[str, Any]rd   ru   r+   r,   )rl   rw   r+   r,   )rR   rv   rS   r   r+   r,   )rR   rv   r   r   r   r*   r+   r,   )r-   r.   r/   r   r@   rI   rK   rT   r]   re   rg   rk   ro   rq   rs   r#   r   r   r3   r3   >   sj   „ óCó
ðRà,ðRð (ðRð ð	Rð
 
óRó(ó'ó
ô&ó +ô%ó$ ó)ô,r   r3   c                  ó6   — e Zd Zdd„Z	 d	 	 	 	 	 	 	 dd„Zdd„Zy)	ÚRuntimeMetricsContextc                ó.   — || _         i | _        d| _        y)zÇ
        Similar to MetricsContext, but used to gather the runtime metrics that are
        decoupled from compilation, where there's not a natural place to insert a
        context manager.
        r   N)r5   r6   r7   r:   s     r   r   zRuntimeMetricsContext.__init__Ò   s   € ð  ˆŒØ(*ˆŒØ#$ˆÕr   Nc                ó.  — | j                   st        j                  «       | _        || j                   vrd| j                   |<   | j                   |xx   |z  cc<   |r:|j	                  «       D ]&  \  }}|| j                   vsŒ|€Œ|| j                   |<   Œ( yy)rM   r   N)r6   r>   r?   r7   Úitems)r   rR   rS   Úextrar[   Úvs         r   rT   zRuntimeMetricsContext.incrementÜ   s†   € ð �}Š}ä"&§,¡,£.ˆDÔØ˜Ÿ™Ñ&Ø$%ˆD�M‰M˜&Ñ!Ø�‰�fÓ Ñ&ÓáØŸ™›ò )‘��1Ø˜DŸM™MÒ)¨a©mØ'(�D—M‘M !Ò$ñ)ð r   c                ó  — | j                   rF	 t        j                  «       }| j                  | j                  || j                   dd«       i | _         yy# t
        $ r t        j                  d«       Y Œ)w xY w# i | _         w xY w)zW
        Call the on_exit function with the metrics gathered so far and reset.
        Nz,Unexpected exception logging runtime metrics)r6   r>   r?   r5   r7   rB   rC   rD   )r   rH   s     r   ÚfinishzRuntimeMetricsContext.finishî   st   € ð �=Š=ð#Ü"Ÿl™l›n�Ø—‘Ø×'Ñ'¨°d·m±mÀTÈ4ôð !#�•ð øô ò NÜ—‘ÐLÖMðNûð !#�•ús#   Ž=A ÁA5Á2A8 Á4A5Á5A8 Á8	Brt   r   )rR   rv   rS   r*   r}   zdict[str, Any] | Noner+   r,   )r+   r,   )r-   r.   r/   r   rT   r€   r#   r   r   ry   ry   Ñ   s8   „ ó%ð GKð)Øð)Ø"%ð)Ø.Cð)à	ó)ô$#r   ry   )r0   Ú
__future__r   r   Úloggingr>   Úcollections.abcr   Útypingr   r   r   Útyping_extensionsr   r	   Útorch.utils._tracebackr
   Ú	getLoggerr-   rC   r   r*   Údictrv   ÚtypeÚBaseExceptionr1   Ú__annotations__r3   ry   r#   r   r   ú<module>rŒ      s¦   ðòõ #ã Û Û Ý $ß 0Ñ 0Ý "ñ Ý(å 4ð €g×Ñ˜Ó!€÷Lñ Lð* !Øˆ#ˆt�C˜�H‰~˜t MÑ2°TÑ9¸=È4Ñ;OÐPØð
ñ€
ˆIó ÷P,ñ P,÷f*#ò *#r   