|
|
@ -13,7 +13,7 @@ namespace storm { |
|
|
|
namespace internal { |
|
|
|
|
|
|
|
template <typename ValueType> |
|
|
|
BoundedGloballyGameViHelper<ValueType>::GameViHelper(storm::storage::SparseMatrix<ValueType> const& transitionMatrix, storm::storage::BitVector statesOfCoalition) : _transitionMatrix(transitionMatrix), _statesOfCoalition(statesOfCoalition) { |
|
|
|
BoundedGloballyGameViHelper<ValueType>::BoundedGloballyGameViHelper(storm::storage::SparseMatrix<ValueType> const& transitionMatrix, storm::storage::BitVector statesOfCoalition) : _transitionMatrix(transitionMatrix), _statesOfCoalition(statesOfCoalition) { |
|
|
|
} |
|
|
|
|
|
|
|
template <typename ValueType> |
|
|
@ -23,12 +23,9 @@ namespace storm { |
|
|
|
} |
|
|
|
|
|
|
|
template <typename ValueType> |
|
|
|
void BoundedGloballyGameViHelper<ValueType>::performValueIteration(Environment const& env, std::vector<ValueType>& x, std::vector<ValueType> b, storm::solver::OptimizationDirection const dir) { |
|
|
|
void BoundedGloballyGameViHelper<ValueType>::performValueIteration(Environment const& env, std::vector<ValueType>& x, std::vector<ValueType> b, storm::solver::OptimizationDirection const dir, uint64_t upperBound) { |
|
|
|
prepareSolversAndMultipliersReachability(env); |
|
|
|
// TODO: parse k from the formula
|
|
|
|
uint64_t k = 3; |
|
|
|
_b = b; |
|
|
|
|
|
|
|
_x1.assign(_transitionMatrix.getRowGroupCount(), storm::utility::zero<ValueType>()); |
|
|
|
_x2 = _x1; |
|
|
|
|
|
|
@ -40,22 +37,22 @@ namespace storm { |
|
|
|
} |
|
|
|
|
|
|
|
uint64_t iter = 0; |
|
|
|
std::vector<ValueType> result = x; |
|
|
|
while (iter < k) { |
|
|
|
while (iter < upperBound) { |
|
|
|
++iter; |
|
|
|
|
|
|
|
performIterationStep(env, dir); |
|
|
|
|
|
|
|
if (storm::utility::resources::isTerminate()) { |
|
|
|
/* if (storm::utility::resources::isTerminate()) {
|
|
|
|
break; |
|
|
|
} |
|
|
|
}*/ |
|
|
|
} |
|
|
|
|
|
|
|
x = xNew(); |
|
|
|
|
|
|
|
// TODO: do we have to do that by using boundedGlobally?
|
|
|
|
if (isProduceSchedulerSet()) { |
|
|
|
/* if (isProduceSchedulerSet()) {
|
|
|
|
// We will be doing one more iteration step and track scheduler choices this time.
|
|
|
|
performIterationStep(env, dir, &_producedOptimalChoices.get()); |
|
|
|
} |
|
|
|
}*/ |
|
|
|
} |
|
|
|
|
|
|
|
template <typename ValueType> |
|
|
@ -68,12 +65,7 @@ namespace storm { |
|
|
|
// multiplyandreducegaussseidel
|
|
|
|
// Ax + b
|
|
|
|
if (choices == nullptr) { |
|
|
|
//STORM_LOG_DEBUG("\n" << _transitionMatrix);
|
|
|
|
//STORM_LOG_DEBUG("xOld = " << storm::utility::vector::toString(xOld()));
|
|
|
|
//STORM_LOG_DEBUG("b = " << storm::utility::vector::toString(_b));
|
|
|
|
//STORM_LOG_DEBUG("xNew = " << storm::utility::vector::toString(xNew()));
|
|
|
|
_multiplier->multiplyAndReduce(env, dir, xOld(), &_b, xNew(), nullptr, &_statesOfCoalition); |
|
|
|
//std::cin.get();
|
|
|
|
} else { |
|
|
|
// Also keep track of the choices made.
|
|
|
|
_multiplier->multiplyAndReduce(env, dir, xOld(), &_b, xNew(), choices, &_statesOfCoalition); |
|
|
@ -94,7 +86,7 @@ namespace storm { |
|
|
|
template <typename ValueType> |
|
|
|
void BoundedGloballyGameViHelper<ValueType>::fillResultVector(std::vector<ValueType>& result, storm::storage::BitVector psiStates) |
|
|
|
{ |
|
|
|
std::vector<ValueType> filledVector = std::vector<ValueType>(relevantStates.size(), storm::utility::zero<ValueType>()); |
|
|
|
std::vector<ValueType> filledVector = std::vector<ValueType>(psiStates.size(), storm::utility::zero<ValueType>()); |
|
|
|
uint bitIndex = 0; |
|
|
|
for(uint i = 0; i < filledVector.size(); i++) { |
|
|
|
if (psiStates.get(i)) { |
|
|
|