22template<storm::dd::DdType DdType,
typename ValueType>
27 return std::make_unique<NondeterministicModelPartitionRefiner<DdType, ValueType>>(
28 *model.template as<storm::models::symbolic::NondeterministicModel<DdType, ValueType>>(), initialPartition, bisimulationOptions);
30 return std::make_unique<PartitionRefiner<DdType, ValueType>>(model, initialPartition, bisimulationOptions);
34template<storm::dd::DdType DdType,
typename ValueType,
typename ExportValueType>
39 preservationInformation(model),
40 bisimulationOptions(bisimulationOptions),
41 refiner(
createRefiner(model,
Partition<
DdType, ValueType>::create(model, bisimulationType, preservationInformation), bisimulationOptions)) {
45template<storm::dd::DdType DdType,
typename ValueType,
typename ExportValueType>
50 preservationInformation(preservationInformation),
51 bisimulationOptions(bisimulationOptions),
52 refiner(
createRefiner(model,
Partition<
DdType, ValueType>::create(model, bisimulationType, preservationInformation), bisimulationOptions)) {
56template<storm::dd::DdType DdType,
typename ValueType,
typename ExportValueType>
61 preservationInformation(model, formulas),
62 bisimulationOptions(bisimulationOptions),
63 refiner(
createRefiner(model,
Partition<
DdType, ValueType>::create(model, bisimulationType, formulas, bisimulationOptions), bisimulationOptions)) {
67template<storm::dd::DdType DdType,
typename ValueType,
typename ExportValueType>
72 preservationInformation(preservationInformation),
73 bisimulationOptions(bisimulationOptions),
74 refiner(
createRefiner(model, initialPartition, bisimulationOptions)) {
78template<storm::dd::DdType DdType,
typename ValueType,
typename ExportValueType>
81template<storm::dd::DdType DdType,
typename ValueType,
typename ExportValueType>
82void BisimulationDecomposition<DdType, ValueType, ExportValueType>::initialize() {
84 verboseProgress = generalSettings.isVerboseSet();
85 showProgressDelay = generalSettings.getShowProgressDelay();
87 auto start = std::chrono::high_resolution_clock::now();
88 this->refineWrtRewardModels();
89 auto end = std::chrono::high_resolution_clock::now();
90 STORM_LOG_INFO(
"Refining with respect to reward models took " << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() <<
"ms.");
92 STORM_LOG_INFO(
"Initial partition has " << refiner->getStatePartition().getNumberOfBlocks() <<
" blocks.");
93 STORM_LOG_TRACE(
"Initial partition has " << refiner->getStatePartition().getNodeCount() <<
" nodes.");
96template<storm::dd::DdType DdType,
typename ValueType,
typename ExportValueType>
99 STORM_LOG_ASSERT(this->refiner->getStatus() != Status::FixedPoint,
"Can only proceed if no fixpoint has been reached yet.");
101 auto start = std::chrono::high_resolution_clock::now();
102 auto timeOfLastMessage = start;
103 uint64_t iterations = 0;
106 refined = refiner->refine(mode);
110 auto now = std::chrono::high_resolution_clock::now();
111 auto durationSinceLastMessage = std::chrono::duration_cast<std::chrono::milliseconds>(now - timeOfLastMessage).count();
112 if (
static_cast<uint64_t
>(durationSinceLastMessage) >= showProgressDelay * 1000 || verboseProgress) {
113 auto durationSinceStart = std::chrono::duration_cast<std::chrono::milliseconds>(now - start).count();
114 STORM_LOG_INFO(
"State partition after " << iterations <<
" iterations (" << durationSinceStart <<
"ms) has "
115 << refiner->getStatePartition().getNumberOfBlocks() <<
" blocks.");
116 timeOfLastMessage = std::chrono::high_resolution_clock::now();
119 auto end = std::chrono::high_resolution_clock::now();
122 << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() <<
"ms (" << iterations
123 <<
" iterations, signature: " << std::chrono::duration_cast<std::chrono::milliseconds>(refiner->getTotalSignatureTime()).count()
124 <<
"ms, refinement: " << std::chrono::duration_cast<std::chrono::milliseconds>(refiner->getTotalRefinementTime()).count() <<
"ms).");
127template<storm::dd::DdType DdType,
typename ValueType,
typename ExportValueType>
130 STORM_LOG_ASSERT(this->refiner->getStatus() != Status::FixedPoint,
"Can only proceed if no fixpoint has been reached yet.");
133 auto start = std::chrono::high_resolution_clock::now();
134 auto timeOfLastMessage = start;
135 uint64_t iterations = 0;
137 while (refined && iterations < steps) {
138 refined = refiner->refine(mode);
142 auto now = std::chrono::high_resolution_clock::now();
143 auto durationSinceLastMessage = std::chrono::duration_cast<std::chrono::seconds>(now - timeOfLastMessage).count();
144 if (
static_cast<uint64_t
>(durationSinceLastMessage) >= showProgressDelay || verboseProgress) {
145 auto durationSinceStart = std::chrono::duration_cast<std::chrono::seconds>(now - start).count();
146 STORM_LOG_INFO(
"State partition after " << iterations <<
" iterations (" << durationSinceStart <<
"ms) has "
147 << refiner->getStatePartition().getNumberOfBlocks() <<
" blocks.");
148 timeOfLastMessage = std::chrono::high_resolution_clock::now();
155template<storm::dd::DdType DdType,
typename ValueType,
typename ExportValueType>
157 return this->refiner->getStatus() == Status::FixedPoint;
160template<storm::dd::DdType DdType,
typename ValueType,
typename ExportValueType>
163 std::shared_ptr<storm::models::Model<ExportValueType>> quotient;
164 if (this->refiner->getStatus() == Status::FixedPoint) {
167 quotient = extractor.
extract(model, refiner->getStatePartition(), preservationInformation);
170 storm::exceptions::InvalidOperationException,
"Can only extract partial quotient for discrete-time models.");
173 if (!partialQuotientExtractor) {
174 partialQuotientExtractor = std::make_unique<bisimulation::PartialQuotientExtractor<DdType, ValueType, ExportValueType>>(model, quotientFormat);
177 quotient = partialQuotientExtractor->extract(refiner->getStatePartition(), preservationInformation);
184template<storm::dd::DdType DdType,
typename ValueType,
typename ExportValueType>
185void BisimulationDecomposition<DdType, ValueType, ExportValueType>::refineWrtRewardModels() {
186 for (
auto const& rewardModelName : this->preservationInformation.getRewardModelNames()) {
187 auto const& rewardModel = this->model.getRewardModel(rewardModelName);
188 refiner->refineWrtRewardModel(rewardModel);
192template class BisimulationDecomposition<storm::dd::DdType::CUDD, double>;
194template class BisimulationDecomposition<storm::dd::DdType::Sylvan, double>;
195template class BisimulationDecomposition<storm::dd::DdType::Sylvan, storm::RationalNumber>;
196template class BisimulationDecomposition<storm::dd::DdType::Sylvan, storm::RationalNumber, double>;
197template class BisimulationDecomposition<storm::dd::DdType::Sylvan, storm::RationalFunction>;
bool getReachedFixedPoint() const
Retrieves whether a fixed point has been reached.
BisimulationDecomposition(storm::models::symbolic::Model< DdType, ValueType > const &model, storm::storage::BisimulationType const &bisimulationType, bisimulation::BisimulationOptions const &bisimulationOptions=bisimulation::BisimulationOptions())
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()
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, BisimulationOptions const &bisimulationOptions)
SettingsType const & getModule()
Get module.