diff --git a/src/storm/modelchecker/multiobjective/pcaa/StandardPcaaWeightVectorChecker.cpp b/src/storm/modelchecker/multiobjective/pcaa/StandardPcaaWeightVectorChecker.cpp index 068d08b63..e3c734bf0 100644 --- a/src/storm/modelchecker/multiobjective/pcaa/StandardPcaaWeightVectorChecker.cpp +++ b/src/storm/modelchecker/multiobjective/pcaa/StandardPcaaWeightVectorChecker.cpp @@ -194,7 +194,8 @@ namespace storm { std::fill(ecQuotient->auxStateValues.begin(), ecQuotient->auxStateValues.end(), storm::utility::zero()); solver->solveEquations(env, ecQuotient->auxStateValues, ecQuotient->auxChoiceValues); - + this->overallPerformedIterations += solver->overallPerformedIterations; + solver->overallPerformedIterations = 0; this->weightedResult = std::vector(transitionMatrix.getRowGroupCount()); transformReducedSolutionToOriginalModel(ecQuotient->matrix, ecQuotient->auxStateValues, solver->getSchedulerChoices(), ecQuotient->ecqToOriginalChoiceMapping, ecQuotient->originalToEcqStateMapping, this->weightedResult, this->optimalChoices); @@ -277,6 +278,8 @@ namespace storm { STORM_LOG_THROW(req.empty(), storm::exceptions::UncheckedRequirementException, "At least one requirement of the LinearEquationSolver was not met."); solver->solveEquations(env, x, b); + this->overallPerformedIterations += solver->overallPerformedIterations; + solver->overallPerformedIterations = 0; // Set the result for this objective accordingly storm::utility::vector::setVectorValues(objectiveResults[objIndex], maybeStates, x); diff --git a/src/storm/modelchecker/multiobjective/pcaa/StandardPcaaWeightVectorChecker.h b/src/storm/modelchecker/multiobjective/pcaa/StandardPcaaWeightVectorChecker.h index 2f0a27f33..10cba6fbc 100644 --- a/src/storm/modelchecker/multiobjective/pcaa/StandardPcaaWeightVectorChecker.h +++ b/src/storm/modelchecker/multiobjective/pcaa/StandardPcaaWeightVectorChecker.h @@ -37,7 +37,13 @@ namespace storm { StandardPcaaWeightVectorChecker(SparseMultiObjectivePreprocessorResult const& preprocessorResult); - virtual ~StandardPcaaWeightVectorChecker() = default; + virtual ~StandardPcaaWeightVectorChecker() { + if (overallPerformedIterations != 0) { + std::cout << "PERFORMEDITERATIONS: " << overallPerformedIterations << std::endl; + } + } + + mutable uint64_t overallPerformedIterations = 0; /*! * - computes the optimal expected reward w.r.t. the weighted sum of the rewards of the individual objectives diff --git a/src/storm/solver/AbstractEquationSolver.h b/src/storm/solver/AbstractEquationSolver.h index 476399bfa..7d9013566 100644 --- a/src/storm/solver/AbstractEquationSolver.h +++ b/src/storm/solver/AbstractEquationSolver.h @@ -3,7 +3,7 @@ #include #include - +#include #include #include "storm/solver/TerminationCondition.h" @@ -17,6 +17,15 @@ namespace storm { public: AbstractEquationSolver(); + virtual ~AbstractEquationSolver() { + if (overallPerformedIterations != 0) { + std::cout << "PERFORMEDITERATIONS: " << overallPerformedIterations << std::endl; + } + } + + mutable uint64_t overallPerformedIterations = 0; + + /*! * Sets a custom termination condition that is used together with the regular termination condition of the * solver. diff --git a/src/storm/solver/IterativeMinMaxLinearEquationSolver.cpp b/src/storm/solver/IterativeMinMaxLinearEquationSolver.cpp index bb4886094..fcb715819 100644 --- a/src/storm/solver/IterativeMinMaxLinearEquationSolver.cpp +++ b/src/storm/solver/IterativeMinMaxLinearEquationSolver.cpp @@ -582,7 +582,8 @@ namespace storm { } reportStatus(status, iterations); - + this->overallPerformedIterations += iterations; + // We take the means of the lower and upper bound so we guarantee the desired precision. ValueType two = storm::utility::convertNumber(2.0); storm::utility::vector::applyPointwise(*lowerX, *upperX, *lowerX, [&two] (ValueType const& a, ValueType const& b) -> ValueType { return (a + b) / two; }); @@ -1035,6 +1036,8 @@ namespace storm { reportStatus(status, iterations); + this->overallPerformedIterations += iterations; + if (!this->isCachingEnabled()) { clearCache(); } diff --git a/src/storm/solver/NativeLinearEquationSolver.cpp b/src/storm/solver/NativeLinearEquationSolver.cpp index 06e9efebb..ba0032b08 100644 --- a/src/storm/solver/NativeLinearEquationSolver.cpp +++ b/src/storm/solver/NativeLinearEquationSolver.cpp @@ -549,7 +549,8 @@ namespace storm { if (!this->isCachingEnabled()) { clearCache(); } - + this->overallPerformedIterations += iterations; + this->logIterations(converged, terminate, iterations); return converged; @@ -734,7 +735,8 @@ namespace storm { if (!this->isCachingEnabled()) { clearCache(); } - + this->overallPerformedIterations += iterations; + this->logIterations(converged, terminate, iterations); STORM_LOG_WARN_COND(hasMinValueBound && hasMaxValueBound, "Could not compute lower or upper bound within the given number of iterations."); STORM_LOG_INFO("Quick Power Iteration terminated with lower value bound " << minValueBound << " and upper value bound " << maxValueBound << "."); diff --git a/src/storm/solver/TopologicalLinearEquationSolver.cpp b/src/storm/solver/TopologicalLinearEquationSolver.cpp index 83825d562..35994357b 100644 --- a/src/storm/solver/TopologicalLinearEquationSolver.cpp +++ b/src/storm/solver/TopologicalLinearEquationSolver.cpp @@ -91,6 +91,7 @@ namespace storm { for (auto const& scc : *this->sortedSccDecomposition) { if (scc.isTrivial()) { returnValue = solveTrivialScc(*scc.begin(), x, b) && returnValue; + ++this->overallPerformedIterations; } else { sccAsBitVector.clear(); for (auto const& state : scc) { @@ -101,9 +102,16 @@ namespace storm { } } + if (this->sccSolver) { + this->overallPerformedIterations += this->sccSolver->overallPerformedIterations; + this->sccSolver->overallPerformedIterations = 0; + } if (!this->isCachingEnabled()) { clearCache(); } + + + return returnValue; } diff --git a/src/storm/solver/TopologicalMinMaxLinearEquationSolver.cpp b/src/storm/solver/TopologicalMinMaxLinearEquationSolver.cpp index 1ba0c7467..92d909189 100644 --- a/src/storm/solver/TopologicalMinMaxLinearEquationSolver.cpp +++ b/src/storm/solver/TopologicalMinMaxLinearEquationSolver.cpp @@ -109,6 +109,7 @@ namespace storm { for (auto const& scc : *this->sortedSccDecomposition) { if (scc.isTrivial()) { returnValue = solveTrivialScc(*scc.begin(), dir, x, b) && returnValue; + ++this->overallPerformedIterations; } else { sccRowGroupsAsBitVector.clear(); sccRowsAsBitVector.clear(); @@ -132,6 +133,12 @@ namespace storm { } } + if (this->sccSolver) { + this->overallPerformedIterations += this->sccSolver->overallPerformedIterations; + this->sccSolver->overallPerformedIterations = 0; + } + + if (!this->isCachingEnabled()) { clearCache(); }