You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							105 lines
						
					
					
						
							6.6 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							105 lines
						
					
					
						
							6.6 KiB
						
					
					
				| #include "storm/modelchecker/helper/finitehorizon/SparseNondeterministicStepBoundedHorizonHelper.h" | |
| #include "storm/modelchecker/hints/ExplicitModelCheckerHint.h" | |
| #include "storm/modelchecker/prctl/helper/SparseMdpEndComponentInformation.h" | |
|  | |
| #include "storm/models/sparse/StandardRewardModel.h" | |
|  | |
| #include "storm/utility/macros.h" | |
| #include "storm/utility/vector.h" | |
| #include "storm/utility/graph.h" | |
|  | |
| #include "storm/storage/expressions/Expression.h" | |
| #include "storm/solver/Multiplier.h" | |
| #include "storm/utility/SignalHandler.h" | |
| #include "storm/environment/solver/MinMaxSolverEnvironment.h" | |
|  | |
| namespace storm { | |
|     namespace modelchecker { | |
|         namespace helper { | |
| 
 | |
|             template<typename ValueType> | |
|             SparseNondeterministicStepBoundedHorizonHelper<ValueType>::SparseNondeterministicStepBoundedHorizonHelper(/*storm::storage::SparseMatrix<ValueType> const& transitionMatrix, storm::storage::SparseMatrix<ValueType> const& backwardTransitions*/) | |
|             //transitionMatrix(transitionMatrix), backwardTransitions(backwardTransitions) | |
|             { | |
|                 // Intentionally left empty. | |
|             } | |
| 
 | |
|             template<typename ValueType> | |
|             std::vector<ValueType> SparseNondeterministicStepBoundedHorizonHelper<ValueType>::compute(Environment const& env, storm::solver::SolveGoal<ValueType>&& goal, storm::storage::SparseMatrix<ValueType> const& transitionMatrix, storm::storage::SparseMatrix<ValueType> const& backwardTransitions, storm::storage::BitVector const& phiStates, storm::storage::BitVector const& psiStates, uint64_t lowerBound, uint64_t upperBound, ModelCheckerHint const& hint, storm::storage::BitVector& resultMaybeStates, std::vector<ValueType>& choiceValues) | |
|             { | |
|                 std::vector<ValueType> result(transitionMatrix.getRowGroupCount(), storm::utility::zero<ValueType>()); | |
|                 storm::storage::BitVector makeZeroColumns; | |
| 
 | |
| 
 | |
|                 // Determine the states that have 0 probability of reaching the target states. | |
|                 storm::storage::BitVector maybeStates; | |
|                 if (hint.isExplicitModelCheckerHint() && hint.template asExplicitModelCheckerHint<ValueType>().getComputeOnlyMaybeStates()) { | |
|                     maybeStates = hint.template asExplicitModelCheckerHint<ValueType>().getMaybeStates(); | |
|                 } else { | |
|                     if (goal.minimize()) { | |
|                         maybeStates = storm::utility::graph::performProbGreater0A(transitionMatrix, transitionMatrix.getRowGroupIndices(), backwardTransitions, phiStates, psiStates, true, upperBound); | |
|                     } else { | |
|                         maybeStates = storm::utility::graph::performProbGreater0E(backwardTransitions, phiStates, psiStates, true, upperBound); | |
|                     } | |
|                     if (lowerBound == 0) { | |
|                         maybeStates &= ~psiStates; | |
|                     } else { | |
|                         makeZeroColumns = psiStates; | |
|                     } | |
| 
 | |
|                 } | |
| 
 | |
|                 STORM_LOG_INFO("Preprocessing: " << maybeStates.getNumberOfSetBits() << " non-target states with probability greater 0."); | |
| 
 | |
|                 if (!maybeStates.empty()) { | |
|                     // We can eliminate the rows and columns from the original transition probability matrix that have probability 0. | |
|                     storm::storage::SparseMatrix<ValueType> submatrix = transitionMatrix.getSubmatrix(true, maybeStates, maybeStates, false, makeZeroColumns); | |
|                     std::vector<ValueType> b = transitionMatrix.getConstrainedRowGroupSumVector(maybeStates, psiStates); | |
| 
 | |
|                     // Create the vector with which to multiply. | |
|                     std::vector<ValueType> subresult(maybeStates.getNumberOfSetBits()); | |
| 
 | |
|                     auto multiplier = storm::solver::MultiplierFactory<ValueType>().create(env, submatrix); | |
|                     if (lowerBound == 0) { | |
|                         if(goal.isShieldingTask()) | |
|                         { | |
|                             multiplier->repeatedMultiplyAndReduceWithChoices(env, goal.direction(), subresult, &b, upperBound, nullptr, choiceValues, transitionMatrix.getRowGroupIndices()); | |
|                         } else { | |
|                             multiplier->repeatedMultiplyAndReduce(env, goal.direction(), subresult, &b, upperBound); | |
|                         } | |
|                     } else { | |
|                         if(goal.isShieldingTask()) | |
|                         { | |
|                             multiplier->repeatedMultiplyAndReduceWithChoices(env, goal.direction(), subresult, &b, upperBound - lowerBound + 1, nullptr, choiceValues, transitionMatrix.getRowGroupIndices()); | |
|                             storm::storage::SparseMatrix<ValueType> submatrix = transitionMatrix.getSubmatrix(true, maybeStates, maybeStates, false); | |
|                             auto multiplier = storm::solver::MultiplierFactory<ValueType>().create(env, submatrix); | |
|                             b = std::vector<ValueType>(b.size(), storm::utility::zero<ValueType>()); | |
|                             multiplier->repeatedMultiplyAndReduceWithChoices(env, goal.direction(), subresult, &b, lowerBound - 1, nullptr, choiceValues, transitionMatrix.getRowGroupIndices()); | |
|                         } else { | |
|                             multiplier->repeatedMultiplyAndReduce(env, goal.direction(), subresult, &b, upperBound - lowerBound + 1); | |
|                             storm::storage::SparseMatrix<ValueType> submatrix = transitionMatrix.getSubmatrix(true, maybeStates, maybeStates, false); | |
|                             auto multiplier = storm::solver::MultiplierFactory<ValueType>().create(env, submatrix); | |
|                             b = std::vector<ValueType>(b.size(), storm::utility::zero<ValueType>()); | |
|                             multiplier->repeatedMultiplyAndReduce(env, goal.direction(), subresult, &b, lowerBound - 1); | |
|                         } | |
|                     } | |
|                     // Set the values of the resulting vector accordingly. | |
|                     storm::utility::vector::setVectorValues(result, maybeStates, subresult); | |
|                 } | |
|                 if (lowerBound == 0) { | |
|                     storm::utility::vector::setVectorValues(result, psiStates, storm::utility::one<ValueType>()); | |
|                 } | |
| 
 | |
|                 //TODO: check if this works with nullptr as default for resultMaybeStates | |
|                 if(!resultMaybeStates.empty()) | |
|                 { | |
|                     resultMaybeStates = maybeStates; | |
|                 } | |
|                 return result; | |
|             } | |
| 
 | |
|             template class SparseNondeterministicStepBoundedHorizonHelper<double>; | |
|             template class SparseNondeterministicStepBoundedHorizonHelper<storm::RationalNumber>; | |
|         } | |
|     } | |
| }
 |