o
    ,i"                     @   s  U d Z ddlZddlmZmZmZmZmZmZm	Z	 ddl
Z
ddlmZ ddlmZmZ ddlmZmZmZ dd	lmZ e	eeedf Ze
jZe
jZd
ag aeeeg df ee f  ed< e Ze  Z!e Z"dd Z#dd Z$de%fddZ&d/ddZ'G dd de(Z)de%fddZ*de%fddZ+d/ddZ,defddZ-defdd Z.d0d!ee defd"d#Z/d0d!ee defd$d%Z0d&efd'd(Z1G d)d! d!ZG d*d+ d+Z2d&ed, de2fd-d&Z3g d.Z4dS )1zH
This package enables an interface for accessing MTIA backend in python
    N)AnyCallableDictListOptionalTupleUnion)Device   )deviceTensor)_dummy_type_LazySeedTrackerclassproperty   )_get_device_indexF_queued_callsc                   C   s
   t   d S N)
_lazy_init r   r   Q/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/torch/mtia/__init__.pyinit       
r   c                   C   s   t ot  S )z9Return whether PyTorch's MTIA state has been initialized.)_initialized_is_in_bad_forkr   r   r   r   is_initialized$   s   r   returnc                   C   
   t j S r   )torch_C_mtia_isInBadForkr   r   r   r   r   )   r   r   c                  C   s  t  sttdr
d S ts t  r	 W d    d S t r tdt s'tdtj	
  dt_t D ]	} | r<t|  q3z1tD ]'\}}z|  W q@ tyg } zdt| dd| }t||d }~ww W ttd nttd w daW d    d S 1 sw   Y  d S )Nis_initializingzwCannot re-initialize MTIA in forked subprocess. To use MTIA with multiprocessing, you must use the 'spawn' start methodz$Torch not compiled with MTIA enabledTz6MTIA call failed lazily at initialization with error: z(

MTIA call was originally invoked at:

 )r   hasattr_tls_initialization_lockr   RuntimeError_is_compiledAssertionErrorr   r   
_mtia_initr!   _lazy_seed_tracker	get_callsr   append	ExceptionstrjoinDeferredMtiaCallErrordelattrr   )callsqueued_callorig_tracebackemsgr   r   r   r   -   sD   




"r   c                   @   s   e Zd ZdS )r0   N)__name__
__module____qualname__r   r   r   r   r0   ]   s    r0   c                   C   r   )z*Return true if compiled with MTIA support.)r   r   _mtia_isBuiltr   r   r   r   r'   a      
r'   c                   C   s   t  sdS t dkS )z'Return true if MTIA device is availableFr   )r'   device_countr   r   r   r   is_availablef   s   
r=   c                   C   r   )z?Waits for all jobs in all streams on a MTIA device to complete.)r   r   _mtia_deviceSynchronizer   r   r   r   synchronizen   r;   r?   c                   C   r   )z,Return the number of MTIA devices available.)r   r   _accelerator_hooks_device_countr   r   r   r   r<   s   r;   r<   c                   C   r   )z0Return the index of a currently selected device.)r   r   %_accelerator_hooks_get_current_devicer   r   r   r   current_devicex   r;   rB   r   c                 C      t jt| ddS )aS  Return the currently selected :class:`Stream` for a given device.

    Args:
        device (torch.device or int, optional): selected device. Returns
            the currently selected :class:`Stream` for the current device, given
            by :func:`~torch.mtia.current_device`, if :attr:`device` is ``None``
            (default).
    Toptional)r   r   _mtia_getCurrentStreamr   r   r   r   r   current_stream}      	rH   c                 C   rC   )a=  Return the default :class:`Stream` for a given device.

    Args:
        device (torch.device or int, optional): selected device. Returns
            the default :class:`Stream` for the current device, given by
            :func:`~torch.mtia.current_device`, if :attr:`device` is ``None``
            (default).
    TrD   )r   r   _mtia_getDefaultStreamr   rG   r   r   r   default_stream   rI   rK   streamc                 C   s   | du rdS t j|  dS )a  Set the current stream.This is a wrapper API to set the stream.
        Usage of this function is discouraged in favor of the ``stream``
        context manager.

    Args:
        stream (Stream): selected stream. This function is a no-op
            if this argument is ``None``.
    N)r   r   _mtia_setCurrentStreamrL   r   r   r   
set_stream   s   	rO   c                   @   s<   e Zd ZdZd efddZdd Zdededefd	d
ZdS )r   zContext-manager that changes the selected device.

    Args:
        device (torch.device or int): device index to select. It's a no-op if
            this argument is a negative integer or ``None``.
    c                 C   s   t |dd| _d| _d S )NTrD   )r   idxprev_idx)selfr   r   r   r   __init__   s   
zdevice.__init__c                 C   s   t j| j| _d S r   )r   r   (_accelerator_hooks_maybe_exchange_devicerQ   rR   )rS   r   r   r   	__enter__   s   zdevice.__enter__typevalue	tracebackc                 C   s   t j| j| _dS )NF)r   r   rU   rR   rQ   )rS   rW   rX   rY   r   r   r   __exit__   s   zdevice.__exit__N)r7   r8   r9   __doc__r   rT   rV   rZ   r   r   r   r   r      s
    c                   @   sN   e Zd ZU dZed ed< ded fddZdd Zd	ed
edefddZ	dS )StreamContexta  Context-manager that selects a given stream.

    All MTIA kernels queued within its context will be enqueued on a selected
    stream.

    Args:
        Stream (Stream): selected stream. This manager is a no-op if it's
            ``None``.
    .. note:: Streams are per-device.
    torch.mtia.Stream
cur_streamrL   c                 C   sn   || _ td d| _tj s| jd u rd| _tj sd ntjd | _tj s.d | _	d S tjd | _	d S )NTrP   )
rL   r   rQ   r   jitis_scriptingmtiarK   src_prev_streamdst_prev_stream)rS   rL   r   r   r   rT      s   


zStreamContext.__init__c                 C   s   | j }|d u s| jdkrd S tjd | _| jj|jkr9t|j tj|j| _W d    n1 s4w   Y  tj| d S NrP   )	rL   rQ   r   ra   rH   rb   r   rc   rO   )rS   r^   r   r   r   rV      s   zStreamContext.__enter__rW   rX   rY   c                 C   sJ   | j }|d u s| jdkrd S | jj|jkrtj| j tj| j d S rd   )rL   rQ   rb   r   r   ra   rO   rc   )rS   rW   rX   rY   r^   r   r   r   rZ      s   zStreamContext.__exit__N)
r7   r8   r9   r[   r   __annotations__rT   rV   r   rZ   r   r   r   r   r\      s   
 r\   r]   c                 C   s   t | S )a+  Wrap around the Context-manager StreamContext that selects a given stream.

    Arguments:
        stream (Stream): selected stream. This manager is a no-op if it's
            ``None``.
    ..Note:: In eager mode stream is of type Stream class while in JIT it doesn't support torch.mtia.stream
    )r\   rN   r   r   r   rL      s   )r   r=   r   r?   r<   rB   rH   rK   rO   rL   r   )r   Nr   )5r[   	threadingtypingr   r   r   r   r   r   r   r   torch.typesr	   r"   r   _devicer   _utilsr   r   r   r   r.   int	_device_tEventStreamr   r   re   localr$   Lockr%   r*   r   r   boolr   r   r-   r0   r'   r=   r?   r<   rB   rH   rK   rO   r\   rL   __all__r   r   r   r   <module>   sH   $
0
9