@ -1325,9 +1325,10 @@ namespace storm {
STORM_LOG_WARN_COND ( ! destinationDds . back ( ) . transitions . isZero ( ) , " Destination does not have any effect. " ) ;
}
// Now that we have built the destinations, we always take the full guard.
guard = rangedGuard ;
storm : : dd : : Bdd < Type > sourceLocationBdd = this - > variables . manager - > getEncoding ( this - > variables . automatonToLocationDdVariableMap . at ( automaton . getName ( ) ) . first , edge . getSourceLocationIndex ( ) ) ;
guard = sourceLocationBdd & & rangedGuard ;
// Start by gathering all variables that were written in at least one destination.
std : : set < storm : : expressions : : Variable > globalVariablesInSomeDestination ;
@ -1361,8 +1362,8 @@ namespace storm {
}
// Add the source location and the guard.
storm : : dd : : Add < Type , ValueType > sourceLocationAndGuard = this - > variables . manager - > getEncoding ( this - > variables . a utomatonToLocationDdV ariableMap . at ( automaton . getName ( ) ) . first , e dge . getSourceLocationIndex ( ) ) . template to Add< ValueType > ( ) * guard . template toAdd < ValueType > ( ) ;
transitions * = sourceLocationAndGuar d;
storm : : dd : : Add < Type , ValueType > g uardAdd = guard . template toAdd < ValueType > ( ) ;
transitions * = guardAd d;
// If we multiply the ranges of global variables, make sure everything stays within its bounds.
if ( ! globalVariablesInSomeDestination . empty ( ) ) {
@ -1381,8 +1382,8 @@ namespace storm {
// Finally treat the transient assignments.
std : : map < storm : : expressions : : Variable , storm : : dd : : Add < Type , ValueType > > transientEdgeAssignments ;
if ( ! this - > transientVariables . empty ( ) ) {
performTransientAssignments ( edge . getAssignments ( ) . getTransientAssignments ( ) , [ this , & transientEdgeAssignments , & sourceLocationAndGuar d, & exitRates ] ( storm : : jani : : Assignment const & assignment ) {
auto newTransientEdgeAssignments = sourceLocationAndGuar d * this - > variables . rowExpressionAdapter - > translateExpression ( assignment . getAssignedExpression ( ) ) ;
performTransientAssignments ( edge . getAssignments ( ) . getTransientAssignments ( ) , [ this , & transientEdgeAssignments , & guardAd d, & exitRates ] ( storm : : jani : : Assignment const & assignment ) {
auto newTransientEdgeAssignments = guardAd d * this - > variables . rowExpressionAdapter - > translateExpression ( assignment . getAssignedExpression ( ) ) ;
if ( exitRates ) {
newTransientEdgeAssignments * = exitRates . get ( ) ;
}
@ -1390,7 +1391,7 @@ namespace storm {
} ) ;
}
return EdgeDd ( isMarkovian , guard , guard . template toAdd < ValueType > ( ) * transitions , transientEdgeAssignments , globalVariablesInSomeDestination ) ;
return EdgeDd ( isMarkovian , guard , transitions , transientEdgeAssignments , globalVariablesInSomeDestination ) ;
} else {
return EdgeDd ( false , rangedGuard , rangedGuard . template toAdd < ValueType > ( ) , std : : map < storm : : expressions : : Variable , storm : : dd : : Add < Type , ValueType > > ( ) , std : : set < storm : : expressions : : Variable > ( ) ) ;
}
@ -1516,7 +1517,7 @@ namespace storm {
// Check for overlapping guards.
overlappingGuards = ! ( edgeDd . guard & & allGuards ) . isZero ( ) ;
// Issue a warning if there are overlapping guards in a DTMC.
STORM_LOG_WARN_COND ( ! overlappingGuards | | this - > model . getModelType ( ) = = storm : : jani : : ModelType : : CTMC | | this - > model . getModelType ( ) = = storm : : jani : : ModelType : : MA , " Guard of an edge in a DTMC overlaps with previous guards. " ) ;