Ë
    ÿÍ:ju  ã                   ó8  — d dl 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
Z
d dlmZ d dlmZmZmZmZ  e j$                  e«      ZdZd Zdde	e   d	ed
edefd„Zdd„Zddede	e   ddfd„Zdededededee   f
d„Zddedeeef   fd„Z deeef   ddfd„Z!y)é    N)Úgetstate)Úsetstate)ÚAnyÚOptional)Ú_NUMPY_AVAILABLE)Ú	_get_rankÚrank_prefixed_messageÚrank_zero_onlyÚrank_zero_warnl   ÿÿ ÚseedÚworkersÚverboseÚreturnc                 óÒ  — | €At         j                  j                  d«      }|€d} |r7t        d| › �«       n(	 t	        |«      } nt        | t        «      st	        | «      } t        | cxk  r	t        k  sn t        | › dt        › dt        › �«      ‚|r*t        j                  t        d| › �t        «       «      «       t        | «      t         j                  d<   t        j                   | «       t"        rddl}|j                  j!                  | «       t'        j(                  | «       t	        |«      › t         j                  d	<   | S # t
        $ r t        dt        |«      › �«      ‚w xY w)
an  Function that sets the seed for pseudo-random number generators in: torch, numpy, and Python's random module.
    In addition, sets the following environment variables:

    - ``PL_GLOBAL_SEED``: will be passed to spawned subprocesses (e.g. ddp_spawn backend).
    - ``PL_SEED_WORKERS``: (optional) is set to 1 if ``workers=True``.

    Args:
        seed: the integer value seed for global random state in Lightning.
            If ``None``, it will read the seed from ``PL_GLOBAL_SEED`` env variable. If ``None`` and the
            ``PL_GLOBAL_SEED`` env variable is not set, then the seed defaults to 0. If seed is
            not in bounds or cannot be cast to int, a ValueError is raised.
        workers: if set to ``True``, will properly configure all dataloaders passed to the
            Trainer with a ``worker_init_fn``. If the user already provides such a function
            for their dataloaders, setting this argument will have no influence. See also:
            :func:`~lightning_fabric.utilities.seed.pl_worker_init_function`.
        verbose: Whether to print a message on each rank with the seed being set.

    NÚPL_GLOBAL_SEEDr   zNo seed found, seed set to z+Invalid seed specified via PL_GLOBAL_SEED: z& is not in bounds, numpy accepts from z to zSeed set to ÚPL_SEED_WORKERS)ÚosÚenvironÚgetr   ÚintÚ
ValueErrorÚreprÚ
isinstanceÚmin_seed_valueÚmax_seed_valueÚlogÚinfor	   r   ÚstrÚrandomr   r   ÚnumpyÚtorchÚmanual_seed)r   r   r   Úenv_seedÚnps        út/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/lightning_fabric/utilities/seed.pyÚseed_everythingr&      s5  € ð& €|Ü—:‘:—>‘>Ð"2Ó3ˆØÐØˆDÙÜÐ!<¸T¸FÐCÕDðaÜ˜8“}‘ô ˜œcÔ"Ü�4‹yˆä˜dÔ4¤nÔ4Ü˜D˜6Ð!GÌÐGWÐW[Ô\jÐ[kÐlÓmÐmáÜ�‰Ô&¨°d°VÐ'<¼i»kÓJÔKä#& t£9„B‡J�JÐÑ Ü
‡K�K�ÔÝÛà
�	‰	�‰�tÔÜ	×Ñ�dÔä'*¨7£| n„B‡J�JÐ Ñ!à€Køô+ ò aÜ Ð#NÌtÐT\Ë~ÐN^Ð!_Ó`Ð`ðaús   ¸E Å!E&c                  óÜ   — t         j                  j                  dd«      } | €yt         j                  j                  dd«      }t        t	        | «      t        t	        |«      «      d¬«       y)zÚReset the seed to the value that :func:`~lightning_fabric.utilities.seed.seed_everything` previously set.

    If :func:`~lightning_fabric.utilities.seed.seed_everything` is unused, this function will do nothing.

    r   Nr   Ú0F)r   r   )r   r   r   r&   r   Úbool)r   r   s     r%   Ú
reset_seedr*   H   sO   € ô �:‰:�>‰>Ð*¨DÓ1€DØ€|ØÜ�j‰j�n‰nÐ.°Ó4€GÜ”C˜“I¤t¬C°«LÓ'9À5ÖIó    Ú	worker_idÚrankc                 óÔ  — |�|nt         j                  }t        j                  «       }|| z
  }t        j                  d|› d| › d|› �«       t        || |d¬«      }t        j                  |d   «       t        j                  |d   d	z  |d
   z  «       t        rOddl}|j                  j                  || |g«      }|j                  d«      }|j                  j                  |«       yy)a.  The worker_init_fn that Lightning automatically adds to your dataloader if you previously set the seed with
    ``seed_everything(seed, workers=True)``.

    See also the PyTorch documentation on
    `randomness in DataLoaders <https://pytorch.org/docs/stable/notes/randomness.html#dataloader>`_.

    Nz1Initializing random number generators of process z worker z with base seed é   )Úcountr   é   é    é   )r
   r-   r!   Úinitial_seedr   ÚdebugÚ_generate_seed_sequencer"   r   r   r   r    ÚSeedSequenceÚgenerate_state)	r,   r-   Úglobal_rankÚprocess_seedÚ	base_seedÚseed_sequencer$   ÚssÚnp_rng_seeds	            r%   Úpl_worker_init_functionr?   U   sá   € ð Ð*‘$´×0CÑ0C€KÜ×%Ñ%Ó'€Là˜yÑ(€IÜ‡I�IØ
;¸K¸=ÈÐQZÐP[Ð[kÐluÐkvÐwôô ,¨I°yÀ+ÐUVÔW€MÜ	×Ñ�m AÑ&Ô'Ü
‡K�K�˜qÑ! RÑ'¨=¸Ñ+;Ñ;Ô<ÝÛà�Y‰Y×#Ñ# Y°	¸;Ð$GÓHˆØ×'Ñ'¨Ó*ˆà
�	‰	�‰�{Õ#ð r+   r;   r9   r0   c                 óÎ   — | dz  |dz  z  |z  }||dz	  z  }|dz  dz  }||dz	  z  }|dz  dz  }||dz	  z  }g }t        |«      D ]  }|dz  dz   dz  }|j                  |«       Œ  |S )	z�Generates a sequence of seeds from a base seed, worker id and rank using hash-based mixing followed by the
    linear congruential generator (LCG) algorithm.r2   é   é!   l   Í«Z_?�z l   ÿÿÿÿ l   Sl5øgu& l   -*µP�B r1   )ÚrangeÚappend)r;   r,   r9   r0   Úcombined_seedÚseedsÚ_s          r%   r6   r6   q   sª   € ð  "‘_¨°b©Ñ9¸KÑG€Mð �] bÑ(Ñ(€MØ"Ð%7Ñ7¸MÑJ€MØ�] bÑ(Ñ(€MØ"Ð%7Ñ7¸MÑJ€MØ�] bÑ(Ñ(€Mà€EÜ�5‹\ò $ˆà&Ð)<Ñ<¸qÑ@À]ÑSˆØ�‰�]Õ#ð$ð €Lr+   Úinclude_cudac                 ó  — t        j                  «       t        «       dœ}t        r!ddl}|j
                  j                  «       |d<   | rAt         j                  j                  «       rt         j                  j                  «       ng |d<   |S )z\Collect the global random state of :mod:`torch`, :mod:`torch.cuda`, :mod:`numpy` and Python.)r!   Úpythonr   Nr    ú
torch.cuda)
r!   Úget_rng_stateÚpython_get_rng_stater   r    r   Ú	get_stateÚcudaÚis_availableÚget_rng_state_all)rH   Ústatesr$   s      r%   Ú_collect_rng_statesrS   ‡   sl   € ô ×$Ñ$Ó&Ü&Ó(ñ€Fõ ÛàŸ)™)×-Ñ-Ó/ˆˆw‰ÙÜAFÇÁ×AXÑAXÔAZœuŸz™z×;Ñ;Ô=Ð`bˆˆ|ÑØ€Mr+   Úrng_state_dictc                 ó  — t        j                  | d   «       d| v r"t         j                  j                  | d   «       t        r&d| v r"ddl}|j                  j                  | d   «       | d   \  }}}t        |t        |«      |f«       y)zsSet the global random state of :mod:`torch`, :mod:`torch.cuda`, :mod:`numpy` and Python in the current
    process.r!   rK   r    r   NrJ   )
r!   Úset_rng_staterO   Úset_rng_state_allr   r    r   Ú	set_stateÚpython_set_rng_stateÚtuple)rT   r$   ÚversionÚstateÚgausss        r%   Ú_set_rng_statesr^   –   s~   € ô 
×Ñ˜ wÑ/Ô0à�~Ñ%Ü�
‰
×$Ñ$ ^°LÑ%AÔBÝ˜G ~Ñ5Ûà
�	‰	×Ñ˜N¨7Ñ3Ô4Ø*¨8Ñ4Ñ€GˆU�EÜ˜'¤5¨£<°Ð7Õ8r+   )NFT)r   N)N)T)"Úloggingr   r   r   rM   r   rY   Útypingr   r   r!   Ú"lightning_fabric.utilities.importsr   Ú$lightning_fabric.utilities.rank_zeror   r	   r
   r   Ú	getLoggerÚ__name__r   r   r   r   r)   r&   r*   r?   Úlistr6   Údictr   rS   r^   © r+   r%   ú<module>rh      só   ðÛ Û 	Û Ý 3Ý 3ß  ã å ?ß qÓ qà€g×Ñ˜Ó!€ð €Ø€ñ1˜( 3™-ð 1¸ð 1ÐPTð 1Ð`có 1óh
Jñ$ sð $°(¸3±-ð $È4ó $ð8 sð °sð Èð ÐUXð Ð]aÐbeÑ]fó ñ, dð °d¸3À¸8±nó ð9 D¨¨c¨¡Nð 9°tô 9r+   