Initial opendaylight infrastructure commit!!
[controller.git] / third-party / net.sf.jung2 / src / main / java / edu / uci / ics / jung / algorithms / blockmodel / VertexPartition.java
diff --git a/third-party/net.sf.jung2/src/main/java/edu/uci/ics/jung/algorithms/blockmodel/VertexPartition.java b/third-party/net.sf.jung2/src/main/java/edu/uci/ics/jung/algorithms/blockmodel/VertexPartition.java
new file mode 100644 (file)
index 0000000..b5ec583
--- /dev/null
@@ -0,0 +1,131 @@
+/*
+ * Copyright (c) 2003, the JUNG Project and the Regents of the University 
+ * of California
+ * All rights reserved.
+ *
+ * This software is open-source under the BSD license; see either
+ * "license.txt" or
+ * http://jung.sourceforge.net/license.txt for a description.
+ */
+/*
+ * Created on Feb 3, 2004
+ */
+package edu.uci.ics.jung.algorithms.blockmodel;
+
+import java.util.*;
+
+import edu.uci.ics.jung.graph.Graph;
+
+
+/**
+ * Maintains information about a vertex partition of a graph.
+ * This can be built from a map from vertices to vertex sets 
+ * or from a collection of (disjoint) vertex sets,
+ * such as those created by various clustering methods.
+ */
+public class VertexPartition<V,E> 
+{
+       private Map<V,Set<V>> vertex_partition_map;
+       private Collection<Set<V>> vertex_sets;
+       private Graph<V,E> graph;
+       
+       /**
+        * Creates an instance based on the specified graph and mapping from vertices
+        * to vertex sets, and generates a set of partitions based on this mapping.
+        * @param g the graph over which the vertex partition is defined
+        * @param partition_map the mapping from vertices to vertex sets (partitions)
+        */
+       public VertexPartition(Graph<V,E> g, Map<V, Set<V>> partition_map) 
+       {
+               this.vertex_partition_map = Collections.unmodifiableMap(partition_map);
+               this.graph = g;
+       }
+
+       /**
+     * Creates an instance based on the specified graph, vertex-set mapping, 
+     * and set of disjoint vertex sets.  The vertex-set mapping and vertex 
+     * partitions must be consistent; that is, the mapping must reflect the 
+     * division of vertices into partitions, and each vertex must appear in 
+     * exactly one partition.
+     * @param g the graph over which the vertex partition is defined
+     * @param partition_map the mapping from vertices to vertex sets (partitions)
+        * @param vertex_sets the set of disjoint vertex sets 
+        */
+    public VertexPartition(Graph<V,E> g, Map<V, Set<V>> partition_map, 
+               Collection<Set<V>> vertex_sets) 
+    {
+        this.vertex_partition_map = Collections.unmodifiableMap(partition_map);
+        this.vertex_sets = vertex_sets;
+        this.graph = g;
+    }
+
+    /**
+     * Creates an instance based on the specified graph and set of disjoint vertex sets, 
+     * and generates a vertex-to-partition map based on these sets.
+     * @param g the graph over which the vertex partition is defined
+     * @param vertex_sets the set of disjoint vertex sets
+     */
+    public VertexPartition(Graph<V,E> g, Collection<Set<V>> vertex_sets)
+    {
+        this.vertex_sets = vertex_sets;
+        this.graph = g;
+    }
+       
+    /**
+     * Returns the graph on which the partition is defined.
+     * @return the graph on which the partition is defined
+     */
+       public Graph<V,E> getGraph() 
+       {
+               return graph;
+       }
+
+       /**
+        * Returns a map from each vertex in the input graph to its partition.
+        * This map is generated if it does not already exist.
+        * @return a map from each vertex in the input graph to a vertex set
+        */
+       public Map<V,Set<V>> getVertexToPartitionMap() 
+       {
+               if (vertex_partition_map == null)
+               {
+               this.vertex_partition_map = new HashMap<V, Set<V>>();
+               for (Set<V> set : this.vertex_sets)
+                   for (V v : set)
+                       this.vertex_partition_map.put(v, set);
+               }
+               return vertex_partition_map;
+       }
+       
+       /**
+        * Returns a collection of vertex sets, where each vertex in the 
+        * input graph is in exactly one set.
+        * This collection is generated based on the vertex-to-partition map 
+        * if it does not already exist.
+        * @return a collection of vertex sets such that each vertex in the 
+        * instance's graph is in exactly one set
+        */
+       public Collection<Set<V>> getVertexPartitions() 
+       {
+               if (vertex_sets == null)
+               {
+                       this.vertex_sets = new HashSet<Set<V>>();
+                       this.vertex_sets.addAll(vertex_partition_map.values());
+               }
+           return vertex_sets;
+       }
+
+       /**
+        * Returns the number of partitions.
+        */
+       public int numPartitions() 
+       {
+               return vertex_sets.size();
+       }
+       
+       @Override
+       public String toString() 
+       {
+               return "Partitions: " + vertex_partition_map;
+       }
+}