#include "storm/solver/SymbolicLinearEquationSolver.h" #include "storm/storage/dd/DdManager.h" #include "storm/storage/dd/Add.h" #include "storm/utility/dd.h" #include "storm/solver/SymbolicEliminationLinearEquationSolver.h" #include "storm/solver/SymbolicNativeLinearEquationSolver.h" #include "storm/solver/SolverSelectionOptions.h" #include "storm/settings/SettingsManager.h" #include "storm/settings/modules/CoreSettings.h" #include "storm/utility/macros.h" #include "storm/adapters/RationalFunctionAdapter.h" namespace storm { namespace solver { template SymbolicLinearEquationSolver::SymbolicLinearEquationSolver(storm::dd::Add const& A, storm::dd::Bdd const& allRows, std::set const& rowMetaVariables, std::set const& columnMetaVariables, std::vector> const& rowColumnMetaVariablePairs) : SymbolicLinearEquationSolver(allRows, rowMetaVariables, columnMetaVariables, rowColumnMetaVariablePairs) { this->setMatrix(A); } template SymbolicLinearEquationSolver::SymbolicLinearEquationSolver(storm::dd::Bdd const& allRows, std::set const& rowMetaVariables, std::set const& columnMetaVariables, std::vector> const& rowColumnMetaVariablePairs) : allRows(allRows), rowMetaVariables(rowMetaVariables), columnMetaVariables(columnMetaVariables), rowColumnMetaVariablePairs(rowColumnMetaVariablePairs) { // Intentionally left empty. } template storm::dd::Add SymbolicLinearEquationSolver::multiply(storm::dd::Add const& x, storm::dd::Add const* b, uint_fast64_t n) const { storm::dd::Add xCopy = x; // Perform matrix-vector multiplication while the bound is met. for (uint_fast64_t i = 0; i < n; ++i) { xCopy = xCopy.swapVariables(this->rowColumnMetaVariablePairs); xCopy = this->A.multiplyMatrix(xCopy, this->columnMetaVariables); if (b != nullptr) { xCopy += *b; } } return xCopy; } template void SymbolicLinearEquationSolver::setMatrix(storm::dd::Add const& newA) { this->A = newA; } template storm::dd::DdManager& SymbolicLinearEquationSolver::getDdManager() const { return this->allRows.getDdManager(); } template std::unique_ptr> SymbolicLinearEquationSolverFactory::create(storm::dd::Add const& A, storm::dd::Bdd const& allRows, std::set const& rowMetaVariables, std::set const& columnMetaVariables, std::vector> const& rowColumnMetaVariablePairs) const { std::unique_ptr> solver = this->create(allRows, rowMetaVariables, columnMetaVariables, rowColumnMetaVariablePairs); solver->setMatrix(A); return solver; } template std::unique_ptr> GeneralSymbolicLinearEquationSolverFactory::create(storm::dd::Bdd const& allRows, std::set const& rowMetaVariables, std::set const& columnMetaVariables, std::vector> const& rowColumnMetaVariablePairs) const { storm::solver::EquationSolverType equationSolver = storm::settings::getModule().getEquationSolver(); switch (equationSolver) { case storm::solver::EquationSolverType::Elimination: return std::make_unique>(allRows, rowMetaVariables, columnMetaVariables, rowColumnMetaVariablePairs); break; case storm::solver::EquationSolverType::Native: return std::make_unique>(allRows, rowMetaVariables, columnMetaVariables, rowColumnMetaVariablePairs); break; default: STORM_LOG_WARN("The selected equation solver is not available in the dd engine. Falling back to native solver."); return std::make_unique>(allRows, rowMetaVariables, columnMetaVariables, rowColumnMetaVariablePairs); } } template std::unique_ptr> GeneralSymbolicLinearEquationSolverFactory::create(storm::dd::Bdd const& allRows, std::set const& rowMetaVariables, std::set const& columnMetaVariables, std::vector> const& rowColumnMetaVariablePairs) const { auto const& coreSettings = storm::settings::getModule(); storm::solver::EquationSolverType equationSolver = coreSettings.getEquationSolver(); if (coreSettings.isEquationSolverSetFromDefaultValue() && equationSolver != storm::solver::EquationSolverType::Elimination) { STORM_LOG_WARN("Selecting the elimination solver to guarantee exact results. If you want to override this, please explicitly specify a different equation solver."); equationSolver = storm::solver::EquationSolverType::Elimination; } if (equationSolver != storm::solver::EquationSolverType::Elimination) { STORM_LOG_WARN("The chosen equation solver does not guarantee precise results despite using exact arithmetic. Consider using the elimination solver instead."); } switch (equationSolver) { case storm::solver::EquationSolverType::Elimination: return std::make_unique>(allRows, rowMetaVariables, columnMetaVariables, rowColumnMetaVariablePairs); break; case storm::solver::EquationSolverType::Native: return std::make_unique>(allRows, rowMetaVariables, columnMetaVariables, rowColumnMetaVariablePairs); break; default: STORM_LOG_WARN("The selected equation solver is not available in the dd engine. Falling back to elimination solver."); return std::make_unique>(allRows, rowMetaVariables, columnMetaVariables, rowColumnMetaVariablePairs); } } template std::unique_ptr> GeneralSymbolicLinearEquationSolverFactory::create(storm::dd::Bdd const& allRows, std::set const& rowMetaVariables, std::set const& columnMetaVariables, std::vector> const& rowColumnMetaVariablePairs) const { storm::solver::EquationSolverType equationSolver = storm::settings::getModule().getEquationSolver(); switch (equationSolver) { case storm::solver::EquationSolverType::Elimination: return std::make_unique>(allRows, rowMetaVariables, columnMetaVariables, rowColumnMetaVariablePairs); break; default: STORM_LOG_WARN("The selected equation solver is not available in the DD setting. Falling back to elimination solver."); return std::make_unique>(allRows, rowMetaVariables, columnMetaVariables, rowColumnMetaVariablePairs); } } template class SymbolicLinearEquationSolver; template class SymbolicLinearEquationSolver; template class SymbolicLinearEquationSolver; template class SymbolicLinearEquationSolver; template class SymbolicLinearEquationSolver; template class SymbolicLinearEquationSolverFactory; template class SymbolicLinearEquationSolverFactory; template class SymbolicLinearEquationSolverFactory; template class SymbolicLinearEquationSolverFactory; template class SymbolicLinearEquationSolverFactory; template class GeneralSymbolicLinearEquationSolverFactory; template class GeneralSymbolicLinearEquationSolverFactory; template class GeneralSymbolicLinearEquationSolverFactory; template class GeneralSymbolicLinearEquationSolverFactory; template class GeneralSymbolicLinearEquationSolverFactory; } }