Source code for hetero.stims.utils
from numpy.random import MT19937, Generator, RandomState, default_rng
from typing import Union
import numpy as np
import numbers
__global_rg = default_rng()
[docs]
def get_seed(seed=None):
if seed is None:
return 2026 # a fixed seed to prevent progression of the rng
else:
return seed
[docs]
def rand_generator(seed: Union[int, Generator, RandomState] = None) -> Generator:
if seed is None:
return __global_rg
# provided to support legacy RandomState generator
# of Numpy. It is not the best thing to do however
# and recommend the user to keep using integer seeds
# and proper Numpy Generator API.
if isinstance(seed, RandomState):
mt19937 = MT19937()
mt19937.state = seed.get_state()
return Generator(mt19937)
if isinstance(seed, Generator):
return seed
else:
return default_rng(seed)
[docs]
def check_vector(array, allow_reshape=True, allow_timespans=True, caller=None):
msg = "."
if caller is not None:
if hasattr(caller, "name"):
msg = f" in {caller.name}."
else:
msg = f"in {caller}."
if not isinstance(array, np.ndarray):
# maybe a single number, make it an array
if isinstance(array, numbers.Number):
array = np.asarray(array)
else:
msg = (
f"Data type '{type(array)}' not understood. All vectors "
f"should be Numpy arrays" + msg
)
raise TypeError(msg)
if not (np.issubdtype(array.dtype, np.number)):
msg = f"Impossible to operate on non-numerical data, in array: {array}" + msg
raise TypeError(msg)
if allow_reshape:
array = np.atleast_2d(array)
if not allow_timespans:
if array.shape[0] > 1:
msg = (
f"Impossible to operate on multiple timesteps. Data should"
f" have shape (1, n) but is {array.shape}" + msg
)
raise ValueError(msg)
# TODO: choose axis to expand and/or np.atleast_2d
return array