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
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;
|
|
};
|
|
}
|
|
}
|