147 lines
5.6 KiB

#include "src/storage/bisimulation/Block.h"
#include <iostream>
#include <iomanip>
#include "src/storage/bisimulation/Partition.h"
#include "src/exceptions/InvalidOperationException.h"
#include "src/utility/macros.h"
namespace storm {
namespace storage {
namespace bisimulation {
Block::Block(storm::storage::sparse::state_type beginIndex, storm::storage::sparse::state_type endIndex, Block* previousBlock, Block* nextBlock, std::size_t id) : nextBlock(nextBlock), previousBlock(previousBlock), beginIndex(beginIndex), endIndex(endIndex), markedAsSplitter(false), needsRefinementFlag(false), absorbing(false), id(id) {
if (nextBlock != nullptr) {
nextBlock->previousBlock = this;
}
if (previousBlock != nullptr) {
previousBlock->nextBlock = this;
}
STORM_LOG_ASSERT(this->beginIndex < this->endIndex, "Unable to create block of illegal size.");
}
bool Block::operator==(Block const& other) const {
return this == &other;
}
bool Block::operator!=(Block const& other) const {
return this != &other;
}
void Block::print(Partition const& partition) const {
std::cout << "block [" << this << "] " << this->id << " from " << this->beginIndex << " to " << this->endIndex << std::endl;
}
void Block::setBeginIndex(storm::storage::sparse::state_type beginIndex) {
// std::cout << "setting beg index to " << beginIndex << " [" << this << "]" << std::endl;
this->beginIndex = beginIndex;
STORM_LOG_ASSERT(beginIndex < endIndex, "Unable to resize block to illegal size.");
}
void Block::setEndIndex(storm::storage::sparse::state_type endIndex) {
this->endIndex = endIndex;
STORM_LOG_ASSERT(beginIndex < endIndex, "Unable to resize block to illegal size.");
}
storm::storage::sparse::state_type Block::getBeginIndex() const {
return this->beginIndex;
}
storm::storage::sparse::state_type Block::getEndIndex() const {
return this->endIndex;
}
Block const& Block::getNextBlock() const {
return *this->nextBlock;
}
bool Block::hasNextBlock() const {
return this->nextBlock != nullptr;
}
Block* Block::getNextBlockPointer() {
return this->nextBlock;
}
Block const* Block::getNextBlockPointer() const {
return this->nextBlock;
}
Block const& Block::getPreviousBlock() const {
return *this->previousBlock;
}
Block* Block::getPreviousBlockPointer() {
return this->previousBlock;
}
Block const* Block::getPreviousBlockPointer() const {
return this->previousBlock;
}
bool Block::hasPreviousBlock() const {
return this->previousBlock != nullptr;
}
bool Block::check() const {
STORM_LOG_ASSERT(this->beginIndex < this->endIndex, "Block has negative size.");
STORM_LOG_ASSERT(!this->hasPreviousBlock() || this->getPreviousBlock().getNextBlockPointer() == this, "Illegal previous block.");
STORM_LOG_ASSERT(!this->hasNextBlock() || this->getNextBlock().getPreviousBlockPointer() == this, "Illegal next block.");
return true;
}
std::size_t Block::getNumberOfStates() const {
return (this->endIndex - this->beginIndex);
}
bool Block::isMarkedAsSplitter() const {
return this->markedAsSplitter;
}
void Block::markAsSplitter() {
this->markedAsSplitter = true;
}
void Block::unmarkAsSplitter() {
this->markedAsSplitter = false;
}
std::size_t Block::getId() const {
return this->id;
}
void Block::setAbsorbing(bool absorbing) {
this->absorbing = absorbing;
}
bool Block::isAbsorbing() const {
return this->absorbing;
}
void Block::setRepresentativeState(storm::storage::sparse::state_type representativeState) {
this->representativeState = representativeState;
}
bool Block::hasRepresentativeState() const {
return static_cast<bool>(representativeState);
}
storm::storage::sparse::state_type Block::getRepresentativeState() const {
STORM_LOG_THROW(representativeState, storm::exceptions::InvalidOperationException, "Unable to retrieve representative state for block.");
return representativeState.get();
}
// Retrieves whether the block is marked as a predecessor.
bool Block::needsRefinement() const {
return needsRefinementFlag;
}
// Marks the block as needing refinement (or not).
void Block::setNeedsRefinement(bool value) {
needsRefinementFlag = value;
}
}
}
}