mosaik.scenario
— Classes related to the scenario creation
This module provides the interface for users to create simulation scenarios for mosaik.
The World
holds all necessary data for the simulation and
allows the user to start simulators. It provides a ModelFactory
(and a ModelMock
) via which the user can instantiate model
instances (entities). The method World.run
finally starts
the simulation.
- SimConfig[source]
alias of
Dict
[str
,PythonModel
|ConnectModel
|CmdModel
]
- class World(sim_config: mosaik.async_scenario.SimConfig, mosaik_config: MosaikConfig | None = None, time_resolution: float = 1.0, debug: bool = False, cache: bool = True, max_loop_iterations: int = 100, skip_greetings: bool = False, configure_logging: bool = True, asyncio_loop: AbstractEventLoop | None = None)[source]
The world holds all data required to specify and run the scenario.
We recommend that you use the world in a
with
block like so:with mosaik.World(SIM_CONFIG) as world: # Scenario setup ... world.run(until=UNTIL)
This way, mosaik will keep the connection to the simulators alive until the end of the with block and you can still call extra methods on the to retrieve final simulation data, if needed.
However, you can also use a
World
outside of awith
block.The
World
provides a method to start a simulator process (start
) and manages the simulator instances.You have to provide a sim_config which tells the world which simulators are available and how to start them. See
mosaik.simmanager.start
for more details.mosaik_config can be a dict or list of key-value pairs to set addional parameters overriding the defaults:
{ 'addr': ('127.0.0.1', 5555), 'start_timeout': 2, # seconds 'stop_timeout': 2, # seconds }
Here, addr is the network address that mosaik will bind its socket to. start_timeout and stop_timeout specifiy a timeout (in seconds) for starting/stopping external simulator processes.
If execution_graph is set to
True
, an execution graph will be created during the simulation. This may be useful for debugging and testing. Note, that this increases the memory consumption and simulation time.Using the skip_greetings and configure_logging parameters, you can configure how “wordy” mosaik will be. If you set skip_greetings to
True
, the big mosaik logo will no longer be shown when you create the world. If you set configure_logging toFalse
, mosaik’s logging messages will not be enabled in loguru. You can still do this yourself by callinglogger.enable("mosaik")
.- Parameters:
sim_config (SimConfig)
mosaik_config (Optional[MosaikConfig])
time_resolution (float)
debug (bool)
cache (bool)
max_loop_iterations (int)
skip_greetings (bool)
configure_logging (bool)
asyncio_loop (Optional[asyncio.AbstractEventLoop])
- start(sim_name: str, sim_id: str | None = None, **sim_params: Any) ModelFactory [source]
Start the simulator named sim_name and return a
ModelFactory
for it.- Parameters:
- Return type:
- connect(src: ~mosaik.async_scenario.Entity, dest: ~mosaik.async_scenario.Entity, *attr_pairs: str | ~typing.Tuple[str, str], async_requests: bool = False, time_shifted: bool | int = False, initial_data: ~typing.Dict[str, ~typing.Any] = {}, weak: bool = False, transform: ~typing.Callable[[~typing.Any], ~typing.Any] = <function World.<lambda>>)[source]
Warning
The keyword async_requests is deprecated and will be removed in a future release. Implement cyclic data flow using time-shifted and weak connections instead.
Connect the src entity to dest entity.
Establish a data-flow for each
(src_attr, dest_attr)
tuple in attr_pairs. If src_attr and dest_attr have the same name, you can optionally only pass one of them as a single string.Raise a
ScenarioError
if both entities share the same simulator instance, if at least one (src. or dest.) attribute in attr_pairs does not exist, or if the connection would introduce a cycle in the data-flow (e.g., A → B → C → A).If the dest simulator may make asynchronous requests to mosaik to query data from src (or set data to it), async_requests should be set to
True
so that the src simulator stays in sync with dest.An alternative to asynchronous requests are time-shifted connections. Their data flow is always resolved after normal connections so that cycles in the data-flow can be realized without introducing deadlocks. For such a connection time_shifted should be set to
True
and initial_data should contain a dict with input data for the first simulation step of the receiving simulator.An alternative to using async_requests to realize cyclic data-flow is given by the time_shifted kwarg. If set to
True
it marks the connection as cycle-closing (e.g. C → A). It must always be used with initial_data specifying a dict with the data sent to the destination simulator at the first step (e.g. {‘src_attr’: value}).
- set_initial_event(sid: str, time: int = 0)[source]
Set an initial step for simulator sid at time time (default=0).
- get_data(entity_set: Iterable[Entity], *attributes: str) Dict[Entity, Dict[str, Any]] [source]
Get and return the values of all attributes for each entity of an entity_set.
The return value is a dict mapping the entities of entity_set to dicts containing the values of each attribute in attributes:
{ Entity(...): { 'attr_1': 'val_1', 'attr_2': 'val_2', ... }, ... }
- run(until: int, rt_factor: float | None = None, rt_strict: bool = False, print_progress: bool | Literal['individual'] = True, lazy_stepping: bool = True, *, shutdown: bool = True)[source]
Start the simulation until the simulation time
until
is reached. As mosaik has no way of resetting the simulators to their starting state, this method can only be called once.- Parameters:
until (int) – The end time for the simulation, exclusive (i.e. the step at time
until
will not be performed.)rt_factor (float | None) – In order to perform real-time simulations, you can set
rt_factor
to a number > 0. A real-time factor of 1. means that 1 second in simulated time takes 1 second in real-time. An real-time factor of 0.5 will let the simulation run twice as fast as real-time. For correct behavior of thert_factor
, the time resolution of the scenario has to be set adequately, which is 1. [second] by default.rt_strict (bool) – If the simulators are too slow for the real-time factor you chose, mosaik will emit a warning. If you want it to raise a
RuntimeError
, instead, you can setrt_strict
toTrue
.print_progress (bool | Literal['individual']) – This controls whether progress bars are printed while the simulation is running. The default is to print one bar representing the global progress of the simulation. You can also set
print_progress='individual'
to get one bar per simulator in your simulation (in addition to the global one).print_progress=False
turns off the progress bars completely. The progress bars use tqdm; see their documentation on how to write to the console without interfering with the bars.lazy_stepping (bool) – If
True
a simulator can only run ahead one step of it’s successors. IfFalse
a simulator always steps as soon as all input is provided. This might decrease the simulation time but increase the memory consumption.shutdown (bool) – If
True
and thisWorld
is not being used in awith
block, mosaik will stop all simulators and close the connections to them at the end of the simulation run. You can set this toFalse
if you want to keep the connections open and callshutdown
yourself, later. (This is useful if you want to call extra methods on your simulator after the simulation is over; however, we recommend that you use theWorld
in awith
block.)
- Raises:
RuntimeError – if this world has already been run
- class ModelFactory(async_model_factory: AsyncModelFactory, loop: AbstractEventLoop)[source]
This is a facade for a simulator sim that allows the user to create new model instances (entities) within that simulator.
For every model that a simulator publicly exposes, the
ModelFactory
provides aModelMock
attribute that actually creates the entities.If you access an attribute that is not a model or if the model is not marked as public, an
ScenarioError
is raised.- Parameters:
async_model_factory (AsyncModelFactory)
loop (asyncio.AbstractEventLoop)
- class ModelMock(async_model_mock: AsyncModelMock, loop: AbstractEventLoop)[source]
Instances of this class are exposed as attributes of
ModelFactory
and allow the instantiation of simulator models.You can call an instance of this class to create exactly one entity:
sim.ModelName(x=23)
. Alternatively, you can use thecreate
method to create multiple entities with the same set of parameters at once:sim.ModelName.create(3, x=23)
.- Parameters:
async_model_mock (AsyncModelMock)
loop (asyncio.AbstractEventLoop)
- create(num: int, **model_params: Any)[source]
Create num entities with the specified model_params and return a list with the entity dicts.
The returned list of entities is the same as returned by
mosaik_api_v3.Simulator.create
, but the simulator is prepended to every entity ID to make them globally unique.