|
|
@ -13,14 +13,10 @@ |
|
|
|
|
|
|
|
#include "utility/OsDetection.h" |
|
|
|
|
|
|
|
//GCC 4.7 does not support method emplace yet, therefore use boost map on Linux |
|
|
|
#ifdef LINUX |
|
|
|
#include <boost/container/set.hpp> |
|
|
|
#endif |
|
|
|
|
|
|
|
#include "src/storage/sparse/StateType.h" |
|
|
|
#include "src/models/AbstractDeterministicModel.h" |
|
|
|
#include "src/models/AbstractNondeterministicModel.h" |
|
|
|
#include "constants.h" |
|
|
|
#include "src/utility/constants.h" |
|
|
|
#include "src/exceptions/InvalidArgumentException.h" |
|
|
|
|
|
|
|
#include "log4cplus/logger.h" |
|
|
@ -75,6 +71,45 @@ namespace storm { |
|
|
|
return reachableStates; |
|
|
|
} |
|
|
|
|
|
|
|
/*! |
|
|
|
* Performs a breadth-first search through the underlying graph structure to compute the distance from all |
|
|
|
* states to the starting states of the search. |
|
|
|
* |
|
|
|
* @param transitionMatrix The transition relation of the graph structure to search. |
|
|
|
* @param initialStates The set of states from which to start the search. |
|
|
|
* @return The distances of each state to the initial states of the sarch. |
|
|
|
*/ |
|
|
|
template<typename T> |
|
|
|
std::vector<std::size_t> getReachableStates(storm::storage::SparseMatrix<T> const& transitionMatrix, storm::storage::BitVector const& initialStates) { |
|
|
|
std::vector<std::size_t> distances(transitionMatrix.getRowGroupCount()); |
|
|
|
|
|
|
|
std::vector<std::pair<storm::storage::sparse::state_type, std::size_t>> stateQueue; |
|
|
|
stateQueue.reserve(transitionMatrix.getRowGroupCount()); |
|
|
|
storm::storage::BitVector statesInQueue(transitionMatrix.getRowGroupCount()); |
|
|
|
|
|
|
|
storm::storage::sparse::state_type currentPosition = 0; |
|
|
|
for (auto const& initialState : initialStates) { |
|
|
|
stateQueue.emplace_back(initialState, 0); |
|
|
|
statesInQueue.set(initialState); |
|
|
|
} |
|
|
|
|
|
|
|
// Perform a BFS. |
|
|
|
while (currentPosition < stateQueue.size()) { |
|
|
|
std::pair<storm::storage::sparse::state_type, std::size_t> const& stateDistancePair = stateQueue[currentPosition]; |
|
|
|
distances[stateDistancePair.first] = stateDistancePair.second; |
|
|
|
|
|
|
|
for (auto const& successorEntry : transitionMatrix.getRowGroup(stateDistancePair.first)) { |
|
|
|
if (!statesInQueue.get(successorEntry.getColumn())) { |
|
|
|
stateQueue.emplace_back(successorEntry.getColumn(), stateDistancePair.second + 1); |
|
|
|
statesInQueue.set(successorEntry.getColumn()); |
|
|
|
} |
|
|
|
} |
|
|
|
++currentPosition; |
|
|
|
} |
|
|
|
|
|
|
|
return distances; |
|
|
|
} |
|
|
|
|
|
|
|
/*! |
|
|
|
* Performs a backward depth-first search trough the underlying graph structure |
|
|
|
* of the given model to determine which states of the model have a positive probability |
|
|
@ -727,11 +762,8 @@ namespace storm { |
|
|
|
std::vector<uint_fast64_t> predecessors(model.getNumberOfStates(), noPredecessorValue); |
|
|
|
|
|
|
|
// Set the probability to 1 for all starting states. |
|
|
|
#ifdef LINUX |
|
|
|
boost::container::set<std::pair<T, uint_fast64_t>, DistanceCompare<T>> probabilityStateSet; |
|
|
|
#else |
|
|
|
std::set<std::pair<T, uint_fast64_t>, DistanceCompare<T>> probabilityStateSet; |
|
|
|
#endif |
|
|
|
|
|
|
|
for (auto state : startingStates) { |
|
|
|
probabilityStateSet.emplace(storm::utility::constantOne<T>(), state); |
|
|
|
probabilities[state] = storm::utility::constantOne<T>(); |
|
|
|