#pragma once #include "storm/solver/LinearEquationSolver.h" #include "storm/solver/StandardMinMaxLinearEquationSolver.h" namespace storm { namespace solver { template class IterativeMinMaxLinearEquationSolverSettings { public: IterativeMinMaxLinearEquationSolverSettings(); enum class SolutionMethod { ValueIteration, PolicyIteration, Acyclic }; void setSolutionMethod(SolutionMethod const& solutionMethod); void setSolutionMethod(MinMaxMethod const& solutionMethod); void setMaximalNumberOfIterations(uint64_t maximalNumberOfIterations); void setRelativeTerminationCriterion(bool value); void setPrecision(ValueType precision); SolutionMethod const& getSolutionMethod() const; uint64_t getMaximalNumberOfIterations() const; ValueType getPrecision() const; bool getRelativeTerminationCriterion() const; private: SolutionMethod solutionMethod; uint64_t maximalNumberOfIterations; ValueType precision; bool relative; }; template class IterativeMinMaxLinearEquationSolver : public StandardMinMaxLinearEquationSolver { public: IterativeMinMaxLinearEquationSolver(storm::storage::SparseMatrix const& A, std::unique_ptr>&& linearEquationSolverFactory, IterativeMinMaxLinearEquationSolverSettings const& settings = IterativeMinMaxLinearEquationSolverSettings()); IterativeMinMaxLinearEquationSolver(storm::storage::SparseMatrix&& A, std::unique_ptr>&& linearEquationSolverFactory, IterativeMinMaxLinearEquationSolverSettings const& settings = IterativeMinMaxLinearEquationSolverSettings()); virtual bool solveEquations(OptimizationDirection dir, std::vector& x, std::vector const& b) const override; IterativeMinMaxLinearEquationSolverSettings const& getSettings() const; void setSettings(IterativeMinMaxLinearEquationSolverSettings const& newSettings); virtual void clearCache() const override; virtual ValueType getPrecision() const override; virtual bool getRelative() const override; private: bool solveEquationsPolicyIteration(OptimizationDirection dir, std::vector& x, std::vector const& b) const; bool solveEquationsValueIteration(OptimizationDirection dir, std::vector& x, std::vector const& b) const; bool solveEquationsAcyclic(OptimizationDirection dir, std::vector& x, std::vector const& b) const; bool valueImproved(OptimizationDirection dir, ValueType const& value1, ValueType const& value2) const; void computeOptimalValueForRowGroup(uint_fast64_t group, OptimizationDirection dir, std::vector& x, std::vector const& b, uint_fast64_t* choice = nullptr) const; enum class Status { Converged, TerminatedEarly, MaximalIterationsExceeded, InProgress }; // possibly cached data mutable std::unique_ptr> auxiliaryRowGroupVector; // A.rowGroupCount() entries mutable std::unique_ptr> rowGroupOrdering; // A.rowGroupCount() entries Status updateStatusIfNotConverged(Status status, std::vector const& x, uint64_t iterations) const; void reportStatus(Status status, uint64_t iterations) const; /// The settings of this solver. IterativeMinMaxLinearEquationSolverSettings settings; }; template class IterativeMinMaxLinearEquationSolverFactory : public StandardMinMaxLinearEquationSolverFactory { public: IterativeMinMaxLinearEquationSolverFactory(MinMaxMethodSelection const& method = MinMaxMethodSelection::FROMSETTINGS, bool trackScheduler = false); IterativeMinMaxLinearEquationSolverFactory(std::unique_ptr>&& linearEquationSolverFactory, MinMaxMethodSelection const& method = MinMaxMethodSelection::FROMSETTINGS, bool trackScheduler = false); IterativeMinMaxLinearEquationSolverFactory(EquationSolverType const& solverType, MinMaxMethodSelection const& method = MinMaxMethodSelection::FROMSETTINGS, bool trackScheduler = false); virtual std::unique_ptr> create(storm::storage::SparseMatrix const& matrix) const override; virtual std::unique_ptr> create(storm::storage::SparseMatrix&& matrix) const override; IterativeMinMaxLinearEquationSolverSettings& getSettings(); IterativeMinMaxLinearEquationSolverSettings const& getSettings() const; virtual void setMinMaxMethod(MinMaxMethodSelection const& newMethod) override; virtual void setMinMaxMethod(MinMaxMethod const& newMethod) override; private: IterativeMinMaxLinearEquationSolverSettings settings; }; } }