|
@ -1,11 +1,19 @@ |
|
|
|
|
|
from enum import Enum |
|
|
|
|
|
|
|
|
import stormpy.core |
|
|
import stormpy.core |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SimulatorObservationMode(Enum): |
|
|
|
|
|
STATE_LEVEL = 0, |
|
|
|
|
|
PROGRAM_LEVEL = 1 |
|
|
|
|
|
|
|
|
class Simulator: |
|
|
class Simulator: |
|
|
""" |
|
|
""" |
|
|
Base class for simulators. |
|
|
Base class for simulators. |
|
|
""" |
|
|
""" |
|
|
def __init__(self, seed=None): |
|
|
def __init__(self, seed=None): |
|
|
self._seed = seed |
|
|
self._seed = seed |
|
|
|
|
|
self._observation_mode = SimulatorObservationMode.STATE_LEVEL |
|
|
|
|
|
|
|
|
def step(self, action=None): |
|
|
def step(self, action=None): |
|
|
raise NotImplementedError("Abstract superclass") |
|
|
raise NotImplementedError("Abstract superclass") |
|
@ -13,6 +21,14 @@ class Simulator: |
|
|
def restart(self): |
|
|
def restart(self): |
|
|
raise NotImplementedError("Abstract superclass") |
|
|
raise NotImplementedError("Abstract superclass") |
|
|
|
|
|
|
|
|
|
|
|
def is_done(self): |
|
|
|
|
|
return False |
|
|
|
|
|
|
|
|
|
|
|
def set_observation_mode(self, mode): |
|
|
|
|
|
if not isinstance(mode, SimulatorObservationMode): |
|
|
|
|
|
raise RuntimeError("Observation mode must be a SimulatorObservationMode") |
|
|
|
|
|
self._observation_mode = mode |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SparseSimulator(Simulator): |
|
|
class SparseSimulator(Simulator): |
|
|
""" |
|
|
""" |
|
@ -25,23 +41,40 @@ class SparseSimulator(Simulator): |
|
|
self._engine = stormpy.core._DiscreteTimeSparseModelSimulatorDouble(model) |
|
|
self._engine = stormpy.core._DiscreteTimeSparseModelSimulatorDouble(model) |
|
|
if seed is not None: |
|
|
if seed is not None: |
|
|
self._engine.set_seed(seed) |
|
|
self._engine.set_seed(seed) |
|
|
|
|
|
self._state_valuations = None |
|
|
|
|
|
|
|
|
def step(self, action=None): |
|
|
def step(self, action=None): |
|
|
if action is None: |
|
|
if action is None: |
|
|
if self._model.is_nondeterministic_model: |
|
|
if self._model.is_nondeterministic_model: |
|
|
raise RuntimeError("Must specify an action in nondeterministic models") |
|
|
raise RuntimeError("Must specify an action in nondeterministic models") |
|
|
check = self._engine.step(0) |
|
|
check = self._engine.step(0) |
|
|
assert(check) |
|
|
|
|
|
|
|
|
assert check |
|
|
else: |
|
|
else: |
|
|
if action >= self._model.get_nondeterministic_choices(): |
|
|
if action >= self._model.get_nondeterministic_choices(): |
|
|
raise RuntimeError(f"Only {self._model.get_nondeterministic_choices()} actions available") |
|
|
raise RuntimeError(f"Only {self._model.get_nondeterministic_choices()} actions available") |
|
|
check = self._engine.step(action) |
|
|
check = self._engine.step(action) |
|
|
assert(check) |
|
|
|
|
|
return self._engine.get_current_state() |
|
|
|
|
|
|
|
|
assert check |
|
|
|
|
|
if self._observation_mode == SimulatorObservationMode.STATE_LEVEL: |
|
|
|
|
|
return self._engine.get_current_state() |
|
|
|
|
|
elif self._observation_mode == SimulatorObservationMode.PROGRAM_LEVEL: |
|
|
|
|
|
return self._state_valuations.get_state(self._engine.get_current_state()) |
|
|
|
|
|
|
|
|
|
|
|
assert False, "Observation Mode not recognised." |
|
|
|
|
|
|
|
|
def restart(self): |
|
|
def restart(self): |
|
|
self._engine.reset_to_initial_state() |
|
|
self._engine.reset_to_initial_state() |
|
|
|
|
|
|
|
|
|
|
|
def is_done(self): |
|
|
|
|
|
return self._model.is_sink_state(self._engine.get_current_state()) |
|
|
|
|
|
|
|
|
|
|
|
def set_observation_mode(self, mode): |
|
|
|
|
|
super().set_observation_mode(mode) |
|
|
|
|
|
if self._observation_mode == SimulatorObservationMode.PROGRAM_LEVEL: |
|
|
|
|
|
if not self._model.has_state_valuations(): |
|
|
|
|
|
raise RuntimeError("Program level observations require model with state valuations") |
|
|
|
|
|
self._state_valuations = self._model.state_valuations |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def create_simulator(model, seed = None): |
|
|
def create_simulator(model, seed = None): |
|
|
""" |
|
|
""" |
|
|