o
    i                     @  s   d Z ddlmZ ddlmZ ddlmZmZmZm	Z	 e	ddd\Z
Zer-ddlmZmZ ne	d	ejed
dd\ZZe	d	ejeddd\ZZg d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
Zd!ddZd"ddZd#ddZ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.
    Nevents'str | tuple[str | Events, str | Events]msg
str | NonereturnNonec                 C  sJ   |  || _|d u 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   ^/home/dell461/cl/sdc2/last_ska_mid/HISourceFinder-master-l/src/monai/handlers/nvtx_handlers.py
<listcomp>@   s    z)RangeHandler.__init__.<locals>.<listcomp>)resolve_eventsr   
isinstancestrjoinr   depth)selfr   r   r   r   r   __init__8   s   

zRangeHandler.__init__str | tupletuple[Events, Events]c                 C  s^   t |}t|dkr| |d S t|dkr%| |d | |d fS tdt| d)zL
        Resolve the input events to create a pair of Ignite events
           r      z7Exactly two Ignite events should be provided [received z].)r   lencreate_paired_events	get_event
ValueError)r#   r   r   r   r   r   D   s   zRangeHandler.resolve_events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*   O   s   $z!RangeHandler.create_paired_eventsstr | Eventsr
   c                 C  s   t |trt|  S |S N)r   r    r
   r3   r#   r-   r   r   r   r+   W   s   zRangeHandler.get_event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#   r7   r   r   r   attachZ   s   zRangeHandler.attachc                 C     t | j| _d S r5   _nvtx
rangePushAr   r"   r#   r   r   r   r9   c      zRangeHandler.range_pushc                 C     t   d S r5   r?   rangePoprA   r   r   r   r:   f      zRangeHandler.range_popr5   )r   r   r   r   r   r   )r   r%   r   r&   )r-   r    r   r&   )r-   r4   r   r
   r7   r	   r   r   )__name__
__module____qualname____doc__r$   r   r*   r+   r<   r9   r:   r   r   r   r   r   #   s    



	r   c                   @  .   e Zd ZdZddd	d
Z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
    Nr-   r4   r   r   r   r   c                 C  s<   t |trt|  n|| _|d u r| jj}|| _d | _d S r5   )r   r    r
   r3   r-   r   r   r"   r#   r-   r   r   r   r   r$   s   s
   
zRangePushHandler.__init__r7   r	   c                 C     | | 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)r8   r-   r9   r;   r   r   r   r<   z      zRangePushHandler.attachc                 C  r=   r5   r>   rA   r   r   r   r9      rB   zRangePushHandler.range_pushr5   r-   r4   r   r   r   r   rG   )rH   rI   rJ   rK   r$   r<   r9   r   r   r   r   r   j   s
    
r   c                   @  s,   e Zd ZdZdddZ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
    r-   r4   r   r   c                 C  s&   t |trt|  | _d S || _d S r5   )r   r    r
   r3   r-   r6   r   r   r   r$      s   &zRangePopHandler.__init__r7   r	   c                 C  rN   )z
        Pop an NVTX range at a specific Ignite event
        Args:
            engine: Ignite Engine, it can be a trainer, validator or evaluator.
        N)r8   r-   r:   r;   r   r   r   r<      rO   zRangePopHandler.attachc                 C  rC   r5   rD   rA   r   r   r   r:      rF   zRangePopHandler.range_popN)r-   r4   r   r   rG   )rH   rI   rJ   rK   r$   r<   r:   r   r   r   r   r      s
    

r   c                   @  rL   )r   z
    Mark an instantaneous event that occurred at some point.

    Args:
        msg: ASCII message to associate with range
    Nr-   r4   r   r   r   r   c                 C  s6   t |trt|  n|| _|d u r| jj}|| _d S r5   )r   r    r
   r3   r-   r   r   rM   r   r   r   r$      s   
zMarkHandler.__init__r7   r	   c                 C  rN   )z
        Add an NVTX mark to a specific Ignite event
        Args:
            engine: Ignite Engine, it can be a trainer, validator or evaluator.
        N)r8   r-   markr;   r   r   r   r<      rO   zMarkHandler.attachc                 C  s   t | j d S r5   )r?   markAr   rA   r   r   r   rQ      s   zMarkHandler.markr5   rP   rG   )rH   rI   rJ   rK   r$   r<   rQ   r   r   r   r   r      s
    
r   N)rK   
__future__r   typingr   monai.utilsr   r   r   r   r?   _ignite.enginer	   r
   OPT_IMPORT_VERSION__all__r   r   r   r   r   r   r   r   <module>   s$   


G