Source code for ax.utils.common.random
#!/usr/bin/env python3
# Copyright (c) Meta Platforms, Inc. and affiliates.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
# pyre-strict
import random
from contextlib import contextmanager
from typing import Generator, Optional
import numpy as np
import torch
[docs]def set_rng_seed(seed: int) -> None:
"""Sets seeds for random number generators from numpy, pytorch,
and the native random module.
Args:
seed: The random number generator seed.
"""
random.seed(seed)
np.random.seed(seed)
torch.manual_seed(seed)
[docs]@contextmanager
def with_rng_seed(seed: Optional[int]) -> Generator[None, None, None]:
"""Context manager that sets the random number generator seeds
to a given value and restores the previous state on exit.
If the seed is None, the context manager does nothing. This makes
it possible to use the context manager without having to change
the code based on whether the seed is specified.
Args:
seed: The random number generator seed.
"""
if seed is None:
yield
else:
old_state_native = random.getstate()
old_state_numpy = np.random.get_state()
try:
with torch.random.fork_rng():
set_rng_seed(seed)
yield
finally:
random.setstate(old_state_native)
np.random.set_state(old_state_numpy)