#include "storm/solver/SymbolicEliminationLinearEquationSolver.h" #include "storm/storage/dd/DdManager.h" #include "storm/storage/dd/Add.h" #include "storm/utility/dd.h" namespace storm { namespace solver { template SymbolicEliminationLinearEquationSolver::SymbolicEliminationLinearEquationSolver(storm::dd::Add const& A, storm::dd::Bdd const& allRows, std::set const& rowMetaVariables, std::set const& columnMetaVariables, std::vector> const& rowColumnMetaVariablePairs) : SymbolicLinearEquationSolver(A, allRows, rowMetaVariables, columnMetaVariables, rowColumnMetaVariablePairs) { // Intentionally left empty. } template SymbolicEliminationLinearEquationSolver::SymbolicEliminationLinearEquationSolver(storm::dd::Add const& A, storm::dd::Bdd const& allRows, std::set const& rowMetaVariables, std::set const& columnMetaVariables, std::vector> const& rowColumnMetaVariablePairs, double precision, uint_fast64_t maximalNumberOfIterations, bool relative) : SymbolicLinearEquationSolver(A, allRows, rowMetaVariables, columnMetaVariables, rowColumnMetaVariablePairs, precision, maximalNumberOfIterations, relative) { // Intentionally left empty. } template storm::dd::Add SymbolicEliminationLinearEquationSolver::solveEquations(storm::dd::Add const& x, storm::dd::Add const& b) const { storm::dd::Bdd diagonal = storm::utility::dd::getRowColumnDiagonal(x.getDdManager(), this->rowColumnMetaVariablePairs); diagonal &= this->allRows; storm::dd::Add rowsAdd = this->allRows.template toAdd(); storm::dd::Add diagonalAdd = diagonal.template toAdd(); // Revert the conversion to an equation system. storm::dd::Add matrix = diagonalAdd - this->A; storm::dd::Add solution = b; // As long as there are transitions, we eliminate them. while (!matrix.isZero()) { // Determine inverse loop probabilies storm::dd::Add inverseLoopProbabilities = rowsAdd / (rowsAdd - (diagonalAdd * matrix).sumAbstract(this->columnMetaVariables)); inverseLoopProbabilities.swapVariables(this->rowColumnMetaVariablePairs); // Scale all transitions with the inverse loop probabilities. matrix *= inverseLoopProbabilities; // Delete diagonal elements, i.e. remove self-loops. matrix = diagonal.ite(x.getDdManager().template getAddZero(), matrix); // Update the one-step probabilities. solution += (matrix * solution.swapVariables(this->rowColumnMetaVariablePairs)).sumAbstract(this->columnMetaVariables); // Now eliminate all direct transitions of all states. storm::dd::Add matrixWithRemoved; } std::cout << "here" << std::endl; solution.exportToDot("solution.dot"); exit(-1); } template class SymbolicEliminationLinearEquationSolver; template class SymbolicEliminationLinearEquationSolver; } }