Exemple #1
0
  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;
  }