|  |  | @ -10,7 +10,6 @@ | 
			
		
	
		
			
				
					|  |  |  | #include "storm/utility/KwekMehlhorn.h"
 | 
			
		
	
		
			
				
					|  |  |  | #include "storm/utility/NumberTraits.h"
 | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | #include "storm/solver/helper/SoundValueIterationHelper.h"
 | 
			
		
	
		
			
				
					|  |  |  | #include "storm/utility/Stopwatch.h"
 | 
			
		
	
		
			
				
					|  |  |  | #include "storm/utility/vector.h"
 | 
			
		
	
		
			
				
					|  |  |  | #include "storm/utility/macros.h"
 | 
			
		
	
	
		
			
				
					|  |  | @ -608,21 +607,23 @@ namespace storm { | 
			
		
	
		
			
				
					|  |  |  |         template<typename ValueType> | 
			
		
	
		
			
				
					|  |  |  |         bool IterativeMinMaxLinearEquationSolver<ValueType>::solveEquationsSoundValueIteration(Environment const& env, OptimizationDirection dir, std::vector<ValueType>& x, std::vector<ValueType> const& b) const { | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             // Prepare the solution vectors.
 | 
			
		
	
		
			
				
					|  |  |  |             // Prepare the solution vectors and the helper.
 | 
			
		
	
		
			
				
					|  |  |  |             assert(x.size() == this->A->getRowGroupCount()); | 
			
		
	
		
			
				
					|  |  |  |             if (!this->auxiliaryRowGroupVector) { | 
			
		
	
		
			
				
					|  |  |  |                 this->auxiliaryRowGroupVector = std::make_unique<std::vector<ValueType>>(); | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             // TODO: implement caching for the helper
 | 
			
		
	
		
			
				
					|  |  |  |             storm::solver::helper::SoundValueIterationHelper<ValueType> helper(*this->A, x, *this->auxiliaryRowGroupVector, env.solver().minMax().getRelativeTerminationCriterion(), storm::utility::convertNumber<ValueType>(env.solver().minMax().getPrecision())); | 
			
		
	
		
			
				
					|  |  |  |             if (!this->soundValueIterationHelper) { | 
			
		
	
		
			
				
					|  |  |  |                 this->soundValueIterationHelper = std::make_unique<storm::solver::helper::SoundValueIterationHelper<ValueType>>(*this->A, x, *this->auxiliaryRowGroupVector, env.solver().minMax().getRelativeTerminationCriterion(), storm::utility::convertNumber<ValueType>(env.solver().minMax().getPrecision())); | 
			
		
	
		
			
				
					|  |  |  |             } else { | 
			
		
	
		
			
				
					|  |  |  |                 this->soundValueIterationHelper = std::make_unique<storm::solver::helper::SoundValueIterationHelper<ValueType>>(std::move(*this->soundValueIterationHelper), x, *this->auxiliaryRowGroupVector, env.solver().minMax().getRelativeTerminationCriterion(), storm::utility::convertNumber<ValueType>(env.solver().minMax().getPrecision())); | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |              | 
			
		
	
		
			
				
					|  |  |  |             // Prepare initial bounds for the solution (if given)
 | 
			
		
	
		
			
				
					|  |  |  |             if (this->hasLowerBound()) { | 
			
		
	
		
			
				
					|  |  |  |                 helper.setLowerBound(this->getLowerBound(true)); | 
			
		
	
		
			
				
					|  |  |  |                 this->soundValueIterationHelper->setLowerBound(this->getLowerBound(true)); | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |             if (this->hasUpperBound()) { | 
			
		
	
		
			
				
					|  |  |  |                 helper.setUpperBound(this->getUpperBound(true)); | 
			
		
	
		
			
				
					|  |  |  |                 this->soundValueIterationHelper->setUpperBound(this->getUpperBound(true)); | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |              | 
			
		
	
		
			
				
					|  |  |  |             storm::storage::BitVector const* relevantValuesPtr = nullptr; | 
			
		
	
	
		
			
				
					|  |  | @ -635,8 +636,8 @@ namespace storm { | 
			
		
	
		
			
				
					|  |  |  |             uint64_t iterations = 0; | 
			
		
	
		
			
				
					|  |  |  |              | 
			
		
	
		
			
				
					|  |  |  |             while (status == SolverStatus::InProgress && iterations < env.solver().minMax().getMaximalNumberOfIterations()) { | 
			
		
	
		
			
				
					|  |  |  |                 helper.performIterationStep(dir, b); | 
			
		
	
		
			
				
					|  |  |  |                 if (helper.checkConvergenceUpdateBounds(dir, relevantValuesPtr)) { | 
			
		
	
		
			
				
					|  |  |  |                 this->soundValueIterationHelper->performIterationStep(dir, b); | 
			
		
	
		
			
				
					|  |  |  |                 if (this->soundValueIterationHelper->checkConvergenceUpdateBounds(dir, relevantValuesPtr)) { | 
			
		
	
		
			
				
					|  |  |  |                     status = SolverStatus::Converged; | 
			
		
	
		
			
				
					|  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  | @ -648,7 +649,7 @@ namespace storm { | 
			
		
	
		
			
				
					|  |  |  |                 // Potentially show progress.
 | 
			
		
	
		
			
				
					|  |  |  |                 this->showProgressIterative(iterations); | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |             helper.setSolutionVector(); | 
			
		
	
		
			
				
					|  |  |  |             this->soundValueIterationHelper->setSolutionVector(); | 
			
		
	
		
			
				
					|  |  |  |              | 
			
		
	
		
			
				
					|  |  |  |             // If requested, we store the scheduler for retrieval.
 | 
			
		
	
		
			
				
					|  |  |  |             if (this->isTrackSchedulerSet()) { | 
			
		
	
	
		
			
				
					|  |  | @ -1000,6 +1001,7 @@ namespace storm { | 
			
		
	
		
			
				
					|  |  |  |             multiplierA.reset(); | 
			
		
	
		
			
				
					|  |  |  |             auxiliaryRowGroupVector.reset(); | 
			
		
	
		
			
				
					|  |  |  |             auxiliaryRowGroupVector2.reset(); | 
			
		
	
		
			
				
					|  |  |  |             soundValueIterationHelper.reset(); | 
			
		
	
		
			
				
					|  |  |  |             StandardMinMaxLinearEquationSolver<ValueType>::clearCache(); | 
			
		
	
		
			
				
					|  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |          | 
			
		
	
	
		
			
				
					|  |  | 
 |