19template<
typename ValueType, SignatureMode SignatureMode>
39template<
typename ValueType, SignatureMode SignatureMode>
41 bool const enforcePredecessorExploration) {
44 for (uint64_t
const state : pivotBlock) {
48 bool pivotHasBeenSplit{
false};
57 context.
partition.
forEachSubBlock(pivotBlock, [&context, &splitCondition, &pivotHasBeenSplit](
auto const& subBlock) {
62 if (!pivotHasBeenSplit && !enforcePredecessorExploration) {
76 uint64_t subBlockIndex = 0;
77 context.
partition.
forEachSubBlock(pivotBlock, [&context, &predecessorToPivotBlocks, &predecessorBlocks, &subBlockIndex](
auto const& subBlock) {
78 for (uint64_t
const state : subBlock) {
80 auto const predecessorState = predecessorEntry.getColumn();
82 if (predecessorBlock.size() > 1) {
84 predecessorToPivotBlocks.addValue(predecessorState, subBlockIndex);
85 predecessorBlocks.insert(predecessorBlock);
92 while (!predecessorBlocks.empty()) {
93 auto const predecessorBlock = predecessorBlocks.pop();
95 auto const& toPivotBlocks = predecessorToPivotBlocks.getValues();
99 auto [noPredecessors, predecessors] =
100 predecessorToPivotBlocks.getNonDefaultStates().size() < predecessorBlock.size()
105 STORM_LOG_ASSERT(!predecessors.empty(),
"The predecessor block should contain at least one predecessor state.");
109 if (pivotHasBeenSplit) {
111 predecessors, [&toPivotBlocks](uint64_t
const state1, uint64_t
const state2) {
return toPivotBlocks[state1] < toPivotBlocks[state2]; });
114 std::all_of(predecessors.begin(), predecessors.end(), [&toPivotBlocks](uint64_t
const& state) { return toPivotBlocks[state] == 1ull; }),
115 "Expected all predecessor states to reach the pivot block.");
120 context.
queue.erase(predecessorBlock);
126 context.
queue.try_emplace(predecessorBlock,
false);
130 predecessorToPivotBlocks.clear();
135template<
typename ValueType, SignatureMode SignatureMode>
141 partition.
forEachBlock([&context](
auto const& block) { context.
queue.emplace(block,
false); });
143 while (!context.
queue.empty()) {
145 auto const [pivotBlock, enforcePredecessorExploration] = *context.
queue.begin();
154 partition.
forEachBlock([&signatures](
auto const& block) {
155 if (block.size() == 1) {
Set of blocks that are no proper superblock.
Represents a partition of a set of consecutive indices.
bool splitBlockByClustering(Block const &block, Condition const &condition)
Splits the given block by anchor-based clustering: repeatedly picks the first not-yet-grouped element...
std::map< Block, T, BlockCompare > OrderedBlockMap
A map of blocks, ordered by their size (smallest first).
void forEachBlock(Func const &f) const
Applies the given function on each block in the partition.
void forEachSubBlock(Block const &superBlock, Func const &f) const
Applies the given function on each block in the given super block.
bool splitBlockByOrder(Block const &block, SplittingOrder const &less)
Splits the given block according to the given order.
std::span< ElementIndex const > Block
A contiguous range of elements that form a (possibly proper super-) block of the partition.
Block getBlockOfElement(ElementIndex element) const
std::pair< Block, Block > splitBlockByRange(Block const &block, SplitRange &&r)
Splits the given block according to the given range of elements.
bool isProperSuperBlock(Block const &block) const
std::pair< Block, Block > splitBlockByPredicate(Block const &block, SplittingPredicate const &f)
Splits the given block according to the given predicate.
Computes and caches the state signatures and provides state-based order / condition for splitting in ...
void updateStateSignature(uint64_t const stateIndex)
Updates the state signature of the given state index.
SplitOrder getEquivalenceSplitOrder() const
Instantiates a SplitOrder whose ties exactly coincide with true signature equality (operator==).
SplitCondition getApproximateSplitCondition() const
Instantiates a SplitCondition.
SplitOrder getStructuralSplitOrder() const
Instantiates a SplitOrder that only compares with respect to structural equality of the state signatu...
Base class for all sparse models.
A class that holds a possibly non-square matrix in the compressed row storage format.
#define STORM_LOG_ASSERT(cond, message)
void refinePartitionBasedOnSignature(SignatureRefinementContext< ValueType, SignatureMode > &context, storm::bisimulation::Partition::Block const pivotBlock, bool const enforcePredecessorExploration)
SparseAccumulator< uint64_t > WrappingSetAccumulator
Accumulates a set of indices for each state, where only the index modulo 64 is stored,...
void performSignatureBasedRefinement(storm::models::sparse::Model< ValueType > const &model, storm::bisimulation::Partition &partition, Signatures< ValueType, SignatureMode > &signatures)
template void performSignatureBasedRefinement< storm::RationalNumber, SignatureMode::Approximative >(storm::models::sparse::Model< storm::RationalNumber > const &model, storm::bisimulation::Partition &partition, Signatures< storm::RationalNumber, SignatureMode::Approximative > &signatures)
template void performSignatureBasedRefinement< double, SignatureMode::Exact >(storm::models::sparse::Model< double > const &model, storm::bisimulation::Partition &partition, Signatures< double, SignatureMode::Exact > &signatures)
template void performSignatureBasedRefinement< double, SignatureMode::Approximative >(storm::models::sparse::Model< double > const &model, storm::bisimulation::Partition &partition, Signatures< double, SignatureMode::Approximative > &signatures)
template void performSignatureBasedRefinement< storm::RationalFunction, SignatureMode::Exact >(storm::models::sparse::Model< storm::RationalFunction > const &model, storm::bisimulation::Partition &partition, Signatures< storm::RationalFunction, SignatureMode::Exact > &signatures)
template void performSignatureBasedRefinement< storm::RationalNumber, SignatureMode::Exact >(storm::models::sparse::Model< storm::RationalNumber > const &model, storm::bisimulation::Partition &partition, Signatures< storm::RationalNumber, SignatureMode::Exact > &signatures)
constexpr bool IsIntervalType
Helper to check if a type is an interval.
Cache(Partition const &partition)
Partition::NonSuperBlockSet predecessorBlocks
WrappingSetAccumulator predecessorToPivotBlocks
storm::models::sparse::Model< ValueType > const & model
storm::bisimulation::Partition::OrderedBlockMap< bool > queue
storm::bisimulation::Signatures< ValueType, SignatureMode > & signatures
SignatureRefinementContext(storm::models::sparse::Model< ValueType > const &model, storm::bisimulation::Partition &partition, Signatures< ValueType, SignatureMode > &signatures)
storm::bisimulation::Partition & partition
storm::storage::SparseMatrix< ValueType > const backwardTransitions
struct storm::bisimulation::detail::SignatureRefinementContext::Cache cache