diff --git a/src/storm-dft/storage/dft/DFTIsomorphism.h b/src/storm-dft/storage/dft/DFTIsomorphism.h index 03f8866a7..a08fd6a07 100644 --- a/src/storm-dft/storage/dft/DFTIsomorphism.h +++ b/src/storm-dft/storage/dft/DFTIsomorphism.h @@ -57,16 +57,16 @@ namespace storage { BEColourClass() = default; - BEColourClass(storm::storage::BEType t, ValueType a, ValueType p, size_t h) : type(t), hash(h), aRate(a), pRate(p) { - STORM_LOG_ASSERT(t == storm::storage::BEType::EXPONENTIAL, "Expected type EXPONENTIAL but got type " << t); + BEColourClass(storm::storage::BEType type, ValueType active, ValueType passive, size_t parents) : type(type), nrParents(parents), aRate(active), pRate(passive) { + STORM_LOG_ASSERT(type == storm::storage::BEType::EXPONENTIAL, "Expected type EXPONENTIAL but got type " << type); } - BEColourClass(storm::storage::BEType t, bool fail, size_t h) : type(t), hash(h), failed(fail) { - STORM_LOG_ASSERT(t == storm::storage::BEType::CONSTANT, "Expected type CONSTANT but got type " << t); + BEColourClass(storm::storage::BEType type, bool fail, size_t parents) : type(type), nrParents(parents), failed(fail) { + STORM_LOG_ASSERT(type == storm::storage::BEType::CONSTANT, "Expected type CONSTANT but got type " << type); } storm::storage::BEType type; - size_t hash; + size_t nrParents; ValueType aRate; ValueType pRate; bool failed; @@ -80,9 +80,9 @@ namespace storage { } switch (lhs.type) { case storm::storage::BEType::EXPONENTIAL: - return lhs.hash == rhs.hash && lhs.aRate == rhs.aRate && lhs.pRate == rhs.pRate; + return lhs.nrParents == rhs.nrParents && lhs.aRate == rhs.aRate && lhs.pRate == rhs.pRate; case storm::storage::BEType::CONSTANT: - return lhs.hash == rhs.hash && lhs.failed == rhs.failed; + return lhs.nrParents == rhs.nrParents && lhs.failed == rhs.failed; default: STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "BE of type '" << lhs.type << "' is not known."); break; @@ -701,22 +701,25 @@ namespace std { template struct hash> { size_t operator()(storm::storage::BEColourClass const& bcc) const { - constexpr uint_fast64_t fivebitmask = (1 << 6) - 1; - constexpr uint_fast64_t eightbitmask = (1 << 9) - 1; + constexpr uint_fast64_t fivebitmask = (1ul << 6) - 1ul; + constexpr uint_fast64_t eightbitmask = (1ul << 9) - 1ul; + constexpr uint_fast64_t fortybitmask = (1ul << 41) - 1ul; std::hash hasher; uint_fast64_t groupHash = static_cast(1) << 63; groupHash |= (static_cast(bcc.type) & fivebitmask) << (62 - 5); switch (bcc.type) { case storm::storage::BEType::CONSTANT: - return (bcc.failed << 8); + groupHash |= (static_cast(bcc.failed) & fortybitmask) << 8; + break; case storm::storage::BEType::EXPONENTIAL: - return (hasher(bcc.aRate) ^ hasher(bcc.pRate) << 8); + groupHash |= ((hasher(bcc.aRate) ^ hasher(bcc.pRate)) & fortybitmask) << 8; + break; default: STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "BE of type '" << bcc.type << "' is not known."); break; } - groupHash |= static_cast(bcc.hash) & eightbitmask; + groupHash |= static_cast(bcc.nrParents) & eightbitmask; return groupHash; } };