§
    ŠŠtj#  ã                  ó6  — 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dS )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                  ó4   — e Zd ZdZddd„Zdd„Zdd„Zdd„ZdS )ÚTopNz_
    Helper to record a list of metrics, keeping only the top N "most expensive" elements.
    é   Úat_mostÚintÚreturnÚNonec                ó"   — || _         g | _        d S ©N)r   Úheap)Úselfr   s     ú[/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/torch/_dynamo/metrics_context.pyÚ__init__zTopN.__init__(   s   € ØˆŒØ+-ˆŒ	ˆ	ˆ	ó    Úkeyr   Úvalc                ó–   — t          | j        ¦  «        | j        k     rt          j        nt          j        } || j        ||f¦  «         d S r   )Úlenr   r   ÚheapqÚheappushÚheappushpop)r   r   r   Úfns       r   ÚaddzTopN.add,   sB   € å" 4¤9™~œ~°´Ò<Ð<�UŒ^ˆ^Å%ÔBSˆØ
ˆˆ4Œ9�s˜C�jÑ!Ô!Ð!Ð!Ð!r   c                ó*   — t          | j        ¦  «        S r   )r   r   ©r   s    r   Ú__len__zTopN.__len__1   s   € Ý�4”9‰~Œ~Ðr   úIterator[tuple[Any, int]]c                óB   — d„ t          | j        d¬¦  «        D ¦   «         S )Nc              3  ó$   K  — | ]\  }}||fV — Œd S r   © )Ú.0r   r   s      r   ú	<genexpr>z TopN.__iter__.<locals>.<genexpr>5   s*   è è € ÐKÐK™x˜s C��c�
ÐKÐKÐKÐKÐKÐKr   T)Úreverse)Úsortedr   r#   s    r   Ú__iter__zTopN.__iter__4   s%   € ØKÐK­6°$´)ÀTÐ+JÑ+JÔ+JÐKÑKÔKÐKr   N)r   )r   r   r   r   )r   r   r   r   r   r   )r   r   )r   r%   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r!   r$   r-   r(   r   r   r   r   #   sy   € € € € € ðð ð.ð .ð .ð .ð .ð"ð "ð "ð "ð
ð ð ð ðLð Lð Lð Lð Lð Lr   r   r   Ú
OnExitTypec                  ór   — 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d0d!„Zd1d"„Zd2d$„Zd%S )3ÚMetricsContextÚon_exitr2   r   r   c                óL   — || _         i | _        d| _        d| _        g | _        dS )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   r5   s     r   r   zMetricsContext.__init__?   s,   € ð  ˆŒØ(*ˆŒØ#$ˆÔØˆŒØ@BˆŒˆˆr   r   c                óz   — | j         dk    ri | _        t          j        ¦   «         | _        | xj         dz  c_         | S )z/
        Initialize metrics recording.
        r   é   )r:   r8   ÚtimeÚtime_nsr9   r#   s    r   Ú	__enter__zMetricsContext.__enter__L   s;   € ð Œ;˜!ÒÐàˆDŒMÝ"&¤,¡.¤.ˆDÔàˆŒ�qÑˆŒØˆr   Úexc_typeútype[BaseException] | NoneÚ	exc_valueúBaseException | NoneÚ
_tracebackr   c                ó8  — | xj         dz  c_         | j         dk     rt          d¦  «        ‚| j         dk    rd	 t          j        ¦   «         }|                      | j        || j        ||¦  «         dS # t          $ r t           	                    d¦  «         Y dS w xY wdS )z>
        At exit, call the provided on_exit function.
        r>   r   z+MetricsContext level cannot become negativez0Unexpected exception logging compilation metricsN)
r:   ÚAssertionErrorr?   r@   r7   r9   r8   Ú	ExceptionÚlogÚ	exception)r   rB   rD   rF   Úend_time_nss        r   Ú__exit__zMetricsContext.__exit__X   sÁ   € ð 	ˆŒ�qÑˆŒØŒ;˜Š?ˆ?Ý Ð!NÑOÔOÐOØŒ;˜!ÒÐðRÝ"œl™nœn�Ø—’ØÔ'¨°d´mÀXÈyñô ð ð ð øõ ð Rð Rð RÝ—’ÐPÑQÔQÐQÐQÐQÐQðRøøøð Ðs   ·6A/ Á/$BÂBÚboolc                ó   — | j         dk    S )z4
        True if we've entered the context.
        r   )r:   r#   s    r   Úin_progresszMetricsContext.in_progressm   s   € ð Œ{˜QŠÐr   ÚmetricÚstrÚvaluer   c                ó’   — | j         dk    rt          d|› d�¦  «        ‚|| j        vr
d| j        |<   | j        |xx         |z  cc<   dS )ú7
        Increment a metric by a given amount.
        r   zCannot increment ú outside of a MetricsContextN©r:   ÚRuntimeErrorr8   ©r   rQ   rS   s      r   Ú	incrementzMetricsContext.increments   sh   € ð Œ;˜!ÒÐÝÐW°6ÐWÐWÐWÑXÔXÐXØ˜œÐ&Ð&Ø$%ˆDŒM˜&Ñ!ØŒ�fÐÐÔ Ñ&ÐÐÑÐÐr   Úpredúset[str]c                óV   ‡— dd                      ˆfd„| j        D ¦   «         ¦  «        z   S )Nz

c              3  ó|   •K  — | ]6\  }}|‰z  ¯
d d                      |                     ¦   «         ¦  «        z   V — Œ7dS )zPrevious Traceback:
Ú N)ÚjoinÚformat)r)   ÚeÚkr[   s      €r   r*   z/MetricsContext._render_edits.<locals>.<genexpr>~   s^   øè è € ð $
ð $
á��1Ø�4‰xð$
Ø# b§g¢g¨a¯hªh©j¬jÑ&9Ô&9Ñ9ð$
ð $
ð $
ð $
ð $
ð $
r   )r`   r;   )r   r[   s    `r   Ú_render_editszMetricsContext._render_edits}   sH   ø€ Ø˜Ÿšð $
ð $
ð $
ð $
àœð$
ñ $
ô $
ñ 
ô 
ñ 
ð 	
r   FÚ	overwritec                ó   — | j         dk    rt          d|› d�¦  «        ‚|| j        v r,|s*t          |                      |h¦  «        d|› d�z   ¦  «        ‚| j                             t          j        d¬¦  «        |hf¦  «         || j        |<   dS )	z‚
        Set a metric to a given value. Raises if the metric has been assigned previously
        in the current context.
        r   úCannot set rV   z

RuntimeError: Metric 'z]' has already been set in the current context (see above for current and previous traceback).r>   ©ÚskipN)r:   rX   r8   rd   r;   Úappendr
   Úextract)r   rQ   rS   re   s       r   ÚsetzMetricsContext.set„   sÂ   € ð
 Œ;˜!ÒÐÝÐQ¨VÐQÐQÐQÑRÔRÐRØ�T”]Ð"Ð"¨9Ð"ÝØ×"Ò" F 8Ñ,Ô,ðB¨vð Bð Bð BñBñô ð ð
 	Œ×ÒÕ-Ô5¸1Ð=Ñ=Ô=À¸xÐHÑIÔIÐIØ %ˆŒ�fÑÐÐr   r   c                óˆ   — | j         dk    rt          d|› d�¦  «        ‚|| j        vr
i | j        |<   || j        |         |<   dS )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   rg   rV   NrW   )r   rQ   r   rS   s       r   Úset_key_valuezMetricsContext.set_key_value”   s[   € ð Œ;˜!ÒÐÝÐQ¨VÐQÐQÐQÑRÔRÐRØ˜œÐ&Ð&Ø$&ˆDŒM˜&Ñ!Ø%*ˆŒ�fÔ˜cÑ"Ð"Ð"r   Úvaluesúdict[str, Any]c                óþ  — | j         dk    rt          d¦  «        ‚| j                             ¦   «         |                     ¦   «         z  }|rJ|sHt          |                      t          |                     ¦   «         ¦  «        ¦  «        d|› d�z   ¦  «        ‚| j                             t          j	        d¬¦  «        t          |                     ¦   «         ¦  «        f¦  «         | j         
                    |¦  «         dS )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>   rh   N)r:   rX   r8   Úkeysrd   rl   r;   rj   r
   rk   Úupdate)r   ro   re   Úexistings       r   rt   zMetricsContext.update¢   sú   € ð Œ;˜!ÒÐÝÐRÑSÔSÐSØ”=×%Ò%Ñ'Ô'¨&¯+ª+©-¬-Ñ7ˆØð 	˜Ið 	ÝØ×"Ò"¥3 v§{¢{¡}¤}Ñ#5Ô#5Ñ6Ô6ðB°ð Bð Bð BñBñô ð ð
 	Œ×ÒÕ-Ô5¸1Ð=Ñ=Ô=½sÀ6Ç;Â;Á=Ä=Ñ?QÔ?QÐRÑSÔSÐSØŒ×Ò˜VÑ$Ô$Ð$Ð$Ð$r   c                ó~   — | j         dk    rt          d¦  «        ‚| j         dk    r|                      |¦  «         dS dS )zA
        Update, but only when at the outermost context.
        r   rr   r>   N)r:   rX   rt   )r   ro   s     r   Úupdate_outerzMetricsContext.update_outer´   sM   € ð Œ;˜!ÒÐÝÐRÑSÔSÐSØŒ;˜!ÒÐØ�KŠK˜ÑÔÐÐÐð Ðr   c                óÀ   — | j         dk    rt          d|› d�¦  «        ‚|| j        vrt          ¦   «         | j        |<   | j        |                              |¦  «         dS )z8
        Records a metric as a set() of values.
        r   zCannot add rV   N)r:   rX   r8   rl   r!   rY   s      r   Ú
add_to_setzMetricsContext.add_to_set½   si   € ð Œ;˜!ÒÐÝÐQ¨VÐQÐQÐQÑRÔRÐRØ˜œÐ&Ð&Ý$'¡E¤EˆDŒM˜&Ñ!ØŒ�fÔ×!Ò! %Ñ(Ô(Ð(Ð(Ð(r   r   c                ó    — | j         dk    rdS || j        vrt          ¦   «         | j        |<   | j        |                              ||¦  «         dS )z;
        Records a metric as a TopN set of values.
        r   N)r:   r8   r   r!   )r   rQ   r   r   s       r   Ú	add_top_nzMetricsContext.add_top_nÇ   sV   € ð Œ;˜!ÒÐØˆFØ˜œÐ&Ð&Ý$(¡F¤FˆDŒM˜&Ñ!ØŒ�fÔ×!Ò! # sÑ+Ô+Ð+Ð+Ð+r   N©r5   r2   r   r   )r   r   )rB   rC   rD   rE   rF   r   r   r   )r   rN   )rQ   rR   rS   r   r   r   )r[   r\   r   rR   )F)rQ   rR   rS   r   re   rN   r   r   )rQ   rR   r   rR   rS   r   r   r   )ro   rp   re   rN   r   r   )ro   rp   r   r   )rQ   rR   rS   r   r   r   )rQ   rR   r   r   r   r   r   r   )r.   r/   r0   r   rA   rM   rP   rZ   rd   rl   rn   rt   rw   ry   r{   r(   r   r   r4   r4   >   s  € € € € € ðCð Cð Cð Cð
ð 
ð 
ð 
ðRð Rð Rð Rð*ð ð ð ð'ð 'ð 'ð 'ð
ð 
ð 
ð 
ð&ð &ð &ð &ð &ð +ð +ð +ð +ð%ð %ð %ð %ð %ð$ ð  ð  ð  ð)ð )ð )ð )ð,ð ,ð ,ð ,ð ,ð ,r   r4   c                  ó*   — e Zd Zdd„Z	 ddd„Zdd„ZdS )ÚRuntimeMetricsContextr5   r2   r   r   c                ó0   — || _         i | _        d| _        dS )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)r7   r8   r9   r<   s     r   r   zRuntimeMetricsContext.__init__Ó   s    € ð  ˆŒØ(*ˆŒØ#$ˆÔÐÐr   NrQ   rR   rS   r   Úextraúdict[str, Any] | Nonec                óú   — | j         st          j        ¦   «         | _        || j         vr
d| j         |<   | j         |xx         |z  cc<   |r/|                     ¦   «         D ]\  }}|| j         vr|�
|| j         |<   ŒdS dS )rU   r   N)r8   r?   r@   r9   Úitems)r   rQ   rS   r€   rc   Úvs         r   rZ   zRuntimeMetricsContext.incrementÝ   s¨   € ð Œ}ð 	1å"&¤,¡.¤.ˆDÔØ˜œÐ&Ð&Ø$%ˆDŒM˜&Ñ!ØŒ�fÐÐÔ Ñ&ÐÐÑàð 	)ØŸš™œð )ð )‘��1Ø˜DœMÐ)Ð)¨a¨mØ'(�D”M !Ñ$øð	)ð 	)ð)ð )r   c                ó  — | j         rw	 t          j        ¦   «         }|                      | j        || j         dd¦  «         n*# t
          $ r t                               d¦  «         Y nw xY wi | _         dS # i | _         w xY wdS )zW
        Call the on_exit function with the metrics gathered so far and reset.
        Nz,Unexpected exception logging runtime metrics)r8   r?   r@   r7   r9   rI   rJ   rK   )r   rL   s     r   ÚfinishzRuntimeMetricsContext.finishï   s­   € ð Œ=ð 		#ð#Ý"œl™nœn�Ø—’ØÔ'¨°d´mÀTÈ4ñô ð ð øõ ð Nð Nð NÝ—’ÐLÑMÔMÐMÐMÐMðNøøøð !#�”��ø �”Ð"Ð"Ð"Ð"ð		#ð 		#s(   ‰6A  ¿A3 Á $A'Á$A3 Á&A'Á'A3 Á3	A<r|   r   )rQ   rR   rS   r   r€   r�   r   r   )r   r   )r.   r/   r0   r   rZ   r†   r(   r   r   r~   r~   Ò   s\   € € € € € ð%ð %ð %ð %ð GKð)ð )ð )ð )ð )ð$#ð #ð #ð #ð #ð #r   r~   )r1   Ú
__future__r   r   Úloggingr?   Úcollections.abcr   Útypingr   r   r   Útyping_extensionsr   r	   Útorch.utils._tracebackr
   Ú	getLoggerr.   rJ   r   r   ÚdictrR   ÚtypeÚBaseExceptionr2   Ú__annotations__r4   r~   r(   r   r   ú<module>r’      s§  ððð ð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø €€€Ø $Ð $Ð $Ð $Ð $Ð $Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø "Ð "Ð "Ð "Ð "Ð "ð ð )Ø(Ð(Ð(Ð(Ð(Ð(à 4Ð 4Ð 4Ð 4Ð 4Ð 4ð €gÔ˜Ñ!Ô!€ðLð Lð Lð Lð Lñ Lô Lð Lð* !Øˆ#ˆt�C˜�HŒ~˜t MÔ2°TÑ9¸=È4Ñ;OÐPØð
ô€
ð ð ð ñ ðQ,ð Q,ð Q,ð Q,ð Q,ñ Q,ô Q,ð Q,ðh*#ð *#ð *#ð *#ð *#ñ *#ô *#ð *#ð *#ð *#r   