U
    |Ph                     @  s   d Z ddlmZ ddlmZ ddlmZ ddlmZm	Z	m
Z
 e
ddd\ZZerbdd	lmZmZ n0e
d
eje	ddd\ZZe
d
eje	ddd\ZZddddgZG dd dZG dd dZG dd dZG dd dZdS )zK
Wrapper around NVIDIA Tools Extension for profiling MONAI ignite workflow
    )annotations)TYPE_CHECKING)
IgniteInfo)ensure_tuplemin_versionoptional_importztorch._C._nvtxz:NVTX is not installed. Are you sure you have a CUDA build?)
descriptor)EngineEventszignite.enginer	   	decorator)as_typer
   RangeHandlerRangePushHandlerRangePopHandlerMarkHandlerc                   @  st   e Zd ZdZdddddddZd	d
dddZdd
dddZdddddZdddddZdd Z	dd Z
dS )r   a  
    Attach a NVTX range to a pair of Ignite events.
    It pushes an NVTX range at the first event and pops it at the second event.
    Stores zero-based depth of the range that is started.

    Args:
        events: a string, pair of Ignite events, pair of Ignite event literals, or pair of Ignite events and literals.
            If a single string is provided, it should  describe the base name of a pair of default Ignite events
            with _STARTED and _COMPLETED postfix (like "EPOCH" for Events.EPOCH_STARTED and Events.EPOCH_COMPLETED).
            The accepted events are: BATCH, ITERATION, EPOCH, and ENGINE.
            If pair of literals, each should be the literal equivalent of an Ignite event, fo instance:
            ("EPOCH_STARTED" and "EPOCH_COMPLETED").
            One can combine events and literals, like (Events.EPOCH_STARTED and "EPOCH_COMPLETED").
            For the complete list of Events,
            check https://pytorch.org/ignite/generated/ignite.engine.events.Events.html.

        msg: ASCII message to associate with range.
            If not provided, the name of first event will be assigned to the NVTX range.
    Nz'str | tuple[str | Events, str | Events]
str | NoneNone)eventsmsgreturnc                 C  sJ   |  || _|d kr:t|tr$|}nddd | jD }|| _d | _d S )N/c                 S  s   g | ]
}|j qS  )name).0er   r   Q/home/dell461/cl/sdc2/HISourceFinder-master-l/src/monai/handlers/nvtx_handlers.py
<listcomp>A   s     z)RangeHandler.__init__.<locals>.<listcomp>)resolve_eventsr   
isinstancestrjoinr   depth)selfr   r   r   r   r   __init__9   s    
zRangeHandler.__init__zstr | tupleztuple[Events, Events])r   r   c                 C  sb   t |}t|dkr"| |d S t|dkrJ| |d | |d fS tdt| ddS )zL
        Resolve the input events to create a pair of Ignite events
           r      z7Exactly two Ignite events should be provided [received z].N)r   lencreate_paired_events	get_event
ValueError)r"   r   r   r   r   r   E   s    zRangeHandler.resolve_eventsr   eventr   c                 C  s<   |  }dddddd}| || d | || d fS )zG
        Create pair of Ignite events from a event prefix name
         ZEPOCH_Z
ITERATION_Z
GET_BATCH_)r,   ZENGINEEPOCHZ	ITERATIONBATCHSTARTED	COMPLETED)upperr(   )r"   r+   Zevent_prefixr   r   r   r'   P   s    z!RangeHandler.create_paired_eventsstr | Eventsr
   c                 C  s   t |trt|  S |S N)r   r   r
   r1   r"   r+   r   r   r   r(   X   s    zRangeHandler.get_eventr	   enginer   c                 C  s,   | | jd | j | | jd | j dS )z
        Attach an NVTX Range to specific Ignite events
        Args:
            engine: Ignite Engine, it can be a trainer, validator or evaluator.
        r   r$   N)add_event_handlerr   
range_push	range_popr"   r6   r   r   r   attach[   s    zRangeHandler.attachc                 C  s   t | j| _d S r3   _nvtx
rangePushAr   r!   r"   r   r   r   r8   d   s    zRangeHandler.range_pushc                 C  s   t   d S r3   r=   rangePopr?   r   r   r   r9   g   s    zRangeHandler.range_pop)N)__name__
__module____qualname____doc__r#   r   r'   r(   r;   r8   r9   r   r   r   r   r   $   s   	c                   @  s<   e Zd ZdZdddddddZd	dd
ddZdd ZdS )r   z
    At a specific event, pushes a range onto a stack of nested range span.
    Stores zero-based depth of the range that is started.

    Args:
        msg: ASCII message to associate with range
    Nr2   r   r   r+   r   r   c                 C  s<   t |trt|  n|| _|d kr,| jj}|| _d | _d S r3   )r   r   r
   r1   r+   r   r   r!   r"   r+   r   r   r   r   r#   t   s
    zRangePushHandler.__init__r	   r5   c                 C  s   | | j| j dS )z
        Push an NVTX range at a specific Ignite event
        Args:
            engine: Ignite Engine, it can be a trainer, validator or evaluator.
        N)r7   r+   r8   r:   r   r   r   r;   {   s    zRangePushHandler.attachc                 C  s   t | j| _d S r3   r<   r?   r   r   r   r8      s    zRangePushHandler.range_push)N)rB   rC   rD   rE   r#   r;   r8   r   r   r   r   r   k   s   c                   @  s8   e Zd ZdZdddddZdddd	d
Zdd ZdS )r   z
    At a specific event, pop a previously pushed range.
    Stores zero-based depth of the range that is started.

    Args:
        msg: ASCII message to associate with range
    r2   r   r*   c                 C  s    t |trt|  n|| _d S r3   )r   r   r
   r1   r+   r4   r   r   r   r#      s    zRangePopHandler.__init__r	   r5   c                 C  s   | | j| j dS )z
        Pop an NVTX range at a specific Ignite event
        Args:
            engine: Ignite Engine, it can be a trainer, validator or evaluator.
        N)r7   r+   r9   r:   r   r   r   r;      s    zRangePopHandler.attachc                 C  s   t   d S r3   r@   r?   r   r   r   r9      s    zRangePopHandler.range_popN)rB   rC   rD   rE   r#   r;   r9   r   r   r   r   r      s   c                   @  s<   e Zd ZdZdddddddZd	dd
ddZdd ZdS )r   z
    Mark an instantaneous event that occurred at some point.

    Args:
        msg: ASCII message to associate with range
    Nr2   r   r   rF   c                 C  s6   t |trt|  n|| _|d kr,| jj}|| _d S r3   )r   r   r
   r1   r+   r   r   rG   r   r   r   r#      s    zMarkHandler.__init__r	   r5   c                 C  s   | | j| j dS )z
        Add an NVTX mark to a specific Ignite event
        Args:
            engine: Ignite Engine, it can be a trainer, validator or evaluator.
        N)r7   r+   markr:   r   r   r   r;      s    zMarkHandler.attachc                 C  s   t | j d S r3   )r=   markAr   r?   r   r   r   rH      s    zMarkHandler.mark)N)rB   rC   rD   rE   r#   r;   rH   r   r   r   r   r      s   N)rE   
__future__r   typingr   monai.configr   monai.utilsr   r   r   r=   _ignite.enginer	   r
   OPT_IMPORT_VERSION__all__r   r   r   r   r   r   r   r   <module>   s4       
    
G