o
    h                     @   s   d dl Z d dlmZ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 ed	d
rBd dlm  mZ d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)ListOptionalUnion   )AcceleratorState   )CUDA_DISTRIBUTED_TYPES)DistributedTypeRNGType)is_npu_availableis_tpu_availableis_xpu_availableF)check_deviceseeddevice_specificc                 C   s|   |r| t  j7 } t|  tj|  t|  t r"tj	|  nt
 r,tj	|  ntj	|  t r<t|  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`.
    N)r   process_indexrandomr   nptorchmanual_seedr   xpumanual_seed_allr   npucudar   xmset_rng_state)r   r    r   M/var/www/html/ai/venv/lib/python3.10/site-packages/accelerate/utils/random.pyset_seed   s   


r   rng_type	generatorc                 C   s  | t jkr
t }nT| t jkrtj }nI| t jkr)t s!J dtt	 }n5| t j
kr;t s5J dtj }n#| t jkrMt sGJ dtj }n| t jkr^|d usZJ d| }t }|jtjkr}|t	 }t	|g t	  | }n0|jtv s|jtjks|jtjkr||j}tj |d | }n|jtj!krtj |d | t jkrt"| d S | t jkrtj"| d S | t j
krtj"| d S | t jkrtj"| d S | t jkrt	"|#  d S | t jkr|$| d S d S )Nz;Can't synchronize XLA seeds on an environment without TPUs.z;Can't synchronize NPU seeds on an environment without NPUs.z;Can't synchronize XPU seeds on an environment without XPUs.z)Need a generator to synchronize its seed.r   )%r
   TORCHr   get_rng_stateCUDAr   XLAr   tensorr   NPUr   r   XPUr   r   	GENERATOR	get_stater   distributed_typer	   TPUto
xla_devicecollective_broadcast	mark_stepcpur   	MULTI_NPU	MULTI_XPUdevicedistributed	broadcast	MULTI_CPUr   item	set_state)r   r    	rng_statestater   r   r   synchronize_rng_state9   sV   















r;   	rng_typesc                 C   s   | D ]
}t t||d qd S )N)r    )r;   r
   )r<   r    r   r   r   r   synchronize_rng_statesm   s   r=   )F)NN)N)r   typingr   r   r   numpyr   r   r:   r   	constantsr   dataclassesr	   r
   importsr   r   r   torch_xla.core.xla_modelcore	xla_modelr   intboolr   	Generatorr;   strr=   r   r   r   r   <module>   s   
*4