1 public class DirectedEdgeGraph implements EdgeGraph {
3 // jjenista - we need this set to find all nodes in a graph
4 // (as hard a problem as keeping a reference to one node that
5 // is in the graph from which to do a traversal and find all
6 // nodes currently in the graph).
8 // Problem: when you add or remove one node, the obvious update
9 // is to add or remove it to this set as well. That is a conflict
10 // for concurrent add and remove ops that don't collide in terms of
11 // modifying the graph elements though.
13 // SOLUTION: the all-nodes set is invalid after node add/remove ops
14 // until you run discoverAllNodes(src)
15 protected HashSet nodes;
17 // only use when the nodes set is up-to-date
18 public DirectedEdgeGraph() { nodes = new HashSet(); }
19 public Iterator iterator() { return nodes.iterator(); }
20 public int getNumNodes() { return nodes.size(); }
21 public Node getRandom() { return (Node) nodes.iterator().next(); }
23 // make the node set up to date
24 public void discoverAllNodes( Node src ) {
26 Stack toVisit = new Stack();
30 while( !toVisit.isEmpty() ) {
31 EdgeGraphNode n =(EdgeGraphNode) toVisit.pop();
34 System.out.println( "Error: found a node actual in the graph but not marked!" );
38 for( Iterator itrInNei = n.getInNeighbors(); itrInNei.hasNext(); ) {
39 Node nNei = (Node) itrInNei.next();
41 System.out.println("NULLIN");
45 if( !nodes.contains( nNei ) ) {
50 for( Iterator itrOutNei = n.getOutNeighbors(); itrOutNei.hasNext(); ) {
51 Node nNei = (Node) itrOutNei.next();
53 System.out.println("NULLOUT");
56 if( !nodes.contains( nNei ) ) {
64 // these are the normal methods for truly adding and removing nodes
65 // from the graph, nodes know locally if they are in and out but they
66 // haven't been added or removed from the nodes set until ABOVE methods
67 public boolean addNode(Node n) {
68 boolean notInAlready = !n.inGraph;
73 public boolean removeNode(Node n) {
74 boolean wasIn = n.inGraph;
76 removeConnectingEdges((EdgeGraphNode) n);
80 public boolean containsNode(Node n) {
88 public boolean addEdge(Edge_d e) {
89 GraphEdge ge = (GraphEdge) e;
90 EdgeGraphNode src = ge.getSrc();
91 EdgeGraphNode dest = ge.getDest();
92 return src.addOutEdge(dest, ge) ? dest.addInEdge(src, ge) : false;
95 public Edge_d createEdge(Node src, Node dest, Object e) {
96 return new GraphEdge((EdgeGraphNode) src, (EdgeGraphNode) dest, e);
99 public Node getDest(Edge_d e) {
100 return ((GraphEdge) e).getDest();
103 public Edge_d getEdge(Node src, Node dest) {
104 return ((EdgeGraphNode) src).getOutEdge((EdgeGraphNode) dest);
107 public Iterator getInEdges(Node n) {
108 return ((EdgeGraphNode) n).getInEdges();
111 public Iterator getOutEdges(Node n) {
112 return ((EdgeGraphNode) n).getOutEdges();
115 public Node getSource(Edge_d e) {
116 return ((GraphEdge) e).src;
119 public boolean hasEdge(Edge_d e) {
120 GraphEdge ge = (GraphEdge) e;
121 return ge.getSrc().hasOutNeighbor(ge.getDest());
124 public boolean removeEdge(Edge_d e) {
125 GraphEdge ge = (GraphEdge) e;
126 EdgeGraphNode src = ge.getSrc();
127 EdgeGraphNode dest = ge.getDest();
128 return src.removeOutEdge(dest) ? dest.removeInEdge(src) : false;
131 public boolean addNeighbor(Node src, Node dest) {
132 throw new UnsupportedOperationException(
133 "addNeighbor not supported in EdgeGraphs. Use createEdge/addEdge instead");
136 public Node createNode(Object n) {
137 return new EdgeGraphNode(n);
140 public Iterator getInNeighbors(Node src) {
141 return ((EdgeGraphNode) src).getInNeighbors();
144 public int getInNeighborsSize(Node node) {
145 return ((EdgeGraphNode) node).inEdges.size();
148 public Iterator getOutNeighbors(Node src) {
149 return ((EdgeGraphNode) src).getOutNeighbors();
152 public int getOutNeighborsSize(Node node) {
153 return ((EdgeGraphNode)node).outEdges.size();
156 public boolean removeNeighbor(Node src, Node dest) {
157 EdgeGraphNode gsrc = (EdgeGraphNode) src;
158 EdgeGraphNode gdest = (EdgeGraphNode) dest;
159 return gsrc.removeOutEdge(gdest) ? gdest.removeInEdge(gsrc) : false;
162 public Object getEdgeData(Edge_d e) {
163 return ((GraphEdge) e).d;
166 public Object setEdgeData(Edge_d e, Object d) {
167 GraphEdge ge = (GraphEdge) e;
168 Object retval = ge.d;
173 public Object getNodeData(Node n) {
174 EdgeGraphNode egn = (EdgeGraphNode) n;
178 public boolean hasNeighbor(Node src, Node dest) {
179 EdgeGraphNode esrc = (EdgeGraphNode) src;
180 EdgeGraphNode edest = (EdgeGraphNode) dest;
181 return esrc.hasOutNeighbor(edest);
184 protected void removeConnectingEdges(EdgeGraphNode n) {
186 for (Iterator iterator1 = n.getOutNeighborsCopy(); iterator1.hasNext();) {
187 g = (EdgeGraphNode) iterator1.next();
188 removeNeighbor(n, g);
191 for (Iterator iterator2 = n.getInNeighborsCopy(); iterator2.hasNext(); ) {
192 g = (EdgeGraphNode) iterator2.next();
193 removeNeighbor(g, n);
198 public Object setNodeData(Node n, Object d) {
199 EdgeGraphNode egn = (EdgeGraphNode) n;
200 Object retval = egn.data;
205 public boolean isDirected() {