Matthias Volk
7 years ago
7 changed files with 119 additions and 102 deletions
-
1doc/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.core |
|||
|
|||
import pycarl |
|||
import pycarl.core |
|||
|
|||
import stormpy.examples |
|||
import stormpy.examples.files |
|||
|
|||
import stormpy._config as config |
|||
|
|||
|
|||
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) |
|||
|
|||
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) |
|||
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__': |
|||
|
@ -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