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  /*
11   * Created on Feb 3, 2004
12   */
13  package edu.uci.ics.jung.algorithms.blockmodel;
14  
15  import java.util.*;
16  
17  import edu.uci.ics.jung.graph.Graph;
18  
19  
20  /**
21   * Maintains information about a vertex partition of a graph.
22   * This can be built from a map from vertices to vertex sets 
23   * or from a collection of (disjoint) vertex sets,
24   * such as those created by various clustering methods.
25   */
26  public class VertexPartition<V,E> 
27  {
28  	private Map<V,Set<V>> vertex_partition_map;
29  	private Collection<Set<V>> vertex_sets;
30  	private Graph<V,E> graph;
31  	
32  	/**
33  	 * Creates an instance based on the specified graph and mapping from vertices
34  	 * to vertex sets, and generates a set of partitions based on this mapping.
35  	 * @param g the graph over which the vertex partition is defined
36  	 * @param partition_map the mapping from vertices to vertex sets (partitions)
37  	 */
38  	public VertexPartition(Graph<V,E> g, Map<V, Set<V>> partition_map) 
39  	{
40  		this.vertex_partition_map = Collections.unmodifiableMap(partition_map);
41  		this.graph = g;
42  	}
43  
44  	/**
45       * Creates an instance based on the specified graph, vertex-set mapping, 
46       * and set of disjoint vertex sets.  The vertex-set mapping and vertex 
47       * partitions must be consistent; that is, the mapping must reflect the 
48       * division of vertices into partitions, and each vertex must appear in 
49       * exactly one partition.
50       * @param g the graph over which the vertex partition is defined
51       * @param partition_map the mapping from vertices to vertex sets (partitions)
52  	 * @param vertex_sets the set of disjoint vertex sets 
53  	 */
54      public VertexPartition(Graph<V,E> g, Map<V, Set<V>> partition_map, 
55      		Collection<Set<V>> vertex_sets) 
56      {
57          this.vertex_partition_map = Collections.unmodifiableMap(partition_map);
58          this.vertex_sets = vertex_sets;
59          this.graph = g;
60      }
61  
62      /**
63       * Creates an instance based on the specified graph and set of disjoint vertex sets, 
64       * and generates a vertex-to-partition map based on these sets.
65       * @param g the graph over which the vertex partition is defined
66       * @param vertex_sets the set of disjoint vertex sets
67       */
68      public VertexPartition(Graph<V,E> g, Collection<Set<V>> vertex_sets)
69      {
70          this.vertex_sets = vertex_sets;
71          this.graph = g;
72      }
73  	
74      /**
75       * Returns the graph on which the partition is defined.
76       * @return the graph on which the partition is defined
77       */
78  	public Graph<V,E> getGraph() 
79  	{
80  		return graph;
81  	}
82  
83  	/**
84  	 * Returns a map from each vertex in the input graph to its partition.
85  	 * This map is generated if it does not already exist.
86  	 * @return a map from each vertex in the input graph to a vertex set
87  	 */
88  	public Map<V,Set<V>> getVertexToPartitionMap() 
89  	{
90  		if (vertex_partition_map == null)
91  		{
92  	        this.vertex_partition_map = new HashMap<V, Set<V>>();
93  	        for (Set<V> set : this.vertex_sets)
94  	            for (V v : set)
95  	                this.vertex_partition_map.put(v, set);
96  		}
97  		return vertex_partition_map;
98  	}
99  	
100 	/**
101 	 * Returns a collection of vertex sets, where each vertex in the 
102 	 * input graph is in exactly one set.
103 	 * This collection is generated based on the vertex-to-partition map 
104 	 * if it does not already exist.
105 	 * @return a collection of vertex sets such that each vertex in the 
106 	 * instance's graph is in exactly one set
107 	 */
108 	public Collection<Set<V>> getVertexPartitions() 
109 	{
110 		if (vertex_sets == null)
111 		{
112 			this.vertex_sets = new HashSet<Set<V>>();
113 			this.vertex_sets.addAll(vertex_partition_map.values());
114 		}
115 	    return vertex_sets;
116 	}
117 
118 	/**
119 	 * @return the number of partitions.
120 	 */
121 	public int numPartitions() 
122 	{
123 		return vertex_sets.size();
124 	}
125 	
126 	@Override
127   	public String toString() 
128 	{
129 		return "Partitions: " + vertex_partition_map;
130 	}
131 }