| 
					
					
						
							
						
					
					
				 | 
				@ -775,8 +775,7 @@ namespace storm { | 
			
		
		
	
		
			
				 | 
				 | 
				        } | 
				 | 
				 | 
				        } | 
			
		
		
	
		
			
				 | 
				 | 
				         | 
				 | 
				 | 
				         | 
			
		
		
	
		
			
				 | 
				 | 
				        template<typename ValueType, typename StateType> | 
				 | 
				 | 
				        template<typename ValueType, typename StateType> | 
			
		
		
	
		
			
				 | 
				 | 
				        std::vector<Choice<ValueType>> JaniNextStateGenerator<ValueType, StateType>::expandSynchronizingEdgeCombination(AutomataEdgeSets const& edgeCombination, uint64_t outputActionIndex, CompressedState const& state, StateToIdCallback stateToIdCallback) { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				            std::vector<Choice<ValueType>> result; | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        void JaniNextStateGenerator<ValueType, StateType>::expandSynchronizingEdgeCombination(AutomataEdgeSets const& edgeCombination, uint64_t outputActionIndex, CompressedState const& state, StateToIdCallback stateToIdCallback, std::vector<Choice<ValueType>>& newChoices) { | 
			
		
		
	
		
			
				 | 
				 | 
				             | 
				 | 
				 | 
				             | 
			
		
		
	
		
			
				 | 
				 | 
				            if (this->options.isExplorationChecksSet()) { | 
				 | 
				 | 
				            if (this->options.isExplorationChecksSet()) { | 
			
		
		
	
		
			
				 | 
				 | 
				                // Check whether a global variable is written multiple times in any combination.
 | 
				 | 
				 | 
				                // Check whether a global variable is written multiple times in any combination.
 | 
			
		
		
	
	
		
			
				| 
					
						
							
						
					
					
						
							
						
					
					
				 | 
				@ -806,10 +805,10 @@ namespace storm { | 
			
		
		
	
		
			
				 | 
				 | 
				                // At this point, we applied all commands of the current command combination and newTargetStates
 | 
				 | 
				 | 
				                // At this point, we applied all commands of the current command combination and newTargetStates
 | 
			
		
		
	
		
			
				 | 
				 | 
				                // contains all target states and their respective probabilities. That means we are now ready to
 | 
				 | 
				 | 
				                // contains all target states and their respective probabilities. That means we are now ready to
 | 
			
		
		
	
		
			
				 | 
				 | 
				                // add the choice to the list of transitions.
 | 
				 | 
				 | 
				                // add the choice to the list of transitions.
 | 
			
		
		
	
		
			
				 | 
				 | 
				                result.emplace_back(outputActionIndex); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                newChoices.emplace_back(outputActionIndex); | 
			
		
		
	
		
			
				 | 
				 | 
				                 | 
				 | 
				 | 
				                 | 
			
		
		
	
		
			
				 | 
				 | 
				                // Now create the actual distribution.
 | 
				 | 
				 | 
				                // Now create the actual distribution.
 | 
			
		
		
	
		
			
				 | 
				 | 
				                Choice<ValueType>& choice = result.back(); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                Choice<ValueType>& choice = newChoices.back(); | 
			
		
		
	
		
			
				 | 
				 | 
				                 | 
				 | 
				 | 
				                 | 
			
		
		
	
		
			
				 | 
				 | 
				                // Add the edge indices if requested.
 | 
				 | 
				 | 
				                // Add the edge indices if requested.
 | 
			
		
		
	
		
			
				 | 
				 | 
				                if (this->getOptions().isBuildChoiceOriginsSet()) { | 
				 | 
				 | 
				                if (this->getOptions().isBuildChoiceOriginsSet()) { | 
			
		
		
	
	
		
			
				| 
					
						
							
						
					
					
						
							
						
					
					
				 | 
				@ -848,8 +847,6 @@ namespace storm { | 
			
		
		
	
		
			
				 | 
				 | 
				                 | 
				 | 
				 | 
				                 | 
			
		
		
	
		
			
				 | 
				 | 
				                done = !movedIterator; | 
				 | 
				 | 
				                done = !movedIterator; | 
			
		
		
	
		
			
				 | 
				 | 
				            } | 
				 | 
				 | 
				            } | 
			
		
		
	
		
			
				 | 
				 | 
				             | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				            return result; | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				        } | 
				 | 
				 | 
				        } | 
			
		
		
	
		
			
				 | 
				 | 
				         | 
				 | 
				 | 
				         | 
			
		
		
	
		
			
				 | 
				 | 
				        template<typename ValueType, typename StateType> | 
				 | 
				 | 
				        template<typename ValueType, typename StateType> | 
			
		
		
	
	
		
			
				| 
					
						
							
						
					
					
						
							
						
					
					
				 | 
				@ -876,13 +873,12 @@ namespace storm { | 
			
		
		
	
		
			
				 | 
				 | 
				                                continue; | 
				 | 
				 | 
				                                continue; | 
			
		
		
	
		
			
				 | 
				 | 
				                            } | 
				 | 
				 | 
				                            } | 
			
		
		
	
		
			
				 | 
				 | 
				                         | 
				 | 
				 | 
				                         | 
			
		
		
	
		
			
				 | 
				 | 
				                            Choice<ValueType> choice = expandNonSynchronizingEdge(*indexAndEdge.second, outputAndEdges.first ? outputAndEdges.first.get() : indexAndEdge.second->getActionIndex(), automatonIndex, state, stateToIdCallback); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                            result.push_back(expandNonSynchronizingEdge(*indexAndEdge.second, outputAndEdges.first ? outputAndEdges.first.get() : indexAndEdge.second->getActionIndex(), automatonIndex, state, stateToIdCallback)); | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				                            if (this->getOptions().isBuildChoiceOriginsSet()) { | 
				 | 
				 | 
				                            if (this->getOptions().isBuildChoiceOriginsSet()) { | 
			
		
		
	
		
			
				 | 
				 | 
				                                EdgeIndexSet edgeIndex { model.encodeAutomatonAndEdgeIndices(automatonIndex, indexAndEdge.first) }; | 
				 | 
				 | 
				                                EdgeIndexSet edgeIndex { model.encodeAutomatonAndEdgeIndices(automatonIndex, indexAndEdge.first) }; | 
			
		
		
	
		
			
				 | 
				 | 
				                                choice.addOriginData(boost::any(std::move(edgeIndex))); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                                result.back().addOriginData(boost::any(std::move(edgeIndex))); | 
			
		
		
	
		
			
				 | 
				 | 
				                            } | 
				 | 
				 | 
				                            } | 
			
		
		
	
		
			
				 | 
				 | 
				                            result.emplace_back(std::move(choice)); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                        } | 
				 | 
				 | 
				                        } | 
			
		
		
	
		
			
				 | 
				 | 
				                    } | 
				 | 
				 | 
				                    } | 
			
		
		
	
		
			
				 | 
				 | 
				                } else { | 
				 | 
				 | 
				                } else { | 
			
		
		
	
	
		
			
				| 
					
					
					
						
							
						
					
				 | 
				@ -893,9 +889,9 @@ namespace storm { | 
			
		
		
	
		
			
				 | 
				 | 
				                    uint64_t outputActionIndex = outputAndEdges.first.get(); | 
				 | 
				 | 
				                    uint64_t outputActionIndex = outputAndEdges.first.get(); | 
			
		
		
	
		
			
				 | 
				 | 
				                     | 
				 | 
				 | 
				                     | 
			
		
		
	
		
			
				 | 
				 | 
				                    bool productiveCombination = true; | 
				 | 
				 | 
				                    bool productiveCombination = true; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                    EdgeSetWithIndices enabledEdgesOfAutomaton; | 
			
		
		
	
		
			
				 | 
				 | 
				                    for (auto const& automatonAndEdges : outputAndEdges.second) { | 
				 | 
				 | 
				                    for (auto const& automatonAndEdges : outputAndEdges.second) { | 
			
		
		
	
		
			
				 | 
				 | 
				                        uint64_t automatonIndex = automatonAndEdges.first; | 
				 | 
				 | 
				                        uint64_t automatonIndex = automatonAndEdges.first; | 
			
		
		
	
		
			
				 | 
				 | 
				                        EdgeSetWithIndices enabledEdgesOfAutomaton; | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                         | 
				 | 
				 | 
				                         | 
			
		
		
	
		
			
				 | 
				 | 
				                        bool atLeastOneEdge = false; | 
				 | 
				 | 
				                        bool atLeastOneEdge = false; | 
			
		
		
	
		
			
				 | 
				 | 
				                        auto edgesIt = automatonAndEdges.second.find(locations[automatonIndex]); | 
				 | 
				 | 
				                        auto edgesIt = automatonAndEdges.second.find(locations[automatonIndex]); | 
			
		
		
	
	
		
			
				| 
					
					
					
						
							
						
					
				 | 
				@ -918,19 +914,18 @@ namespace storm { | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				                        // If there is no enabled edge of this automaton, the whole combination is not productive.
 | 
				 | 
				 | 
				                        // If there is no enabled edge of this automaton, the whole combination is not productive.
 | 
			
		
		
	
		
			
				 | 
				 | 
				                        if (!atLeastOneEdge) { | 
				 | 
				 | 
				                        if (!atLeastOneEdge) { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                            STORM_LOG_ASSERT(enabledEdgesOfAutomaton.empty(), "enabledEdgesOfAutomaton should be empty at this point."); | 
			
		
		
	
		
			
				 | 
				 | 
				                            productiveCombination = false; | 
				 | 
				 | 
				                            productiveCombination = false; | 
			
		
		
	
		
			
				 | 
				 | 
				                            break; | 
				 | 
				 | 
				                            break; | 
			
		
		
	
		
			
				 | 
				 | 
				                        } | 
				 | 
				 | 
				                        } | 
			
		
		
	
		
			
				 | 
				 | 
				                         | 
				 | 
				 | 
				                         | 
			
		
		
	
		
			
				 | 
				 | 
				                        automataEdgeSets.emplace_back(std::make_pair(automatonIndex, std::move(enabledEdgesOfAutomaton))); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                        automataEdgeSets.emplace_back(std::move(automatonIndex), std::move(enabledEdgesOfAutomaton)); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                        enabledEdgesOfAutomaton.clear(); | 
			
		
		
	
		
			
				 | 
				 | 
				                    } | 
				 | 
				 | 
				                    } | 
			
		
		
	
		
			
				 | 
				 | 
				                     | 
				 | 
				 | 
				                     | 
			
		
		
	
		
			
				 | 
				 | 
				                    if (productiveCombination) { | 
				 | 
				 | 
				                    if (productiveCombination) { | 
			
		
		
	
		
			
				 | 
				 | 
				                        std::vector<Choice<ValueType>> choices = expandSynchronizingEdgeCombination(automataEdgeSets, outputActionIndex, state, stateToIdCallback); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                         | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                        for (auto const& choice : choices) { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                            result.emplace_back(std::move(choice)); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                        } | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                        // insert choices in the result vector.
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                        expandSynchronizingEdgeCombination(automataEdgeSets, outputActionIndex, state, stateToIdCallback, result); | 
			
		
		
	
		
			
				 | 
				 | 
				                    } | 
				 | 
				 | 
				                    } | 
			
		
		
	
		
			
				 | 
				 | 
				                 } | 
				 | 
				 | 
				                 } | 
			
		
		
	
		
			
				 | 
				 | 
				            } | 
				 | 
				 | 
				            } | 
			
		
		
	
	
		
			
				| 
					
						
							
						
					
					
					
				 | 
				
  |