View Javadoc
1   /*
2   * Copyright (c) 2003, The JUNG Authors 
3   *
4   * All rights reserved.
5   *
6   * This software is open-source under the BSD license; see either
7   * "license.txt" or
8   * https://github.com/jrtom/jung/blob/master/LICENSE for a description.
9   */
10  package edu.uci.ics.jung.algorithms.cluster;
11  
12  import java.util.ArrayList;
13  import java.util.HashSet;
14  import java.util.List;
15  import java.util.Set;
16  
17  import junit.framework.Test;
18  import junit.framework.TestCase;
19  import junit.framework.TestSuite;
20  import edu.uci.ics.jung.graph.Graph;
21  import edu.uci.ics.jung.graph.UndirectedGraph;
22  import edu.uci.ics.jung.graph.UndirectedSparseMultigraph;
23  
24  
25  /**
26   * @author Scott White
27   */
28  public class TestBicomponentClusterer extends TestCase {
29  	public static Test suite() {
30  		return new TestSuite(TestBicomponentClusterer.class);
31  	}
32  
33  	@Override
34    protected void setUp() {
35  
36  	}
37  
38      public void testExtract0() throws Exception
39      {
40          UndirectedGraph<String,Number> graph = new UndirectedSparseMultigraph<String,Number>();
41          String[] v = {"0"};
42          graph.addVertex(v[0]);
43          
44          List<Set<String>> c = new ArrayList<Set<String>>();
45          c.add(0, new HashSet<String>());
46          c.get(0).add(v[0]);
47          
48  //        Set[] c = {new HashSet<String>()};
49          
50  //        c[0].add(v[0]);
51       
52          testComponents(graph, v, c);
53      }
54  
55      public void testExtractEdge() throws Exception
56      {
57          UndirectedGraph<String,Number> graph = new UndirectedSparseMultigraph<String,Number>();
58          String[] v = {"0","1"}; 
59          graph.addVertex(v[0]);
60          graph.addVertex(v[1]);
61          graph.addEdge(0, v[0], v[1]);
62          
63          List<Set<String>> c = new ArrayList<Set<String>>();
64          c.add(0, new HashSet<String>());
65          c.get(0).add(v[0]);
66          c.get(0).add(v[1]);
67  
68  //        Set[] c = {new HashSet()};
69  //        
70  //        c[0].add(v[0]);
71  //        c[0].add(v[1]);
72       
73          testComponents(graph, v, c);
74      }
75      
76      public void testExtractV() throws Exception
77      {
78          UndirectedGraph<String,Number> graph = new UndirectedSparseMultigraph<String,Number>();
79          String[] v = new String[3];
80          for (int i = 0; i < 3; i++)
81          {
82              v[i] = ""+i;
83              graph.addVertex(v[i]);
84          }
85          graph.addEdge(0, v[0], v[1]);
86          graph.addEdge(1, v[0], v[2]);
87          
88          List<Set<String>> c = new ArrayList<Set<String>>();
89          c.add(0, new HashSet<String>());
90          c.add(1, new HashSet<String>());
91  
92          c.get(0).add(v[0]);
93          c.get(0).add(v[1]);
94  
95          c.get(1).add(v[0]);
96          c.get(1).add(v[2]);
97          
98  //        Set[] c = {new HashSet(), new HashSet()};
99  //              
100 //        c[0].add(v[0]);
101 //        c[0].add(v[1]);
102 //        
103 //        c[1].add(v[0]);
104 //        c[1].add(v[2]);
105            
106         testComponents(graph, v, c);
107     }
108     
109     public void createEdges(String[] v, int[][] edge_array, Graph<String,Number> g)
110     {
111         for (int k = 0; k < edge_array.length; k++)
112         {
113             int i = edge_array[k][0];
114             int j = edge_array[k][1];
115             String v1 = getVertex(v, i, g);
116             String v2 = getVertex(v, j, g);
117             
118             g.addEdge(k, v1, v2);
119         }
120     }
121     
122     public String getVertex(String[] v_array, int i, Graph<String,Number> g)
123     {
124         String v = v_array[i];
125         if (v == null)
126         {
127         	v_array[i] = Character.toString((char)('0'+i));
128             g.addVertex(v_array[i]);
129             v = v_array[i];
130         }
131         return v;
132     }
133     
134 	public void testExtract1() {
135         String[] v = new String[6];
136         int[][] edges1 = {{0,1}, {0,5}, {0,3}, {0,4}, {1,5}, {3,4}, {2,3}};
137         UndirectedGraph<String,Number> graph = new UndirectedSparseMultigraph<String,Number>();
138         createEdges(v, edges1, graph);
139         
140         List<Set<String>> c = new ArrayList<Set<String>>();
141         for (int i = 0; i < 3; i++)
142             c.add(i, new HashSet<String>());
143 
144         c.get(0).add(v[0]);
145         c.get(0).add(v[1]);
146         c.get(0).add(v[5]);
147 
148         c.get(1).add(v[0]);
149         c.get(1).add(v[3]);
150         c.get(1).add(v[4]);
151 
152         c.get(2).add(v[2]);
153         c.get(2).add(v[3]);
154 
155 //        Set[] c = new Set[3];
156 //        for (int i = 0; i < c.length; i++)
157 //            c[i] = new HashSet();
158 //        
159 //        c[0].add(v[0]);
160 //        c[0].add(v[1]);
161 //        c[0].add(v[5]);
162 //        
163 //        c[1].add(v[0]);
164 //        c[1].add(v[3]);
165 //        c[1].add(v[4]);
166 //        
167 //        c[2].add(v[2]);
168 //        c[2].add(v[3]);
169         
170         testComponents(graph, v, c);
171 	}
172     
173     public void testExtract2() {
174         String[] v = new String[9];
175         int[][] edges1 = {{0,2}, {0,4}, {1,0}, {2,1}, {3,0}, {4,3}, {5,3}, {6,7}, {6,8}, {8,7}};
176         UndirectedGraph<String,Number> graph = new UndirectedSparseMultigraph<String,Number>();
177         createEdges(v, edges1, graph);
178         
179         List<Set<String>> c = new ArrayList<Set<String>>();
180         for (int i = 0; i < 4; i++)
181             c.add(i, new HashSet<String>());
182 
183         c.get(0).add(v[0]);
184         c.get(0).add(v[1]);
185         c.get(0).add(v[2]);
186 
187         c.get(1).add(v[0]);
188         c.get(1).add(v[3]);
189         c.get(1).add(v[4]);
190 
191         c.get(2).add(v[5]);
192         c.get(2).add(v[3]);
193 
194         c.get(3).add(v[6]);
195         c.get(3).add(v[7]);
196         c.get(3).add(v[8]);
197 
198 //        Set[] c = new Set[4];
199 //        for (int i = 0; i < c.length; i++)
200 //            c[i] = new HashSet();
201 //        
202 //        c[0].add(v[0]);
203 //        c[0].add(v[1]);
204 //        c[0].add(v[2]);
205 //        
206 //        c[1].add(v[0]);
207 //        c[1].add(v[3]);
208 //        c[1].add(v[4]);
209 //        
210 //        c[2].add(v[5]);
211 //        c[2].add(v[3]);
212 //        
213 //        c[3].add(v[6]);
214 //        c[3].add(v[7]);
215 //        c[3].add(v[8]);
216 
217         testComponents(graph, v, c);
218 	}
219 
220     public void testComponents(UndirectedGraph<String,Number> graph, String[] vertices, List<Set<String>> c)
221     {
222         BicomponentClusterer<String,Number> finder = new BicomponentClusterer<String,Number>();
223         Set<Set<String>> bicomponents = finder.apply(graph);
224         
225         // check number of components
226         assertEquals(bicomponents.size(), c.size());
227 
228         // diagnostic; should be commented out for typical unit tests
229 //        for (int i = 0; i < bicomponents.size(); i++)
230 //        {
231 //            System.out.print("Component " + i + ": ");
232 //            Set bicomponent = bicomponents.getCluster(i);
233 //            for (Iterator iter = bicomponent.iterator(); iter.hasNext(); )
234 //            {
235 //                Vertex w = (Vertex)iter.next();
236 //                System.out.print(sl.getLabel(w) + " ");
237 //            }
238 //            System.out.println();
239 //        }
240 //        System.out.println();
241         
242         // make sure that each set in c[] is found in bicomponents
243         List<Set<String>> clusterList = new ArrayList<Set<String>>(bicomponents);
244         boolean found = false;
245         for (int i = 0; i < c.size(); i++)
246         {
247             for (int j = 0; j < bicomponents.size(); j++)
248                 if (clusterList.get(j).equals(c.get(i)))
249                 {
250                     found = true;
251                     break;
252                 }
253             assertTrue(found);
254         }
255         
256         // make sure that each vertex is represented in >=1 element of bicomponents 
257         Set<String> collapsedSet = new HashSet<String>();
258         for(Set<String> set : bicomponents) {
259         	collapsedSet.addAll(set);
260         }
261         for (String v : graph.getVertices())
262         {
263         	assertTrue(collapsedSet.contains(v));
264 //        	assertFalse(((LinkedHashSet)vset).get(v).isEmpty());
265         }
266     }
267     
268 }