U
    yh                     @   s|  U 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 d dl	m
Z
 dddd	d
ddddddddgZedddddg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eef ed< e aeed< d0eee dddZed d!dZd"d# Zd1ed d%dZe
d&ed'd2d(dZd3eeed)d*dZe
d+ed'eeed,d-dZe d.d/dZ!dS )4    N)
namedtuplewraps)DictOptional)
deprecatedMetricsConfigMetricHandlerConsoleMetricHandlerNullMetricHandlerMetricStream	configure	getStreamprofprofile
put_metricpublish_metricget_elapsed_time_ms
MetricData	timestamp
group_namenamevaluec                   @   s.   e Zd ZdgZdeeeef  dddZdS )r   paramsNr   c                 C   s   || _ | j d kri | _ d S Nr   )selfr    r   W/var/www/html/venv/lib/python3.8/site-packages/torch/distributed/elastic/metrics/api.py__init__   s    
zMetricsConfig.__init__)N)__name__
__module____qualname__	__slots__r   r   strr   r   r   r   r   r      s   c                   @   s    e Zd ZejedddZdS )r	   metric_datac                 C   s   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   c                   @   s   e Zd Zed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
   '   s   c                   @   s   e Zd ZedddZdS )r   r%   c                 C   s   d S r   r   r'   r   r   r   r(   /   s    zNullMetricHandler.emitNr.   r   r   r   r   r   .   s   c                   @   s,   e Zd ZeedddZeedddZdS )r   r   handlerc                 C   s   || _ || _d S r   r/   )r   r   r0   r   r   r   r   4   s    zMetricStream.__init__)metric_namemetric_valuec                 C   s    | j tt | j|| d S r   )r0   r(   r   timer   )r   r1   r2   r   r   r   	add_value8   s    zMetricStream.add_valueN)r    r!   r"   r$   r	   r   intr4   r   r   r   r   r   3   s   _metrics_map_default_metrics_handlerr0   groupc                 C   s   |d kr| a n| t|< d S r   )r7   r6   r8   r   r   r   r   C   s    r9   c                 C   s    | t krt |  }nt}t| |S r   )r6   r7   r   )r9   r0   r   r   r   r   M   s    
c                 C   sR   | j }|d}t|dkrJ| j}|r@|dd d |d  S |d S n|S d S )N.   r   )r"   splitlenr!   )fnqualnamer>   moduler   r   r   _get_metric_nameU   s    

rC   torchelasticc                    s     fdd}| r|| S |S d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                    s   t   fdd}|S )Nc               
      s|   t  }zVz(t } | |}t| dd W n( tk
rZ   t| dd  Y nX W 5 t| dt| X |S Nz.duration.msz.successr<   z.failure)rC   r   r   r3   	Exception)argskwargskeystartresult)fr9   r   r   wrapperw   s    
z#prof.<locals>.wrap.<locals>.wrapperr   )rL   rM   r:   )rL   r   wrapv   s    zprof.<locals>.wrapNr   )r@   r9   rN   r   r:   r   r   b   s    zDeprecated, use `@prof` instead)categoryc                    s    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>):
    c                    s   t   fdd}|S )Nc                     sz   zZz*t } | |}t  j dd W n* tk
rV   t  j dd  Y nX W 5 t  j dt| X |S rE   )r   r    r   r3   rF   )rG   rH   
start_timerK   )funcr9   r   r   rM      s    

z&profile.<locals>.wrap.<locals>.wrapperr   )rQ   rM   r:   )rQ   r   rN      s    zprofile.<locals>.wrapr   )r9   rN   r   r:   r   r      s    r1   r2   metric_groupc                 C   s   t || | dS )z
    Publish a metric data point.

    Usage

    ::

     put_metric("metric_name", 1)
     put_metric("metric_name", 1, "metric_group_name")
    Nr   r4   rR   r   r   r   r      s    zMDeprecated, use `put_metric(metric_group)(metric_name, metric_value)` instead)rS   r1   r2   c                 C   s   t | }||| d S r   rT   )rS   r1   r2   Zmetric_streamr   r   r   r      s    )start_time_in_secondsc                 C   s   t   }t||  d S )z<Return the elapsed time in millis from the given start time.i  )r3   r5   )rU   Zend_timer   r   r   r      s    )N)NrD   )N)rD   )"r)   r3   collectionsr   	functoolsr   typingr   r   typing_extensionsr   __all__r   r   ABCr	   r
   r   r   r6   r$   __annotations__r7   r   r   rC   r   FutureWarningr   r5   r   r   floatr   r   r   r   r   <module>
   sJ    
      	
+
"