Source code for graphix.rng

"""Provide a default random-number generator if `None` is given."""

from __future__ import annotations

import threading
import warnings
from typing import TYPE_CHECKING

import numpy as np

if TYPE_CHECKING:
    from numpy.random import Generator

_rng_local = threading.local()


[docs] def ensure_rng(rng: Generator | None = None, *, stacklevel: int = 1) -> Generator: """Return a default random-number generator if ``None`` is given. Parameters ---------- rng: Generator | None, optional If set and not ``None``, this value is returned. If ``None`` (the default), the default random-number generator is returned. stacklevel : int, optional Stack level to use for warnings. Defaults to 1, meaning that warnings are reported at this function's call site. Notes ----- A warning is issued if the default random-number generator is used. """ if rng is not None: return rng warnings.warn( "Default random-number generator is used. Results may not be reproducible.", stacklevel=stacklevel + 1 ) stored: Generator | None = getattr(_rng_local, "rng", None) if stored is not None: return stored rng = np.random.default_rng() # MEMO: Cannot perform type check setattr(_rng_local, "rng", rng) # noqa: B010 return rng