|  |  | @ -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>(); | 
			
		
	
	
		
			
				
					|  |  | 
 |