26 std::vector<std::shared_ptr<storm::logic::Formula const>>
const& formulas,
Options options) {
29 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Bisimulation is not supported for Interval models.");
39 storm::RationalNumber
const& tolerance = *options.
tolerance;
41 "Tolerance for bisimulation minimization must be non-negative, but was " << tolerance <<
".");
45 "Weak bisimulation is only supported for deterministic models, but the given model is of type " << model.
getType() <<
".");
47 "Using splitter-based refinement because weak bisimulation is not supported for signature-based refinement.");
52 STORM_LOG_INFO(
"Using " << (useSignatureRefinement ?
"signature" :
"splitter") <<
"-based refinement for bisimulation minimization.");
61 STORM_LOG_STATISTICS(sw <<
" seconds for initial partition (" << partition.getNumberOfBlocks() <<
" blocks).");
65 std::optional<storm::bisimulation::QuotientData<ValueType>> quotientData;
67 auto initializeQuotientData = [&partition, &sw,
69 STORM_LOG_STATISTICS(sw <<
" seconds for refinement (" << partition.getNumberOfBlocks() <<
" blocks).");
71 quotientData.emplace(partition, preferredRepresentatives);
80 auto weakData = initialization.
getWeakBisimulationData(partition, backwardTransitions, preservationInformation);
81 STORM_LOG_STATISTICS(sw <<
" seconds for weak bisimulation initialization (" << partition.getNumberOfBlocks() <<
" blocks).");
91 auto const nonSilentStates = ~weakData.silentStates;
92 initializeQuotientData(nonSilentStates);
93 quotientData->weakData.emplace(std::move(weakData));
97 quotientData->toQuotientChoice = quotientData->toQuotientState;
102 initializeQuotientData();
105 if constexpr (std::is_same_v<ValueType, storm::RationalFunction>) {
108 <<
") is not supported for parametric models.");
113 initializeQuotientData();
121 initializeQuotientData();
124 quotientData->toQuotientChoice = quotientData->toQuotientState;
133 return {.quotient = std::move(quotientModel),
134 .toQuotientStateMapping = std::move(quotientData->toQuotientState),
135 .toQuotientChoiceMapping = std::move(quotientData->toQuotientChoice)};