From d90c507431e0b6cd8e763634135faa68d7c2696d Mon Sep 17 00:00:00 2001 From: dehnert Date: Tue, 17 Oct 2017 13:18:43 +0200 Subject: [PATCH] fixed bug in sparse bisimulation quotient extraction related to rewards --- .../IterativeMinMaxLinearEquationSolver.cpp | 18 ++++++++++++------ .../solver/NativeLinearEquationSolver.cpp | 2 +- .../dd/bisimulation/QuotientExtractor.cpp | 18 ++++++------------ 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/storm/solver/IterativeMinMaxLinearEquationSolver.cpp b/src/storm/solver/IterativeMinMaxLinearEquationSolver.cpp index d756c194b..b706ab585 100644 --- a/src/storm/solver/IterativeMinMaxLinearEquationSolver.cpp +++ b/src/storm/solver/IterativeMinMaxLinearEquationSolver.cpp @@ -124,23 +124,29 @@ namespace storm { template bool IterativeMinMaxLinearEquationSolver::internalSolveEquations(OptimizationDirection dir, std::vector& x, std::vector const& b) const { + bool result = false; switch (this->getSettings().getSolutionMethod()) { case IterativeMinMaxLinearEquationSolverSettings::SolutionMethod::ValueIteration: if (this->getSettings().getForceSoundness()) { - return solveEquationsSoundValueIteration(dir, x, b); + result = solveEquationsSoundValueIteration(dir, x, b); } else { - return solveEquationsValueIteration(dir, x, b); + result = solveEquationsValueIteration(dir, x, b); } + break; case IterativeMinMaxLinearEquationSolverSettings::SolutionMethod::PolicyIteration: - return solveEquationsPolicyIteration(dir, x, b); + result = solveEquationsPolicyIteration(dir, x, b); + break; case IterativeMinMaxLinearEquationSolverSettings::SolutionMethod::Acyclic: - return solveEquationsAcyclic(dir, x, b); + result = solveEquationsAcyclic(dir, x, b); + break; case IterativeMinMaxLinearEquationSolverSettings::SolutionMethod::RationalSearch: - return solveEquationsRationalSearch(dir, x, b); + result = solveEquationsRationalSearch(dir, x, b); + break; default: STORM_LOG_THROW(false, storm::exceptions::InvalidSettingsException, "This solver does not implement the selected solution method"); } - return false; + + return result; } template diff --git a/src/storm/solver/NativeLinearEquationSolver.cpp b/src/storm/solver/NativeLinearEquationSolver.cpp index e77d23d94..a0f0f03e7 100644 --- a/src/storm/solver/NativeLinearEquationSolver.cpp +++ b/src/storm/solver/NativeLinearEquationSolver.cpp @@ -86,7 +86,7 @@ namespace storm { void NativeLinearEquationSolverSettings::setForceSoundness(bool value) { forceSoundness = value; if (forceSoundness && method != SolutionMethod::Power && method != SolutionMethod::RationalSearch) { - STORM_LOG_WARN("To guarantee soundness, the equation solving technique has been switched to '" << storm::settings::modules::NativeEquationSolverSettings::LinearEquationMethod::Power << "'."); + STORM_LOG_INFO("To guarantee soundness, the equation solving technique has been switched to '" << storm::settings::modules::NativeEquationSolverSettings::LinearEquationMethod::Power << "'."); method = SolutionMethod::Power; } } diff --git a/src/storm/storage/dd/bisimulation/QuotientExtractor.cpp b/src/storm/storage/dd/bisimulation/QuotientExtractor.cpp index 3e8682b6d..895cea154 100644 --- a/src/storm/storage/dd/bisimulation/QuotientExtractor.cpp +++ b/src/storm/storage/dd/bisimulation/QuotientExtractor.cpp @@ -269,18 +269,13 @@ namespace storm { } else { STORM_LOG_ASSERT(!this->rowPermutation.empty(), "Expected proper row permutation."); std::vector valueVector = extractVectorInternal(vector, this->allSourceVariablesCube, this->nondeterminismOdd); - + // Reorder the values according to the known row permutation. - for (uint64_t position = 0; position < valueVector.size(); ) { - if (rowPermutation[position] != position) { - std::swap(valueVector[position], valueVector[rowPermutation[position]]); - std::swap(rowPermutation[position], rowPermutation[rowPermutation[position]]); - } else { - ++position; - } + std::vector reorderedValues(valueVector.size()); + for (uint64_t pos = 0; pos < valueVector.size(); ++pos) { + reorderedValues[pos] = valueVector[rowPermutation[pos]]; } - - return valueVector; + return reorderedValues; } } @@ -857,7 +852,7 @@ namespace storm { storm::storage::SparseMatrix quotientTransitionMatrix = sparseExtractor.extractTransitionMatrix(model.getTransitionMatrix()); auto end = std::chrono::high_resolution_clock::now(); STORM_LOG_TRACE("Quotient transition matrix extracted in " << std::chrono::duration_cast(end - start).count() << "ms."); - + start = std::chrono::high_resolution_clock::now(); storm::models::sparse::StateLabeling quotientStateLabeling(partition.getNumberOfBlocks()); quotientStateLabeling.addLabel("init", sparseExtractor.extractSetExists(model.getInitialStates())); @@ -892,7 +887,6 @@ namespace storm { boost::optional> quotientStateActionRewards; if (rewardModel.hasStateActionRewards()) { - rewardModel.getStateActionRewardVector().exportToDot("vector.dot"); quotientStateActionRewards = sparseExtractor.extractStateActionVector(rewardModel.getStateActionRewardVector()); }