private Set<FiringSequence> getAllFiringSequencesRecursively( Marking marking, Set<Marking> visitedMarkings) throws PetriNetException { Set<FiringSequence> firingSequences = new HashSet<FiringSequence>(); Set<Transition> enabledTransitions = marking.getAllEnabledTransitions(); for (Transition transition : enabledTransitions) { Marking newMarking = marking.getMarkingAfterFiring(transition); if (visitedMarkings.contains(newMarking)) { throw new PetriNetException("There is a loop."); } visitedMarkings.add(newMarking); if (!newMarking.isEnabledByAnyTransition()) { // leaf marking FiringSequence firingSequence = new FiringSequence(); firingSequence.add(transition); firingSequences.add(firingSequence); } for (FiringSequence nextFiringSequence : getAllFiringSequencesRecursively(newMarking, visitedMarkings)) { FiringSequence firingSequence = new FiringSequence(); firingSequence.add(transition); firingSequence.addAll(nextFiringSequence); firingSequences.add(firingSequence); } visitedMarkings.remove(newMarking); } return firingSequences; }