| 
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -75,10 +75,6 @@ namespace storm { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                if (storm::utility::vector::equalModuloPrecision<ValueType>(*this->cachedRowVector, x, precision, relative)) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    status = SolverStatus::Converged; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                if (this->terminateNow(x, SolverGuarantee::None)) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    status = SolverStatus::TerminatedEarly; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                // If we did not yet converge, we need to backup the contents of x.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                if (status != SolverStatus::Converged) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    *this->cachedRowVector = x; | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -90,9 +86,7 @@ namespace storm { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                // Increase iteration count so we can abort if convergence is too slow.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                ++iterations; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                if (storm::utility::resources::isTerminate()) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    status = SolverStatus::Aborted; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                status = this->updateStatus(status, x, SolverGuarantee::None, iterations, maxIter); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					             | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            if (!this->isCachingEnabled()) { | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -147,9 +141,6 @@ namespace storm { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                if (storm::utility::vector::equalModuloPrecision<ValueType>(*currentX, *nextX, precision, relative)) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    status = SolverStatus::Converged; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                if (this->terminateNow(*currentX, SolverGuarantee::None)) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    status = SolverStatus::TerminatedEarly; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                // Swap the two pointers as a preparation for the next iteration.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                std::swap(nextX, currentX); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                 | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -159,9 +150,7 @@ namespace storm { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                // Increase iteration count so we can abort if convergence is too slow.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                ++iterations; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                if (storm::utility::resources::isTerminate()) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    status = SolverStatus::Aborted; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                status = this->updateStatus(status, *currentX, SolverGuarantee::None, iterations, maxIter); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					             | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            // If the last iteration did not write to the original x we have to swap the contents, because the
 | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -343,18 +332,11 @@ namespace storm { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                // Check for termination.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                std::swap(currentX, newX); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                ++iterations; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                if (this->terminateNow(*currentX, guarantee)) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    status = SolverStatus::TerminatedEarly; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                status = this->updateStatus(status, *currentX, guarantee, iterations, maxIterations); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                // Potentially show progress.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                this->showProgressIterative(iterations); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                if (storm::utility::resources::isTerminate()) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    status = SolverStatus::Aborted; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            if (status == SolverStatus::InProgress && iterations == maxIterations) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                status = SolverStatus::MaximalIterationsExceeded; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            return PowerIterationResult(iterations - currentIterations, status); | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -559,15 +541,11 @@ namespace storm { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                            status = SolverStatus::Converged; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    if (lowerStep) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        if (this->terminateNow(*lowerX, SolverGuarantee::LessOrEqual)) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    if (lowerStep && this->terminateNow(*lowerX, SolverGuarantee::LessOrEqual)) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                            status = SolverStatus::TerminatedEarly; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    if (upperStep) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        if (this->terminateNow(*upperX, SolverGuarantee::GreaterOrEqual)) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    if (upperStep && this->terminateNow(*upperX, SolverGuarantee::GreaterOrEqual)) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                            status = SolverStatus::TerminatedEarly; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                 | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -578,9 +556,7 @@ namespace storm { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                // Set up next iteration.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                ++iterations; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                doConvergenceCheck = !doConvergenceCheck; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                if (storm::utility::resources::isTerminate()) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    status = SolverStatus::Aborted; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                status = this->updateStatus(status, false, iterations, maxIter); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					             | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            // We take the means of the lower and upper bound so we guarantee the desired precision.
 | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -639,19 +615,13 @@ namespace storm { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    status = SolverStatus::Converged; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                // Check whether we terminate early.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                if (this->hasCustomTerminationCondition() && this->soundValueIterationHelper->checkCustomTerminationCondition(this->getTerminationCondition())) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    status = SolverStatus::TerminatedEarly; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                // Update environment variables.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                ++iterations; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                // Potentially show progress.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                this->showProgressIterative(iterations); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                if (storm::utility::resources::isTerminate()) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    status = SolverStatus::Aborted; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                status = this->updateStatus(status, this->hasCustomTerminationCondition() && this->soundValueIterationHelper->checkCustomTerminationCondition(this->getTerminationCondition()), iterations, env.solver().native().getMaximalNumberOfIterations()); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            this->soundValueIterationHelper->setSolutionVector(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
				 | 
				
					
  |