You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
1.8 KiB
58 lines
1.8 KiB
import stormpy.core
|
|
|
|
class Simulator:
|
|
"""
|
|
Base class for simulators.
|
|
"""
|
|
def __init__(self, seed=None):
|
|
self._seed = seed
|
|
|
|
def step(self, action=None):
|
|
raise NotImplementedError("Abstract superclass")
|
|
|
|
def restart(self):
|
|
raise NotImplementedError("Abstract superclass")
|
|
|
|
|
|
class SparseSimulator(Simulator):
|
|
"""
|
|
Simulator on top of sparse models.
|
|
"""
|
|
|
|
def __init__(self, model, seed=None):
|
|
super().__init__(seed)
|
|
self._model = model
|
|
self._engine = stormpy.core._DiscreteTimeSparseModelSimulatorDouble(model)
|
|
if seed is not None:
|
|
self._engine.set_seed(seed)
|
|
|
|
def step(self, action=None):
|
|
if action is None:
|
|
if self._model.is_nondeterministic_model:
|
|
raise RuntimeError("Must specify an action in nondeterministic models")
|
|
check = self._engine.step(0)
|
|
assert(check)
|
|
else:
|
|
if action >= self._model.get_nondeterministic_choices():
|
|
raise RuntimeError(f"Only {self._model.get_nondeterministic_choices()} actions available")
|
|
check = self._engine.step(action)
|
|
assert(check)
|
|
return self._engine.get_current_state()
|
|
|
|
def restart(self):
|
|
self._engine.reset_to_initial_state()
|
|
|
|
|
|
def create_simulator(model, seed = None):
|
|
"""
|
|
Factory method for creating a simulator.
|
|
|
|
:param model: Some form of model
|
|
:param seed: A seed for reproducibility. If None (default), the seed is internally generated.
|
|
:return: A simulator that can simulate on top of this model
|
|
"""
|
|
if isinstance(model, stormpy.storage._ModelBase):
|
|
if model.is_sparse_model:
|
|
return SparseSimulator(model, seed)
|
|
else:
|
|
raise NotImplementedError("Currently, we only support simulators for sparse models.")
|