fenfire-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[ff-cvs] fenfire/org/fenfire/util/lava Traversals.java T...


From: Tuukka Hastrup
Subject: [ff-cvs] fenfire/org/fenfire/util/lava Traversals.java T...
Date: Fri, 15 Aug 2003 20:11:31 -0400

CVSROOT:        /cvsroot/fenfire
Module name:    fenfire
Branch:         
Changes by:     Tuukka Hastrup <address@hidden> 03/08/15 20:11:30

Modified files:
        org/fenfire/util/lava: Traversals.java Traversals.test 

Log message:
        findComponents using DFS

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/fenfire/fenfire/org/fenfire/util/lava/Traversals.java.diff?tr1=1.2&tr2=1.3&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/fenfire/fenfire/org/fenfire/util/lava/Traversals.test.diff?tr1=1.1&tr2=1.2&r1=text&r2=text

Patches:
Index: fenfire/org/fenfire/util/lava/Traversals.java
diff -u fenfire/org/fenfire/util/lava/Traversals.java:1.2 
fenfire/org/fenfire/util/lava/Traversals.java:1.3
--- fenfire/org/fenfire/util/lava/Traversals.java:1.2   Fri Aug 15 19:04:03 2003
+++ fenfire/org/fenfire/util/lava/Traversals.java       Fri Aug 15 20:11:30 2003
@@ -1,3 +1,4 @@
+//(c): Tuukka Hastrup
 
 package org.fenfire.util.lava;
 
@@ -14,6 +15,13 @@
     static class CollisionException extends Exception {
     }
 
+    /** Return type for recurseDFS. 
+     */
+    static class DFSRet {
+       public Object representative;
+       public int degree;
+    }
+
     /** Returns an iterator of nodes directly connected to a given node
      *  along a given non-directional property.
      */
@@ -105,4 +113,57 @@
        }
     }
 
+    /** Finds components disconnected along a given non-directed property, 
+     *  and for each component returns the node of highest degree as a 
+     *  representative.
+     *  @return set of representatives, one for each component
+     */
+    public static Set findComponents(Object property, ConstGraph g) {
+       // XXX "Iterator nodes" could be a parameter
+       Iterator nodes = g.findN_XAA_Iter(); // FIXME doesn't find objects
+       Set visited = new HashSet();
+       Set components = new HashSet();
+       while(nodes.hasNext()) {
+           Object node = nodes.next();
+           if(!visited.contains(node)) { // If found a new component
+               visited.add(node);
+               components.add(recurseDFS(node, property, g, visited, 
+                                         new DFSRet()).representative);
+           }
+       }
+       return components;
+    }
+
+    /** Recurses depth-first search from a given node, and finds the node
+     *  of highest degree (with most connections).
+     *  @return an array: the first element is the node of highest degree
+     *                    the second element is the highest degree as Integer
+     */
+    static DFSRet recurseDFS(Object start, Object property, ConstGraph g, 
+                              Set visited, DFSRet ret) {
+       Object representative = null;
+       int representativeDegree = -1;
+       Iterator conns = findConnected_Iter(g, start, property);
+       int degree = 0;
+       while(conns.hasNext()) {
+           Object found = conns.next();
+           degree++;
+           if(!visited.contains(found)) {
+               visited.add(found);
+               ret = recurseDFS(found, property, g, visited, ret);
+               if(ret.degree > representativeDegree) {
+                   representativeDegree = ret.degree;
+                   representative = ret.representative;
+               }
+           }
+       }
+       if(representativeDegree > degree) {
+           ret.representative = representative;
+           ret.degree = representativeDegree;
+       } else {
+           ret.representative = start;
+           ret.degree = degree;
+       }
+       return ret;
+    }
 }
Index: fenfire/org/fenfire/util/lava/Traversals.test
diff -u fenfire/org/fenfire/util/lava/Traversals.test:1.1 
fenfire/org/fenfire/util/lava/Traversals.test:1.2
--- fenfire/org/fenfire/util/lava/Traversals.test:1.1   Fri Aug 15 17:49:50 2003
+++ fenfire/org/fenfire/util/lava/Traversals.test       Fri Aug 15 20:11:30 2003
@@ -49,3 +49,52 @@
 
     assert Traversals.isConnected(a, p, d, fen.constgraph)
     assert Traversals.isConnected(d, p, a, fen.constgraph)
+
+
+def testfindComponents():
+    fen = ff.test.fen.newFen()
+    p = ff.swamp.Nodes.N()
+    q = ff.swamp.Nodes.N()
+
+    a = ff.swamp.Nodes.N()
+    b = ff.swamp.Nodes.N()
+    c = ff.swamp.Nodes.N()
+    d = ff.swamp.Nodes.N()
+
+    # Introduce the nodes into graph
+    fen.graph.add(a,q,b)
+    fen.graph.add(c,q,d)
+
+    ## no XAA problem if all nodes are subjects
+    # fen.graph.add(b,q,c)
+    # fen.graph.add(d,q,a)
+
+    result = Traversals.findComponents(p, fen.constgraph)
+    nodes = fen.constgraph.findN_XAA_Iter()
+    print "XAA doesn't find objects:"
+    while nodes.hasNext():
+        print nodes.next()
+    print result
+    for x in a, b, c, d:          # all single nodes are components
+        assert result.contains(x)
+
+    fen.graph.add(a,p,b)
+
+    result = Traversals.findComponents(p, fen.constgraph)
+    assert result.contains(a) != result.contains(b) # Either is representative
+
+    fen.graph.add(a,p,c)
+
+    result = Traversals.findComponents(p, fen.constgraph)
+    assert result.contains(a)     # a has higher degree than b or c
+    assert not result.contains(b)
+    assert not result.contains(c)
+
+    fen.graph.add(c,p,b)
+    fen.graph.add(d,p,b)
+
+    result = Traversals.findComponents(p, fen.constgraph)
+    assert result.contains(b)         # b has highest degree
+    for x in a, c, d:
+        assert not result.contains(x)
+       




reply via email to

[Prev in Thread] Current Thread [Next in Thread]