
    ǄgQ=                     .   U d Z ddlZddlZddlm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ZddlmZ ddlmZmZ ddlmZ dd	lmZmZ d
a ej4                         Z ej8                         Zg ae	eeg df   e	e   f      e d<    e!ejD                  dd       Z#eeee$df   Z% e       a&dZ'eejD                  jP                     e d<   de)fdZ* e*       rCejD                  jV                  Z+ejD                  jX                  Z-ejD                  j\                  Z/n ed      Z+de$de$fdZ-de$de$fdZ/ ed      de$fd       Z0de)fdZ1d Z2d Z3d Z4d Z5d Z6 G d d      Z7 G d  d      Z G d! d"e      Z8de%ddfd#Z9d9de
e%   defd$Z: ed      d9de
e%   deeef   fd%       Z;d9de
e%   de+fd&Z<de$fd'Z=dee$eej                  f   dej                  fd(Z> G d) d*      Z?d+e
d,   de?fd-Z@d. ZAd+efd/ZBd9de
e%   defd0ZCd9de%ddfd1ZDdej                  dejD                  jP                  fd2ZE	 d:d3e$dee$eej                  f   ddfd4ZFd:dee$eej                  f   de$fd5ZGdd6lHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQ dd7lRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[ g d8Z\y);z
This package introduces support for the XPU backend, specifically tailored for
Intel GPU optimization.

This package is lazily initialized, so you can always import it, and use
:func:`is_available()` to determine if your system supports XPU.
    N)	lru_cache)AnyCallableDictListOptionalTupleUniondevice)_dummy_type_LazySeedTracker   )_get_device_index)EventStreamF_queued_calls_xpu_isInBadForkc                       yNF r       Z/home/mcse/projects/flask_80/flask-venv/lib/python3.12/site-packages/torch/xpu/__init__.py<lambda>r      s    r   r   default_generatorsreturnc                  6    t         j                  j                  S )z(Return true if compile with XPU support.)torch_C_has_xpur   r   r   _is_compiledr!   #   s    88r   _XpuDevicePropertiesr   c                     t        d      Nz(PyTorch was compiled without XPU supportNotImplementedErrorr   s    r   _exchange_devicer'   0       !"LMMr   c                     t        d      r$   r%   r   s    r   _maybe_exchange_devicer*   3   r(   r   )maxsizec                  T    t               syt        j                  j                         S )z*Return the number of XPU device available.r   )r!   r   r   _xpu_getDeviceCountr   r   r   device_countr.   7   s     >88''))r   c                      t               dkD  S )z7Return a bool indicating if XPU is currently available.r   )r.   r   r   r   is_availabler0   ?   s     >Ar   c                       y)zKReturn a bool indicating if the current XPU device supports dtype bfloat16.Tr   r   r   r   is_bf16_supportedr2   E   s    r   c                  (    t         xr t                S )z8Return whether PyTorch's XPU state has been initialized.)_initialized_is_in_bad_forkr   r   r   is_initializedr6   J   s    1 111r   c                 f   t               r |         y |j                  dd      r)t        j                  | t	        j
                                y |j                  dd      r)t        j                  | t	        j
                                y t        j                  | t	        j
                         f       y )Nseed_allFseed)	r6   get_lazy_seed_trackerqueue_seed_all	tracebackformat_stack
queue_seedr   append)callablekwargss     r   
_lazy_callrC   O   s{    
 ::j%(--h	8N8N8PQZZ&))(I4J4J4LM   (I,B,B,D!EFr   c                      t                y)zInitialize PyTorch's XPU state.
    This is a Python API about lazy initialization that avoids initializing
    XPU until the first time it is accessed. Does nothing if the XPU state is
    already initialized.
    N)
_lazy_initr   r   r   initrF   ]   s	     Lr   c            	         t               st        t        d      ry t        5  t               r
	 d d d        y t	               rt        d      t               st        d      t        j                  j                          dt        _        t        j                         D ]  } | st        j                  |         	 t        D ]  \  }}	  |         	 t'        t        d       dad d d        y # t         $ r1}dt#        |       ddj%                  |       }t!        |      |d }~ww xY w# t'        t        d       w xY w# 1 sw Y   y xY w)Nis_initializingzuCannot re-initialize XPU in forked subprocess. To use XPU with multiprocessing, you must use the 'spawn' start methodz#Torch not compiled with XPU enabledTz5XPU call failed lazily at initialization with error: z'

XPU call was originally invoked at:

 )r6   hasattr_tls_initialization_lockr5   RuntimeErrorr!   AssertionErrorr   r   	_xpu_initrH   r;   	get_callsr   r@   	Exceptionstrjoindelattrr4   )callsqueued_callorig_tracebackemsgs        r   rE   rE   f   sL   74):;	 # 	# # I  ~ !FGG  $'113 	,E$$U+	,	-/< 0+^0M0 D+,G# #6 ! 0OPSTUPVx XBBD''.BYAZ\  $C.a/0 D+,E# #sS   E A,E $E <D+	C.D+E .	D(7,D##D((D++D==E  E	c                   2    e Zd ZdefdZd ZdededefdZy)	_DeviceGuardindexc                      || _         d| _        y N)idxprev_idx)selfr\   s     r   __init__z_DeviceGuard.__init__   s    r   c                 `    t         j                  j                  | j                        | _        y Nr   xpur'   r`   ra   rb   s    r   	__enter__z_DeviceGuard.__enter__       		22488<r   typevaluer=   c                 `    t         j                  j                  | j                        | _        yr   r   rg   r*   ra   r`   rb   rk   rl   r=   s       r   __exit__z_DeviceGuard.__exit__       9933DMMBr   N)__name__
__module____qualname__intrc   ri   r   rp   r   r   r   r[   r[      s-    c =S   r   r[   c                   6    e Zd ZdZd efdZd ZdededefdZy)	r   zContext-manager that changes the selected device.

    Args:
        device (torch.device or int or str): device index to select. It's a no-op if
            this argument is a negative integer or ``None``.
    c                 6    t        |d      | _        d| _        y )NToptionalr_   )r   r`   ra   )rb   r   s     r   rc   zdevice.__init__   s    $Vd;r   c                 `    t         j                  j                  | j                        | _        y re   rf   rh   s    r   ri   zdevice.__enter__   rj   r   rk   rl   r=   c                 `    t         j                  j                  | j                        | _        yr   rn   ro   s       r   rp   zdevice.__exit__   rq   r   N)rr   rs   rt   __doc__r   rc   ri   rp   r   r   r   r   r      s2    s =S   r   c                   "     e Zd ZdZ fdZ xZS )	device_ofa  Context-manager that changes the current device to that of given object.

    You can use both tensors and storages as arguments. If a given object is
    not allocated on a XPU, this is a no-op.

    Args:
        obj (Tensor or Storage): object allocated on the selected device.
    c                 `    |j                   r|j                         nd}t        |   |       y r^   )is_xpu
get_devicesuperrc   )rb   objr`   	__class__s      r   rc   zdevice_of.__init__   s$    "%**cnn"r   )rr   rs   rt   r|   rc   __classcell__)r   s   @r   r~   r~      s     r   r~   c                 x    t                t        |       } | dk\  r t        j                  j	                  |        yy)zSet the current device.

    Args:
        device (torch.device or int or str): selected device. This function is a
            no-op if this argument is negative.
    r   N)rE   r   r   r   _xpu_setDevicer   s    r   
set_devicer      s1     Lv&F{' r   c                 ,    t        |       j                  S )a  Get the name of a device.

    Args:
        device (torch.device or int or str, optional): device for which to
            return the name. This function is a no-op if this argument is a
            negative integer. It uses the current device, given by :func:`~torch.xpu.current_device`,
            if :attr:`device` is ``None`` (default).

    Returns:
        str: the name of the device
    )get_device_propertiesnamer   s    r   get_device_namer      s     !(---r   c                     t        |       }t        |      D ci c]!  }|j                  d      r|t        ||      # c}S c c}w )a  Get the xpu capability of a device.

    Args:
        device (torch.device or int or str, optional): device for which to
            return the device capability. This function is a no-op if this
            argument is a negative integer. It uses the current device, given by
            :func:`~torch.xpu.current_device`, if :attr:`device` is ``None``
            (default).

    Returns:
        Dict[str, Any]: the xpu capability dictionary of the device
    __)r   dir
startswithgetattr)r   propsprops      r   get_device_capabilityr      sG     "&)E/25z'+QUAVgeT""  s
   AAc                     t                t        | d      } | dk  s| t               k\  rt        d      t	        |       S )zGet the properties of a device.

    Args:
        device (torch.device or int or str): device for which to return the
            properties of the device.

    Returns:
        _XpuDeviceProperties: the properties of the device
    Trx   r   zInvalid device index)rE   r   r.   rN   _get_device_propertiesr   s    r   r   r      s<     Lv5FzV|~-344!&))r   c                  R    t                t        j                  j                         S )z0Return the index of a currently selected device.)rE   r   r   _xpu_getDevicer   r   r   current_devicer     s    L88""$$r   c                     t        | t              rt        j                  |       } | S t        | t              rt        j                  d|       } | S )zReturn the torch.device type object from the passed in device.

    Args:
        device (torch.device or int or str): selected device.
    rg   )
isinstancerR   r   r   ru   r   s    r   _get_devicer     sD     &#f% M 
FC	 eV,Mr   c                   N    e Zd ZU dZed   ed<   ded   fdZd Zdeded	efd
Z	y)StreamContexta  Context-manager that selects a given stream.

    All XPU 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.xpu.Stream
cur_streamstreamc                 \    || _         t        d d      | _        | j                  d| _        y y )NTr_   )r   r   r`   )rb   r   s     r   rc   zStreamContext.__init__!  s-    $T4088DH r   c                    | j                   }|| j                  dk(  ry t        j                  j	                  d       | _        | j
                  j                  |j                  k7  rLt        |j                        5  t        j                  j	                  |j                        | _        d d d        t        j                  j                  |       y # 1 sw Y   )xY wr^   )	r   r`   r   rg   current_streamsrc_prev_streamr   dst_prev_stream
set_stream)rb   r   s     r   ri   zStreamContext.__enter__'  s    [[
R$yy77= &&**;*;;
))* S',yy'?'?
@Q@Q'R$S		Z(S Ss   ;/CCrk   rl   r=   c                 *   | j                   }|| j                  dk(  ry | j                  j                  |j                  k7  r)t        j
                  j                  | j                         t        j
                  j                  | j                         y r^   )r   r`   r   r   r   rg   r   r   )rb   rk   rl   r=   r   s        r   rp   zStreamContext.__exit__3  sj    [[
R &&**;*;;II  !5!56		T112r   N)
rr   rs   rt   r|   r   __annotations__rc   ri   r   rp   r   r   r   r   r     sF    	 +,,x(:; 
)3S 3 3 3r   r   r   r   c                     t        |       S )zWrap 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``.
    )r   r   s    r   r   r   >  s       r   c                 H    t         j                  j                  | ||       y)a  set stream specified by the stream id, device index and device type

    Args: stream_id (int): not visible to the user, used to assigned to the specific stream.
          device_index (int): selected device index.
          device_type (int): selected device type.
    	stream_iddevice_indexdevice_typeN)r   r   _xpu_setStreamr   s      r   _set_stream_by_idr   G  s$     
HH!  r   c                 v    | yt                t        | j                  | j                  | j                         y)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``.
    Nr   )rE   r   r   r   r   r   s    r   r   r   U  s4     ~L""((&&r   c                     t                t        j                  j                  t	        | d            }t        |d   |d   |d         S )aR  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.xpu.current_device`, if :attr:`device` is ``None``
            (default).
    Trx   r   r      r   )rE   r   r   _xpu_getCurrentStreamr   r   )r   
streamdatas     r   r   r   h  sJ     L//&40J Q-jmTU r   c                 n    t                t        | d      } t        j                  j	                  |       S )a*  Wait for all kernels in all streams on a XPU device to complete.

    Args:
        device (torch.device or int, optional): device for which to synchronize.
            It uses the current device, given by :func:`~torch.xpu.current_device`,
            if :attr:`device` is ``None`` (default).
    Trx   )rE   r   r   r   _xpu_synchronizer   s    r   synchronizer   z  s*     Lv5F88$$V,,r   c                 l    | j                   }|
t               }t        j                  j                  |   S )zuReturn the XPU Generator object for the given device.

    Args:
        device (torch.device): selected device.
    )r\   r   r   rg   r   )r   r`   s     r   _get_generatorr     s/     ,,C
{99'',,r   offsetc                 @     t        |       fd}t        |       y)a$  Set the random number generator state offset of the specified GPU.

    Args:
        offset (int): The desired offset
        device (torch.device or int, optional): The device to set the RNG state.
            Default: ``'xpu'`` (i.e., ``torch.device('xpu')``, the current XPU device).
    c                  >    t              } | j                         y re   )r   
set_offset)default_generatorfinal_devicer   s    r   cbz!_set_rng_state_offset.<locals>.cb  s    *<8$$V,r   N)r   rC   )r   r   r   r   s   `  @r   _set_rng_state_offsetr     s     v&L- rNr   c                 b    t                t        |       }t        |      }|j                         S )aL  Return the random number generator state offset of the specified GPU.

    Args:
        device (torch.device or int, optional): The device to return the RNG state offset of.
            Default: ``'xpu'`` (i.e., ``torch.device('xpu')``, the current XPU device).

    .. warning::
        This function eagerly initializes XPU.
    )rE   r   r   
get_offset)r   r   r   s      r   _get_rng_state_offsetr     s-     Lv&L&|4''))r   )	empty_cachemax_memory_allocatedmax_memory_reservedmemory_allocatedmemory_reservedmemory_statsmemory_stats_as_nested_dictreset_accumulated_memory_statsreset_peak_memory_stats)	get_rng_stateget_rng_state_allinitial_seedmanual_seedmanual_seed_allr9   r8   set_rng_stateset_rng_state_all)(r   r   r   r   r   r   r   r~   r.   r   r   r   r   r   r   
get_streamrF   r   r0   r2   r6   r   r   r   r   r   r   r   r   r   r   r9   r8   r   r   r   r   r   streamsr   re   )rg   )]r|   	threadingr=   	functoolsr   typingr   r   r   r   r   r	   r
   r   torch._Cr   _devicetorch._utilsr   r   _utilsr   r   r   r   r4   localrK   LockrL   r   rR   r   r   r   r5   ru   	_device_tr;   r   	Generatorboolr!   r"   _xpu_exchangeDevicer'   _xpu_maybeExchangeDevicer*   r.   r0   r2   r6   rC   rF   rE   r[   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   memoryr   r   r   r   r   r   r   r   r   randomr   r   r   r   r   r9   r8   r   r   __all__r   r   r   <module>r      sX      D D D   # 6 % " y%y~~'   t	(2t8
d3i
'(  %(($6F'3T)*	%' 02 E%((,,- 2d 
 > 8888xx33"XX>> ''=>N N NNs Ns N 1*c * *d 
2
G'T
 
 ( 
(y 
(T 
(.HY/ .3 . 4(9"5 c3h  &*(9"5 *AU *"% %
c345 
%,, 
'3 '3T!8./ !M !v &8I. & $
-	 
-T 
-	-5<< 	-EHH,>,> 	- :?sC56	&*%S%,,(>"? *C *"
 
 

 
 
)r   