|
@ -1555,28 +1555,9 @@ namespace storm { |
|
|
return SymbolicGameProb01Result<Type>(maybePlayer1States, maybePlayer2States, player1StrategyBdd, player2StrategyBdd); |
|
|
return SymbolicGameProb01Result<Type>(maybePlayer1States, maybePlayer2States, player1StrategyBdd, player2StrategyBdd); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
template <typename T> |
|
|
|
|
|
std::vector<uint_fast64_t> getTopologicalSort(storm::storage::SparseMatrix<T> const& matrix) { |
|
|
|
|
|
if (matrix.getRowCount() != matrix.getColumnCount()) { |
|
|
|
|
|
STORM_LOG_ERROR("Provided matrix is required to be square."); |
|
|
|
|
|
throw storm::exceptions::InvalidArgumentException() << "Provided matrix is required to be square."; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
uint_fast64_t numberOfStates = matrix.getRowCount(); |
|
|
|
|
|
|
|
|
|
|
|
// Prepare the result. This relies on the matrix being square.
|
|
|
|
|
|
std::vector<uint_fast64_t> topologicalSort; |
|
|
|
|
|
topologicalSort.reserve(numberOfStates); |
|
|
|
|
|
|
|
|
|
|
|
// Prepare the stacks needed for recursion.
|
|
|
|
|
|
std::vector<uint_fast64_t> recursionStack; |
|
|
|
|
|
recursionStack.reserve(matrix.getRowCount()); |
|
|
|
|
|
std::vector<typename storm::storage::SparseMatrix<T>::const_iterator> iteratorRecursionStack; |
|
|
|
|
|
iteratorRecursionStack.reserve(numberOfStates); |
|
|
|
|
|
|
|
|
|
|
|
// Perform a depth-first search over the given transitions and record states in the reverse order they were visited.
|
|
|
|
|
|
storm::storage::BitVector visitedStates(numberOfStates); |
|
|
|
|
|
for (uint_fast64_t state = 0; state < numberOfStates; ++state) { |
|
|
|
|
|
|
|
|
template<typename T> |
|
|
|
|
|
void topologicalSortHelper(storm::storage::SparseMatrix<T> const& matrix, uint64_t state, std::vector<uint_fast64_t>& topologicalSort, std::vector<uint_fast64_t>& recursionStack, std::vector<typename storm::storage::SparseMatrix<T>::const_iterator>& iteratorRecursionStack, storm::storage::BitVector& visitedStates) { |
|
|
if (!visitedStates.get(state)) { |
|
|
if (!visitedStates.get(state)) { |
|
|
recursionStack.push_back(state); |
|
|
recursionStack.push_back(state); |
|
|
iteratorRecursionStack.push_back(matrix.begin(state)); |
|
|
iteratorRecursionStack.push_back(matrix.begin(state)); |
|
@ -1621,6 +1602,34 @@ namespace storm { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
template <typename T> |
|
|
|
|
|
std::vector<uint_fast64_t> getTopologicalSort(storm::storage::SparseMatrix<T> const& matrix, std::vector<uint64_t> const& firstStates) { |
|
|
|
|
|
if (matrix.getRowCount() != matrix.getColumnCount()) { |
|
|
|
|
|
STORM_LOG_ERROR("Provided matrix is required to be square."); |
|
|
|
|
|
throw storm::exceptions::InvalidArgumentException() << "Provided matrix is required to be square."; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
uint_fast64_t numberOfStates = matrix.getRowCount(); |
|
|
|
|
|
|
|
|
|
|
|
// Prepare the result. This relies on the matrix being square.
|
|
|
|
|
|
std::vector<uint_fast64_t> topologicalSort; |
|
|
|
|
|
topologicalSort.reserve(numberOfStates); |
|
|
|
|
|
|
|
|
|
|
|
// Prepare the stacks needed for recursion.
|
|
|
|
|
|
std::vector<uint_fast64_t> recursionStack; |
|
|
|
|
|
recursionStack.reserve(matrix.getRowCount()); |
|
|
|
|
|
std::vector<typename storm::storage::SparseMatrix<T>::const_iterator> iteratorRecursionStack; |
|
|
|
|
|
iteratorRecursionStack.reserve(numberOfStates); |
|
|
|
|
|
|
|
|
|
|
|
// Perform a depth-first search over the given transitions and record states in the reverse order they were visited.
|
|
|
|
|
|
storm::storage::BitVector visitedStates(numberOfStates); |
|
|
|
|
|
for (auto const state : firstStates ) { |
|
|
|
|
|
topologicalSortHelper<T>(matrix, state, topologicalSort, recursionStack, iteratorRecursionStack, visitedStates); |
|
|
|
|
|
} |
|
|
|
|
|
for (uint_fast64_t state = 0; state < numberOfStates; ++state) { |
|
|
|
|
|
topologicalSortHelper<T>(matrix, state, topologicalSort, recursionStack, iteratorRecursionStack, visitedStates); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
return topologicalSort; |
|
|
return topologicalSort; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -1696,7 +1705,7 @@ namespace storm { |
|
|
|
|
|
|
|
|
template ExplicitGameProb01Result performProb1(storm::storage::SparseMatrix<double> const& transitionMatrix, std::vector<uint64_t> const& player1RowGrouping, storm::storage::SparseMatrix<double> const& player1BackwardTransitions, std::vector<uint64_t> const& player2BackwardTransitions, storm::storage::BitVector const& phiStates, storm::storage::BitVector const& psiStates, storm::OptimizationDirection const& player1Direction, storm::OptimizationDirection const& player2Direction, storm::abstraction::ExplicitGameStrategyPair* strategyPair, boost::optional<storm::storage::BitVector> const& player1Candidates); |
|
|
template ExplicitGameProb01Result performProb1(storm::storage::SparseMatrix<double> const& transitionMatrix, std::vector<uint64_t> const& player1RowGrouping, storm::storage::SparseMatrix<double> const& player1BackwardTransitions, std::vector<uint64_t> const& player2BackwardTransitions, storm::storage::BitVector const& phiStates, storm::storage::BitVector const& psiStates, storm::OptimizationDirection const& player1Direction, storm::OptimizationDirection const& player2Direction, storm::abstraction::ExplicitGameStrategyPair* strategyPair, boost::optional<storm::storage::BitVector> const& player1Candidates); |
|
|
|
|
|
|
|
|
template std::vector<uint_fast64_t> getTopologicalSort(storm::storage::SparseMatrix<double> const& matrix) ; |
|
|
|
|
|
|
|
|
template std::vector<uint_fast64_t> getTopologicalSort(storm::storage::SparseMatrix<double> const& matrix, std::vector<uint64_t> const& firstStates) ; |
|
|
|
|
|
|
|
|
// Instantiations for storm::RationalNumber.
|
|
|
// Instantiations for storm::RationalNumber.
|
|
|
#ifdef STORM_HAVE_CARL
|
|
|
#ifdef STORM_HAVE_CARL
|
|
@ -1752,7 +1761,7 @@ namespace storm { |
|
|
|
|
|
|
|
|
template ExplicitGameProb01Result performProb1(storm::storage::SparseMatrix<storm::RationalNumber> const& transitionMatrix, std::vector<uint64_t> const& player1RowGrouping, storm::storage::SparseMatrix<storm::RationalNumber> const& player1BackwardTransitions, std::vector<uint64_t> const& player2BackwardTransitions, storm::storage::BitVector const& phiStates, storm::storage::BitVector const& psiStates, storm::OptimizationDirection const& player1Direction, storm::OptimizationDirection const& player2Direction, storm::abstraction::ExplicitGameStrategyPair* strategyPair, boost::optional<storm::storage::BitVector> const& player1Candidates); |
|
|
template ExplicitGameProb01Result performProb1(storm::storage::SparseMatrix<storm::RationalNumber> const& transitionMatrix, std::vector<uint64_t> const& player1RowGrouping, storm::storage::SparseMatrix<storm::RationalNumber> const& player1BackwardTransitions, std::vector<uint64_t> const& player2BackwardTransitions, storm::storage::BitVector const& phiStates, storm::storage::BitVector const& psiStates, storm::OptimizationDirection const& player1Direction, storm::OptimizationDirection const& player2Direction, storm::abstraction::ExplicitGameStrategyPair* strategyPair, boost::optional<storm::storage::BitVector> const& player1Candidates); |
|
|
|
|
|
|
|
|
template std::vector<uint_fast64_t> getTopologicalSort(storm::storage::SparseMatrix<storm::RationalNumber> const& matrix); |
|
|
|
|
|
|
|
|
template std::vector<uint_fast64_t> getTopologicalSort(storm::storage::SparseMatrix<storm::RationalNumber> const& matrix, std::vector<uint64_t> const& firstStates); |
|
|
// End of instantiations for storm::RationalNumber.
|
|
|
// End of instantiations for storm::RationalNumber.
|
|
|
|
|
|
|
|
|
template storm::storage::BitVector getReachableStates(storm::storage::SparseMatrix<storm::RationalFunction> const& transitionMatrix, storm::storage::BitVector const& initialStates, storm::storage::BitVector const& constraintStates, storm::storage::BitVector const& targetStates, bool useStepBound, uint_fast64_t maximalSteps, boost::optional<storm::storage::BitVector> const& choiceFilter); |
|
|
template storm::storage::BitVector getReachableStates(storm::storage::SparseMatrix<storm::RationalFunction> const& transitionMatrix, storm::storage::BitVector const& initialStates, storm::storage::BitVector const& constraintStates, storm::storage::BitVector const& targetStates, bool useStepBound, uint_fast64_t maximalSteps, boost::optional<storm::storage::BitVector> const& choiceFilter); |
|
@ -1804,7 +1813,7 @@ namespace storm { |
|
|
template std::pair<storm::storage::BitVector, storm::storage::BitVector> performProb01Min(storm::models::sparse::NondeterministicModel<storm::RationalFunction> const& model, storm::storage::BitVector const& phiStates, storm::storage::BitVector const& psiStates); |
|
|
template std::pair<storm::storage::BitVector, storm::storage::BitVector> performProb01Min(storm::models::sparse::NondeterministicModel<storm::RationalFunction> const& model, storm::storage::BitVector const& phiStates, storm::storage::BitVector const& psiStates); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template std::vector<uint_fast64_t> getTopologicalSort(storm::storage::SparseMatrix<storm::RationalFunction> const& matrix); |
|
|
|
|
|
|
|
|
template std::vector<uint_fast64_t> getTopologicalSort(storm::storage::SparseMatrix<storm::RationalFunction> const& matrix, std::vector<uint64_t> const& firstStates); |
|
|
|
|
|
|
|
|
#endif
|
|
|
#endif
|
|
|
|
|
|
|
|
|