U
    ©Ê¹j‡  ã                	   @   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dd	d
dddddg	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S )!é    )ÚIterableÚListÚUnionNé   )ÚTensoré   )Ú
_lazy_callÚ
_lazy_initÚcurrent_deviceÚdevice_countÚget_rng_stateÚget_rng_state_allÚset_rng_stateÚset_rng_state_allÚmanual_seedÚmanual_seed_allÚseedÚseed_allÚinitial_seedÚcuda)ÚdeviceÚreturnc                 C   sZ   t ƒ  t| tƒrt | ¡} nt| tƒr2t d| ¡} | j}|dkrFtƒ }tjj	| }| 
¡ S )aS  Returns 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: ``'cuda'`` (i.e., ``torch.device('cuda')``, the current CUDA device).

    .. warning::
        This function eagerly initializes CUDA.
    r   N)r	   Ú
isinstanceÚstrÚtorchr   ÚintÚindexr
   r   Údefault_generatorsZ	get_state)r   ÚidxÚdefault_generator© r    úP/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/cuda/random.pyr      s    


)r   c                  C   s&   g } t tƒ ƒD ]}|  t|ƒ¡ q| S )zRReturns a list of ByteTensor representing the random number states of all devices.)Úranger   Úappendr   )ÚresultsÚir    r    r!   r   *   s    )Ú	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 )a0  Sets 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: ``'cuda'`` (i.e., ``torch.device('cuda')``, the current CUDA 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!   ÚcbD   s
    zset_rng_state.<locals>.cbN)
r   Z_CZ_DisableFuncTorchÚcloneZcontiguous_formatr   r   r   r   r   )r&   r   r*   r    r)   r!   r   3   s    


)Ú
new_statesr   c                 C   s    t | ƒD ]\}}t||ƒ qdS )z–Sets the random number generator state of all devices.

    Args:
        new_states (Iterable of torch.ByteTensor): The desired state for each deviceN)Ú	enumerater   )r,   r%   Ústater    r    r!   r   N   s    )r   r   c                    s$   t ˆ ƒ‰ ‡ fdd„}t|dd� dS )a�  Sets the seed for generating random numbers for the current GPU.
    It's safe to call this function if CUDA 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   r   r(   ©r   r    r!   r*   e   s    zmanual_seed.<locals>.cbTr/   N©r   r   ©r   r*   r    r/   r!   r   W   s    c                    s$   t ˆ ƒ‰ ‡ fdd„}t|dd� dS )zÖSets the seed for generating random numbers on all GPUs.
    It's safe to call this function if CUDA 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*   w   s    zmanual_seed_all.<locals>.cbT)r   Nr0   r1   r    r/   r!   r   m   s    c                  C   s   dd„ } t | ƒ dS )at  Sets the seed for generating random numbers to a random number for the current GPU.
    It's safe to call this function if CUDA 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      s    
c                  C   s   dd„ } t | ƒ dS )z¸Sets the seed for generating random numbers to a random number on all GPUs.
    It's safe to call this function if CUDA 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   r   r   )Zrandom_seedZseededr%   r   r    r    r!   r*   —   s    zseed_all.<locals>.cbNr2   r3   r    r    r!   r   ‘   s    c                  C   s    t ƒ  tƒ } tjj|  }| ¡ S )zzReturns the current random seed of the current GPU.

    .. warning::
        This function eagerly initializes CUDA.
    )r	   r
   r   r   r   r   r(   r    r    r!   r   ¦   s    )r   )r   )Útypingr   r   r   r   Ú r   r   r	   r
   r   Ú__all__r   r   r   r   r   r   r   r   r   r   r   r   r    r    r    r!   Ú<module>   s6   ÷
 ÿ þ	