#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/environment/solver/SolverEnvironment.h" #include "storm/utility/macros.h" #include "storm/exceptions/UnmetRequirementException.h" #include "storm/exceptions/InvalidEnvironmentException.h" #include "storm/adapters/RationalFunctionAdapter.h" namespace storm { namespace solver { template SymbolicLinearEquationSolver::SymbolicLinearEquationSolver() { // Intentionally left empty. } 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) : SymbolicEquationSolver(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 LinearEquationSolverProblemFormat SymbolicLinearEquationSolver::getEquationProblemFormat(Environment const& env) const { return LinearEquationSolverProblemFormat::EquationSystem; } template LinearEquationSolverRequirements SymbolicLinearEquationSolver::getRequirements(Environment const& env) const { // Return empty requirements by default. return LinearEquationSolverRequirements(); } template void SymbolicLinearEquationSolver::setMatrix(storm::dd::Add const& newA) { this->A = newA; } template void SymbolicLinearEquationSolver::setData(storm::dd::Bdd const& allRows, std::set const& rowMetaVariables, std::set const& columnMetaVariables, std::vector> const& rowColumnMetaVariablePairs) { this->setAllRows(allRows); this->rowMetaVariables = rowMetaVariables; this->columnMetaVariables = columnMetaVariables; this->rowColumnMetaVariablePairs = rowColumnMetaVariablePairs; } template std::unique_ptr> SymbolicLinearEquationSolverFactory::create(Environment const& env, 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(env, allRows, rowMetaVariables, columnMetaVariables, rowColumnMetaVariablePairs); solver->setMatrix(A); return solver; } template std::unique_ptr> SymbolicLinearEquationSolverFactory::create(Environment const& env, storm::dd::Bdd const& allRows, std::set const& rowMetaVariables, std::set const& columnMetaVariables, std::vector> const& rowColumnMetaVariablePairs) const { std::unique_ptr> solver = this->create(env); solver->setData(allRows, rowMetaVariables, columnMetaVariables, rowColumnMetaVariablePairs); return solver; } template LinearEquationSolverProblemFormat SymbolicLinearEquationSolverFactory::getEquationProblemFormat(Environment const& env) const { return this->create(env)->getEquationProblemFormat(env); } template LinearEquationSolverRequirements SymbolicLinearEquationSolverFactory::getRequirements(Environment const& env) const { return this->create(env)->getRequirements(env); } template<> std::unique_ptr> GeneralSymbolicLinearEquationSolverFactory::create(Environment const& env) const { EquationSolverType type = env.solver().getLinearEquationSolverType(); // Adjust the solver type if it is not supported in the Dd engine with rational functions if (type != EquationSolverType::Elimination) { type = EquationSolverType::Elimination; STORM_LOG_INFO("The selected equation solver is not available in the parametric dd engine. Falling back to " << toString(type) << " solver."); } switch (type) { case EquationSolverType::Elimination: return std::make_unique>(); default: STORM_LOG_THROW(false, storm::exceptions::InvalidEnvironmentException, "Unknown solver type."); return nullptr; } } template std::unique_ptr> GeneralSymbolicLinearEquationSolverFactory::create(Environment const& env) const { EquationSolverType type = env.solver().getLinearEquationSolverType(); // Adjust the solver type if it is not supported in the Dd engine if (type != EquationSolverType::Native && type != EquationSolverType::Elimination) { type = EquationSolverType::Native; STORM_LOG_INFO("The selected equation solver is not available in the dd engine. Falling back to " << toString(type) << " solver."); } switch (type) { case EquationSolverType::Native: return std::make_unique>(); case EquationSolverType::Elimination: return std::make_unique>(); default: STORM_LOG_THROW(false, storm::exceptions::InvalidEnvironmentException, "Unknown solver type."); return nullptr; } } 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; } }