| 
					
					
						
							
						
					
					
				 | 
				@ -13,14 +13,10 @@ | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				#include "utility/OsDetection.h" | 
				 | 
				 | 
				#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/AbstractDeterministicModel.h" | 
			
		
		
	
		
			
				 | 
				 | 
				#include "src/models/AbstractNondeterministicModel.h" | 
				 | 
				 | 
				#include "src/models/AbstractNondeterministicModel.h" | 
			
		
		
	
		
			
				 | 
				 | 
				#include "constants.h" | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				#include "src/utility/constants.h" | 
			
		
		
	
		
			
				 | 
				 | 
				#include "src/exceptions/InvalidArgumentException.h" | 
				 | 
				 | 
				#include "src/exceptions/InvalidArgumentException.h" | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				#include "log4cplus/logger.h" | 
				 | 
				 | 
				#include "log4cplus/logger.h" | 
			
		
		
	
	
		
			
				| 
					
						
							
						
					
					
						
							
						
					
					
				 | 
				@ -75,6 +71,45 @@ namespace storm { | 
			
		
		
	
		
			
				 | 
				 | 
				                return reachableStates; | 
				 | 
				 | 
				                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 | 
				 | 
				 | 
				             * 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 | 
				 | 
				 | 
				             * 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); | 
				 | 
				 | 
				                std::vector<uint_fast64_t> predecessors(model.getNumberOfStates(), noPredecessorValue); | 
			
		
		
	
		
			
				 | 
				 | 
				                 | 
				 | 
				 | 
				                 | 
			
		
		
	
		
			
				 | 
				 | 
				                // Set the probability to 1 for all starting states. | 
				 | 
				 | 
				                // 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; | 
				 | 
				 | 
				                std::set<std::pair<T, uint_fast64_t>, DistanceCompare<T>> probabilityStateSet; | 
			
		
		
	
		
			
				 | 
				 | 
				#endif | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				                for (auto state : startingStates) { | 
				 | 
				 | 
				                for (auto state : startingStates) { | 
			
		
		
	
		
			
				 | 
				 | 
				                    probabilityStateSet.emplace(storm::utility::constantOne<T>(), state); | 
				 | 
				 | 
				                    probabilityStateSet.emplace(storm::utility::constantOne<T>(), state); | 
			
		
		
	
		
			
				 | 
				 | 
				                    probabilities[state] = storm::utility::constantOne<T>(); | 
				 | 
				 | 
				                    probabilities[state] = storm::utility::constantOne<T>(); | 
			
		
		
	
	
		
			
				| 
					
						
							
						
					
					
					
				 | 
				
  |