code: public static <S, I, O> Optional<ADSNode<S, I, O>> compute(final MealyMachine<S, I, ?, O> automaton,
                                                                 final Alphabet<I> input,
                                                                 final Set<S> states) throws IllegalArgumentException {
  
          if (states.size() != 2) {
              throw new IllegalArgumentException("StateEquivalence can only distinguish 2 states");
          }
  
          final SplitTree<S, I, O> node = new SplitTree<>(states);
          node.getMapping().putAll(states.stream().collect(Collectors.toMap(Function.identity(), Function.identity())));
  
          return compute(automaton, input, node);
      }
docs: Computes a two-state ADS by using {@link Automata#findSeparatingWord(UniversalDeterministicAutomaton,
  UniversalDeterministicAutomaton, Collection)}.
  
  @param automaton
  the automaton for which an ADS should be computed
  @param input
  the input alphabet of the automaton
  @param states
  the set of states which should be distinguished by the computed ADS
  @param <S>
  (hypothesis) state type
  @param <I>
  input alphabet type
  @param <O>
  output alphabet type
  
  @return {@code Optional.empty()} if there exists no ADS that distinguishes the given states, a valid ADS
  otherwise.
  
  @throws IllegalArgumentException
  if passed anything other than two states.