@ -89,14 +89,12 @@ namespace storm {
progress . startNewMeasurement ( 0 ) ;
for ( auto const & scc : * this - > sortedSccDecomposition ) {
if ( scc . size ( ) = = 1 ) {
// TODO: directly use localMonRes on this
returnValue = solveTrivialScc ( * scc . begin ( ) , dir , x , b ) & & returnValue ;
} else {
STORM_LOG_TRACE ( " Solving SCC of size " < < scc . size ( ) < < " . " ) ;
sccRowGroupsAsBitVector . clear ( ) ;
sccRowsAsBitVector . clear ( ) ;
for ( auto const & group : scc ) { // Group refers to state
bool allIgnored = true ;
sccRowGroupsAsBitVector . set ( group , true ) ;
if ( ! this - > choiceFixedForState | | ! this - > choiceFixedForState . get ( ) [ group ] ) {
@ -150,13 +148,12 @@ namespace storm {
ValueType & xi = globalX [ sccState ] ;
bool firstRow = true ;
uint64_t bestRow ;
if ( this - > choiceFixedForState & & this - > choiceFixedForState . get ( ) [ sccState ] ) {
assert ( this - > hasInitialScheduler ( ) ) ;
uint64_t row = this - > A - > getRowGroupIndices ( ) [ sccState ] + this - > initialScheduler . get ( ) [ sccState ] ;
assert ( ! this - > choiceFixedForState | | ! this - > choiceFixedForState . get ( ) [ sccState ] | | ( this - > hasInitialScheduler ( ) & & this - > A - > getRowGroupSize ( sccState ) = = 1 ) ) ;
for ( uint64_t row = this - > A - > getRowGroupIndices ( ) [ sccState ] ; row < this - > A - > getRowGroupIndices ( ) [ sccState + 1 ] ; + + row ) {
ValueType rowValue = globalB [ row ] ;
bool hasDiagonalEntry = false ;
ValueType denominator ;
for ( auto const & entry : this - > A - > getRow ( row ) ) {
for ( auto const & entry : this - > A - > getRow ( row ) ) {
if ( entry . getColumn ( ) = = sccState ) {
hasDiagonalEntry = true ;
denominator = storm : : utility : : one < ValueType > ( ) - entry . getValue ( ) ;
@ -165,69 +162,41 @@ namespace storm {
}
}
if ( hasDiagonalEntry ) {
STORM_LOG_WARN_COND_DEBUG ( storm : : NumberTraits < ValueType > : : IsExact | | ! storm : : utility : : isAlmostZero ( denominator ) | |
storm : : utility : : isZero ( denominator ) , " State " < < sccState < < " has a selfloop with probability '1-( " < < denominator < < " )'. This could be an indication for numerical issues. " ) ;
assert ( ! storm : : utility : : isZero ( denominator ) ) ;
rowValue / = denominator ;
STORM_LOG_WARN_COND_DEBUG (
storm : : NumberTraits < ValueType > : : IsExact | | ! storm : : utility : : isAlmostZero ( denominator ) | | storm : : utility : : isZero ( denominator ) ,
" State " < < sccState < < " has a selfloop with probability '1-( " < < denominator
< < " )'. This could be an indication for numerical issues. " ) ;
if ( storm : : utility : : isZero ( denominator ) ) {
// In this case we have a selfloop on this state. This can never an optimal choice:
// When minimizing, we are looking for the largest fixpoint (which will never be attained by this action)
// When maximizing, this choice reflects probability zero (non-optimal) or reward infinity (should already be handled during preprocessing).
continue ;
} else {
rowValue / = denominator ;
}
}
if ( minimize ( dir ) ) {
if ( firstRow ) {
xi = std : : move ( rowValue ) ;
bestRow = row ;
firstRow = false ;
} else {
xi = std : : move ( rowValue ) ;
}
STORM_LOG_INFO ( " Ignoring state " < < sccState < < " as the choice is fixed, current probability for this state is: " < < this - > schedulerChoices . get ( ) [ sccState ] ) ;
} else {
for ( uint64_t row = this - > A - > getRowGroupIndices ( ) [ sccState ] ; row < this - > A - > getRowGroupIndices ( ) [ sccState + 1 ] ; + + row ) {
ValueType rowValue = globalB [ row ] ;
bool hasDiagonalEntry = false ;
ValueType denominator ;
for ( auto const & entry : this - > A - > getRow ( row ) ) {
if ( entry . getColumn ( ) = = sccState ) {
hasDiagonalEntry = true ;
denominator = storm : : utility : : one < ValueType > ( ) - entry . getValue ( ) ;
} else {
rowValue + = entry . getValue ( ) * globalX [ entry . getColumn ( ) ] ;
}
}
if ( hasDiagonalEntry ) {
STORM_LOG_WARN_COND_DEBUG (
storm : : NumberTraits < ValueType > : : IsExact | | ! storm : : utility : : isAlmostZero ( denominator ) | |
storm : : utility : : isZero ( denominator ) ,
" State " < < sccState < < " has a selfloop with probability '1-( " < < denominator
< < " )'. This could be an indication for numerical issues. " ) ;
if ( storm : : utility : : isZero ( denominator ) ) {
// In this case we have a selfloop on this state. This can never an optimal choice:
// When minimizing, we are looking for the largest fixpoint (which will never be attained by this action)
// When maximizing, this choice reflects probability zero (non-optimal) or reward infinity (should already be handled during preprocessing).
continue ;
} else {
rowValue / = denominator ;
if ( minimize ( dir ) ) {
if ( rowValue < xi ) {
xi = std : : move ( rowValue ) ;
bestRow = row ;
}
}
if ( firstRow ) {
xi = std : : move ( rowValue ) ;
bestRow = row ;
firstRow = false ;
} else {
if ( minimize ( dir ) ) {
if ( rowValue < xi ) {
xi = std : : move ( rowValue ) ;
bestRow = row ;
}
} else {
if ( rowValue > xi ) {
xi = std : : move ( rowValue ) ;
bestRow = row ;
}
if ( rowValue > xi ) {
xi = std : : move ( rowValue ) ;
bestRow = row ;
}
}
}
if ( this - > isTrackSchedulerSet ( ) ) {
this - > schedulerChoices . get ( ) [ sccState ] = bestRow - this - > A - > getRowGroupIndices ( ) [ sccState ] ;
}
STORM_LOG_THROW ( ! firstRow , storm : : exceptions : : UnexpectedException , " Empty row group in MinMax equation system. " ) ;
}
//std::cout << "Solved trivial scc " << sccState << " with result " << globalX[sccState] << std::endl;
if ( this - > isTrackSchedulerSet ( ) ) {
this - > schedulerChoices . get ( ) [ sccState ] = bestRow - this - > A - > getRowGroupIndices ( ) [ sccState ] ;
}
STORM_LOG_THROW ( ! firstRow , storm : : exceptions : : UnexpectedException , " Empty row group in MinMax equation system. " ) ;
return true ;
}
@ -301,8 +270,6 @@ namespace storm {
}
// std::cout << "Matrix is " << sccA << std::endl;
this - > sccSolver - > setMatrix ( std : : move ( sccA ) ) ;
// x Vector