| 
					
					
						
							
						
					
					
				 | 
				@ -654,6 +654,40 @@ namespace storm { | 
			
		
		
	
		
			
				 | 
				 | 
				                    return ActionDd(guard, transitions * factor, transientEdgeAssignments, localNondeterminismVariables, variableToWritingFragment, illegalFragment); | 
				 | 
				 | 
				                    return ActionDd(guard, transitions * factor, transientEdgeAssignments, localNondeterminismVariables, variableToWritingFragment, illegalFragment); | 
			
		
		
	
		
			
				 | 
				 | 
				                } | 
				 | 
				 | 
				                } | 
			
		
		
	
		
			
				 | 
				 | 
				                 | 
				 | 
				 | 
				                 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                ActionDd add(ActionDd const& other) const { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                    storm::dd::Bdd<Type> newGuard = this->guard || other.guard; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                    storm::dd::Add<Type, ValueType> newTransitions = this->transitions + other.transitions; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                     | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                    // Join the transient edge assignments.
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                    std::map<storm::expressions::Variable, storm::dd::Add<Type, ValueType>> newTransientEdgeAssignments(this->transientEdgeAssignments); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                    for (auto const& entry : other.transientEdgeAssignments) { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                        auto it = newTransientEdgeAssignments.find(entry.first); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                        if (it == newTransientEdgeAssignments.end()) { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                            newTransientEdgeAssignments[entry.first] = entry.second; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                        } else { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                            it->second += entry.second; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                        } | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                    } | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                     | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                    std::pair<uint64_t, uint64_t> newLocalNondeterminismVariables = std::make_pair(std::min(this->localNondeterminismVariables.first, other.localNondeterminismVariables.first), std::max(this->localNondeterminismVariables.second, other.localNondeterminismVariables.second)); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                    // Join variable-to-writing-fragment maps.
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                    std::map<storm::expressions::Variable, storm::dd::Bdd<Type>> newVariableToWritingFragment(this->variableToWritingFragment); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                    for (auto const& entry : other.variableToWritingFragment) { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                        auto it = newVariableToWritingFragment.find(entry.first); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                        if (it == newVariableToWritingFragment.end()) { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                            newVariableToWritingFragment[entry.first] = entry.second; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                        } else { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                            it->second |= entry.second; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                        } | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                    } | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                     | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                    // Join illegal fragments.
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                    storm::dd::Bdd<Type> newIllegalFragment = this->illegalFragment || other.illegalFragment; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                     | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                    return ActionDd(newGuard, newTransitions, newTransientEdgeAssignments, newLocalNondeterminismVariables, newVariableToWritingFragment, newIllegalFragment); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                } | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				                bool isInputEnabled() const { | 
				 | 
				 | 
				                bool isInputEnabled() const { | 
			
		
		
	
		
			
				 | 
				 | 
				                    return inputEnabled; | 
				 | 
				 | 
				                    return inputEnabled; | 
			
		
		
	
		
			
				 | 
				 | 
				                } | 
				 | 
				 | 
				                } | 
			
		
		
	
	
		
			
				| 
					
						
							
						
					
					
						
							
						
					
					
				 | 
				@ -975,7 +1009,16 @@ namespace storm { | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				                // Finally, combine (potentially) multiple action DDs.
 | 
				 | 
				 | 
				                // Finally, combine (potentially) multiple action DDs.
 | 
			
		
		
	
		
			
				 | 
				 | 
				                for (auto const& actionDds : actions) { | 
				 | 
				 | 
				                for (auto const& actionDds : actions) { | 
			
		
		
	
		
			
				 | 
				 | 
				                    ActionDd combinedAction = actionDds.second.size() > 1 ? combineUnsynchronizedActions(actionDds.second) : actionDds.second.front(); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                    ActionDd combinedAction; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                    if (actionDds.first == silentMarkovianActionIdentification) { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                        // For the Markovian transitions, we can simply add the actions.
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                        combinedAction = actionDds.second.front(); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                        for (uint64_t i = 1; i < actionDds.second.size(); ++i) { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                            combinedAction = combinedAction.add(actionDds.second[i]); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                        } | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                    } else { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                        combinedAction = actionDds.second.size() > 1 ? combineUnsynchronizedActions(actionDds.second) : actionDds.second.front(); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                    } | 
			
		
		
	
		
			
				 | 
				 | 
				                    result.actions[actionDds.first] = combinedAction; | 
				 | 
				 | 
				                    result.actions[actionDds.first] = combinedAction; | 
			
		
		
	
		
			
				 | 
				 | 
				                    result.extendLocalNondeterminismVariables(combinedAction.getLocalNondeterminismVariables()); | 
				 | 
				 | 
				                    result.extendLocalNondeterminismVariables(combinedAction.getLocalNondeterminismVariables()); | 
			
		
		
	
		
			
				 | 
				 | 
				                } | 
				 | 
				 | 
				                } | 
			
		
		
	
	
		
			
				| 
					
						
							
						
					
					
						
							
						
					
					
				 | 
				@ -1333,7 +1376,7 @@ namespace storm { | 
			
		
		
	
		
			
				 | 
				 | 
				                    } else if (modelType == storm::jani::ModelType::MDP || modelType == storm::jani::ModelType::LTS) { | 
				 | 
				 | 
				                    } else if (modelType == storm::jani::ModelType::MDP || modelType == storm::jani::ModelType::LTS) { | 
			
		
		
	
		
			
				 | 
				 | 
				                        return combineEdgesToActionNondeterministic(edgeDds, localNondeterminismVariableOffset); | 
				 | 
				 | 
				                        return combineEdgesToActionNondeterministic(edgeDds, localNondeterminismVariableOffset); | 
			
		
		
	
		
			
				 | 
				 | 
				                    } else if (modelType == storm::jani::ModelType::MA) { | 
				 | 
				 | 
				                    } else if (modelType == storm::jani::ModelType::MA) { | 
			
		
		
	
		
			
				 | 
				 | 
				                        if (instantiation.isMarkovian()){ | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                        if (instantiation.isMarkovian()) { | 
			
		
		
	
		
			
				 | 
				 | 
				                            return combineEdgesToActionDeterministic(edgeDds); | 
				 | 
				 | 
				                            return combineEdgesToActionDeterministic(edgeDds); | 
			
		
		
	
		
			
				 | 
				 | 
				                        } else { | 
				 | 
				 | 
				                        } else { | 
			
		
		
	
		
			
				 | 
				 | 
				                            return combineEdgesToActionNondeterministic(edgeDds, localNondeterminismVariableOffset); | 
				 | 
				 | 
				                            return combineEdgesToActionNondeterministic(edgeDds, localNondeterminismVariableOffset); | 
			
		
		
	
	
		
			
				| 
					
						
							
						
					
					
					
				 | 
				
  |