#pragma once #include "storm/solver/LinearEquationSolver.h" #include "storm/utility/eigen.h" namespace storm { namespace solver { template class EigenLinearEquationSolverSettings { public: enum class SolutionMethod { SparseLU, BiCGSTAB, DGMRES, GMRES }; enum class Preconditioner { Ilu, Diagonal, None }; EigenLinearEquationSolverSettings(); void setSolutionMethod(SolutionMethod const& method); void setPreconditioner(Preconditioner const& preconditioner); void setPrecision(ValueType precision); void setMaximalNumberOfIterations(uint64_t maximalNumberOfIterations); void setNumberOfIterationsUntilRestart(uint64_t restart); void setForceSoundness(bool value); SolutionMethod getSolutionMethod() const; Preconditioner getPreconditioner() const; ValueType getPrecision() const; uint64_t getMaximalNumberOfIterations() const; uint64_t getNumberOfIterationsUntilRestart() const; bool getForceSoundness() const; private: bool forceSoundness; SolutionMethod method; Preconditioner preconditioner; double precision; uint64_t maximalNumberOfIterations; uint_fast64_t restart; }; #ifdef STORM_HAVE_CARL template<> class EigenLinearEquationSolverSettings { public: EigenLinearEquationSolverSettings(); }; template<> class EigenLinearEquationSolverSettings { public: EigenLinearEquationSolverSettings(); }; #endif /*! * A class that uses the Eigen library to implement the LinearEquationSolver interface. */ template class EigenLinearEquationSolver : public LinearEquationSolver { public: EigenLinearEquationSolver(EigenLinearEquationSolverSettings const& settings = EigenLinearEquationSolverSettings()); EigenLinearEquationSolver(storm::storage::SparseMatrix const& A, EigenLinearEquationSolverSettings const& settings = EigenLinearEquationSolverSettings()); EigenLinearEquationSolver(storm::storage::SparseMatrix&& A, EigenLinearEquationSolverSettings const& settings = EigenLinearEquationSolverSettings()); virtual void setMatrix(storm::storage::SparseMatrix const& A) override; virtual void setMatrix(storm::storage::SparseMatrix&& A) override; virtual void multiply(std::vector& x, std::vector const* b, std::vector& result) const override; EigenLinearEquationSolverSettings& getSettings(); EigenLinearEquationSolverSettings const& getSettings() const; virtual LinearEquationSolverProblemFormat getEquationProblemFormat() const override; protected: virtual bool internalSolveEquations(std::vector& x, std::vector const& b) const override; private: virtual uint64_t getMatrixRowCount() const override; virtual uint64_t getMatrixColumnCount() const override; // The (eigen) matrix associated with this equation solver. std::unique_ptr> eigenA; // The settings used by the solver. EigenLinearEquationSolverSettings settings; }; template class EigenLinearEquationSolverFactory : public LinearEquationSolverFactory { public: using LinearEquationSolverFactory::create; virtual std::unique_ptr> create() const override; EigenLinearEquationSolverSettings& getSettings(); EigenLinearEquationSolverSettings const& getSettings() const; virtual std::unique_ptr> clone() const override; private: EigenLinearEquationSolverSettings settings; }; } }