o
    h}                     @   s@  U d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZm	Z	 g dZ
edg dZG dd	 d	ZG d
d de jZG dd deZG dd deZG dd dZi Ze aeed< d*dede	e fddZdefddZdd Zd+defddZd*ddZd,d ed!ed"efd#d$Zd"ed ed!efd%d&Zd'efd(d)ZdS )-    N)
namedtuplewraps)DictOptional)MetricsConfigMetricHandlerConsoleMetricHandlerNullMetricHandlerMetricStream	configure	getStreamprofprofile
put_metricpublish_metricget_elapsed_time_ms
MetricDatar   )	timestamp
group_namenamevaluec                   @   s.   e Zd ZdgZddeeeef  fddZdS )r   paramsNc                 C   s   || _ | j d u ri | _ d S d S N)r   )selfr    r   [/var/www/html/ai/venv/lib/python3.10/site-packages/torch/distributed/elastic/metrics/api.py__init__   s   

zMetricsConfig.__init__r   )__name__
__module____qualname__	__slots__r   r   strr   r   r   r   r   r      s     r   c                   @   s    e Zd ZejdefddZdS )r   metric_datac                 C      d S r   r   r   r#   r   r   r   emit!   s   zMetricHandler.emitN)r   r   r    abcabstractmethodr   r&   r   r   r   r   r       s    r   c                   @      e Zd ZdefddZdS )r	   r#   c              	   C   s,   t d|j d|j d|j d|j  d S )N[z][z]: =)printr   r   r   r   r%   r   r   r   r&   '   s   "zConsoleMetricHandler.emitNr   r   r    r   r&   r   r   r   r   r	   &       r	   c                   @   r)   )r
   r#   c                 C   r$   r   r   r%   r   r   r   r&   .   s   zNullMetricHandler.emitNr-   r   r   r   r   r
   -   r.   r
   c                   @   s0   e Zd ZdedefddZdedefddZd	S )
r   r   handlerc                 C   s   || _ || _d S r   )r   r/   )r   r   r/   r   r   r   r   3   s   
zMetricStream.__init__metric_namemetric_valuec                 C   s    | j tt | j|| d S r   )r/   r&   r   timer   )r   r0   r1   r   r   r   	add_value7   s   zMetricStream.add_valueN)r   r   r    r"   r   r   intr3   r   r   r   r   r   2   s    r   _default_metrics_handlerr/   groupc                 C   s   |d u r| a d S | t|< d S r   )r5   _metrics_map)r/   r6   r   r   r   r   B   s   r   c                 C   s    | t v r	t |  }nt}t| |S r   )r7   r5   r   )r6   r/   r   r   r   r   L   s   

r   c                 C   sL   | j }|d}t|dkr$| j}|r |dd d |d  S |d S |S )N.   r   )r    splitlenr   )fnqualnamer;   moduler   r   r   _get_metric_nameT   s   
r@   torchelasticc                    s    fdd}| r|| S |S )a  
    @profile decorator publishes duration.ms, count, success, failure
    metrics for the function that it decorates. The metric name defaults
    to the qualified name (``class_name.def_name``) of the function.
    If the function does not belong to a class, it uses the leaf module name
    instead.

    Usage

    ::

     @metrics.prof
     def x():
         pass

     @metrics.prof(group="agent")
     def y():
         pass
    c                       t   fdd}|S )Nc               
      s   t  }z6zt } | i |}t| dd W n ty,   t| dd  w W t| dt| |S t| dt| w Nz.successr9   z.failurez.duration.ms)r@   r2   r   	Exceptionr   )argskwargskeystartresult)fr6   r   r   wrapperw   s   z#prof.<locals>.wrap.<locals>.wrapperr   )rJ   rK   r6   )rJ   r   wrapv   s   zprof.<locals>.wrapr   )r=   r6   rM   r   rL   r   r   a   s   r   c                    s   t dt  fdd}|S )z
    @profile decorator adds latency and success/failure metrics to any given function.

    Usage

    ::

     @metrics.profile("my_metric_group")
     def some_function(<arguments>):
    zDeprecated, use @prof insteadc                    rB   )Nc                     s   z9zt   } | i |}t j dd W n ty*   t j dd  w W t j dt| |S t j dt| w rC   )r2   r   r   rD   r   )rE   rF   
start_timerI   )funcr6   r   r   rK      s(   

z&profile.<locals>.wrap.<locals>.wrapperr   )rO   rK   rL   )rO   r   rM      s   zprofile.<locals>.wrap)warningswarnDeprecationWarning)r6   rM   r   rL   r   r      s   r   r0   r1   metric_groupc                 C   s   t || | dS )z
    Publishes a metric data point.

    Usage

    ::

     put_metric("metric_name", 1)
     put_metric("metric_name", 1, "metric_group_name")
    N)r   r3   )r0   r1   rS   r   r   r   r      s   r   c                 C   s"   t d t| }||| d S )NzKDeprecated, use put_metric(metric_group)(metric_name, metric_value) instead)rP   rQ   r   r3   )rS   r0   r1   metric_streamr   r   r   r      s
   r   start_time_in_secondsc                 C   s   t   }t||  d S )zG
    Returns the elapsed time in millis from the given start time.
    i  )r2   r4   )rU   end_timer   r   r   r      s   r   r   )NrA   )rA   ) r'   r2   rP   collectionsr   	functoolsr   typingr   r   __all__r   r   ABCr   r	   r
   r   r7   r5   __annotations__r"   r   r   r@   r   r   r4   r   r   floatr   r   r   r   r   <module>   s.   
	

,$