23using namespace bisimulation;
25template<storm::dd::DdType DdType,
typename ValueType>
29 return std::make_unique<NondeterministicModelPartitionRefiner<DdType, ValueType>>(
30 *model.template as<storm::models::symbolic::NondeterministicModel<DdType, ValueType>>(), initialPartition);
32 return std::make_unique<PartitionRefiner<DdType, ValueType>>(model, initialPartition);
36template<storm::dd::DdType DdType,
typename ValueType,
typename ExportValueType>
40 preservationInformation(model),
45template<storm::dd::DdType DdType,
typename ValueType,
typename ExportValueType>
50 preservationInformation(preservationInformation),
55template<storm::dd::DdType DdType,
typename ValueType,
typename ExportValueType>
60 preservationInformation(model, formulas),
65template<storm::dd::DdType DdType,
typename ValueType,
typename ExportValueType>
69 : model(model), preservationInformation(preservationInformation), refiner(
createRefiner(model, initialPartition)) {
73template<storm::dd::DdType DdType,
typename ValueType,
typename ExportValueType>
76template<storm::dd::DdType DdType,
typename ValueType,
typename ExportValueType>
79 verboseProgress = generalSettings.isVerboseSet();
80 showProgressDelay = generalSettings.getShowProgressDelay();
82 auto start = std::chrono::high_resolution_clock::now();
83 this->refineWrtRewardModels();
84 auto end = std::chrono::high_resolution_clock::now();
85 STORM_LOG_INFO(
"Refining with respect to reward models took " << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() <<
"ms.");
87 STORM_LOG_INFO(
"Initial partition has " << refiner->getStatePartition().getNumberOfBlocks() <<
" blocks.");
88 STORM_LOG_TRACE(
"Initial partition has " << refiner->getStatePartition().getNodeCount() <<
" nodes.");
91template<storm::dd::DdType DdType,
typename ValueType,
typename ExportValueType>
94 STORM_LOG_ASSERT(this->refiner->getStatus() != Status::FixedPoint,
"Can only proceed if no fixpoint has been reached yet.");
96 auto start = std::chrono::high_resolution_clock::now();
97 auto timeOfLastMessage = start;
98 uint64_t iterations = 0;
101 refined = refiner->refine(mode);
105 auto now = std::chrono::high_resolution_clock::now();
106 auto durationSinceLastMessage = std::chrono::duration_cast<std::chrono::milliseconds>(now - timeOfLastMessage).count();
107 if (
static_cast<uint64_t
>(durationSinceLastMessage) >= showProgressDelay * 1000 || verboseProgress) {
108 auto durationSinceStart = std::chrono::duration_cast<std::chrono::milliseconds>(now - start).count();
109 STORM_LOG_INFO(
"State partition after " << iterations <<
" iterations (" << durationSinceStart <<
"ms) has "
110 << refiner->getStatePartition().getNumberOfBlocks() <<
" blocks.");
111 timeOfLastMessage = std::chrono::high_resolution_clock::now();
114 auto end = std::chrono::high_resolution_clock::now();
117 << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() <<
"ms (" << iterations
118 <<
" iterations, signature: " << std::chrono::duration_cast<std::chrono::milliseconds>(refiner->getTotalSignatureTime()).count()
119 <<
"ms, refinement: " << std::chrono::duration_cast<std::chrono::milliseconds>(refiner->getTotalRefinementTime()).count() <<
"ms).");
122template<storm::dd::DdType DdType,
typename ValueType,
typename ExportValueType>
125 STORM_LOG_ASSERT(this->refiner->getStatus() != Status::FixedPoint,
"Can only proceed if no fixpoint has been reached yet.");
128 auto start = std::chrono::high_resolution_clock::now();
129 auto timeOfLastMessage = start;
130 uint64_t iterations = 0;
132 while (refined && iterations < steps) {
133 refined = refiner->refine(mode);
137 auto now = std::chrono::high_resolution_clock::now();
138 auto durationSinceLastMessage = std::chrono::duration_cast<std::chrono::seconds>(now - timeOfLastMessage).count();
139 if (
static_cast<uint64_t
>(durationSinceLastMessage) >= showProgressDelay || verboseProgress) {
140 auto durationSinceStart = std::chrono::duration_cast<std::chrono::seconds>(now - start).count();
141 STORM_LOG_INFO(
"State partition after " << iterations <<
" iterations (" << durationSinceStart <<
"ms) has "
142 << refiner->getStatePartition().getNumberOfBlocks() <<
" blocks.");
143 timeOfLastMessage = std::chrono::high_resolution_clock::now();
150template<storm::dd::DdType DdType,
typename ValueType,
typename ExportValueType>
152 return this->refiner->getStatus() == Status::FixedPoint;
155template<storm::dd::DdType DdType,
typename ValueType,
typename ExportValueType>
158 std::shared_ptr<storm::models::Model<ExportValueType>> quotient;
159 if (this->refiner->getStatus() == Status::FixedPoint) {
162 quotient = extractor.
extract(model, refiner->getStatePartition(), preservationInformation);
165 storm::exceptions::InvalidOperationException,
"Can only extract partial quotient for discrete-time models.");
168 if (!partialQuotientExtractor) {
169 partialQuotientExtractor = std::make_unique<bisimulation::PartialQuotientExtractor<DdType, ValueType, ExportValueType>>(model, quotientFormat);
172 quotient = partialQuotientExtractor->extract(refiner->getStatePartition(), preservationInformation);
179template<storm::dd::DdType DdType,
typename ValueType,
typename ExportValueType>
181 for (
auto const& rewardModelName : this->preservationInformation.getRewardModelNames()) {
182 auto const& rewardModel = this->model.getRewardModel(rewardModelName);
183 refiner->refineWrtRewardModel(rewardModel);
187template class BisimulationDecomposition<storm::dd::DdType::CUDD, double>;
189template class BisimulationDecomposition<storm::dd::DdType::Sylvan, double>;
190template class BisimulationDecomposition<storm::dd::DdType::Sylvan, storm::RationalNumber>;
191template class BisimulationDecomposition<storm::dd::DdType::Sylvan, storm::RationalNumber, double>;
192template class BisimulationDecomposition<storm::dd::DdType::Sylvan, storm::RationalFunction>;
bool getReachedFixedPoint() const
Retrieves whether a fixed point has been reached.
void compute(bisimulation::SignatureMode const &mode=bisimulation::SignatureMode::Eager)
Performs partition refinement until a fixpoint has been reached.
std::shared_ptr< storm::models::Model< ExportValueType > > getQuotient(storm::dd::bisimulation::QuotientFormat const "ientFormat) const
Retrieves the quotient model after the bisimulation decomposition was computed.
~BisimulationDecomposition()
BisimulationDecomposition(storm::models::symbolic::Model< DdType, ValueType > const &model, storm::storage::BisimulationType const &bisimulationType)
bool isOfType(storm::models::ModelType const &modelType) const
Checks whether the model is of the given type.
Base class for all symbolic models.
#define STORM_LOG_INFO(message)
#define STORM_LOG_TRACE(message)
#define STORM_LOG_ASSERT(cond, message)
#define STORM_LOG_THROW(cond, exception, message)
std::unique_ptr< PartitionRefiner< DdType, ValueType > > createRefiner(storm::models::symbolic::Model< DdType, ValueType > const &model, Partition< DdType, ValueType > const &initialPartition)
SettingsType const & getModule()
Get module.