|
|
@ -639,7 +639,13 @@ namespace storm { |
|
|
|
template <storm::dd::DdType DdType, typename ValueType> |
|
|
|
BottomStateResult<DdType> EdgeAbstractor<DdType, ValueType>::getBottomStateTransitions(storm::dd::Bdd<DdType> const& reachableStates, uint_fast64_t numberOfPlayer2Variables, boost::optional<std::pair<storm::expressions::Variable, storm::expressions::Variable>> const& locationVariables) { |
|
|
|
// Compute the reachable states that have this edge enabled.
|
|
|
|
storm::dd::Bdd<DdType> reachableStatesWithEdge = (reachableStates && abstractGuard && this->getAbstractionInformation().encodeLocation(locationVariables.get().first, edge.get().getSourceLocationIndex())).existsAbstract(this->getAbstractionInformation().getSourceLocationVariables()); |
|
|
|
storm::dd::Bdd<DdType> reachableStatesWithEdge; |
|
|
|
if (locationVariables) { |
|
|
|
reachableStatesWithEdge = (reachableStates && abstractGuard && this->getAbstractionInformation().encodeLocation(locationVariables.get().first, edge.get().getSourceLocationIndex())).existsAbstract(this->getAbstractionInformation().getSourceLocationVariables()); |
|
|
|
} else { |
|
|
|
reachableStatesWithEdge = (reachableStates && abstractGuard).existsAbstract(this->getAbstractionInformation().getSourceLocationVariables()); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
STORM_LOG_TRACE("Computing bottom state transitions of edge with guard " << edge.get().getGuard()); |
|
|
|
BottomStateResult<DdType> result(this->getAbstractionInformation().getDdManager().getBddZero(), this->getAbstractionInformation().getDdManager().getBddZero()); |
|
|
@ -653,7 +659,11 @@ namespace storm { |
|
|
|
// Use the state abstractor to compute the set of abstract states that has this edge enabled but still
|
|
|
|
// has a transition to a bottom state.
|
|
|
|
bottomStateAbstractor.constrain(reachableStatesWithEdge); |
|
|
|
result.states = bottomStateAbstractor.getAbstractStates() && reachableStatesWithEdge && this->getAbstractionInformation().encodeLocation(locationVariables.get().first, edge.get().getSourceLocationIndex()); |
|
|
|
if (locationVariables) { |
|
|
|
result.states = bottomStateAbstractor.getAbstractStates() && reachableStatesWithEdge && this->getAbstractionInformation().encodeLocation(locationVariables.get().first, edge.get().getSourceLocationIndex()); |
|
|
|
} else { |
|
|
|
result.states = bottomStateAbstractor.getAbstractStates() && reachableStatesWithEdge; |
|
|
|
} |
|
|
|
|
|
|
|
// If the result is empty one time, we can skip the bottom state computation from now on.
|
|
|
|
if (result.states.isZero()) { |
|
|
|