Ë
    g^(hÅ  ã                   óÀ   — U d 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
  G d„ d«      Zeeeeeef   eee      ee   gdf   Ze
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.
é    N)ÚIterator)ÚAnyÚCallableÚOptional)Ú	TypeAliasc                   óZ   — e Zd ZdZddefd„Zdededdfd„Zdefd	„Zde	e
eef      fd
„Zy)ÚTopNz_
    Helper to record a list of metrics, keeping only the top N "most expensive" elements.
    Úat_mostc                 ó    — || _         g | _        y ©N)r
   Úheap)Úselfr
   s     ú[/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/torch/_dynamo/metrics_context.pyÚ__init__zTopN.__init__   s   € ØˆŒØ+-ˆ�	ó    ÚkeyÚvalÚreturnNc                 ó²   — t        | j                  «      | j                  k  rt        j                  nt        j
                  } || j                  ||f«       y r   )Úlenr   r
   ÚheapqÚheappushÚheappushpop)r   r   r   Ú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__%   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>)   s   è ø€ ÒK™x˜s C��c”
ÑKùs   ‚T)Úreverse)Úsortedr   r   s    r   Ú__iter__zTopN.__iter__(   s   € ÙK¬6°$·)±)ÀTÔ+JÔKÐKr   )é   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úintr   r   r   r   r   Útupler&   r!   r   r   r	   r	      sT   „ ññ. ó .ð"�sð " ð "¨ó "ð
˜ó ðL˜( 5¨¨c¨¡?Ñ3ô Lr   r	   Ú
OnExitTypec            	       ó  — e Zd Zdefd„Zdd„Zdeee      dee   de	ddfd	„Z
defd
„Zdededdfd„Zddede	deddfd„Zdedede	ddfd„Zddeee	f   deddfd„Zdeee	f   ddfd„Zdede	ddfd„Zdede	deddfd„Zy)ÚMetricsContextÚon_exitc                 ó<   — || _         i | _        d| _        d| _        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©r   r1   s     r   r   zMetricsContext.__init__3   s!   € ð  ˆŒØ(*ˆŒØ#$ˆÔØˆ�r   r   c                 óŽ   — | j                   dk(  r i | _        t        j                  «       | _        | xj                   dz  c_         | S )z/
        Initialize metrics recording.
        r   é   )r6   r4   ÚtimeÚtime_nsr5   r   s    r   Ú	__enter__zMetricsContext.__enter__?   s8   € ð �;‰;˜!ÒàˆDŒMÜ"&§,¡,£.ˆDÔà�Š�qÑ�Øˆr   Úexc_typeÚ	exc_valueÚ
_tracebackNc                 óê   — | xj                   dz  c_         | j                   dk\  sJ ‚| j                   dk(  r>t        j                  «       }| j                  | j                  || j
                  ||«       yy)z>
        At exit, call the provided on_exit function.
        r9   r   N)r6   r:   r;   r3   r5   r4   )r   r=   r>   r?   Úend_time_nss        r   Ú__exit__zMetricsContext.__exit__K   sa   € ð 	�Š�qÑ�Ø�{‰{˜aÒÐÐØ�;‰;˜!ÒÜŸ,™,›.ˆKØ�M‰MØ×#Ñ# [°$·-±-ÀÈ9õð r   c                 ó    — | j                   dkD  S )z4
        True if we've entered the context.
        r   )r6   r   s    r   Úin_progresszMetricsContext.in_progress\   s   € ð �{‰{˜Q‰Ðr   ÚmetricÚvaluec                 ó¨   — | 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©r6   ÚRuntimeErrorr4   ©r   rE   rF   s      r   Ú	incrementzMetricsContext.incrementb   sT   € ð �;‰;˜!ÒÜÐ!2°6°(Ð:VÐWÓXÐXØ˜Ÿ™Ñ&Ø$%ˆD�M‰M˜&Ñ!Ø�‰�fÓ Ñ&Ôr   Ú	overwritec                 óœ   — | j                   dk(  rt        d|› d�«      ‚|| j                  v r|st        d|› d�«      ‚|| 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 rI   zMetric 'z-' has already been set in the current contextNrJ   )r   rE   rF   rN   s       r   ÚsetzMetricsContext.setl   s]   € ð
 �;‰;˜!ÒÜ ¨V¨HÐ4PÐQÓRÐRØ�T—]‘]Ñ"©9ÜØ˜6˜(Ð"OÐPóð ð !&ˆ�‰�fÒr   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   rP   rI   NrJ   )r   rE   r   rF   s       r   Úset_key_valuezMetricsContext.set_key_valuey   sR   € ð �;‰;˜!ÒÜ ¨V¨HÐ4PÐQÓRÐRØ˜Ÿ™Ñ&Ø$&ˆD�M‰M˜&Ñ!Ø%*ˆ�‰�fÑ˜cÒ"r   Úvaluesc                 óê   — | j                   dk(  rt        d«      ‚| j                  j                  «       |j                  «       z  }|r|st        d|› d�«      ‚| 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
Metric(s) z- have already been set in the current contextN)r6   rK   r4   ÚkeysÚupdate)r   rT   rN   Úexistings       r   rX   zMetricsContext.update‡   sl   € ð �;‰;˜!ÒÜÐRÓSÐSØ—=‘=×%Ñ%Ó'¨&¯+©+«-Ñ7ˆÙ™IÜØ˜X˜JÐ&SÐTóð ð 	�‰×Ñ˜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   rV   r9   N)r6   rK   rX   )r   rT   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 rI   N)r6   rK   r4   rQ   r   rL   s      r   Ú
add_to_setzMetricsContext.add_to_setŸ   sX   € ð �;‰;˜!ÒÜ ¨V¨HÐ4PÐQÓRÐRØ˜Ÿ™Ñ&Ü$'£EˆD�M‰M˜&Ñ!Ø�‰�fÑ×!Ñ! %Õ(r   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)r6   r4   r	   r   )r   rE   r   r   s       r   Ú	add_top_nzMetricsContext.add_top_n©   sH   € ð �;‰;˜!ÒØØ˜Ÿ™Ñ&Ü$(£FˆD�M‰M˜&Ñ!Ø�‰�fÑ×!Ñ! # sÕ+r   )r   r0   )F)r(   r)   r*   r.   r   r<   r   ÚtypeÚBaseExceptionr   rB   ÚboolrD   Ústrr,   rM   rQ   rS   ÚdictrX   r[   r]   r_   r!   r   r   r0   r0   2   s-  „ ð
 
ó 
ó
ðà˜4 Ñ.Ñ/ðð ˜MÑ*ðð ð	ð
 
óð"˜Tó ð' ð '¨Cð '°Dó 'ñ&˜#ð & cð &°dð &Àtó &ð+ Cð +¨cð +¸#ð +À$ó +ñ%˜T # s (™^ð %¸ð %Èó %ð  4¨¨S¨¡>ð  °dó  ð) ð )¨Sð )°Tó )ð, ð ,¨#ð ,°Cð ,¸Dô ,r   r0   c            	       óH   — e Zd Zdefd„Zdededeeee	f      ddfd„Z
d
d	„Zy)ÚRuntimeMetricsContextr1   c                 ó.   — || _         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)r3   r4   r5   r7   s     r   r   zRuntimeMetricsContext.__init__µ   s   € ð  ˆŒØ(*ˆŒØ#$ˆÕr   rE   rF   Úextrar   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)rH   r   N)r4   r:   r;   r5   Úitems)r   rE   rF   rh   ÚkÚvs         r   rM   zRuntimeMetricsContext.increment¿   s†   € ð �}Š}ä"&§,¡,£.ˆDÔØ˜Ÿ™Ñ&Ø$%ˆD�M‰M˜&Ñ!Ø�‰�fÓ Ñ&ÓáØŸ™›ò )‘��1Ø˜DŸM™MÒ)¨a©mØ'(�D—M‘M !Ò$ñ)ð r   c                 ó¦   — | j                   rEt        j                  «       }| j                  | j                  || j                   dd«       i | _         yy)zW
        Call the on_exit function with the metrics gathered so far and reset.
        N)r4   r:   r;   r3   r5   )r   rA   s     r   ÚfinishzRuntimeMetricsContext.finishÑ   sA   € ð �=Š=ÜŸ,™,›.ˆKØ�M‰M˜$×-Ñ-¨{¸D¿M¹MÈ4ÐQUÔVØˆD�Mð r   )r   N)r(   r)   r*   r.   r   rc   r,   r   rd   r   rM   rn   r!   r   r   rf   rf   ´   sE   „ ð% 
ó %ð)Øð)Ø"%ð)Ø.6°t¸CÀ¸H±~Ñ.Fð)à	ó)ô$r   rf   )r+   r   r:   Úcollections.abcr   Útypingr   r   r   Útyping_extensionsr   r	   r,   rd   rc   r`   ra   r.   Ú__annotations__r0   rf   r!   r   r   ú<module>rs      s�   ðòó Û Ý $ß *Ñ *Ý '÷Lñ Lð* !Øˆ#ˆt�C˜�H‰~˜x¨¨]Ñ(;Ñ<¸hÀ}Ñ>UÐVØð
ñ€
ˆIó ÷,ñ ,÷D$ò $r   