U
    9%e}                     @   sP  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	 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 aeed< d+ee	e ddd
ZedddZd d! Zd,edd#dZd-d$dZd.eeed%d&dZeeed'd(dZed)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
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   d/var/www/html/Darija-Ai-API/env/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   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   _default_metrics_handlerr/   groupc                 C   s   |d kr| a n| t|< d S r   )r5   _metrics_mapr6   r   r   r   r   B   s    r7   c                 C   s    | t krt |  }nt}t| |S r   )r8   r5   r   )r7   r/   r   r   r   r   L   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_nameT   s    

rB   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)rB   r   r   r2   	Exception)argskwargskeystartresult)fr7   r   r   wrapperw   s    
z#prof.<locals>.wrap.<locals>.wrapperr   )rK   rL   r9   )rK   r   wrapv   s    zprof.<locals>.wrapNr   )r?   r7   rM   r   r9   r   r   a   s    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                    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 rD   )r   r   r   r2   rE   )rF   rG   
start_timerJ   )funcr7   r   r   rL      s    

z&profile.<locals>.wrap.<locals>.wrapperr   )rO   rL   r9   )rO   r   rM      s    zprofile.<locals>.wrap)warningswarnDeprecationWarning)r7   rM   r   r9   r   r      s    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   rS   r   r   r   r      s    )rT   r0   r1   c                 C   s"   t d t| }||| d S )NzKDeprecated, use put_metric(metric_group)(metric_name, metric_value) instead)rP   rQ   r   r3   )rT   r0   r1   Zmetric_streamr   r   r   r      s
    )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    )N)NrC   )N)rC   ) r(   r2   rP   collectionsr   	functoolsr   typingr   r   __all__r   r   ABCr   r	   r
   r   r8   r5   __annotations__r#   r   r   rB   r   r   r4   r   r   floatr   r   r   r   r   <module>	   s@    
      	
,
$