#include "src/storage/Distribution.h" #include #include #include "src/settings/SettingsManager.h" namespace storm { namespace storage { template Distribution::Distribution() : hash(0) { // Intentionally left empty. } template bool Distribution::operator==(Distribution const& other) const { // We need to check equality by ourselves, because we need to account for epsilon differences. if (this->distribution.size() != other.distribution.size() || this->getHash() != other.getHash()) { return false; } auto first1 = this->distribution.begin(); auto last1 = this->distribution.end(); auto first2 = other.distribution.begin(); for (; first1 != last1; ++first1, ++first2) { if (first1->first != first2->first) { return false; } if (std::abs(first1->second - first2->second) > 1e-6) { return false; } } return true; } template void Distribution::addProbability(storm::storage::sparse::state_type const& state, ValueType const& probability) { if (this->distribution.find(state) == this->distribution.end()) { this->hash += static_cast(state); } this->distribution[state] += probability; } template typename Distribution::iterator Distribution::begin() { return this->distribution.begin(); } template typename Distribution::const_iterator Distribution::begin() const { return this->distribution.begin(); } template typename Distribution::iterator Distribution::end() { return this->distribution.end(); } template typename Distribution::const_iterator Distribution::end() const { return this->distribution.end(); } template void Distribution::scale(storm::storage::sparse::state_type const& state) { auto probabilityIterator = this->distribution.find(state); if (probabilityIterator != this->distribution.end()) { ValueType scaleValue = 1 / probabilityIterator->second; this->distribution.erase(probabilityIterator); for (auto& entry : this->distribution) { entry.second *= scaleValue; } } } template std::size_t Distribution::getHash() const { return this->hash ^ (this->distribution.size() << 8); } template std::ostream& operator<<(std::ostream& out, Distribution const& distribution) { out << "{"; for (auto const& entry : distribution) { out << "[" << entry.second << ": " << entry.first << "], "; } out << "}"; return out; } template class Distribution; template std::ostream& operator<<(std::ostream& out, Distribution const& distribution); } }