13namespace bisimulation {
15template<storm::dd::DdType DdType,
typename ValueType>
18 : signatureComputer(signatureComputer), partition(partition), position(0) {
22template<storm::dd::DdType DdType,
typename ValueType>
24 switch (signatureComputer.getSignatureMode()) {
31 STORM_LOG_THROW(
false, storm::exceptions::IllegalArgumentException,
"Unknown SignatureMode");
34template<storm::dd::DdType DdType,
typename ValueType>
36 auto mode = signatureComputer.getSignatureMode();
39 storm::exceptions::OutOfRangeException,
"Iterator is out of range.");
44 result = signatureComputer.getFullSignature(partition);
48 result = signatureComputer.getQualitativeSignature(partition);
50 result = signatureComputer.getFullSignature(partition);
54 result = signatureComputer.getQualitativeSignature(partition);
64template<storm::dd::DdType DdType,
typename ValueType>
66 bool ensureQualitative)
67 :
SignatureComputer(model.getTransitionMatrix(),
boost::none, model.getColumnVariables(), mode, ensureQualitative) {
71template<storm::dd::DdType DdType,
typename ValueType>
73 std::set<storm::expressions::Variable>
const& columnVariables,
SignatureMode const& mode,
74 bool ensureQualitative)
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) {
87template<storm::dd::DdType DdType,
typename ValueType>
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>());
98 if (qualitativeTransitionMatrix) {
100 this->transitionMatrix01 = qualitativeTransitionMatrix.get();
102 this->transitionMatrix01 = qualitativeTransitionMatrix.get().template toAdd<ValueType>();
107template<storm::dd::DdType DdType,
typename ValueType>
112template<storm::dd::DdType DdType,
typename ValueType>
114 this->mode = newMode;
117template<storm::dd::DdType DdType,
typename ValueType>
122template<storm::dd::DdType DdType,
typename ValueType>
139template<storm::dd::DdType DdType,
typename ValueType>
141 if (!transitionMatrix01) {
143 this->transitionMatrix01 = this->transitionMatrix.notZero();
145 this->transitionMatrix01 = this->transitionMatrix.notZero().template toAdd<ValueType>();
150 return this->getQualitativeTransitionMatrixAsBdd().andExists(partition.
asBdd(), columnVariables).template toAdd<ValueType>();
152 if (this->qualitativeTransitionMatrixIsBdd()) {
154 this->getQualitativeTransitionMatrixAsBdd().andExists(partition.
asAdd().
toBdd(), columnVariables).template toAdd<ValueType>());
161template<storm::dd::DdType DdType,
typename ValueType>
163 return transitionMatrix01.get().which() == 0;
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());
172template<storm::dd::DdType DdType,
typename ValueType>
174 STORM_LOG_ASSERT(this->transitionMatrix01,
"Missing qualitative transition matrix.");
175 return boost::get<storm::dd::Add<DdType, ValueType>>(this->transitionMatrix01.get());
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>;
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>;
Bdd< LibraryType > toBdd() const
Converts the ADD to a BDD by mapping all values unequal to zero to 1.
Bdd< LibraryType > notZero() const
Computes a BDD that represents the function in which all assignments with a function value unequal to...
DdManager< LibraryType > & getDdManager() const
Retrieves the manager that is responsible for this DD.
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.
#define STORM_LOG_ASSERT(cond, message)
#define STORM_LOG_THROW(cond, exception, message)