Source code for bluecellulab.rngsettings

# Copyright 2023-2024 Blue Brain Project / EPFL

# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at

#     http://www.apache.org/licenses/LICENSE-2.0

# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""RNG settings of bluecellulab."""

import logging

from typing import Optional

import neuron
from bluecellulab.circuit.config.definition import SimulationConfig
from bluecellulab.exceptions import UndefinedRNGException
from bluecellulab.importer import load_mod_files

logger = logging.getLogger(__name__)


[docs] class RNGSettings: """Singleton object that represents RNG settings in bluecellulab.""" _instance = None
[docs] @classmethod def get_instance(cls): """Return the instance of the class.""" if cls._instance is None: cls._instance = cls() return cls._instance
@load_mod_files def __init__( self, mode="Random123", base_seed=0, synapse_seed=0, ionchannel_seed=0, stimulus_seed=0, minis_seed=0, ) -> None: self.mode = mode self.base_seed = base_seed self.synapse_seed = synapse_seed self.ionchannel_seed = ionchannel_seed self.stimulus_seed = stimulus_seed self.minis_seed = minis_seed
[docs] def set_seeds( self, mode: Optional[str] = None, sim_config: Optional[SimulationConfig] = None, base_seed: Optional[int] = None): """Constructor. Parameters ---------- mode : rng mode, if not specified mode is taken from circuit_access sim_config: simulation config object, if present seeds are read from simulation base_seed: base seed for entire sim, overrides config value """ self._mode = "" if mode is None: if sim_config is not None: self.mode = sim_config.rng_mode if sim_config else "Compatibility" else: self.mode = "Random123" else: self.mode = mode logger.debug("Setting rng mode to: %s", self._mode) if base_seed is None: self.base_seed = sim_config.base_seed if sim_config else 0 else: self.base_seed = base_seed neuron.h.globalSeed = self.base_seed logger.debug("Setting base seed to: %d", self.base_seed) if self._mode == 'Random123': rng = neuron.h.Random() rng.Random123_globalindex(self.base_seed) if sim_config: self.synapse_seed = sim_config.synapse_seed self.ionchannel_seed = sim_config.ionchannel_seed self.stimulus_seed = sim_config.stimulus_seed self.minis_seed = sim_config.minis_seed
@property def mode(self): return self._mode @mode.setter def mode(self, new_val): """Setter method for the mode.""" options = {"Compatibility": 0, "Random123": 1, "UpdatedMCell": 2} if new_val not in options: raise UndefinedRNGException( "RNG mode's value %s is not in the accepted list: %s" % (self.mode, list(options.keys())) ) else: neuron.h.rngMode = options[new_val] self._mode = new_val def __repr__(self) -> str: """Returns a string representation of the object.""" return "RNGSettings(mode={mode}, base_seed={base_seed}, " \ "synapse_seed={synapse_seed}, " \ "ionchannel_seed={ionchannel_seed}, " \ "stimulus_seed={stimulus_seed}, " \ "minis_seed={minis_seed})".format( mode=self.mode, base_seed=self.base_seed, synapse_seed=self.synapse_seed, ionchannel_seed=self.ionchannel_seed, stimulus_seed=self.stimulus_seed, minis_seed=self.minis_seed)