U
    ªÊ¹j2  ã                   @   s¬   d dl Z d dlmZ d dlZd dlmZ d dlZejddœdd„Zejdœdd	„Z	ej
jdœd
d„Zedœdd„Zddœdd„Zedœdd„Zdae jdedœdd„ƒZdS )é    N)Ú	Generator)Údefault_generator)Ú	new_stateÚreturnc                 C   s   t  | ¡ dS )zýSets the random number generator state.

    .. note: This function only works for CPU. For CUDA, please use
             torch.manual_seed(seed), which works for both CPU and CUDA.

    Args:
        new_state (torch.ByteTensor): The desired state
    N)r   Z	set_state)r   © r   úK/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/random.pyÚset_rng_state	   s    	r   )r   c                   C   s   t  ¡ S )zBReturns the random number generator state as a `torch.ByteTensor`.)r   Z	get_stater   r   r   r   Úget_rng_state   s    r	   c                 C   sV   t | ƒ} ddl}|j ¡ s&|j | ¡ ddl}|j ¡ sD|j | ¡ t| ƒ t	 | ¡S )a�  Sets the seed for generating random numbers. Returns a
    `torch.Generator` object.

    Args:
        seed (int): The desired seed. Value must be within the inclusive range
            `[-0x8000_0000_0000_0000, 0xffff_ffff_ffff_ffff]`. Otherwise, a RuntimeError
            is raised. Negative inputs are remapped to positive values with the formula
            `0xffff_ffff_ffff_ffff + seed`.
    r   N)
ÚintÚ
torch.cudaÚcudaÚ_is_in_bad_forkÚmanual_seed_allÚ	torch.mpsÚmpsÚmanual_seedÚ_seed_custom_devicer   ©ÚseedÚtorchr   r   r   r      s    


r   c                  C   sP   t  ¡ } ddl}|j ¡ s&|j | ¡ ddl}|j ¡ sD|j | ¡ t	| ƒ | S )zˆSets the seed for generating random numbers to a non-deterministic
    random number. Returns a 64 bit number used to seed the RNG.
    r   N)
r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   3   s    

r   c                 C   sš   t | ƒ} tj ¡ }tt|ƒr–tt|ƒ}d}d}t||ƒr^t||ƒr^t||ƒƒ s–t||ƒ| ƒ n8d|› d�}|d|› d|› d|› d�7 }tj|td	d
� dS )z­Sets the seed to generate random numbers for custom device.

    Args:
        seed (int): The desired seed.

    See [Note: support the custom device with privateuse1]
    r   r   zSet seed for `z0` device does not take effect, please add API's ú`z` and `z` to `z` device module.é   )Ú
stacklevelN)	r
   r   Ú_CZ_get_privateuse1_backend_nameÚhasattrÚgetattrÚwarningsÚwarnÚUserWarning)r   Zcustom_backend_nameZcustom_device_modZ_bad_fork_nameZ_seed_all_nameÚmessager   r   r   r   F   s    


r   c                   C   s   t  ¡ S )zSReturns the initial seed for generating random numbers as a
    Python `long`.
    )r   Úinitial_seedr   r   r   r   r    ]   s    r    FTÚfork_rngÚdevicesr   c                 c   sJ  t  |¡j}tt |dƒ}|dkr4td|› d�d ƒ‚|sBdV  dS | dkrÞ| ¡ }|dkrÐtsÐ| ¡ › d|› d|› d| ¡ › d	| ¡ › d
| ¡ › d| ¡ › d|› d|› d| ¡ › d|› d|› d�}t 	|¡ dat
t|ƒƒ} nt
| ƒ} t  ¡ }g }	| D ]}
|	 | |
¡¡ qöz
dV  W 5 t  |¡ t| |	ƒD ]\}
}| ||
¡ �q,X dS )a‰  
    Forks the RNG, so that when you return, the RNG is reset
    to the state that it was previously in.

    Args:
        devices (iterable of Device IDs): devices for which to fork
            the RNG. CPU RNG state is always forked. By default, :meth:`fork_rng` operates
            on all devices, but will emit a warning if your machine has a lot
            of devices, since this function will run very slowly in that case.
            If you explicitly specify devices, this warning will be suppressed
        enabled (bool): if ``False``, the RNG is not forked.  This is a convenience
            argument for easily disabling the context manager without having
            to delete it and unindent your Python code under it.
        deivce_type (str): device type str, default is `cuda`. As for custom device,
            see details in [Note: support the custom device with privateuse1]
    Nztorch has no module of `z`, you should register z,a module by `torch._register_device_module`.é   z reports that you have z& available devices, and you have used z_ without explicitly specifying which devices are being used. For safety, we initialize *every* zA device by default, which can be quite slow if you have a lot of z5s. If you know that you are only making use of a few z' devices, set the environment variable z_VISIBLE_DEVICES or the 'z' keyword argument of z° with the set of devices you are actually using. For example, if you are using CPU only, set device.upper()_VISIBLE_DEVICES= or devices=[]; if you are using device 0 only, set zb_VISIBLE_DEVICES=0 or devices=[0].  To initialize all devices and suppress this warning, set the 'z#' keyword argument to `range(torch.z.device_count())`.T)r   ÚdeviceÚtyper   ÚRuntimeErrorZdevice_countÚ_fork_rng_warned_alreadyÚupperr   r   ÚlistÚranger	   Úappendr   Úzip)r"   ZenabledÚ_callerZ_devices_kwZdevice_typeZ
device_modZnum_devicesr   Zcpu_rng_stateZdevice_rng_statesr$   Zdevice_rng_stater   r   r   r!   g   s4    ÿd


)NTr!   r"   r   )Ú
contextlibÚtypingr   r   Ztorch._Cr   r   ZTensorr   r	   r   r   r
   r   r   r    r'   Úcontextmanagerr!   r   r   r   r   Ú<module>   s   