Storm
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
dd.cpp
Go to the documentation of this file.
1#include "storm/utility/dd.h"
2
6
8
10
11namespace storm {
12namespace utility {
13namespace dd {
14
15template<storm::dd::DdType Type>
16std::pair<storm::dd::Bdd<Type>, uint64_t> computeReachableStates(storm::dd::Bdd<Type> const& initialStates, storm::dd::Bdd<Type> const& transitions,
17 std::set<storm::expressions::Variable> const& rowMetaVariables,
18 std::set<storm::expressions::Variable> const& columnMetaVariables) {
19 STORM_LOG_TRACE("Computing reachable states: transition matrix BDD has " << transitions.getNodeCount() << " node(s) and " << transitions.getNonZeroCount()
20 << " non-zero(s), " << initialStates.getNonZeroCount() << " initial states).");
21
22 auto start = std::chrono::high_resolution_clock::now();
23 storm::dd::Bdd<Type> reachableStates = initialStates;
24
25 // Perform the BFS to discover all reachable states.
26 bool changed = true;
27 uint_fast64_t iteration = 0;
28 do {
29 changed = false;
30 storm::dd::Bdd<Type> tmp = reachableStates.relationalProduct(transitions, rowMetaVariables, columnMetaVariables);
31 storm::dd::Bdd<Type> newReachableStates = tmp && (!reachableStates);
32
33 // Check whether new states were indeed discovered.
34 if (!newReachableStates.isZero()) {
35 changed = true;
36 }
37
38 reachableStates |= newReachableStates;
39
40 ++iteration;
41 STORM_LOG_TRACE("Iteration " << iteration << " of reachability computation completed: " << reachableStates.getNonZeroCount()
42 << " reachable states found.");
43 } while (changed);
44
45 auto end = std::chrono::high_resolution_clock::now();
46 STORM_LOG_TRACE("Reachability computation completed in " << iteration << " iterations ("
47 << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() << "ms).");
48
49 return {reachableStates, iteration};
50}
51
52template<storm::dd::DdType Type>
54 storm::dd::Bdd<Type> const& transitions, std::set<storm::expressions::Variable> const& rowMetaVariables,
55 std::set<storm::expressions::Variable> const& columnMetaVariables) {
56 STORM_LOG_TRACE("Computing backwards reachable states: transition matrix BDD has "
57 << transitions.getNodeCount() << " node(s) and " << transitions.getNonZeroCount() << " non-zero(s), " << initialStates.getNonZeroCount()
58 << " initial states).");
59
60 auto start = std::chrono::high_resolution_clock::now();
61 storm::dd::Bdd<Type> reachableStates = initialStates;
62
63 // Perform the BFS to discover all reachable states.
64 bool changed = true;
65 uint_fast64_t iteration = 0;
66 do {
67 changed = false;
68 storm::dd::Bdd<Type> tmp = reachableStates.inverseRelationalProduct(transitions, rowMetaVariables, columnMetaVariables);
69 storm::dd::Bdd<Type> newReachableStates = tmp && (!reachableStates) && constraintStates;
70
71 // Check whether new states were indeed discovered.
72 if (!newReachableStates.isZero()) {
73 changed = true;
74 }
75
76 reachableStates |= newReachableStates;
77
78 ++iteration;
79 STORM_LOG_TRACE("Iteration " << iteration << " of (backward) reachability computation completed: " << reachableStates.getNonZeroCount()
80 << " reachable states found.");
81 } while (changed);
82
83 auto end = std::chrono::high_resolution_clock::now();
84 STORM_LOG_TRACE("Backward reachability computation completed in " << iteration << " iterations ("
85 << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() << "ms).");
86
87 return reachableStates;
88}
89
90template<storm::dd::DdType Type>
92 storm::dd::DdManager<Type> const& ddManager,
93 std::vector<std::pair<storm::expressions::Variable, storm::expressions::Variable>> const& rowColumnMetaVariablePairs) {
94 return ddManager.getIdentity(rowColumnMetaVariablePairs, false);
95}
96
97template std::pair<storm::dd::Bdd<storm::dd::DdType::CUDD>, uint64_t> computeReachableStates(storm::dd::Bdd<storm::dd::DdType::CUDD> const& initialStates,
99 std::set<storm::expressions::Variable> const& rowMetaVariables,
100 std::set<storm::expressions::Variable> const& columnMetaVariables);
101template std::pair<storm::dd::Bdd<storm::dd::DdType::Sylvan>, uint64_t> computeReachableStates(
103 std::set<storm::expressions::Variable> const& rowMetaVariables, std::set<storm::expressions::Variable> const& columnMetaVariables);
104
106 storm::dd::Bdd<storm::dd::DdType::CUDD> const& constraintStates,
108 std::set<storm::expressions::Variable> const& rowMetaVariables,
109 std::set<storm::expressions::Variable> const& columnMetaVariables);
111 storm::dd::Bdd<storm::dd::DdType::Sylvan> const& constraintStates,
113 std::set<storm::expressions::Variable> const& rowMetaVariables,
114 std::set<storm::expressions::Variable> const& columnMetaVariables);
115
118 std::vector<std::pair<storm::expressions::Variable, storm::expressions::Variable>> const& rowColumnMetaVariablePairs);
121 std::vector<std::pair<storm::expressions::Variable, storm::expressions::Variable>> const& rowColumnMetaVariablePairs);
122
123} // namespace dd
124} // namespace utility
125} // namespace storm
Bdd< LibraryType > inverseRelationalProduct(Bdd< LibraryType > const &relation, std::set< storm::expressions::Variable > const &rowMetaVariables, std::set< storm::expressions::Variable > const &columnMetaVariables) const
Computes the inverse relational product of the current BDD and the given BDD representing a relation.
Definition Bdd.cpp:246
bool isZero() const
Retrieves whether this DD represents the constant zero function.
Definition Bdd.cpp:547
virtual uint_fast64_t getNonZeroCount() const override
Retrieves the number of encodings that are mapped to a non-zero value.
Definition Bdd.cpp:513
virtual uint_fast64_t getNodeCount() const override
Retrieves the number of nodes necessary to represent the DD.
Definition Bdd.cpp:527
Bdd< LibraryType > relationalProduct(Bdd< LibraryType > const &relation, std::set< storm::expressions::Variable > const &rowMetaVariables, std::set< storm::expressions::Variable > const &columnMetaVariables) const
Computes the relational product of the current BDD and the given BDD representing a relation.
Definition Bdd.cpp:220
Add< LibraryType, ValueType > getIdentity(storm::expressions::Variable const &variable) const
Retrieves the ADD representing the identity of the meta variable, i.e., a function that maps all lega...
#define STORM_LOG_TRACE(message)
Definition logging.h:17
storm::dd::Bdd< Type > computeBackwardsReachableStates(storm::dd::Bdd< Type > const &initialStates, storm::dd::Bdd< Type > const &constraintStates, storm::dd::Bdd< Type > const &transitions, std::set< storm::expressions::Variable > const &rowMetaVariables, std::set< storm::expressions::Variable > const &columnMetaVariables)
Definition dd.cpp:53
std::pair< storm::dd::Bdd< Type >, uint64_t > computeReachableStates(storm::dd::Bdd< Type > const &initialStates, storm::dd::Bdd< Type > const &transitions, std::set< storm::expressions::Variable > const &rowMetaVariables, std::set< storm::expressions::Variable > const &columnMetaVariables)
Definition dd.cpp:16
storm::dd::Bdd< Type > getRowColumnDiagonal(storm::dd::DdManager< Type > const &ddManager, std::vector< std::pair< storm::expressions::Variable, storm::expressions::Variable > > const &rowColumnMetaVariablePairs)
Definition dd.cpp:91
LabParser.cpp.
Definition cli.cpp:18