@ -45,6 +45,8 @@ namespace storm {
template < typename ValueType >
template < typename ValueType >
SoundValueIterationHelper < ValueType > : : SoundValueIterationHelper ( SoundValueIterationHelper < ValueType > & & oldHelper , std : : vector < ValueType > & x , std : : vector < ValueType > & y , bool relative , ValueType const & precision ) : x ( x ) , y ( y ) , xTmp ( std : : move ( oldHelper . xTmp ) ) , yTmp ( std : : move ( oldHelper . yTmp ) ) , hasLowerBound ( false ) , hasUpperBound ( false ) , hasDecisionValue ( false ) , convergencePhase1 ( true ) , decisionValueBlocks ( false ) , firstIndexViolatingConvergence ( 0 ) , minIndex ( 0 ) , maxIndex ( 0 ) , relative ( relative ) , precision ( precision ) , numRows ( std : : move ( oldHelper . numRows ) ) , matrixValues ( std : : move ( oldHelper . matrixValues ) ) , matrixColumns ( std : : move ( oldHelper . matrixColumns ) ) , rowIndications ( std : : move ( oldHelper . rowIndications ) ) , rowGroupIndices ( oldHelper . rowGroupIndices ) {
SoundValueIterationHelper < ValueType > : : SoundValueIterationHelper ( SoundValueIterationHelper < ValueType > & & oldHelper , std : : vector < ValueType > & x , std : : vector < ValueType > & y , bool relative , ValueType const & precision ) : x ( x ) , y ( y ) , xTmp ( std : : move ( oldHelper . xTmp ) ) , yTmp ( std : : move ( oldHelper . yTmp ) ) , hasLowerBound ( false ) , hasUpperBound ( false ) , hasDecisionValue ( false ) , convergencePhase1 ( true ) , decisionValueBlocks ( false ) , firstIndexViolatingConvergence ( 0 ) , minIndex ( 0 ) , maxIndex ( 0 ) , relative ( relative ) , precision ( precision ) , numRows ( std : : move ( oldHelper . numRows ) ) , matrixValues ( std : : move ( oldHelper . matrixValues ) ) , matrixColumns ( std : : move ( oldHelper . matrixColumns ) ) , rowIndications ( std : : move ( oldHelper . rowIndications ) ) , rowGroupIndices ( oldHelper . rowGroupIndices ) {
// If x0 is the obtained result, we want x0-eps <= x <= x0+eps for the actual solution x. Hence, the difference between the lower and upper bounds can be 2*eps.
this - > precision * = storm : : utility : : convertNumber < ValueType > ( 2.0 ) ;
x . assign ( x . size ( ) , storm : : utility : : zero < ValueType > ( ) ) ;
x . assign ( x . size ( ) , storm : : utility : : zero < ValueType > ( ) ) ;
y . assign ( x . size ( ) , storm : : utility : : one < ValueType > ( ) ) ;
y . assign ( x . size ( ) , storm : : utility : : one < ValueType > ( ) ) ;
}
}
@ -349,10 +351,9 @@ namespace storm {
return true ;
return true ;
}
}
template < typename ValueType >
template < typename ValueType >
bool SoundValueIterationHelper < ValueType > : : isPreciseEnough ( ValueType const & xi , ValueType const & yi , ValueType const & lb , ValueType const & ub ) {
bool SoundValueIterationHelper < ValueType > : : isPreciseEnough ( ValueType const & xi , ValueType const & yi , ValueType const & lb , ValueType const & ub ) {
return yi * ( ub - lb ) < = storm : : utility : : abs < ValueType > ( ( relative ? ( precision * xi ) : ( precision * storm : : utility : : convertNumber < ValueType > ( 2.0 ) ) ) ) ;
return yi * ( ub - lb ) < = storm : : utility : : abs < ValueType > ( ( relative ? ( precision * xi ) : ( precision ) ) ) ;
}
}
template < typename ValueType >
template < typename ValueType >