|
|
@ -319,8 +319,6 @@ namespace storm { |
|
|
|
// Then restrict the pivot states by requiring existing and different player 2 choices.
|
|
|
|
pivotStates &= ((minPlayer1Strategy || maxPlayer1Strategy) && constraint).existsAbstract(game.getNondeterminismVariables()); |
|
|
|
|
|
|
|
((minPlayer1Strategy || maxPlayer1Strategy) && constraint).existsAbstract(game.getNondeterminismVariables()).template toAdd<ValueType>().exportToDot("a.dot"); |
|
|
|
|
|
|
|
STORM_LOG_ASSERT(!pivotStates.isZero(), "Unable to refine without pivot state candidates."); |
|
|
|
|
|
|
|
// Now that we have the pivot state candidates, we need to pick one.
|
|
|
@ -339,7 +337,7 @@ namespace storm { |
|
|
|
//
|
|
|
|
// minResult.exportToDot("minresult.dot");
|
|
|
|
// maxResult.exportToDot("maxresult.dot");
|
|
|
|
// pivotState.template toAdd<ValueType>().exportToDot("pivot.dot");
|
|
|
|
pivotState.template toAdd<ValueType>().exportToDot("pivot.dot"); |
|
|
|
// pivotStateLower.exportToDot("pivot_lower.dot");
|
|
|
|
// pivotStateUpper.exportToDot("pivot_upper.dot");
|
|
|
|
// pivotStateIsMinProb0.template toAdd<ValueType>().exportToDot("pivot_is_minprob0.dot");
|
|
|
@ -477,7 +475,7 @@ namespace storm { |
|
|
|
targetStates |= game.getBottomStates(); |
|
|
|
} |
|
|
|
|
|
|
|
abstractor.exportToDot("game" + std::to_string(iterations) + ".dot", targetStates, game.getManager().getBddOne()); |
|
|
|
abstractor.exportToDot("game" + std::to_string(iterations) + ".dot"); |
|
|
|
|
|
|
|
prob01.min = computeProb01States(player1Direction, storm::OptimizationDirection::Minimize, game, transitionMatrixBdd, game.getStates(constraintExpression), targetStates); |
|
|
|
std::unique_ptr<CheckResult> result = checkForResultAfterQualitativeCheck<Type, ValueType>(checkTask, storm::OptimizationDirection::Minimize, game.getInitialStates(), prob01.min.first.getPlayer1States(), prob01.min.second.getPlayer1States()); |
|
|
@ -617,6 +615,23 @@ namespace storm { |
|
|
|
// Start by extending the quantitative strategies by the qualitative ones.
|
|
|
|
//minMaybeStateResult.player1Strategy |= prob01.min.first.getPlayer1Strategy() || prob01.min.second.getPlayer1Strategy();
|
|
|
|
|
|
|
|
storm::dd::Bdd<Type> tmp = (prob01.min.first.getPlayer2Strategy().existsAbstract(game.getPlayer2Variables()) && prob01.min.second.getPlayer2Strategy().existsAbstract(game.getPlayer2Variables())); |
|
|
|
STORM_LOG_ASSERT(tmp.isZero(), "wth?"); |
|
|
|
tmp = prob01.min.first.getPlayer2Strategy().existsAbstract(game.getPlayer2Variables()) && minMaybeStateResult.player2Strategy.existsAbstract(game.getPlayer2Variables()); |
|
|
|
if (!tmp.isZero()) { |
|
|
|
tmp = tmp && prob01.min.first.getPlayer2Strategy().exclusiveOr(minMaybeStateResult.player2Strategy).existsAbstract(game.getPlayer2Variables()); |
|
|
|
(tmp && prob01.min.first.getPlayer2Strategy()).template toAdd<ValueType>().exportToDot("prob0_strat.dot"); |
|
|
|
(tmp && minMaybeStateResult.player2Strategy).template toAdd<ValueType>().exportToDot("maybe_strat.dot"); |
|
|
|
if (!tmp.isZero()) { |
|
|
|
storm::dd::Add<Type, ValueType> values = (tmp.template toAdd<ValueType>() * game.getTransitionMatrix() * minResult.swapVariables(game.getRowColumnMetaVariablePairs())).sumAbstract(game.getColumnVariables()); |
|
|
|
tmp.template toAdd<ValueType>().exportToDot("illegal.dot"); |
|
|
|
minResult.exportToDot("vals.dot"); |
|
|
|
} |
|
|
|
STORM_LOG_ASSERT(tmp.isZero(), "ddduuuudde?"); |
|
|
|
} |
|
|
|
STORM_LOG_ASSERT(tmp.isZero(), "wth2?"); |
|
|
|
tmp = prob01.min.second.getPlayer2Strategy().existsAbstract(game.getPlayer2Variables()) && minMaybeStateResult.player2Strategy; |
|
|
|
|
|
|
|
//(minMaybeStateResult.player2Strategy && (prob01.min.first.getPlayer2Strategy() || prob01.min.second.getPlayer2Strategy())).template toAdd<ValueType>().exportToDot("strat_overlap.dot");
|
|
|
|
//minMaybeStateResult.player2Strategy |= prob01.min.first.getPlayer2Strategy() || prob01.min.second.getPlayer2Strategy();
|
|
|
|
//maxMaybeStateResult.player1Strategy |= prob01.max.first.getPlayer1Strategy() || prob01.max.second.getPlayer1Strategy();
|
|
|
@ -631,8 +646,8 @@ namespace storm { |
|
|
|
// Check whether the strategies coincide over the reachable parts.
|
|
|
|
storm::dd::Bdd<Type> tmp = game.getTransitionMatrix().toBdd() && (minMaybeStateResult.player1Strategy || maxMaybeStateResult.player1Strategy) && (minMaybeStateResult.player2Strategy || maxMaybeStateResult.player2Strategy); |
|
|
|
storm::dd::Bdd<Type> commonReach = storm::utility::dd::computeReachableStates(game.getInitialStates(), tmp.existsAbstract(game.getNondeterminismVariables()), game.getRowVariables(), game.getColumnVariables()); |
|
|
|
std::cout << "diff one? " << ((commonReach && minMaybeStateResult.player1Strategy) != (commonReach && maxMaybeStateResult.player1Strategy)) << std::endl; |
|
|
|
std::cout << "diff one? " << ((commonReach && minMaybeStateResult.player2Strategy) != (commonReach && maxMaybeStateResult.player2Strategy)) << std::endl; |
|
|
|
//std::cout << "diff one? " << ((commonReach && minMaybeStateResult.player1Strategy) != (commonReach && maxMaybeStateResult.player1Strategy)) << std::endl;
|
|
|
|
//std::cout << "diff one? " << ((commonReach && minMaybeStateResult.player2Strategy) != (commonReach && maxMaybeStateResult.player2Strategy)) << std::endl;
|
|
|
|
STORM_LOG_ASSERT((commonReach && minMaybeStateResult.player1Strategy) != (commonReach && maxMaybeStateResult.player1Strategy) || (commonReach && minMaybeStateResult.player2Strategy) != (commonReach && maxMaybeStateResult.player2Strategy), "The strategies fully coincide."); |
|
|
|
|
|
|
|
abstractor.exportToDot("lowerlower" + std::to_string(iterations) + ".dot", targetStates, minMaybeStateResult.player1Strategy && minMaybeStateResult.player2Strategy); |
|
|
|