Storm
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
SignatureComputer.cpp
Go to the documentation of this file.
2
4
6
10
11namespace storm {
12namespace dd {
13namespace bisimulation {
14
15template<storm::dd::DdType DdType, typename ValueType>
17 Partition<DdType, ValueType> const& partition)
18 : signatureComputer(signatureComputer), partition(partition), position(0) {
19 // Intentionally left empty.
20}
21
22template<storm::dd::DdType DdType, typename ValueType>
24 switch (signatureComputer.getSignatureMode()) {
27 return position < 1;
29 return position < 2;
30 }
31 STORM_LOG_THROW(false, storm::exceptions::IllegalArgumentException, "Unknown SignatureMode");
32}
33
34template<storm::dd::DdType DdType, typename ValueType>
36 auto mode = signatureComputer.getSignatureMode();
38 (mode == SignatureMode::Eager && position < 1) || (mode == SignatureMode::Lazy && position < 2) || (mode == SignatureMode::Qualitative && position < 1),
39 storm::exceptions::OutOfRangeException, "Iterator is out of range.");
41
42 if (mode == SignatureMode::Eager) {
43 if (position == 0) {
44 result = signatureComputer.getFullSignature(partition);
45 }
46 } else if (mode == SignatureMode::Lazy) {
47 if (position == 0) {
48 result = signatureComputer.getQualitativeSignature(partition);
49 } else {
50 result = signatureComputer.getFullSignature(partition);
51 }
52 } else if (mode == SignatureMode::Qualitative) {
53 if (position == 0) {
54 result = signatureComputer.getQualitativeSignature(partition);
55 }
56 } else {
57 STORM_LOG_ASSERT(false, "Unknown signature mode.");
58 }
59
60 ++position;
61 return result;
62}
63
64template<storm::dd::DdType DdType, typename ValueType>
66 bool ensureQualitative)
67 : SignatureComputer(model.getTransitionMatrix(), boost::none, model.getColumnVariables(), mode, ensureQualitative) {
68 // Intentionally left empty.
69}
70
71template<storm::dd::DdType DdType, typename ValueType>
73 std::set<storm::expressions::Variable> const& columnVariables, SignatureMode const& mode,
74 bool ensureQualitative)
75 : SignatureComputer(transitionMatrix, boost::none, columnVariables, mode, ensureQualitative) {
76 // Intentionally left empty.
77}
78
79template<storm::dd::DdType DdType, typename ValueType>
81 std::set<storm::expressions::Variable> const& columnVariables, SignatureMode const& mode,
82 bool ensureQualitative)
83 : SignatureComputer(qualitativeTransitionMatrix.template toAdd<ValueType>(), boost::none, columnVariables, mode, ensureQualitative) {
84 // Intentionally left empty.
85}
86
87template<storm::dd::DdType DdType, typename ValueType>
89 boost::optional<storm::dd::Bdd<DdType>> const& qualitativeTransitionMatrix,
90 std::set<storm::expressions::Variable> const& columnVariables, SignatureMode const& mode,
91 bool ensureQualitative)
92 : transitionMatrix(transitionMatrix), columnVariables(columnVariables), mode(mode), ensureQualitative(ensureQualitative) {
94 this->transitionMatrix =
95 this->transitionMatrix.notZero().ite(this->transitionMatrix, this->transitionMatrix.getDdManager().template getAddUndefined<ValueType>());
96 }
97
98 if (qualitativeTransitionMatrix) {
99 if (DdType == storm::dd::DdType::Sylvan || ensureQualitative) {
100 this->transitionMatrix01 = qualitativeTransitionMatrix.get();
101 } else {
102 this->transitionMatrix01 = qualitativeTransitionMatrix.get().template toAdd<ValueType>();
103 }
104 }
105}
106
107template<storm::dd::DdType DdType, typename ValueType>
111
112template<storm::dd::DdType DdType, typename ValueType>
114 this->mode = newMode;
115}
116
117template<storm::dd::DdType DdType, typename ValueType>
119 return mode;
120}
121
122template<storm::dd::DdType DdType, typename ValueType>
124 if (partition.storedAsBdd()) {
125 if (partition.hasChangedStates()) {
126 return Signature<DdType, ValueType>(this->transitionMatrix.multiplyMatrix(partition.asBdd() && partition.changedStatesAsBdd(), columnVariables));
127 } else {
128 return Signature<DdType, ValueType>(this->transitionMatrix.multiplyMatrix(partition.asBdd(), columnVariables));
129 }
130 } else {
131 if (partition.hasChangedStates()) {
132 return Signature<DdType, ValueType>(this->transitionMatrix.multiplyMatrix(partition.asAdd() * partition.changedStatesAsAdd(), columnVariables));
133 } else {
134 return Signature<DdType, ValueType>(this->transitionMatrix.multiplyMatrix(partition.asAdd(), columnVariables));
135 }
136 }
137}
138
139template<storm::dd::DdType DdType, typename ValueType>
141 if (!transitionMatrix01) {
142 if (DdType == storm::dd::DdType::Sylvan || this->ensureQualitative) {
143 this->transitionMatrix01 = this->transitionMatrix.notZero();
144 } else {
145 this->transitionMatrix01 = this->transitionMatrix.notZero().template toAdd<ValueType>();
146 }
147 }
148
149 if (partition.storedAsBdd()) {
150 return this->getQualitativeTransitionMatrixAsBdd().andExists(partition.asBdd(), columnVariables).template toAdd<ValueType>();
151 } else {
152 if (this->qualitativeTransitionMatrixIsBdd()) {
154 this->getQualitativeTransitionMatrixAsBdd().andExists(partition.asAdd().toBdd(), columnVariables).template toAdd<ValueType>());
155 } else {
156 return Signature<DdType, ValueType>(this->getQualitativeTransitionMatrixAsAdd().multiplyMatrix(partition.asAdd(), columnVariables));
157 }
158 }
159}
160
161template<storm::dd::DdType DdType, typename ValueType>
163 return transitionMatrix01.get().which() == 0;
164}
165
166template<storm::dd::DdType DdType, typename ValueType>
168 STORM_LOG_ASSERT(this->transitionMatrix01, "Missing qualitative transition matrix.");
169 return boost::get<storm::dd::Bdd<DdType>>(this->transitionMatrix01.get());
170}
171
172template<storm::dd::DdType DdType, typename ValueType>
173storm::dd::Add<DdType, ValueType> const& SignatureComputer<DdType, ValueType>::getQualitativeTransitionMatrixAsAdd() const {
174 STORM_LOG_ASSERT(this->transitionMatrix01, "Missing qualitative transition matrix.");
175 return boost::get<storm::dd::Add<DdType, ValueType>>(this->transitionMatrix01.get());
176}
177
178template class SignatureIterator<storm::dd::DdType::CUDD, double>;
179template class SignatureIterator<storm::dd::DdType::Sylvan, double>;
180template class SignatureIterator<storm::dd::DdType::Sylvan, storm::RationalNumber>;
181template class SignatureIterator<storm::dd::DdType::Sylvan, storm::RationalFunction>;
182
183template class SignatureComputer<storm::dd::DdType::CUDD, double>;
184template class SignatureComputer<storm::dd::DdType::Sylvan, double>;
185template class SignatureComputer<storm::dd::DdType::Sylvan, storm::RationalNumber>;
186template class SignatureComputer<storm::dd::DdType::Sylvan, storm::RationalFunction>;
187} // namespace bisimulation
188} // namespace dd
189} // namespace storm
Bdd< LibraryType > toBdd() const
Converts the ADD to a BDD by mapping all values unequal to zero to 1.
Definition Add.cpp:1187
Bdd< LibraryType > notZero() const
Computes a BDD that represents the function in which all assignments with a function value unequal to...
Definition Add.cpp:431
DdManager< LibraryType > & getDdManager() const
Retrieves the manager that is responsible for this DD.
Definition Dd.cpp:39
bool hasChangedStates() const
Retrieves whether this partition has information about the states whose partition block assignment ch...
storm::dd::Bdd< DdType > const & asBdd() const
storm::dd::Add< DdType, ValueType > const & changedStatesAsAdd() const
Retrieves the DD representing the states whose partition block assignment changed.
storm::dd::Bdd< DdType > const & changedStatesAsBdd() const
storm::dd::Add< DdType, ValueType > const & asAdd() const
SignatureComputer(storm::models::symbolic::Model< DdType, ValueType > const &model, SignatureMode const &mode=SignatureMode::Eager, bool ensureQualitative=false)
Signature< DdType, ValueType > getFullSignature(Partition< DdType, ValueType > const &partition) const
Methods to compute the signatures.
Signature< DdType, ValueType > getQualitativeSignature(Partition< DdType, ValueType > const &partition) const
SignatureIterator< DdType, ValueType > compute(Partition< DdType, ValueType > const &partition)
void setSignatureMode(SignatureMode const &newMode)
Signature< DdType, ValueType > next()
SignatureIterator(SignatureComputer< DdType, ValueType > const &signatureComputer, Partition< DdType, ValueType > const &partition)
Base class for all symbolic models.
Definition Model.h:46
#define STORM_LOG_ASSERT(cond, message)
Definition macros.h:11
#define STORM_LOG_THROW(cond, exception, message)
Definition macros.h:30
LabParser.cpp.
Definition cli.cpp:18