You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

145 lines
5.7 KiB

#pragma once
#include <memory>
#include <set>
#include <boost/optional.hpp>
#include "src/utility/OsDetection.h"
#include "src/storage/dd/DdType.h"
#include "src/solver/SmtSolver.h"
#include "src/abstraction/LocalExpressionInformation.h"
namespace storm {
namespace utility {
namespace solver {
class SmtSolverFactory;
}
}
namespace dd {
template <storm::dd::DdType DdType>
class Bdd;
template <storm::dd::DdType DdType, typename ValueType>
class Add;
}
namespace abstraction {
template <storm::dd::DdType DdType, typename ValueType>
class AbstractionDdInformation;
class AbstractionExpressionInformation;
template <storm::dd::DdType DdType, typename ValueType>
class StateSetAbstractor {
public:
// Provide a no-op default constructor.
StateSetAbstractor() = default;
StateSetAbstractor(StateSetAbstractor const& other) = default;
StateSetAbstractor& operator=(StateSetAbstractor const& other) = default;
#ifndef WINDOWS
StateSetAbstractor(StateSetAbstractor&& other) = default;
StateSetAbstractor& operator=(StateSetAbstractor&& other) = default;
#endif
/*!
* Creates a state set abstractor.
*
* @param expressionInformation The expression-related information including the manager and the predicates.
* @param ddInformation The DD-related information including the manager.
* @param statePredicates A set of predicates that have to hold in the concrete states this abstractor is
* supposed to abstract.
* @param smtSolverFactory A factory that can create new SMT solvers.
*/
StateSetAbstractor(AbstractionExpressionInformation& expressionInformation, AbstractionDdInformation<DdType, ValueType> const& ddInformation, std::vector<storm::expressions::Expression> const& statePredicates, storm::utility::solver::SmtSolverFactory const& smtSolverFactory);
/*!
* Refines the abstractor by making the given predicates new abstract predicates.
*
* @param newPredicateIndices The indices of the new predicates.
*/
void refine(std::vector<uint_fast64_t> const& newPredicateIndices);
/*!
* Constraints the abstract states with the given BDD.
*
* @param newConstraint The BDD used as the constraint.
*/
void constrain(storm::dd::Bdd<DdType> const& newConstraint);
/*!
* Retrieves the set of abstract states matching all predicates added to this abstractor.
*
* @return The set of matching abstract states in the form of a BDD
*/
storm::dd::Bdd<DdType> getAbstractStates();
private:
/*!
* Creates decision variables and the corresponding constraints for the missing predicates.
*
* @param newRelevantPredicateIndices The set of all relevant predicate indices.
*/
void addMissingPredicates(std::set<uint_fast64_t> const& newRelevantPredicateIndices);
/*!
* Adds the current constraint BDD to the solver.
*/
void pushConstraintBdd();
/*!
* Removes the current constraint BDD (if any) from the solver.
*/
void popConstraintBdd();
/*!
* Recomputes the cached BDD. This needs to be triggered if any relevant predicates change.
*/
void recomputeCachedBdd();
/*!
* Translates the given model to a state DD.
*
* @param model The model to translate.
* @return The state encoded as a DD.
*/
storm::dd::Bdd<DdType> getStateBdd(storm::solver::SmtSolver::ModelReference const& model) const;
// The SMT solver used for abstracting the set of states.
std::unique_ptr<storm::solver::SmtSolver> smtSolver;
// The global expression-related information.
AbstractionExpressionInformation& globalExpressionInformation;
// The DD-related information.
AbstractionDdInformation<DdType, ValueType> const& ddInformation;
// The local expression-related information.
LocalExpressionInformation localExpressionInformation;
// The set of relevant predicates and the corresponding decision variables.
std::vector<std::pair<storm::expressions::Variable, uint_fast64_t>> relevantPredicatesAndVariables;
// The set of all variables appearing in the concrete predicates.
std::set<storm::expressions::Variable> concretePredicateVariables;
// The set of all decision variables over which to perform the all-sat enumeration.
std::vector<storm::expressions::Variable> decisionVariables;
// A flag indicating whether the cached BDD needs recomputation.
bool needsRecomputation;
// The cached BDD representing the abstraction. This variable is written to in refinement steps (if work
// needed to be done).
storm::dd::Bdd<DdType> cachedBdd;
// This BDD currently constrains the search for solutions.
storm::dd::Bdd<DdType> constraint;
};
}
}