U
    ©Ê¹j}  ã                   @   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/bwave/python/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   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   Z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@    
      þ	
,
$