private void markExistingDirectionalLabels(Graph g, int prev, BitSet visited, Map<Edge, Edge> replacement, BitSet dbAtoms, int u) { visited.set(u); final int d = g.degree(u); for (int j = 0; j < d; ++j) { final Edge e = g.edgeAt(u, j); int v = e.other(u); if (v == prev) continue; Edge f = replacement.get(e); if (f == null) { replacement.put(e, e); if (!visited.get(v)) { if (dbAtoms.get(v)) markExistingDirectionalLabels(g, u, visited, replacement, dbAtoms, v); } } } } }
private void invertExistingDirectionalLabels(Graph g, int prev, BitSet visited, Map<Edge, Edge> replacement, BitSet dbAtoms, int u) { visited.set(u); final int d = g.degree(u); for (int j = 0; j < d; ++j) { final Edge e = g.edgeAt(u, j); int v = e.other(u); if (v == prev) continue; Edge f = replacement.get(e); if (f == null) { replacement.put(e, e.inverse()); if (!visited.get(v)) { if (dbAtoms.get(v)) invertExistingDirectionalLabels(g, u, visited, replacement, dbAtoms, v); } } } }
private boolean hasAdjDirectionalLabels(Graph g, int u) { final int d = g.degree(u); for (int j = 0; j < d; ++j) { final Edge f = g.edgeAt(u, j); if (f.bond().directional()) return true; } return false; }
boolean safeToClean(Graph g, int v, Map<Edge,Edge> replacements) { final int d = g.degree(v); for (int j = 0; j < d; ++j) { final Edge e = g.edgeAt(v, j); if (e.bond().order() == 2) { int w = e.other(v); final int d2 = g.degree(w); for (int j2 = 0; j2 < d2; ++j2) { final Edge f = g.edgeAt(w, j2); if (isDirectional(f, replacements)) return false; } } } return true; }
Edge firstDirectionalLabel(Graph g, int u) { Edge first = null; final int d = g.degree(u); for (int j = 0; j < d; ++j) { final Edge f = g.edgeAt(u, j); if (f.bond() == Bond.UP || f.bond() == Bond.DOWN) { if (first == null || ordering[f.other(u)] < ordering[first.other(u)]) first = f; } } return first; }
final int d = g.degree(u); for (int j = 0; j < d; ++j) { final Edge e = g.edgeAt(u, j); int v = e.other(u); if (v > u && e.bond() == Bond.DOUBLE) { final int d = g.degree(u); for (int j = 0; j < d; ++j) { final Edge f = g.edgeAt(u, j); if (isDirectional(f, replacements) && safeToClean(g, f.other(u), replacements)) { replacements.put(f, final Edge f = g.edgeAt(v, j); if (isDirectional(f, replacements) && safeToClean(g, f.other(v), replacements)) replacements.put(f, final int d = g.degree(u); for (int j = 0; j < d; ++j) { Edge e = g.edgeAt(u, j); if (e.other(u) < u) { Edge replacement = replacements.get(e);
@Override public Graph apply(Graph g) { Traversal traversal = new Traversal(g); Graph h = new Graph(g.order()); h.addFlags(g.getFlags(0xffffffff)); // copy atom/topology information this is unchanged for (int u = 0; u < g.order(); u++) { h.addAtom(g.atom(u)); h.addTopology(g.topologyOf(u)); } // change edges (only changed added to replacement) for (int u = 0; u < g.order(); u++) { final int d = g.degree(u); for (int j = 0; j < d; ++j) { final Edge e = g.edgeAt(u, j); if (e.other(u) > u) { if (traversal.acc.containsKey(e)) { h.addEdge(traversal.acc.get(e)); } else { h.addEdge(e); } } } } return h.sort(new Graph.CanOrderFirst()); }