o
    !i                     @   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
 g dZdd	eeeejf d
efddZd
ee fddZ	dded	eeeejf d
dfddZdee d
dfddZded
dfddZded
dfddZd ddZd ddZd
ef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rtd| } | j}|du r#t }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    `/var/www/html/eduruby.in/lip-sync/lip-sync-env/lib/python3.10/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   r   	new_statec                    s~   t j  | jt jdW d   n1 sw   Y  t tr't   nt tr2t 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_formatNr   c                     s.    j } | d u 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>.cb)
r   Z_CZ_DisableFuncTorchcloneZcontiguous_formatr   r   r   r   r   )r&   r   r*   r    r)   r!   r   3   s   


r   
new_statesc                 C   s    t | D ]	\}}t|| qdS )zSets 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                    $   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>.cbTr0   Nr   r   r   r*   r    r0   r!   r   W   s   r   c                    r/   )zSets 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   r0   r    r!   r*   w   s   zmanual_seed_all.<locals>.cbT)r   Nr1   r2   r    r0   r!   r   m   s   r   c                  C      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   r3   )zSets 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 ]}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>.cbNr4   r5   r    r    r!   r      s   r   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   )r   N)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>   s*     

	

