11 changed files with 131 additions and 13 deletions
			
			
		- 
					5src/mrmc.cpp
- 
					9src/parser/parser.cpp
- 
					10src/parser/parser.h
- 
					99src/solver/GraphAnalyzer.h
- 
					4src/storage/BitVector.h
- 
					2src/storage/SquareSparseMatrix.h
- 
					3src/utility/osDetection.h
| @ -0,0 +1,99 @@ | |||||
|  | /* | ||||
|  |  * GraphAnalyzer.h | ||||
|  |  * | ||||
|  |  *  Created on: 28.11.2012 | ||||
|  |  *      Author: Christian Dehnert | ||||
|  |  */ | ||||
|  | 
 | ||||
|  | #ifndef GRAPHANALYZER_H_ | ||||
|  | #define GRAPHANALYZER_H_ | ||||
|  | 
 | ||||
|  | #include "src/models/Dtmc.h" | ||||
|  | 
 | ||||
|  | #include <iostream> | ||||
|  | 
 | ||||
|  | namespace mrmc { | ||||
|  | 
 | ||||
|  | namespace solver { | ||||
|  | 
 | ||||
|  | class GraphAnalyzer { | ||||
|  | public: | ||||
|  | 	/*! | ||||
|  | 	 * Performs a backwards depth-first search trough the underlying graph structure | ||||
|  | 	 * of the given model to determine which states of the model can reach one | ||||
|  | 	 * of the given target states whilst always staying in the set of filter states | ||||
|  | 	 * before. The resulting states are written to the given bit vector. | ||||
|  | 	 * @param model The model whose graph structure to search. | ||||
|  | 	 * @param targetStates The target states of the search. | ||||
|  | 	 * @param filterStates A set of states constraining the search. | ||||
|  | 	 * @param existentialReachabilityStates The result of the search. | ||||
|  | 	 */ | ||||
|  | 	template <class T> | ||||
|  | 	static void getExistsPhiUntilPsiStates(mrmc::models::Dtmc<T>& model, const mrmc::storage::BitVector& phiStates, const mrmc::storage::BitVector& psiStates, mrmc::storage::BitVector& existsPhiUntilPsiStates) { | ||||
|  | 		// Get the backwards transition relation from the model to ease the search. | ||||
|  | 		mrmc::models::GraphTransitions<T>& backwardTransitions = model.getBackwardTransitions(); | ||||
|  | 
 | ||||
|  | 		// Add all psi states as the already satisfy the condition. | ||||
|  | 		existsPhiUntilPsiStates |= psiStates; | ||||
|  | 
 | ||||
|  | 		// Initialize the stack used for the DFS with the states | ||||
|  | 		std::vector<uint_fast64_t> stack; | ||||
|  | 		stack.reserve(model.getNumberOfStates()); | ||||
|  | 		psiStates.getList(stack); | ||||
|  | 
 | ||||
|  | 		// Perform the actual DFS. | ||||
|  | 		while(!stack.empty()) { | ||||
|  | 			uint_fast64_t currentState = stack.back(); | ||||
|  | 			stack.pop_back(); | ||||
|  | 
 | ||||
|  | 			for(auto it = backwardTransitions.beginStateSuccessorsIterator(currentState); it != backwardTransitions.endStateSuccessorsIterator(currentState); ++it) { | ||||
|  | 				if (phiStates.get(*it) && !existsPhiUntilPsiStates.get(*it)) { | ||||
|  | 					existsPhiUntilPsiStates.set(*it, true); | ||||
|  | 					stack.push_back(*it); | ||||
|  | 				} | ||||
|  | 			} | ||||
|  | 		} | ||||
|  | 	} | ||||
|  | 
 | ||||
|  | 	/*! | ||||
|  | 	 * Computes the set of states of the given model for which all paths lead to | ||||
|  | 	 * the given set of target states and only visit states from the filter set | ||||
|  | 	 * before. In order to do this, it uses the given set of states that | ||||
|  | 	 * characterizes the states that possess at least one path to a target state. | ||||
|  | 	 * The results are written to the given bit vector. | ||||
|  | 	 * @param model The model whose graph structure to search. | ||||
|  | 	 * @param targetStates The target states of the search. | ||||
|  | 	 * @param filterStates A set of states constraining the search. | ||||
|  | 	 * @param existentialReachabilityStates The set of states that possess at | ||||
|  | 	 * least one path to a target state. | ||||
|  | 	 * @param universalReachabilityStates The result of the search. | ||||
|  | 	 */ | ||||
|  | 	template <class T> | ||||
|  | 	static void getUniversalReachabilityStates(mrmc::models::Dtmc<T>& model, const mrmc::storage::BitVector& phiStates, const mrmc::storage::BitVector& psiStates, const mrmc::storage::BitVector& existsPhiUntilPsiStates, mrmc::storage::BitVector& alwaysPhiUntilPsiStates) { | ||||
|  | 		GraphAnalyzer::getExistsPhiUntilPsiStates(model, ~psiStates, ~existsPhiUntilPsiStates, alwaysPhiUntilPsiStates); | ||||
|  | 		alwaysPhiUntilPsiStates.complement(); | ||||
|  | 	} | ||||
|  | 
 | ||||
|  | 	/*! | ||||
|  | 	 * Computes the set of states of the given model for which all paths lead to | ||||
|  | 	 * the given set of target states and only visit states from the filter set | ||||
|  | 	 * before. | ||||
|  | 	 * @param model The model whose graph structure to search. | ||||
|  | 	 * @param targetStates The target states of the search. | ||||
|  | 	 * @param filterStates A set of states constraining the search. | ||||
|  | 	 * @param universalReachabilityStates The result of the search. | ||||
|  | 	 */ | ||||
|  | 	template <class T> | ||||
|  | 	static void getUniversalReachabilityStates(mrmc::models::Dtmc<T>& model, const mrmc::storage::BitVector& phiStates, const mrmc::storage::BitVector& psiStates, mrmc::storage::BitVector& alwaysPhiUntilPsiStates) { | ||||
|  | 		mrmc::storage::BitVector existsPhiUntilPsiStates(model.getNumberOfStates()); | ||||
|  | 		GraphAnalyzer::getExistsPhiUntilPsiStates(model, phiStates, psiStates, existsPhiUntilPsiStates); | ||||
|  | 		GraphAnalyzer::getUniversalReachabilityStates(model, phiStates, psiStates, existsPhiUntilPsiStates, alwaysPhiUntilPsiStates); | ||||
|  | 	} | ||||
|  | 
 | ||||
|  | }; | ||||
|  | 
 | ||||
|  | } // namespace solver | ||||
|  | 
 | ||||
|  | } // namespace mrmc | ||||
|  | 
 | ||||
|  | #endif /* GRAPHANALYZER_H_ */ | ||||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue