Matthias Volk
7 years ago
7 changed files with 119 additions and 102 deletions
-
3doc/source/advanced_topics.rst
-
61doc/source/doc/parametric_models.rst
-
49doc/source/getting_started.rst
-
37examples/04-getting-started.py
-
26examples/06-getting-started.py
-
41examples/parametric_models/01-parametric-models.py
-
4examples/parametric_models/02-parametric-models.py
@ -0,0 +1,61 @@ |
|||||
|
***************** |
||||
|
Parametric Models |
||||
|
***************** |
||||
|
|
||||
|
|
||||
|
|
||||
|
Instantiating parametric models |
||||
|
=============================== |
||||
|
.. seealso:: `01-parametric-models.py <https://github.com/moves-rwth/stormpy/blob/master/examples//parametric_models/01-parametric-models.py>`_ |
||||
|
|
||||
|
Input formats such as prism allow to specify programs with open constants. We refer to these open constants as parameters. |
||||
|
If the constants only influence the probabilities or rates, but not the topology of the underlying model, we can build these models as parametric models:: |
||||
|
|
||||
|
>>> import stormpy |
||||
|
>>> import stormpy.examples |
||||
|
>>> import stormpy.examples.files |
||||
|
>>> path = stormpy.examples.files.prism_dtmc_die |
||||
|
>>> prism_program = stormpy.parse_prism_program(path) |
||||
|
>>> formula_str = "P=? [F s=7 & d=2]" |
||||
|
>>> properties = stormpy.parse_properties_for_prism_program(formula_str, prism_program) |
||||
|
|
||||
|
>>> model = stormpy.build_parametric_model(prism_program, properties) |
||||
|
>>> parameters = model.collect_probability_parameters() |
||||
|
>>> for x in parameters: |
||||
|
... print(x) |
||||
|
|
||||
|
In order to obtain a standard DTMC, MDP or other Markov model, we need to instantiate these models by means of a model instantiator:: |
||||
|
|
||||
|
>>> import stormpy.pars |
||||
|
>>> instantiator = stormpy.pars.PDtmcInstantiator(model) |
||||
|
|
||||
|
Before we obtain an instantiated model, we need to map parameters to values: We build such a dictionary as follows:: |
||||
|
|
||||
|
>>> point = dict() |
||||
|
>>> for x in parameters: |
||||
|
... print(x.name) |
||||
|
... point[x] = 0.4 |
||||
|
>>> instantiated_model = instantiator.instantiate(point) |
||||
|
>>> result = stormpy.model_checking(instantiated_model, properties[0]) |
||||
|
|
||||
|
Initial states and labels are set as for the parameter-free case. |
||||
|
|
||||
|
|
||||
|
Checking parametric models |
||||
|
========================== |
||||
|
.. seealso:: `02-parametric-models.py <https://github.com/moves-rwth/stormpy/blob/master/examples//parametric_models/02-parametric-models.py>`_ |
||||
|
|
||||
|
It is also possible to check the parametric model directly, similar as before in :ref:`getting-started-checking-properties`:: |
||||
|
|
||||
|
>>> result = stormpy.model_checking(model, properties[0]) |
||||
|
>>> initial_state = model.initial_states[0] |
||||
|
>>> func = result.at(initial_state) |
||||
|
|
||||
|
We collect the constraints ensuring that underlying model is well-formed and the graph structure does not change. |
||||
|
|
||||
|
>>> collector = stormpy.ConstraintCollector(model) |
||||
|
>>> for formula in collector.wellformed_constraints: |
||||
|
... print(formula) |
||||
|
>>> for formula in collector.graph_preserving_constraints: |
||||
|
... print(formula) |
||||
|
|
@ -1,40 +1,27 @@ |
|||||
import stormpy |
import stormpy |
||||
import stormpy.core |
import stormpy.core |
||||
|
|
||||
import pycarl |
|
||||
import pycarl.core |
|
||||
|
|
||||
import stormpy.examples |
import stormpy.examples |
||||
import stormpy.examples.files |
import stormpy.examples.files |
||||
|
|
||||
import stormpy._config as config |
|
||||
|
|
||||
|
|
||||
def example_getting_started_04(): |
def example_getting_started_04(): |
||||
# Check support for parameters |
|
||||
if not config.storm_with_pars: |
|
||||
print("Support parameters is missing. Try building storm-pars.") |
|
||||
return |
|
||||
|
|
||||
import stormpy.pars |
|
||||
path = stormpy.examples.files.prism_pdtmc_die |
|
||||
|
path = stormpy.examples.files.prism_dtmc_die |
||||
prism_program = stormpy.parse_prism_program(path) |
prism_program = stormpy.parse_prism_program(path) |
||||
|
|
||||
formula_str = "P=? [F s=7 & d=2]" |
formula_str = "P=? [F s=7 & d=2]" |
||||
properties = stormpy.parse_properties_for_prism_program(formula_str, prism_program) |
properties = stormpy.parse_properties_for_prism_program(formula_str, prism_program) |
||||
model = stormpy.build_parametric_model(prism_program, properties) |
|
||||
print("Model supports parameters: {}".format(model.supports_parameters)) |
|
||||
parameters = model.collect_probability_parameters() |
|
||||
assert len(parameters) == 2 |
|
||||
|
|
||||
instantiator = stormpy.pars.PDtmcInstantiator(model) |
|
||||
point = dict() |
|
||||
for x in parameters: |
|
||||
print(x.name) |
|
||||
point[x] = stormpy.RationalRF(0.4) |
|
||||
instantiated_model = instantiator.instantiate(point) |
|
||||
result = stormpy.model_checking(instantiated_model, properties[0]) |
|
||||
print(result) |
|
||||
|
model = stormpy.build_model(prism_program, properties) |
||||
|
|
||||
|
print(model.model_type) |
||||
|
|
||||
|
for state in model.states: |
||||
|
if state.id in model.initial_states: |
||||
|
print(state) |
||||
|
for action in state.actions: |
||||
|
for transition in action.transitions: |
||||
|
print("From state {}, with probability {}, go to state {}".format(state, transition.value(), |
||||
|
transition.column)) |
||||
|
|
||||
|
|
||||
if __name__ == '__main__': |
if __name__ == '__main__': |
||||
|
@ -1,26 +0,0 @@ |
|||||
import stormpy |
|
||||
import stormpy.core |
|
||||
|
|
||||
import stormpy.examples |
|
||||
import stormpy.examples.files |
|
||||
|
|
||||
def example_getting_started_06(): |
|
||||
path = stormpy.examples.files.prism_dtmc_die |
|
||||
prism_program = stormpy.parse_prism_program(path) |
|
||||
|
|
||||
formula_str = "P=? [F s=7 & d=2]" |
|
||||
properties = stormpy.parse_properties_for_prism_program(formula_str, prism_program) |
|
||||
model = stormpy.build_model(prism_program, properties) |
|
||||
|
|
||||
print(model.model_type) |
|
||||
|
|
||||
for state in model.states: |
|
||||
if state.id in model.initial_states: |
|
||||
print(state) |
|
||||
for action in state.actions: |
|
||||
for transition in action.transitions: |
|
||||
print("From state {}, with probability {}, go to state {}".format(state, transition.value(), transition.column)) |
|
||||
|
|
||||
|
|
||||
if __name__ == '__main__': |
|
||||
example_getting_started_06() |
|
@ -0,0 +1,41 @@ |
|||||
|
import stormpy |
||||
|
import stormpy.core |
||||
|
|
||||
|
import pycarl |
||||
|
import pycarl.core |
||||
|
|
||||
|
import stormpy.examples |
||||
|
import stormpy.examples.files |
||||
|
|
||||
|
import stormpy._config as config |
||||
|
|
||||
|
|
||||
|
def example_parametric_models_01(): |
||||
|
# Check support for parameters |
||||
|
if not config.storm_with_pars: |
||||
|
print("Support parameters is missing. Try building storm-pars.") |
||||
|
return |
||||
|
|
||||
|
import stormpy.pars |
||||
|
path = stormpy.examples.files.prism_pdtmc_die |
||||
|
prism_program = stormpy.parse_prism_program(path) |
||||
|
|
||||
|
formula_str = "P=? [F s=7 & d=2]" |
||||
|
properties = stormpy.parse_properties_for_prism_program(formula_str, prism_program) |
||||
|
model = stormpy.build_parametric_model(prism_program, properties) |
||||
|
print("Model supports parameters: {}".format(model.supports_parameters)) |
||||
|
parameters = model.collect_probability_parameters() |
||||
|
assert len(parameters) == 2 |
||||
|
|
||||
|
instantiator = stormpy.pars.PDtmcInstantiator(model) |
||||
|
point = dict() |
||||
|
for x in parameters: |
||||
|
print(x.name) |
||||
|
point[x] = stormpy.RationalRF(0.4) |
||||
|
instantiated_model = instantiator.instantiate(point) |
||||
|
result = stormpy.model_checking(instantiated_model, properties[0]) |
||||
|
print(result) |
||||
|
|
||||
|
|
||||
|
if __name__ == '__main__': |
||||
|
example_parametric_models_01() |
Write
Preview
Loading…
Cancel
Save
Reference in new issue