U
    Mh|                  	   @   s  d dl mZmZmZ d dlZddlmZ ddlmZmZm	Z	m
Z
 deeeejf edd	d
Zee dddZd eeeeejf ddddZee ddddZeddddZeddddZddddZddddZedddZd
ddddddddg	ZdS )!    )IterableListUnionN   )Tensor   )
_lazy_call
_lazy_initcurrent_devicedevice_countxpu)devicereturnc                 C   sZ   t   t| trt| } nt| tr2td| } | j}|dkrFt }tjj	| }|
 S )aN  Return the random number generator state of the specified GPU as a ByteTensor.

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

    .. warning::
        This function eagerly initializes XPU.
    r   N)r	   
isinstancestrtorchr   intindexr
   r   default_generatorsZ	get_state)r   idxdefault_generator r   B/var/www/html/venv/lib/python3.8/site-packages/torch/xpu/random.pyget_rng_state	   s    


r   )r   c                  C   s&   g } t t D ]}| t| q| S )zQReturn a list of ByteTensor representing the random number states of all devices.)ranger   appendr   )resultsir   r   r   get_rng_state_all   s    r   )	new_stater   r   c              	      sj   t j  | jt jdW 5 Q R X t tr:t   nt trPt d   fdd}t	| dS )a,  Set the random number generator state of the specified GPU.

    Args:
        new_state (torch.ByteTensor): The desired state
        device (torch.device or int, optional): The device to set the RNG state.
            Default: ``'xpu'`` (i.e., ``torch.device('xpu')``, the current XPU device).
    )Zmemory_formatr   c                     s.    j } | d krt } tjj|  }| d S N)r   r
   r   r   r   Z	set_stater   r   r   Znew_state_copyr   r   cb8   s
    zset_rng_state.<locals>.cbN)
r   Z_CZ_DisableFuncTorchcloneZcontiguous_formatr   r   r   r   r   )r   r   r#   r   r"   r   set_rng_state'   s    


r%   )
new_statesr   c                 C   s    t | D ]\}}t|| qdS )zSet the random number generator state of all devices.

    Args:
        new_states (Iterable of torch.ByteTensor): The desired state for each device.
    N)	enumerater%   )r&   r   stater   r   r   set_rng_state_allB   s    r)   )seedr   c                    s$   t    fdd}t|dd dS )a  Set the seed for generating random numbers for the current GPU.

    It's safe to call this function if XPU is not available; in that case, it is silently ignored.

    Args:
        seed (int): The desired seed.

    .. warning::
        If you are working with a multi-GPU model, this function is insufficient
        to get determinism.  To seed all GPUs, use :func:`manual_seed_all`.
    c                     s    t  } tjj|  }|  d S r    )r
   r   r   r   manual_seedr!   r*   r   r   r#   Z   s    zmanual_seed.<locals>.cbTr,   Nr   r   r*   r#   r   r,   r   r+   L   s    r+   c                    s$   t    fdd}t|dd dS )zSet the seed for generating random numbers on all GPUs.

    It's safe to call this function if XPU is not available; in that case, it is silently ignored.

    Args:
        seed (int): The desired seed.
    c                     s*   t t D ]} tjj|  }|  q
d S r    )r   r   r   r   r   r+   )r   r   r,   r   r   r#   l   s    zmanual_seed_all.<locals>.cbT)seed_allNr-   r.   r   r,   r   manual_seed_allb   s    r0   c                  C   s   dd } t |  dS )ao  Set the seed for generating random numbers to a random number for the current GPU.

    It's safe to call this function if XPU is not available; in that case, it is silently ignored.

    .. warning::
        If you are working with a multi-GPU model, this function will only initialize
        the seed on one GPU.  To initialize all GPUs, use :func:`seed_all`.
    c                  S   s   t  } tjj|  }|  d S r    )r
   r   r   r   r*   r!   r   r   r   r#   ~   s    zseed.<locals>.cbNr   r#   r   r   r   r*   t   s    
r*   c                  C   s   dd } t |  dS )zSet the seed for generating random numbers to a random number on all GPUs.

    It's safe to call this function if XPU is not available; in that case, it is silently ignored.
    c                  S   sL   d} d}t t D ]4}tjj| }|s<|  | } d}q||  qd S )Nr   FT)r   r   r   r   r   r*   initial_seedr+   )Zrandom_seedZseededr   r   r   r   r   r#      s    zseed_all.<locals>.cbNr1   r2   r   r   r   r/      s    r/   c                  C   s    t   t } tjj|  }| S )zxReturn the current random seed of the current GPU.

    .. warning::
        This function eagerly initializes XPU.
    )r	   r
   r   r   r   r3   r!   r   r   r   r3      s    r3   )r   )r   )typingr   r   r   r    r   r   r	   r
   r   r   r   r   r   r   r%   r)   r+   r0   r*   r/   r3   __all__r   r   r   r   <module>   s6   	  
