private <T> Map<T, SemanticIndexRange> createSemanticIndex(EquivalencesDAG<T> dag) { DirectedGraph<T, DefaultEdge> namedDag = getNamedDAG(dag); // reverse the named dag so that we give smallest indexes to ? DirectedGraph<T, DefaultEdge> reversed = new EdgeReversedGraph<>(namedDag); LinkedList<T> roots = new LinkedList<>(); for (T n : reversed.vertexSet()) if ((reversed.incomingEdgesOf(n)).isEmpty()) roots.add(n); Map<T,SemanticIndexRange> ranges = new HashMap<>(); for (T root: roots) { // depth-first sort GraphIterator<T, DefaultEdge> orderIterator = new DepthFirstIterator<>(reversed, root); // add Listener to create the ranges orderIterator.addTraversalListener(new SemanticIndexer<T>(reversed, ranges)); // System.out.println("\nIndexing:"); while (orderIterator.hasNext()) orderIterator.next(); } return ranges; }