o
    0iL                     @   s   d dl Z d dlmZmZ d dlZd dlZddlmZ ddl	m
Z
 ddlmZmZ ddlmZmZmZmZmZmZmZ e rFd dlm  mZ dd
ededefddZddee deej fddZddeee ef  deej fddZ!dS )    N)OptionalUnion   )AcceleratorState   )CUDA_DISTRIBUTED_TYPES)DistributedTypeRNGType)is_hpu_availableis_mlu_availableis_musa_availableis_npu_availableis_sdaa_availableis_torch_xla_availableis_xpu_availableFseeddevice_specificdeterministicc                 C   s   |r| t  j7 } t|  tj|  t|  t r"tj	|  n8t
 r,tj	|  n.t r6tj	|  n$t r@tj	|  nt rJtj	|  nt rTtj	|  ntj	|  t rbt|  |rktd dS dS )a  
    Helper function for reproducible behavior to set the seed in `random`, `numpy`, `torch`.

    Args:
        seed (`int`):
            The seed to set.
        device_specific (`bool`, *optional*, defaults to `False`):
            Whether to differ the seed on each device slightly with `self.process_index`.
        deterministic (`bool`, *optional*, defaults to `False`):
            Whether to use deterministic algorithms where available. Can slow down training.
    TN)r   process_indexrandomr   nptorchmanual_seedr   xpumanual_seed_allr   npur   mlur   sdaar   musar
   hpucudar   xmset_rng_stateuse_deterministic_algorithms)r   r   r    r$   Y/sda-disk/www/egybert/egybert_env/lib/python3.10/site-packages/accelerate/utils/random.pyset_seed'   s.   


r&   rng_type	generatorc                 C   s8  | t jkr
t }n| t jkrtj }n| t jkr)t s!J dtt	 }n}| t j
kr;t s5J dtj }nk| t jkrMt sGJ dtj }nY| t jkr_t sYJ dtj }nG| t jkrqt skJ dtj }n5| t jkrt s}J dtj }n#| t jkrt sJ dtj }n| t jkr|d usJ d| }t }|jt jkr|!t	" }t	#|g t	$  |% }nJ|jt&v s|jt j'ks|jt j(ks|jt j)ks|jt j*ks|jt j+ks|jt j,kr|!|j-}tj./|d	 |% }n|jt j0krtj./|d	 | t jkrt1| d S | t jkr*tj1| d S | t j
kr8tj1| d S | t jkrFtj1| d S | t jkrTtj1| d S | t jkrbtj1| d S | t jkrptj1| d S |t jkr~tj1| d S | t jkrt	1|2  d S | t jkr|3| d S d S )
Nz8Can't synchronize XLA seeds as torch_xla is unavailable.z;Can't synchronize NPU seeds on an environment without NPUs.z;Can't synchronize MLU seeds on an environment without MLUs.z=Can't synchronize SDAA seeds on an environment without SDAAs.z=Can't synchronize MUSA seeds on an environment without MUSAs.z;Can't synchronize XPU seeds on an environment without XPUs.z;Can't synchronize HPU seeds on an environment without HPUs.z)Need a generator to synchronize its seed.r   )4r	   TORCHr   get_rng_stateCUDAr    XLAr   tensorr!   NPUr   r   MLUr   r   SDAAr   r   MUSAr   r   XPUr   r   HPUr
   r   	GENERATOR	get_stater   distributed_typer   to
xla_devicecollective_broadcast	mark_stepcpur   	MULTI_MLU
MULTI_SDAA
MULTI_MUSA	MULTI_NPU	MULTI_XPU	MULTI_HPUdevicedistributed	broadcast	MULTI_CPUr"   item	set_state)r'   r(   	rng_statestater$   r$   r%   synchronize_rng_stateN   s   













rJ   	rng_typesc                 C   s   | D ]
}t t||d qd S )N)r(   )rJ   r	   )rK   r(   r'   r$   r$   r%   synchronize_rng_states   s   rL   )FF)NN)N)"r   typingr   r   numpyr   r   rI   r   	constantsr   dataclassesr   r	   importsr
   r   r   r   r   r   r   torch_xla.core.xla_modelcore	xla_modelr!   intboolr&   	GeneratorrJ   liststrrL   r$   r$   r$   r%   <module>   s   $'*L