Browse Source
Further steps towards implementation of MEC decomposition.
Further steps towards implementation of MEC decomposition.
Former-commit-id: 8166b3b923
main
12 changed files with 358 additions and 49 deletions
-
4src/models/AbstractModel.h
-
15src/storage/BitVector.h
-
52src/storage/Decomposition.cpp
-
12src/storage/Decomposition.h
-
52src/storage/MaximalEndComponent.cpp
-
59src/storage/MaximalEndComponent.h
-
45src/storage/MaximalEndComponentDecomposition.cpp
-
47src/storage/MaximalEndComponentDecomposition.h
-
70src/storage/StronglyConnectedComponentDecomposition.cpp
-
28src/storage/StronglyConnectedComponentDecomposition.h
-
20src/storage/VectorSet.h
-
1src/storm.cpp
@ -1,57 +1,85 @@ |
|||||
#include "src/storage/Decomposition.h"
|
#include "src/storage/Decomposition.h"
|
||||
|
#include "src/storage/MaximalEndComponent.h"
|
||||
|
|
||||
namespace storm { |
namespace storm { |
||||
namespace storage { |
namespace storage { |
||||
|
|
||||
Decomposition::Decomposition() : blocks() { |
|
||||
|
template <typename BlockType> |
||||
|
Decomposition<BlockType>::Decomposition() : blocks() { |
||||
// Intentionally left empty.
|
// Intentionally left empty.
|
||||
} |
} |
||||
|
|
||||
Decomposition::Decomposition(Decomposition const& other) : blocks(other.blocks) { |
|
||||
|
template <typename BlockType> |
||||
|
Decomposition<BlockType>::Decomposition(Decomposition const& other) : blocks(other.blocks) { |
||||
// Intentionally left empty.
|
// Intentionally left empty.
|
||||
} |
} |
||||
|
|
||||
Decomposition& Decomposition::operator=(Decomposition const& other) { |
|
||||
|
template <typename BlockType> |
||||
|
Decomposition<BlockType>& Decomposition<BlockType>::operator=(Decomposition const& other) { |
||||
this->blocks = other.blocks; |
this->blocks = other.blocks; |
||||
return *this; |
return *this; |
||||
} |
} |
||||
|
|
||||
Decomposition::Decomposition(Decomposition&& other) : blocks(std::move(other.blocks)) { |
|
||||
|
template <typename BlockType> |
||||
|
Decomposition<BlockType>::Decomposition(Decomposition&& other) : blocks(std::move(other.blocks)) { |
||||
// Intentionally left empty.
|
// Intentionally left empty.
|
||||
} |
} |
||||
|
|
||||
Decomposition& Decomposition::operator=(Decomposition&& other) { |
|
||||
|
template <typename BlockType> |
||||
|
Decomposition<BlockType>& Decomposition<BlockType>::operator=(Decomposition&& other) { |
||||
this->blocks = std::move(other.blocks); |
this->blocks = std::move(other.blocks); |
||||
return *this; |
return *this; |
||||
} |
} |
||||
|
|
||||
size_t Decomposition::size() const { |
|
||||
|
template <typename BlockType> |
||||
|
size_t Decomposition<BlockType>::size() const { |
||||
return blocks.size(); |
return blocks.size(); |
||||
} |
} |
||||
|
|
||||
Decomposition::iterator Decomposition::begin() { |
|
||||
|
template <typename BlockType> |
||||
|
typename Decomposition<BlockType>::iterator Decomposition<BlockType>::begin() { |
||||
return blocks.begin(); |
return blocks.begin(); |
||||
} |
} |
||||
|
|
||||
Decomposition::iterator Decomposition::end() { |
|
||||
|
template <typename BlockType> |
||||
|
typename Decomposition<BlockType>::iterator Decomposition<BlockType>::end() { |
||||
return blocks.end(); |
return blocks.end(); |
||||
} |
} |
||||
|
|
||||
Decomposition::const_iterator Decomposition::begin() const { |
|
||||
|
template <typename BlockType> |
||||
|
typename Decomposition<BlockType>::const_iterator Decomposition<BlockType>::begin() const { |
||||
return blocks.begin(); |
return blocks.begin(); |
||||
} |
} |
||||
|
|
||||
Decomposition::const_iterator Decomposition::end() const { |
|
||||
|
template <typename BlockType> |
||||
|
typename Decomposition<BlockType>::const_iterator Decomposition<BlockType>::end() const { |
||||
return blocks.end(); |
return blocks.end(); |
||||
} |
} |
||||
|
|
||||
Decomposition::Block const& Decomposition::getBlock(uint_fast64_t index) const { |
|
||||
|
template <typename BlockType> |
||||
|
BlockType const& Decomposition<BlockType>::getBlock(uint_fast64_t index) const { |
||||
return blocks.at(index); |
return blocks.at(index); |
||||
} |
} |
||||
|
|
||||
Decomposition::Block const& Decomposition::operator[](uint_fast64_t index) const { |
|
||||
|
template <typename BlockType> |
||||
|
BlockType const& Decomposition<BlockType>::operator[](uint_fast64_t index) const { |
||||
return blocks[index]; |
return blocks[index]; |
||||
} |
} |
||||
|
|
||||
|
template <typename BlockType> |
||||
|
std::ostream& operator<<(std::ostream& out, Decomposition<BlockType> const& decomposition) { |
||||
|
out << "{"; |
||||
|
if (decomposition.size() > 0) { |
||||
|
for (uint_fast64_t blockIndex = 0; blockIndex < decomposition.size() - 1; ++blockIndex) { |
||||
|
out << decomposition.blocks[blockIndex] << ", "; |
||||
|
} |
||||
|
out << decomposition.blocks[decomposition.size() - 1]; |
||||
|
} |
||||
|
out << "}"; |
||||
|
return out; |
||||
|
} |
||||
|
|
||||
|
template class Decomposition<StateBlock>; |
||||
|
template class Decomposition<MaximalEndComponent>; |
||||
} // namespace storage
|
} // namespace storage
|
||||
} // namespace storm
|
} // namespace storm
|
@ -0,0 +1,52 @@ |
|||||
|
#include "src/storage/MaximalEndComponent.h"
|
||||
|
#include "src/exceptions/InvalidStateException.h"
|
||||
|
|
||||
|
namespace storm { |
||||
|
namespace storage { |
||||
|
|
||||
|
MaximalEndComponent::MaximalEndComponent() : stateToChoicesMapping() { |
||||
|
// Intentionally left empty.
|
||||
|
} |
||||
|
|
||||
|
MaximalEndComponent::MaximalEndComponent(MaximalEndComponent const& other) : stateToChoicesMapping(other.stateToChoicesMapping) { |
||||
|
// Intentionally left empty.
|
||||
|
} |
||||
|
|
||||
|
MaximalEndComponent& MaximalEndComponent::operator=(MaximalEndComponent const& other) { |
||||
|
stateToChoicesMapping = other.stateToChoicesMapping; |
||||
|
return *this; |
||||
|
} |
||||
|
|
||||
|
MaximalEndComponent::MaximalEndComponent(MaximalEndComponent&& other) : stateToChoicesMapping(std::move(other.stateToChoicesMapping)) { |
||||
|
// Intentionally left empty.
|
||||
|
} |
||||
|
|
||||
|
MaximalEndComponent& MaximalEndComponent::operator=(MaximalEndComponent&& other) { |
||||
|
stateToChoicesMapping = std::move(other.stateToChoicesMapping); |
||||
|
return *this; |
||||
|
} |
||||
|
|
||||
|
void MaximalEndComponent::addState(uint_fast64_t state, std::vector<uint_fast64_t> const& choices) { |
||||
|
stateToChoicesMapping[state] = choices; |
||||
|
} |
||||
|
|
||||
|
std::vector<uint_fast64_t> const& MaximalEndComponent::getChoicesForState(uint_fast64_t state) const { |
||||
|
auto stateChoicePair = stateToChoicesMapping.find(state); |
||||
|
|
||||
|
if (stateChoicePair == stateToChoicesMapping.end()) { |
||||
|
throw storm::exceptions::InvalidStateException() << "Cannot retrieve choices for state not contained in MEC."; |
||||
|
} |
||||
|
|
||||
|
return stateChoicePair->second; |
||||
|
} |
||||
|
|
||||
|
bool MaximalEndComponent::containsState(uint_fast64_t state) const { |
||||
|
auto stateChoicePair = stateToChoicesMapping.find(state); |
||||
|
|
||||
|
if (stateChoicePair == stateToChoicesMapping.end()) { |
||||
|
return false; |
||||
|
} |
||||
|
return true; |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,59 @@ |
|||||
|
#ifndef STORM_STORAGE_MAXIMALENDCOMPONENT_H_ |
||||
|
#define STORM_STORAGE_MAXIMALENDCOMPONENT_H_ |
||||
|
|
||||
|
#include <unordered_map> |
||||
|
#include <vector> |
||||
|
|
||||
|
namespace storm { |
||||
|
namespace storage { |
||||
|
/*! |
||||
|
* This class represents a maximal end-component of a nondeterministic model. |
||||
|
*/ |
||||
|
class MaximalEndComponent { |
||||
|
public: |
||||
|
/*! |
||||
|
* Creates an empty MEC. |
||||
|
*/ |
||||
|
MaximalEndComponent(); |
||||
|
|
||||
|
MaximalEndComponent(MaximalEndComponent const& other); |
||||
|
|
||||
|
MaximalEndComponent& operator=(MaximalEndComponent const& other); |
||||
|
|
||||
|
MaximalEndComponent(MaximalEndComponent&& other); |
||||
|
|
||||
|
MaximalEndComponent& operator=(MaximalEndComponent&& other); |
||||
|
|
||||
|
/*! |
||||
|
* Adds the given state and the given choices to the MEC. |
||||
|
* |
||||
|
* @param state The state for which to add the choices. |
||||
|
* @param choices The choices to add for the state. |
||||
|
*/ |
||||
|
void addState(uint_fast64_t state, std::vector<uint_fast64_t> const& choices); |
||||
|
|
||||
|
/*! |
||||
|
* Retrieves the choices for the given state that are contained in this MEC under the |
||||
|
* assumption that the state is in the MEC. |
||||
|
* |
||||
|
* @param state The state for which to retrieve the choices. |
||||
|
* @return A list of choices of the state in the MEC. |
||||
|
*/ |
||||
|
std::vector<uint_fast64_t> const& getChoicesForState(uint_fast64_t state) const; |
||||
|
|
||||
|
/*! |
||||
|
* Retrieves whether the given state is contained in this MEC. |
||||
|
* |
||||
|
* @param state The state for which to query membership in the MEC. |
||||
|
* @return True if the given state is contained in the MEC. |
||||
|
*/ |
||||
|
bool containsState(uint_fast64_t state) const; |
||||
|
|
||||
|
private: |
||||
|
// This stores the mapping from states contained in the MEC to the choices in this MEC. |
||||
|
std::unordered_map<uint_fast64_t, std::vector<uint_fast64_t>> stateToChoicesMapping; |
||||
|
}; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
#endif /* STORM_STORAGE_MAXIMALENDCOMPONENT_H_ */ |
@ -0,0 +1,45 @@ |
|||||
|
#include "src/storage/MaximalEndComponentDecomposition.h"
|
||||
|
|
||||
|
namespace storm { |
||||
|
namespace storage { |
||||
|
|
||||
|
template<typename ValueType> |
||||
|
MaximalEndComponentDecomposition<ValueType>::MaximalEndComponentDecomposition() : Decomposition() { |
||||
|
// Intentionally left empty.
|
||||
|
} |
||||
|
|
||||
|
template<typename ValueType> |
||||
|
MaximalEndComponentDecomposition<ValueType>::MaximalEndComponentDecomposition(storm::models::AbstractNondeterministicModel<ValueType> const& model) { |
||||
|
performMaximalEndComponentDecomposition(model); |
||||
|
} |
||||
|
|
||||
|
template<typename ValueType> |
||||
|
MaximalEndComponentDecomposition<ValueType>::MaximalEndComponentDecomposition(MaximalEndComponentDecomposition const& other) : Decomposition(other) { |
||||
|
// Intentionally left empty.
|
||||
|
} |
||||
|
|
||||
|
template<typename ValueType> |
||||
|
MaximalEndComponentDecomposition<ValueType>& MaximalEndComponentDecomposition<ValueType>::operator=(MaximalEndComponentDecomposition const& other) { |
||||
|
Decomposition::operator=(other); |
||||
|
return *this; |
||||
|
} |
||||
|
|
||||
|
template<typename ValueType> |
||||
|
MaximalEndComponentDecomposition<ValueType>::MaximalEndComponentDecomposition(MaximalEndComponentDecomposition&& other) : Decomposition(std::move(other)) { |
||||
|
// Intentionally left empty.
|
||||
|
} |
||||
|
|
||||
|
template<typename ValueType> |
||||
|
MaximalEndComponentDecomposition<ValueType>& MaximalEndComponentDecomposition<ValueType>::operator=(MaximalEndComponentDecomposition&& other) { |
||||
|
Decomposition::operator=(std::move(other)); |
||||
|
return *this; |
||||
|
} |
||||
|
|
||||
|
template <typename ValueType> |
||||
|
void MaximalEndComponentDecomposition<ValueType>::performMaximalEndComponentDecomposition(storm::models::AbstractNondeterministicModel<ValueType> const& model) { |
||||
|
// TODO.
|
||||
|
} |
||||
|
|
||||
|
template class MaximalEndComponentDecomposition<double>; |
||||
|
} |
||||
|
} |
@ -0,0 +1,47 @@ |
|||||
|
#ifndef STORM_STORAGE_MAXIMALENDCOMPONENTDECOMPOSITION_H_ |
||||
|
#define STORM_STORAGE_MAXIMALENDCOMPONENTDECOMPOSITION_H_ |
||||
|
|
||||
|
#include "src/storage/Decomposition.h" |
||||
|
#include "src/storage/StronglyConnectedComponentDecomposition.h" |
||||
|
#include "src/storage/MaximalEndComponent.h" |
||||
|
#include "src/models/AbstractNondeterministicModel.h" |
||||
|
|
||||
|
namespace storm { |
||||
|
namespace storage { |
||||
|
|
||||
|
template <typename ValueType> |
||||
|
class MaximalEndComponentDecomposition : public Decomposition<MaximalEndComponent> { |
||||
|
public: |
||||
|
/* |
||||
|
* Creates an empty MEC decomposition. |
||||
|
*/ |
||||
|
MaximalEndComponentDecomposition(); |
||||
|
|
||||
|
/* |
||||
|
* Creates an MEC decomposition of the given model. |
||||
|
* |
||||
|
* @param model The model to decompose into MECs. |
||||
|
*/ |
||||
|
MaximalEndComponentDecomposition(storm::models::AbstractNondeterministicModel<ValueType> const& model); |
||||
|
|
||||
|
MaximalEndComponentDecomposition(MaximalEndComponentDecomposition const& other); |
||||
|
|
||||
|
MaximalEndComponentDecomposition& operator=(MaximalEndComponentDecomposition const& other); |
||||
|
|
||||
|
MaximalEndComponentDecomposition(MaximalEndComponentDecomposition&& other); |
||||
|
|
||||
|
MaximalEndComponentDecomposition& operator=(MaximalEndComponentDecomposition&& other); |
||||
|
|
||||
|
private: |
||||
|
/*! |
||||
|
* Performs the actual decomposition of the given model into MECs. Stores the MECs found in the current decomposition |
||||
|
* as a side-effect. |
||||
|
* |
||||
|
* @param model The model to decompose. |
||||
|
*/ |
||||
|
void performMaximalEndComponentDecomposition(storm::models::AbstractNondeterministicModel<ValueType> const& model); |
||||
|
}; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
#endif /* STORM_STORAGE_MAXIMALENDCOMPONENTDECOMPOSITION_H_ */ |
Write
Preview
Loading…
Cancel
Save
Reference in new issue