Source code for bsb.simulation.simulation
import typing
from time import time
from .. import config
from ..config import types as cfgtypes
from ..config._attrs import cfgdict, cfglist
from ._backends import get_simulation_nodes
from .cell import CellModel
from .connection import ConnectionModel
from .device import DeviceModel
if typing.TYPE_CHECKING:
from ..cell_types import CellType
from ..connectivity import ConnectionStrategy
from ..core import Scaffold
from ..storage.interfaces import ConnectivitySet
[docs]
class ProgressEvent:
def __init__(self, progression, duration, time):
self.progression = progression
self.duration = duration
self.time = time
[docs]
@config.pluggable(key="simulator", plugin_name="simulation backend")
class Simulation:
scaffold: "Scaffold"
simulator: str
name: str = config.attr(key=True)
duration: float = config.attr(type=float, required=True)
cell_models: cfgdict[CellModel] = config.slot(type=CellModel, required=True)
connection_models: cfgdict[ConnectionModel] = config.slot(
type=ConnectionModel, required=True
)
devices: cfgdict[DeviceModel] = config.slot(type=DeviceModel, required=True)
post_prepare: cfglist[typing.Callable[["Simulation", typing.Any], None]] = (
config.list(type=cfgtypes.function_())
)
@staticmethod
def __plugins__():
return get_simulation_nodes()
[docs]
def get_model_of(
self, type: typing.Union["CellType", "ConnectionStrategy"]
) -> typing.Optional[typing.Union["CellModel", "ConnectionModel"]]:
cell_models = [cm for cm in self.cell_models.values() if cm.cell_type is type]
if cell_models:
return cell_models[0]
conn_models = [
cm for cm in self.connection_models.values() if cm.connection_type is type
]
if conn_models:
return conn_models[0]
[docs]
def get_connectivity_sets(
self,
) -> typing.Mapping["ConnectionModel", "ConnectivitySet"]:
return {
model: self.scaffold.get_connectivity_set(model.name)
for model in sorted(self.connection_models.values())
}
__all__ = ["ProgressEvent", "Simulation"]