code: public static <I> CompactDFA<I> complement(DFA<?, I> dfa, Alphabet<I> inputAlphabet) {
          return complement(dfa, inputAlphabet, new CompactDFA<>(inputAlphabet));
      }
docs: Calculates the complement (negation) of a DFA, and returns the result as a new DFA.
  <p>
  Note that unlike {@link MutableDFA#flipAcceptance()}, undefined transitions are treated as leading to a rejecting
  sink state (and are thus turned into an accepting sink).
  
  @param dfa
  the DFA to complement
  @param inputAlphabet
  the input alphabet
  
  @return a new DFA representing the complement of the specified DFA