code: static <S, I, O> Optional<ADSNode<S, I, O>> compute(final MealyMachine<S, I, ?, O> automaton,
                                                          final Alphabet<I> input,
                                                          final SplitTree<S, I, O> node) throws IllegalArgumentException {
  
          if (node.getPartition().isEmpty()) {
              throw new IllegalArgumentException("Empty partitions should be handled by the specific algorithm");
          } else if (node.getPartition().size() == 1) {
  
              final S state = node.getPartition().iterator().next();
  
              if (!node.getMapping().containsKey(state)) {
                  throw new IllegalStateException();
              }
  
              final ADSNode<S, I, O> result = new ADSLeafNode<>(null, node.getMapping().get(state));
              return Optional.of(result);
          } else if (node.getPartition().size() == 2) {
              return StateEquivalence.compute(automaton, input, node);
          } else if (node.getPartition().size() == automaton.getStates().size()) {
              throw new IllegalArgumentException("Call LeeYannakakis directly");
          } else {
              return BacktrackingSearch.compute(automaton, input, node);
          }
      }
docs: See {@link #compute(MealyMachine, Alphabet, Set)}. Internal version that uses a {@link SplitTree} for state
  tracking.