/**
   * Performs a filter of the entries.
   *
   * @param context
   * @return a set whose each element is a set of entries that are coherent alltogether
   */
  private Set<GrammarEntries> filter(PolarityContext context) {
    if (logger.isDebugEnabled()) logger.debug("Polarity keys: " + context.getAllKeys());

    PolarityAutomaton automaton = new PolarityAutomaton();
    automaton.createAutomaton(context);

    if (logger.isDebugEnabled()) logger.debug("Automaton:\n" + automaton.toString());

    Set<GrammarEntries> ret = new HashSet<GrammarEntries>();
    for (PolarityPath path : automaton.getPathsToFinalStates(context)) {
      System.out.println("Path: " + path);
      ret.add(new GrammarEntries(path.collectEntries()));
    }

    return ret;
  }
  /**
   * Performs a filter of the entries.
   *
   * @param context
   * @return a set whose each element is a set of entries that are coherent alltogether
   */
  public Set<GrammarEntries> filter(PolarityContext context) {
    PolarityAutomaton automaton = new PolarityAutomaton();
    automaton.createAutomaton(context);
    // logger.fine("0-key automaton: " + automaton.size()+"\n"+automaton);
    // logger.fine("0-key automaton: " + automaton.size());

    for (PolarityKey key : context.getAllKeys()) {
      PolarityAutomaton newAutomaton = new PolarityAutomaton(key);
      newAutomaton.extendAutomaton(automaton, context);
      automaton = newAutomaton;
      // logger.fine(key+" automaton: " + automaton.size()+"\n"+automaton);
      // logger.fine(key + " automaton: " + automaton.size());
    }

    // System.out.println(automaton);

    Set<GrammarEntries> ret = new HashSet<GrammarEntries>();
    for (PolarityPath path : automaton.getPathsToFinalStates(context)) {
      // System.out.println("Path: " + path);
      ret.add(new GrammarEntries(path.collectEntries()));
    }

    return ret;
  }