public StrongConnection(DigraphIteration digraph, CollectionFactory componentFactory) { this.digraph = digraph; this.componentFactory = componentFactory; filteredDigraph = new FilterIteration(digraph, new NotSeenPredicate(), GraphUtils.TRUE_PREDICATE); reverseDigraph = new FilterIteration(new ReversedIteration(digraph), reverseDFSFilter, GraphUtils.TRUE_PREDICATE); vertexIterator = filteredDigraph.vertexIterator(); runDirectDFS(); } public boolean hasNext() {
public ArcIterator outgoingIterator(Object vertex) { if (!containsVertex(vertex)) return ArcIterator.EMPTY_ITERATOR; return new OutgoingArcIterator(vertex); } private class OutgoingArcIterator implements ArcIterator {
public ArcIterator incomingIterator(Object vertex) { if (!containsVertex(vertex)) return ArcIterator.EMPTY_ITERATOR; return new IncomingArcIterator(vertex); } private class IncomingArcIterator implements ArcIterator {
public static Digraph merge(Digraph destination,DigraphIteration graphToMerge) { for (Iterator i = graphToMerge.vertexIterator(); i.hasNext();) { destination.addVertex(i.next()); } for (ArcIterator i = graphToMerge.arcIterator(); i.hasNext();) { Object arc = i.next(); Object origin = i.getOrigin(); Object dst = i.getDestination(); destination.putArc(origin, dst, arc); } return destination; }
private static Digraph createDigraph2() { Digraph digraph = new MapDigraph(MapDigraph.HASHMAP_FACTORY); String[] vertices = new String[] { "A", "B", "C", "D", "E", "F" }; digraph.addAllVertices(Arrays.asList(vertices)); digraph.putArc("A", "B", Boolean.TRUE); digraph.putArc("A", "F", Boolean.TRUE); digraph.putArc("B", "C", Boolean.TRUE); digraph.putArc("F", "D", Boolean.TRUE); digraph.putArc("C", "D", Boolean.TRUE); digraph.putArc("E", "D", Boolean.TRUE); return digraph; }
public Object getOrigin() { return transformOrigin(((ArcIterator)getIterator()).getOrigin()); }
public static Map shiftLevelsDown(Map vertexLevelMap, Digraph digraph) { for (Iterator i = digraph.vertexIterator(); i.hasNext(); ) { Object rootCandidate = i.next(); if (digraph.incomingSize(rootCandidate) == 0) shiftLevelsDown(vertexLevelMap, digraph, rootCandidate); } return vertexLevelMap; }
public static boolean hasLoops(Digraph digraph) { return (traverse(new LoopSearch(digraph)) != 0); } public static boolean isAcyclic(Digraph digraph) {
public ArcIterator arcIterator() { return new FilterArcIterator(digraph.arcIterator(), acceptVertex, acceptVertex, acceptArc); } public ArcIterator outgoingIterator(Object vertex) {
public ArcIterator arcIterator() { return new ReversedArcIterator(wrappedIteration.arcIterator()); } public ArcIterator outgoingIterator(Object vertex) {
public ArcIterator outgoingIterator(Object vertex) { return new ReversedArcIterator(wrappedIteration.incomingIterator(vertex)); } public ArcIterator incomingIterator(Object vertex) {
public ArcIterator incomingIterator(Object vertex) { return new ReversedArcIterator(wrappedIteration.outgoingIterator(vertex)); }
public static boolean isConnected(DigraphIteration digraph, Object firstVertex, int order) { Algorithm dfs = new DepthFirstSearch(digraph, firstVertex); return order == traverse(dfs); }
public static boolean isStronglyConnected(DigraphIteration digraph, Object firstVertex, int order) { return (isConnected(digraph, firstVertex, order) && isConnected(new ReversedIteration(digraph), firstVertex, order)); }
public InOutBreadthFirstSearch( DigraphIteration factory, Object firstVertex) { this.factory = factory; reset(firstVertex); }
public boolean hasNext() { if ( nextObjectSet ) { return true; } else { return setNextObject(); } } public Object next() {
public BreadthFirstSearch( DigraphIteration factory, Object firstVertex, Attribute level) { this.factory = factory; reset(firstVertex, level); }
public boolean evaluate(Object vertex) { return LoopSearch.this.digraph.hasArc(vertex, vertex); } });
public ArcIterator incomingIterator(Object vertex) { return digraph.incomingIterator(vertex); } }