@@ -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
0 commit comments