|
@ -174,6 +174,13 @@ namespace storm { |
|
|
++iter; |
|
|
++iter; |
|
|
performIterationStep(env, dir); |
|
|
performIterationStep(env, dir); |
|
|
|
|
|
|
|
|
|
|
|
std::vector<ValueType> xOldTemp = xOld(); |
|
|
|
|
|
std::vector<ValueType> xNewTemp = xNew(); |
|
|
|
|
|
if(gameNondetTs() && iter > 1) { |
|
|
|
|
|
// Weight values with current iteration step
|
|
|
|
|
|
storm::utility::vector::applyPointwise<ValueType, ValueType>(xOld(), xOld(), [&iter] (ValueType const& x_i) -> ValueType { return x_i / (double)(iter - 1); }); |
|
|
|
|
|
storm::utility::vector::applyPointwise<ValueType, ValueType>(xNew(), xNew(), [&iter] (ValueType const& x_i) -> ValueType { return x_i / (double)iter; }); |
|
|
|
|
|
} |
|
|
// Check if we are done
|
|
|
// Check if we are done
|
|
|
auto convergenceCheckResult = checkConvergence(relative, precision); |
|
|
auto convergenceCheckResult = checkConvergence(relative, precision); |
|
|
result = convergenceCheckResult.currentValue; |
|
|
result = convergenceCheckResult.currentValue; |
|
@ -183,6 +190,12 @@ namespace storm { |
|
|
if (storm::utility::resources::isTerminate()) { |
|
|
if (storm::utility::resources::isTerminate()) { |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if(gameNondetTs() && iter > 1) { |
|
|
|
|
|
xOld() = xOldTemp; |
|
|
|
|
|
xNew() = xNewTemp; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
// If there will be a next iteration, we have to prepare it.
|
|
|
// If there will be a next iteration, we have to prepare it.
|
|
|
prepareNextIteration(env); |
|
|
prepareNextIteration(env); |
|
|
|
|
|
|
|
@ -350,7 +363,7 @@ namespace storm { |
|
|
// The result of this ongoing computation will be stored in xNew()
|
|
|
// The result of this ongoing computation will be stored in xNew()
|
|
|
|
|
|
|
|
|
// Compute the values obtained by a single uniformization step between timed states only
|
|
|
// Compute the values obtained by a single uniformization step between timed states only
|
|
|
if (nondetTs()) { |
|
|
|
|
|
|
|
|
if (nondetTs() && !gameNondetTs()) { |
|
|
if (choices == nullptr) { |
|
|
if (choices == nullptr) { |
|
|
_TsMultiplier->multiplyAndReduce(env, *dir, xOld(), &_TsChoiceValues, xNew()); |
|
|
_TsMultiplier->multiplyAndReduce(env, *dir, xOld(), &_TsChoiceValues, xNew()); |
|
|
} else { |
|
|
} else { |
|
@ -362,6 +375,14 @@ namespace storm { |
|
|
STORM_LOG_ASSERT(!_hasInstantStates, "Nondeterministic timed states are only supported if there are no instant states."); |
|
|
STORM_LOG_ASSERT(!_hasInstantStates, "Nondeterministic timed states are only supported if there are no instant states."); |
|
|
setInputModelChoices(*choices, tsChoices); |
|
|
setInputModelChoices(*choices, tsChoices); |
|
|
} |
|
|
} |
|
|
|
|
|
} else if(gameNondetTs()) { // TODO DRYness? exact same behaviour as case above?
|
|
|
|
|
|
if (choices == nullptr) { |
|
|
|
|
|
_TsMultiplier->multiplyAndReduce(env, *dir, xOld(), &_TsChoiceValues, xNew()); |
|
|
|
|
|
} else { |
|
|
|
|
|
std::vector<uint64_t> tsChoices(_TsTransitions.getRowGroupCount()); |
|
|
|
|
|
_TsMultiplier->multiplyAndReduce(env, *dir, xOld(), &_TsChoiceValues, xNew(), &tsChoices); |
|
|
|
|
|
setInputModelChoices(*choices, tsChoices); // no components -> no need for that call?
|
|
|
|
|
|
} |
|
|
} else { |
|
|
} else { |
|
|
_TsMultiplier->multiply(env, xOld(), &_TsChoiceValues, xNew()); |
|
|
_TsMultiplier->multiply(env, xOld(), &_TsChoiceValues, xNew()); |
|
|
} |
|
|
} |
|
|