Matthias Volk
6 years ago
2 changed files with 83 additions and 0 deletions
@ -0,0 +1,82 @@ |
|||||
|
*************** |
||||
|
Engines |
||||
|
*************** |
||||
|
|
||||
|
Background |
||||
|
===================== |
||||
|
|
||||
|
Storm supports different engines for building and checking a model. A detailed comparison of the different engines provided in Storm can be found on the `Storm website <http://www.stormchecker.org/documentation/usage/engines.html>`_. |
||||
|
|
||||
|
|
||||
|
Sparse engine |
||||
|
=============================== |
||||
|
|
||||
|
In all of the examples so far we used the default sparse engine: |
||||
|
|
||||
|
>>> import stormpy.examples |
||||
|
>>> import stormpy.examples.files |
||||
|
>>> prism_program = stormpy.parse_prism_program(stormpy.examples.files.prism_dtmc_die) |
||||
|
>>> properties = stormpy.parse_properties_for_prism_program('P=? [F "one"]', prism_program) |
||||
|
>>> sparse_model = stormpy.build_sparse_model(prism_program, properties) |
||||
|
>>> print(type(sparse_model)) |
||||
|
<class 'stormpy.storage.storage.SparseDtmc'> |
||||
|
>>> print("Number of states: {}".format(sparse_model.nr_states)) |
||||
|
Number of states: 13 |
||||
|
>>> print("Number of transitions: {}".format(sparse_model.nr_transitions)) |
||||
|
Number of transitions: 20 |
||||
|
|
||||
|
The model checking was also done in the sparse engine: |
||||
|
|
||||
|
>>> sparse_result = stormpy.check_model_sparse(sparse_model, properties[0]) |
||||
|
>>> initial_state = sparse_model.initial_states[0] |
||||
|
>>> print(sparse_result.at(initial_state)) |
||||
|
0.16666666666666666 |
||||
|
|
||||
|
|
||||
|
Symbolic engine |
||||
|
=============================== |
||||
|
|
||||
|
Instead of using the sparse engine, one can also use a symbolic representation in terms of `binary decision diagrams (BDDs)`. |
||||
|
To use the symbolic (dd) engine, we use the symbolic versions for the building and model checking: |
||||
|
|
||||
|
>>> symbolic_model = stormpy.build_symbolic_model(prism_program, properties) |
||||
|
>>> print(type(symbolic_model)) |
||||
|
<class 'stormpy.storage.storage.SymbolicSylvanDtmc'> |
||||
|
>>> print("Number of states: {}".format(symbolic_model.nr_states)) |
||||
|
Number of states: 13 |
||||
|
>>> print("Number of transitions: {}".format(symbolic_model.nr_transitions)) |
||||
|
Number of transitions: 20 |
||||
|
>>> symbolic_result = stormpy.check_model_dd(symbolic_model, properties[0]) |
||||
|
>>> print(symbolic_result) |
||||
|
[0, 1] (range) |
||||
|
|
||||
|
We can also filter the computed results and only consider the initial states: |
||||
|
|
||||
|
>>> filter = stormpy.create_filter_initial_states_symbolic(symbolic_model) |
||||
|
>>> symbolic_result.filter(filter) |
||||
|
>>> print(symbolic_result.min) |
||||
|
0.16666650772094727 |
||||
|
|
||||
|
It is also possible to first build the model symbolically and then transform it into a sparse model: |
||||
|
|
||||
|
>>> print(type(symbolic_model)) |
||||
|
<class 'stormpy.storage.storage.SymbolicSylvanDtmc'> |
||||
|
>>> transformed_model = stormpy.transform_to_sparse_model(symbolic_model) |
||||
|
>>> print(type(transformed_model)) |
||||
|
<class 'stormpy.storage.storage.SparseDtmc'> |
||||
|
|
||||
|
|
||||
|
Hybrid engine |
||||
|
=============================== |
||||
|
|
||||
|
A third possibility is to use the hybrid engine, a combination of sparse and dd engines. |
||||
|
It first builds the model symbolically. |
||||
|
The actual model checking is then performed with the engine which is deemed most suitable for the given task. |
||||
|
|
||||
|
>>> print(type(symbolic_model)) |
||||
|
<class 'stormpy.storage.storage.SymbolicSylvanDtmc'> |
||||
|
>>> hybrid_result = stormpy.check_model_hybrid(symbolic_model, properties[0]) |
||||
|
>>> filter = stormpy.create_filter_initial_states_symbolic(symbolic_model) |
||||
|
>>> hybrid_result.filter(filter) |
||||
|
>>> print(hybrid_result) |
||||
|
0.166667 |
Write
Preview
Loading…
Cancel
Save
Reference in new issue