14namespace abstraction {
19template<storm::dd::DdType DdType,
typename ValueType>
21 std::shared_ptr<storm::utility::solver::SmtSolverFactory>
const& smtSolverFactory,
22 bool useDecomposition,
bool addPredicatesForValidBlocks,
bool debug)
23 : smtSolverFactory(smtSolverFactory), abstractionInformation(abstractionInformation), edges(), automaton(automaton) {
26 for (
auto const& edge : automaton.
getEdges()) {
27 edges.emplace_back(edgeId, edge, abstractionInformation, smtSolverFactory, useDecomposition, addPredicatesForValidBlocks, debug);
36template<storm::dd::DdType DdType,
typename ValueType>
38 for (uint_fast64_t index = 0; index < edges.size(); ++index) {
40 edges[index].refine(predicates);
44template<storm::dd::DdType DdType,
typename ValueType>
46 return edges[player1Choice].getGuard();
49template<storm::dd::DdType DdType,
typename ValueType>
51 return edges[player1Choice].getNumberOfUpdates(player1Choice);
54template<storm::dd::DdType DdType,
typename ValueType>
56 uint64_t player1Choice, uint64_t auxiliaryChoice)
const {
57 return edges[player1Choice].getVariableUpdates(auxiliaryChoice);
60template<storm::dd::DdType DdType,
typename ValueType>
62 return edges[player1Choice].getAssignedVariables();
65template<storm::dd::DdType DdType,
typename ValueType>
68 std::vector<GameBddResult<DdType>> edgeDdsAndUsedOptionVariableCounts;
69 uint_fast64_t maximalNumberOfUsedOptionVariables = 0;
70 for (
auto& edge : edges) {
71 edgeDdsAndUsedOptionVariableCounts.push_back(edge.abstract());
72 maximalNumberOfUsedOptionVariables = std::max(maximalNumberOfUsedOptionVariables, edgeDdsAndUsedOptionVariableCounts.back().numberOfPlayer2Variables);
78 for (
auto const& edgeDd : edgeDdsAndUsedOptionVariableCounts) {
79 result |= edgeDd.bdd && this->getAbstractionInformation().encodePlayer2Choice(1, edgeDd.numberOfPlayer2Variables, maximalNumberOfUsedOptionVariables);
84template<storm::dd::DdType DdType,
typename ValueType>
86 uint_fast64_t numberOfPlayer2Variables) {
88 this->getAbstractionInformation().getDdManager().getBddZero());
90 for (
auto& edge : edges) {
91 BottomStateResult<DdType> commandBottomStateResult = edge.getBottomStateTransitions(reachableStates, numberOfPlayer2Variables, locationVariables);
99template<storm::dd::DdType DdType,
typename ValueType>
102 for (
auto const& edge : edges) {
103 result += edge.getEdgeDecoratorAdd(locationVariables);
108template<storm::dd::DdType DdType,
typename ValueType>
110 if (automaton.get().getNumberOfLocations() == 1) {
111 return this->getAbstractionInformation().
getDdManager().getBddOne();
114 std::set<uint64_t>
const& initialLocationIndices = automaton.get().getInitialLocationIndices();
116 for (
auto const& initialLocationIndex : initialLocationIndices) {
117 result |= this->getAbstractionInformation().encodeLocation(locationVariables.get().first, initialLocationIndex);
122template<storm::dd::DdType DdType,
typename ValueType>
127template<storm::dd::DdType DdType,
typename ValueType>
132template<storm::dd::DdType DdType,
typename ValueType>
137template<storm::dd::DdType DdType,
typename ValueType>
139 return abstractionInformation.get();
142template<storm::dd::DdType DdType,
typename ValueType>
144 for (
auto& edge : edges) {
145 edge.notifyGuardIsPredicate();
DdManager< LibraryType > & getDdManager() const
Retrieves the manager that is responsible for this DD.
std::set< storm::expressions::Variable > const & getAssignedVariables(uint64_t player1Choice) const
Retrieves the variables assigned by the given player 1 choice.
std::size_t getNumberOfEdges() const
Retrieves the number of abstract edges of this abstract automaton.
void notifyGuardsArePredicates()
BottomStateResult< DdType > getBottomStateTransitions(storm::dd::Bdd< DdType > const &reachableStates, uint_fast64_t numberOfPlayer2Variables)
Retrieves the transitions to bottom states of this automaton.
uint64_t getNumberOfUpdates(uint64_t player1Choice) const
Retrieves the number of updates of the specified player 1 choice.
GameBddResult< DdType > abstract()
Computes the abstraction of the module wrt.
storm::expressions::Expression const & getGuard(uint64_t player1Choice) const
Retrieves the guard of the given player 1 choice.
AutomatonAbstractor(storm::jani::Automaton const &automaton, AbstractionInformation< DdType > &abstractionInformation, std::shared_ptr< storm::utility::solver::SmtSolverFactory > const &smtSolverFactory, bool useDecomposition, bool addPredicatesForValidBlocks, bool debug)
Constructs an abstract module from the given automaton.
storm::dd::Add< DdType, ValueType > getEdgeDecoratorAdd() const
Retrieves an ADD that maps the encodings of edges, source/target locations and their updates to their...
std::vector< EdgeAbstractor< DdType, ValueType > > const & getEdges() const
Retrieves the abstract edges of this abstract automton.
void refine(std::vector< uint_fast64_t > const &predicates)
Refines the abstract automaton with the given predicates.
storm::dd::Bdd< DdType > getInitialLocationsBdd() const
Retrieves a BDD that encodes all initial locations of this abstract automaton.
std::map< storm::expressions::Variable, storm::expressions::Expression > getVariableUpdates(uint64_t player1Choice, uint64_t auxiliaryChoice) const
Retrieves a mapping from variables to expressions that define their updates wrt.
storm::expressions::Variable const & getLocationExpressionVariable() const
Retrieves the expression variable that represents the location of this automaton.
uint64_t getNumberOfLocations() const
Retrieves the number of locations.
std::vector< Edge > & getEdges()
Retrieves the edges of the automaton.
This class represents the settings for the abstraction procedures.
#define STORM_LOG_TRACE(message)
storm::dd::Bdd< DdType > states
storm::dd::Bdd< DdType > transitions