protected void addEdge(int x, int y) { // we only have to track the inverse edge. predecessors.add(y, x); }
@Override public void removeIncomingEdges(T node) throws IllegalArgumentException { final int number = nodeManager.getNumber(node); if (number < 0) { throw new IllegalArgumentException("node not in graph: " + node); } IntSet pred = predecessors.getRelated(number); if (pred != null) { pred.foreach(x -> { successors.remove(x, number); if (successors.getRelatedCount(x) == 0) { hasSuccessor.clear(x); } }); } predecessors.removeAll(number); }
/** * This is slow. Fix it. */ public static <T> boolean isAcyclic(NumberedGraph<T> G, T root) { IBinaryNaturalRelation r = computeBackEdges(G, root); Iterator<IntPair> it = r.iterator(); return !it.hasNext(); }
private static IntSet getDomain(IBinaryNaturalRelation r) { MutableIntSet result = MutableSparseIntSet.makeEmpty(); int maxKeyValue = r.maxKeyValue(); for (int i = 0; i <= maxKeyValue; i++) { if (r.getRelated(i) != null) { result.add(i); } } return result; }
@Override public void removeOutgoingEdges(T node) throws IllegalArgumentException { final int number = nodeManager.getNumber(node); if (number < 0) { throw new IllegalArgumentException("node not in graph: " + node); } IntSet succ = successors.getRelated(number); if (succ != null) { succ.foreach(x -> predecessors.remove(x, number)); } successors.removeAll(number); hasSuccessor.clear(number); }
/** * @return set of d2 s.t. d1 -> d2 is a path edge for node n */ private IntSet getReachableFast(int n, int d1) { IBinaryNaturalRelation R = altPaths.get(d1); if (R != null) { return R.getRelated(n); } return null; }
@Test public void testBinaryIntegerRelation() { byte[] impl = new byte[] { BasicNaturalRelation.SIMPLE, BasicNaturalRelation.TWO_LEVEL, BasicNaturalRelation.SIMPLE }; IBinaryNaturalRelation R = new BasicNaturalRelation(impl, BasicNaturalRelation.TWO_LEVEL); R.add(3, 5); R.add(3, 7); R.add(3, 9); R.add(3, 11); R.add(5, 1); int count = 0; for (IntPair intPair : R) { IntSet x = R.getRelated(3); Assert.assertTrue(x.size() == 4); x = R.getRelated(5); Assert.assertTrue(x.size() == 1); R.remove(5, 1); x = R.getRelated(5); Assert.assertTrue(x == null); R.add(2, 1); R.add(2, 2); R.remove(2, 1); x = R.getRelated(2); Assert.assertTrue(x.size() == 1); R.removeAll(3); x = R.getRelated(3); Assert.assertTrue(x == null);
@Override public boolean hasEdge(T src, T dst) { int x = nodeManager.getNumber(src); int y = nodeManager.getNumber(dst); if (x < 0 || y < 0) { return false; } return successors.contains(x, y); }
@Override public void removeEdge(T src, T dst) throws IllegalArgumentException { final int srcNumber = nodeManager.getNumber(src); final int dstNumber = nodeManager.getNumber(dst); if (srcNumber < 0) { throw new IllegalArgumentException("src not in graph: " + src); } if (dstNumber < 0) { throw new IllegalArgumentException("dst not in graph: " + dst); } successors.remove(srcNumber, dstNumber); if (successors.getRelatedCount(srcNumber) == 0) { hasSuccessor.clear(srcNumber); } predecessors.remove(dstNumber, srcNumber); }
public int getSuccNodeCount(int number) { return successors.getRelatedCount(number); }
@Override public void removeEdge(CGNode src, CGNode dst) { int x = getNumber(src); int y = getNumber(dst); predecessors.remove(y, x); }
int d2 = it.next(); IBinaryNaturalRelation R = contents.next(); if (R != null && R.anyRelated(n)) { result.add(d2);
/** * @return set of d2 s.t. d1 -> d2 is a path edge for node n */ private IntSet getReachableFast(int n, int d1) { IBinaryNaturalRelation R = altPaths.get(d1); if (R != null) { return R.getRelated(n); } return null; }
@Override public void removeOutgoingEdges(T node) throws IllegalArgumentException { final int number = nodeManager.getNumber(node); if (number < 0) { throw new IllegalArgumentException("node not in graph: " + node); } IntSet succ = successors.getRelated(number); if (succ != null) { succ.foreach(x -> predecessors.remove(x, number)); } successors.removeAll(number); hasSuccessor.clear(number); }
@Override public boolean hasEdge(T src, T dst) { int x = nodeManager.getNumber(src); int y = nodeManager.getNumber(dst); if (x < 0 || y < 0) { return false; } return successors.contains(x, y); }
@Override public void removeEdge(T src, T dst) throws IllegalArgumentException { final int srcNumber = nodeManager.getNumber(src); final int dstNumber = nodeManager.getNumber(dst); if (srcNumber < 0) { throw new IllegalArgumentException("src not in graph: " + src); } if (dstNumber < 0) { throw new IllegalArgumentException("dst not in graph: " + dst); } successors.remove(srcNumber, dstNumber); if (successors.getRelatedCount(srcNumber) == 0) { hasSuccessor.clear(srcNumber); } predecessors.remove(dstNumber, srcNumber); }
public int getSuccNodeCount(int number) { return successors.getRelatedCount(number); }
@Override public void removeEdge(CGNode src, CGNode dst) { int x = getNumber(src); int y = getNumber(dst); predecessors.remove(y, x); }
private static IntSet getDomain(IBinaryNaturalRelation r) { MutableIntSet result = MutableSparseIntSet.makeEmpty(); int maxKeyValue = r.maxKeyValue(); for (int i = 0; i <= maxKeyValue; i++) { if (r.getRelated(i) != null) { result.add(i); } } return result; }
int d2 = it.next(); IBinaryNaturalRelation R = contents.next(); if (R != null && R.anyRelated(n)) { result.add(d2);