o
    Ii	                     @   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mZ e rHd 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_neuron_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	|  nBt
 r,tj	|  n8t r6tj	|  n.t r@tj	|  n$t rJtj	|  nt rTtj	|  nt r^tj	|  ntj	|  t rlt|  |rut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
   hpur   neuroncudar   xmset_rng_stateuse_deterministic_algorithms)r   r   r    r&   K/home/ubuntu/.local/lib/python3.10/site-packages/accelerate/utils/random.pyset_seed(   s2   


r(   rng_type	generatorc                 C   s  | 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 }n}| t jkrMt sGJ dtj }nk| t jkr_t sYJ dtj }nY| t jkrqt skJ dtj }nG| t jkrt s}J dtj }n5| t jkrt sJ 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	'  |( }nW|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s|j"t#j0kr |$|j1}tj23|d
 |( }n|j"t#j4kr.tj23|d
 | t jkr;t5| d S | t jkrItj5| d S | t j
krWtj5| d S | t jkretj5| d S | t jkrstj5| d S | t jkrtj5| d S | t jkrtj5| d S | t jkrtj5| d S | t jkrtj5| d S | t jkrt	5|6  d S | t jkr|7| 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.zFCan't synchronize Neuron seeds on an environment without Neuron Cores.z)Need a generator to synchronize its seed.r   )8r	   TORCHr   get_rng_stateCUDAr"   XLAr   tensorr#   NPUr   r   MLUr   r   SDAAr   r   MUSAr   r   XPUr   r   HPUr
   r    NEURONr   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MULTI_NEURONdevicedistributed	broadcast	MULTI_CPUr$   item	set_state)r)   r*   	rng_statestater&   r&   r'   synchronize_rng_stateQ   s   













rN   	rng_typesc                 C   s   | D ]
}t t||d qd S )N)r*   )rN   r	   )rO   r*   r)   r&   r&   r'   synchronize_rng_states   s   rP   )FF)NN)N)#r   typingr   r   numpyr   r   rM   r   	constantsr   dataclassesr   r	   importsr
   r   r   r   r   r   r   r   torch_xla.core.xla_modelcore	xla_modelr#   intboolr(   	GeneratorrN   liststrrP   r&   r&   r&   r'   <module>   s   ()*R