private Traversal(Graph g) { this.g = g; this.visited = new boolean[g.order()]; this.ordering = new int[g.order()]; BitSet dbAtoms = new BitSet(); for (int u = 0; u < g.order(); u++) { if (!visited[u]) dbAtoms.or(visit(u, u)); } Collections.sort(doubleBonds, new Comparator<Edge>() { @Override public int compare(Edge e, Edge f) { int u1 = e.either(); int v1 = e.other(u1); int u2 = f.either(); int v2 = f.other(u2); int min1 = Math.min(ordering[u1], ordering[v1]); int min2 = Math.min(ordering[u2], ordering[v2]); int cmp = min1 - min2; if (cmp != 0) return cmp; int max1 = Math.max(ordering[u1], ordering[v1]); int max2 = Math.max(ordering[u2], ordering[v2]); return max1 - max2; } }); for (Edge e : doubleBonds) { if (acc.containsKey(e)) continue; flip(g, e, dbAtoms); } }
private void flip(Graph g, Edge e, BitSet dbAtoms) { int u = e.either(); int v = e.other(u); if (ordering[u] < ordering[v]) { Edge first = firstDirectionalLabel(g, u); if (first != null) { flip(first, u, dbAtoms); } else { first = firstDirectionalLabel(g, v); flip(first, v, dbAtoms); } } else { Edge first = firstDirectionalLabel(g, v); if (first != null) { flip(first, v, dbAtoms); } else { first = firstDirectionalLabel(g, u); flip(first, u, dbAtoms); } } }