You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
138 lines
5.9 KiB
138 lines
5.9 KiB
#ifndef STORM_STORAGE_BISIMULATION_BLOCK_H_
|
|
#define STORM_STORAGE_BISIMULATION_BLOCK_H_
|
|
|
|
#include <list>
|
|
#include <boost/optional.hpp>
|
|
|
|
#include "src/storage/sparse/StateType.h"
|
|
|
|
namespace storm {
|
|
namespace storage {
|
|
namespace bisimulation {
|
|
// Forward-declare partition class.
|
|
class Partition;
|
|
|
|
class Block {
|
|
public:
|
|
friend class Partition;
|
|
|
|
// Creates a new block with the given begin and end.
|
|
Block(storm::storage::sparse::state_type beginIndex, storm::storage::sparse::state_type endIndex, Block* previous, Block* next, std::size_t id);
|
|
|
|
Block() = default;
|
|
Block(Block const& other) = default;
|
|
Block& operator=(Block const& other) = default;
|
|
Block(Block&& other) = default;
|
|
Block& operator=(Block&& other) = default;
|
|
|
|
bool operator==(Block const& other) const;
|
|
bool operator!=(Block const& other) const;
|
|
|
|
// Prints the block to the standard output.
|
|
void print(Partition const& partition) const;
|
|
|
|
// Returns the beginning index of the block.
|
|
storm::storage::sparse::state_type getBeginIndex() const;
|
|
|
|
// Returns the beginning index of the block.
|
|
storm::storage::sparse::state_type getEndIndex() const;
|
|
|
|
// Gets the next block (if there is one).
|
|
Block const& getNextBlock() const;
|
|
|
|
// Gets a pointer to the next block (if there is one).
|
|
Block* getNextBlockPointer();
|
|
|
|
// Gets a pointer to the next block (if there is one).
|
|
Block const* getNextBlockPointer() const;
|
|
|
|
// Retrieves whether the block as a successor block.
|
|
bool hasNextBlock() const;
|
|
|
|
// Gets the next block (if there is one).
|
|
Block const& getPreviousBlock() const;
|
|
|
|
// Gets a pointer to the previous block (if there is one).
|
|
Block* getPreviousBlockPointer();
|
|
|
|
// Gets a pointer to the previous block (if there is one).
|
|
Block const* getPreviousBlockPointer() const;
|
|
|
|
// Retrieves whether the block as a successor block.
|
|
bool hasPreviousBlock() const;
|
|
|
|
// Checks consistency of the information in the block.
|
|
bool check() const;
|
|
|
|
// Retrieves the number of states in this block.
|
|
std::size_t getNumberOfStates() const;
|
|
|
|
// Checks whether the block is marked as a splitter.
|
|
bool isMarkedAsSplitter() const;
|
|
|
|
// Marks the block as being a splitter.
|
|
void markAsSplitter();
|
|
|
|
// Removes the mark.
|
|
void unmarkAsSplitter();
|
|
|
|
// Retrieves the ID of the block.
|
|
std::size_t getId() const;
|
|
|
|
// Retrieves whether the block is marked as a predecessor.
|
|
bool needsRefinement() const;
|
|
|
|
// Marks the block as needing refinement (or not).
|
|
void setNeedsRefinement(bool value = true);
|
|
|
|
// Sets whether or not the block is to be interpreted as absorbing.
|
|
void setAbsorbing(bool absorbing);
|
|
|
|
// Retrieves whether the block is to be interpreted as absorbing.
|
|
bool isAbsorbing() const;
|
|
|
|
// Sets the representative state of this block
|
|
void setRepresentativeState(storm::storage::sparse::state_type representativeState);
|
|
|
|
// Retrieves whether this block has a representative state.
|
|
bool hasRepresentativeState() const;
|
|
|
|
// Retrieves the representative state for this block.
|
|
storm::storage::sparse::state_type getRepresentativeState() const;
|
|
|
|
private:
|
|
// Sets the beginning index of the block.
|
|
void setBeginIndex(storm::storage::sparse::state_type beginIndex);
|
|
|
|
// Sets the end index of the block.
|
|
void setEndIndex(storm::storage::sparse::state_type endIndex);
|
|
|
|
// Pointers to the next and previous block.
|
|
Block* nextBlock;
|
|
Block* previousBlock;
|
|
|
|
// The begin and end indices of the block in terms of the state vector of the partition.
|
|
storm::storage::sparse::state_type beginIndex;
|
|
storm::storage::sparse::state_type endIndex;
|
|
|
|
// A field that can be used for marking the block.
|
|
bool markedAsSplitter;
|
|
|
|
// A field that can be used for marking the block as needing refinement.
|
|
bool needsRefinementFlag;
|
|
|
|
// A flag indicating whether the block is to be interpreted as absorbing or not.
|
|
bool absorbing;
|
|
|
|
// The ID of the block. This is only used for debugging purposes.
|
|
std::size_t id;
|
|
|
|
// An optional representative state for the block. If this is set, this state is used to derive the
|
|
// atomic propositions of the meta state in the quotient model.
|
|
boost::optional<storm::storage::sparse::state_type> representativeState;
|
|
};
|
|
}
|
|
}
|
|
}
|
|
|
|
#endif /* STORM_STORAGE_BISIMULATION_BLOCK_H_ */
|