code: public static <S, I, O> ADTNode<S, I, O> buildFromADS(final ADSNode<S, I, O> node) {
  
          if (node.isLeaf()) {
              return new ADTLeafNode<>(null, node.getHypothesisState());
          }
  
          final ADTNode<S, I, O> result = new ADTSymbolNode<>(null, node.getSymbol());
  
          for (Map.Entry<O, ADSNode<S, I, O>> entry : node.getChildren().entrySet()) {
              final O adsOutput = entry.getKey();
              final ADSNode<S, I, O> adsNode = entry.getValue();
  
              final ADTNode<S, I, O> newChild = buildFromADS(adsNode);
              newChild.setParent(result);
              result.getChildren().put(adsOutput, newChild);
          }
  
          return result;
      }
docs: Utility method that wraps a ADS of type {@link ADSNode} into the equivalent ADS of type {@link ADTNode}.
  
  @param node
  the root node of the ADS
  @param <S>
  (hypothesis) state type
  @param <I>
  input alphabet type
  @param <O>
  output alphabet type
  
  @return an equivalent ADS using the {@link ADTNode} interface