#pragma once #include "src/solver/LinearEquationSolver.h" #include "src/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); SolutionMethod getSolutionMethod() const; Preconditioner getPreconditioner() const; ValueType getPrecision() const; uint64_t getMaximalNumberOfIterations() const; uint64_t getNumberOfIterationsUntilRestart() const; private: 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(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 solveEquations(std::vector& x, std::vector const& b) const override; virtual void multiply(std::vector& x, std::vector const* b, std::vector& result) const override; EigenLinearEquationSolverSettings& getSettings(); EigenLinearEquationSolverSettings const& getSettings() const; 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: virtual std::unique_ptr> create(storm::storage::SparseMatrix const& matrix) const override; virtual std::unique_ptr> create(storm::storage::SparseMatrix&& matrix) const override; EigenLinearEquationSolverSettings& getSettings(); EigenLinearEquationSolverSettings const& getSettings() const; virtual std::unique_ptr> clone() const override; private: EigenLinearEquationSolverSettings settings; }; } }