Skip to content

Commit b3bf878

Browse files
committed
removed enqueuedBlocks-logic based on the front() of each block, as the first state might change by the sorting which takes place during a split. For Nand models this caused an invalid quotient
1 parent fb51bb7 commit b3bf878

2 files changed

Lines changed: 17 additions & 14 deletions

File tree

src/storm/storage/bisimulation/BisimulationDecomposition.cpp

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -305,14 +305,14 @@ void BisimulationDecomposition<ModelType>::performSignatureRefinement() {
305305
// Insert all blocks into the queue for refinement
306306
std::deque<typename Partition::Block> blocksQueue;
307307

308-
std::unordered_set<uint64_t> enqueuedSplitterBlocks;
308+
storm::storage::Partition::BlockSet enqueuedSplitterBlocks;
309309
// Initially, add all current blocks to the queue
310310
this->partition.forEachBlock([&](auto const& block) {
311311
// TODO: maybe one has to handle the absorbing blocks differently for weak bisimulation, i.e., that they are still enqueued here and handled differently
312312
// while splitting based on the computed signatures
313313
if (!this->absorbingBlocks.contains(block.front())) {
314314
blocksQueue.push_back(block);
315-
enqueuedSplitterBlocks.insert(block.front());
315+
enqueuedSplitterBlocks.insert(block);
316316
}
317317
});
318318

@@ -327,7 +327,7 @@ void BisimulationDecomposition<ModelType>::performSignatureRefinement() {
327327

328328
auto blockToRefine = blocksQueue.back();
329329
blocksQueue.pop_back();
330-
enqueuedSplitterBlocks.erase(blockToRefine.front());
330+
enqueuedSplitterBlocks.erase(blockToRefine);
331331

332332
// Detect if splitting is necessary
333333
size_t firstSignature = 0;
@@ -357,16 +357,21 @@ void BisimulationDecomposition<ModelType>::performSignatureRefinement() {
357357
continue;
358358
}
359359

360+
auto oldFront = blockToRefine.front();
360361
// split blocks according to their state signatures, if possible
361362
auto wasSplit = this->partition.splitBlockByOrder(blockToRefine, [&stateToSignature]
362363
(auto const& a, auto const& b) { return stateToSignature.at(a) < stateToSignature.at(b); });
363364

364365
if (wasSplit) {
366+
auto newFront = blockToRefine.front();
367+
if (newFront != oldFront) {
368+
std::cout << "[LOG] Block front changed: was " << oldFront << ", now " << newFront << std::endl;
369+
}
365370
this->partition.forEachSubBlock(blockToRefine, [this, &blocksQueue, &statesWithInvalidSignature, &enqueuedSplitterBlocks](auto const& block) {
366371
// TODO: If representative state is already on queue, then don't add it
367-
if (block.size() > 1 && !enqueuedSplitterBlocks.contains(block.front())) {
372+
if (block.size() > 1 && !enqueuedSplitterBlocks.contains(block)) {
368373
blocksQueue.push_back(block);
369-
enqueuedSplitterBlocks.insert(block.front());
374+
enqueuedSplitterBlocks.insert(block);
370375
}
371376

372377
for (auto state : block) {
@@ -375,9 +380,9 @@ void BisimulationDecomposition<ModelType>::performSignatureRefinement() {
375380
auto predecessorBlock = partition.getBlockOfElement(predecessorState);
376381

377382
// place target block on queue only if it is not already there
378-
if (predecessorBlock.size() > 1 && !enqueuedSplitterBlocks.contains(predecessorBlock.front())) {
383+
if (predecessorBlock.size() > 1 && !enqueuedSplitterBlocks.contains(predecessorBlock)) {
379384
blocksQueue.push_back(predecessorBlock);
380-
enqueuedSplitterBlocks.insert(predecessorBlock.front());
385+
enqueuedSplitterBlocks.insert(predecessorBlock);
381386
}
382387

383388
// remember which states have an invalid signature now

src/storm/storage/bisimulation/DeterministicModelBisimulationDecomposition.cpp

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -133,25 +133,23 @@ void DeterministicModelBisimulationDecomposition<ModelType>::refinePartitionBase
133133
this->partition.splitBlockByPredicate(predecessorBlockToSplit, [this]
134134
(auto const& state) { return touchedProbabilitiesToSplitter.get(state); });
135135

136+
// TODO: Change check to BlockSet (enqueuedBlocks)
136137
if (noPredecessors.size() > 0) {
137138
splitterQueue.push_back(noPredecessors);
138-
enqueuedSplitterBlocks.insert(noPredecessors.front());
139139
}
140140

141141
if (predecessors.size() > 0) {
142142
bool wasSplit = this->partition.splitBlockByOrder(predecessors, [this]
143143
(auto const& a, auto const& b) {
144-
return probabilitiesToCurrentSplitter[a] < probabilitiesToCurrentSplitter[b];
144+
return this->comparator.isLess(probabilitiesToCurrentSplitter[a], probabilitiesToCurrentSplitter[b]);
145145
});
146146

147147
// Add all blocks that were split to splitter queue
148148
if (wasSplit) {
149149
this->partition.forEachSubBlock(predecessors, [&splitterQueue, &enqueuedSplitterBlocks](auto const& block) {
150-
// If representative state is already on queue, then do not add it
151-
if (!enqueuedSplitterBlocks.contains(block.front())) {
152-
splitterQueue.push_back(block);
153-
enqueuedSplitterBlocks.insert(block.front());
154-
}
150+
// TODO: Change check to BlockSet (enqueuedBlocks)
151+
splitterQueue.push_back(block);
152+
enqueuedSplitterBlocks.insert(block.front());
155153
});
156154
}
157155
}

0 commit comments

Comments
 (0)