Index: src/main/java/weka/clusterers/MetisMQIClusterer.java
===================================================================
--- src/main/java/weka/clusterers/MetisMQIClusterer.java	(revision 23)
+++ src/main/java/weka/clusterers/MetisMQIClusterer.java	(revision 24)
@@ -11,4 +11,5 @@
 import weka.clusterers.forMetisMQI.graph.Node;
 import weka.clusterers.forMetisMQI.graph.UndirectedGraph;
+import weka.clusterers.forMetisMQI.util.Configuration;
 import weka.core.Attribute;
 import weka.core.Capabilities;
@@ -23,8 +24,4 @@
 		OptionHandler {
 
-	private int numberOfClusters = 2;
-
-	private int sizeFinerGraph = 10;
-
 	/**
 	 * It maps each cluster with an integer id.
@@ -37,9 +34,6 @@
 	private Map<Node, Integer> nodeMap = null;
 	
-	/**
-	 * True if a random bisection must be used.
-	 */
-	private boolean randomBisection = false;
-
+
+	private Configuration conf = null;
 	/**
 	 * 
@@ -52,6 +46,5 @@
 		UndirectedGraph g = new UndirectedGraph();
 		g.loadFromInstance(data);
-		Set<Set<Node>> clusters = GraphAlgorithms.metisMqi(g, numberOfClusters,
-				sizeFinerGraph, randomBisection);
+		Set<Set<Node>> clusters = GraphAlgorithms.metisMqi(g);
 		setNumClusters(clusters.size());
 		int i = 0;
@@ -125,8 +118,16 @@
 		optionString = Utils.getOption('R', options);
 		setRandomBisection(Boolean.parseBoolean(optionString));
+		optionString = Utils.getOption('V', options);
+		if (optionString.length() != 0) {
+			setVerboseLevel(Integer.parseInt(optionString));
+		}
+	}
+
+	private void setVerboseLevel(int verboseLevel) {
+		Configuration.instance().setVerboseLevel(verboseLevel);
 	}
 
 	private void setRandomBisection(boolean b) {
-		this.randomBisection = b;
+		Configuration.instance().setRandomBisection(b);
 	}
 
@@ -146,13 +147,24 @@
 		result.add("" + getSizeFinerGraph());
 		result.add("-R");
+		result.add("" + getRandomBisection());
+		result.add("-V");
+		result.add("" + getVerboseLevel());
 		return (String[]) result.toArray(new String[result.size()]);
 	}
 
+	private boolean getRandomBisection() {
+		return Configuration.instance().isRandomBisection();
+	}
+
+	private int getVerboseLevel() {
+		return Configuration.instance().getVerboseLevel();
+	}
+
 	private int getSizeFinerGraph() {
-		return sizeFinerGraph;
+		return Configuration.instance().getSizeFinerGraph();
 	}
 
 	private int getNumClusters() {
-		return numberOfClusters;
+		return Configuration.instance().getNumberOfClusters();
 	}
 
@@ -170,13 +182,17 @@
 		result.addElement(new Option("\tsize of finer graph.\n"
 				+ "\t(default 10).", "S", 1, "-S <num>"));
+		result.addElement(new Option("\trandom bisection.\n"
+				+ "\t(default false).", "R", 1, "-V <boolean>"));
+		result.addElement(new Option("\tverbosity of graphical output.\n"
+				+ "\t(default 1).", "V", 1, "-V <num>"));
 		return result.elements();
 	}
 
 	private void setSizeFinerGraph(int size) {
-		this.sizeFinerGraph = size;
+		Configuration.instance().setSizeFinerGraph(size);
 	}
 
 	private void setNumClusters(int n) {
-		this.numberOfClusters = n;
+		Configuration.instance().setNumberOfClusters(n);
 	}
 
@@ -198,5 +214,5 @@
 	@Override
 	public int numberOfClusters() throws Exception {
-		return numberOfClusters;
+		return Configuration.instance().getNumberOfClusters();
 	}
 
Index: src/main/java/weka/clusterers/forMetisMQI/GraphAlgorithms.java
===================================================================
--- src/main/java/weka/clusterers/forMetisMQI/GraphAlgorithms.java	(revision 23)
+++ src/main/java/weka/clusterers/forMetisMQI/GraphAlgorithms.java	(revision 24)
@@ -11,4 +11,5 @@
 import weka.clusterers.forMetisMQI.graph.UndirectedGraph;
 import weka.clusterers.forMetisMQI.util.CoarserGraphElement;
+import weka.clusterers.forMetisMQI.util.Configuration;
 import weka.clusterers.forMetisMQI.util.GraphsFrame;
 import weka.clusterers.forMetisMQI.util.Util;
@@ -68,4 +69,8 @@
 		if (stack.size() > 0) {
 			partition = KL(stack.peek().getContracted());
+			if(Configuration.instance().getVerboseLevel() > 1) {
+				GraphsFrame.instance().addPanel(Util.panelContractedGraph(stack.peek()));
+				GraphsFrame.instance().addPanel(Util.panelContractedGraph(stack.peek(),partition.getSmallerSubgraph().createInducedSubgraph().getVertices()));
+			}
 			partition = Uncoarse.uncoarse(stack, partition);
 		}
@@ -81,25 +86,26 @@
 	 * @param sizeFinerGraph
 	 */
-	static public Set<Set<Node>> metisMqi(UndirectedGraph g, int numberOfCluster, int sizeFinerGraph, boolean randomBisection) {
-		GraphsFrame gf = new GraphsFrame("Prova");
+	static public Set<Set<Node>> metisMqi(UndirectedGraph g) {
+		int numberOfCluster = Configuration.instance().getNumberOfClusters();
+		boolean randomBisection = Configuration.instance().isRandomBisection();
+		int sizeFinerGraph = Configuration.instance().getSizeFinerGraph();
+		int verboseLevel = Configuration.instance().getVerboseLevel();
+		GraphsFrame gf = GraphsFrame.instance();
 		System.out.println("Vertex count: " + g.getVertexCount());
 		System.out.println("Edges count: " + g.getEdgeCount());
-		Iterator<Node> iNodes = g.getVertices().iterator();
-		int degreeCounter = 0;
-		while(iNodes.hasNext()) {
-			Node node = iNodes.next();
-			if(g.degree(node) == 1) {
-				degreeCounter++;
-			}
-		}
 		Set<Set<Node>> clusters = new HashSet<Set<Node>>();
 		UndirectedGraph gclone = g.clone();
-		gf.addPanel(Util.panelGraph(gclone));
 		for (int i = 0; i < numberOfCluster; i++) {
 			Bisection bisection = null;
+			if(verboseLevel > 1)
+				gf.addPanel(Util.panelGraph(g.clone()));
 			if(!randomBisection)
 				bisection = metis(g,sizeFinerGraph);
 			else
 				bisection = new Bisection(g);
+			
+			if(verboseLevel > 1)
+				gf.addPanel(Util.panelCluster(g.clone(),bisection.getSmallerSubgraph().createInducedSubgraph().getVertices()));
+			
 			System.out.print("Partizione iniziale: ");
 			System.out.print("V1: " + bisection.getSubgraph().getVertexCount());
@@ -127,5 +133,6 @@
 			}
 		}
-		gf.addPanel(Util.panelClusters(gclone, clusters));
+		if(verboseLevel > 0)
+			gf.addPanel(Util.panelClusters(gclone, clusters));
 		gf.setVisible(true);
 		return clusters;
Index: src/main/java/weka/clusterers/forMetisMQI/MQI.java
===================================================================
--- src/main/java/weka/clusterers/forMetisMQI/MQI.java	(revision 23)
+++ src/main/java/weka/clusterers/forMetisMQI/MQI.java	(revision 24)
@@ -19,4 +19,6 @@
 import edu.uci.ics.jung.graph.DirectedGraph;
 import edu.uci.ics.jung.graph.DirectedSparseGraph;
+import weka.clusterers.forMetisMQI.util.Configuration;
+import weka.clusterers.forMetisMQI.util.GraphsFrame;
 import weka.clusterers.forMetisMQI.util.Util;
 
@@ -199,5 +201,6 @@
 			}
 			alg.evaluate();
-//			Util.viewFlowGraph(directedGraph, edgeFlowMap);
+			if(Configuration.instance().getVerboseLevel() > 1)
+				GraphsFrame.instance().addPanel(Util.panelFlowGraph(directedGraph, edgeFlowMap));
 			System.out.println("MAX FLOW: " + alg.getMaxFlow() + " THRESHOLD: "
 					+ maxFlowThreshold);
@@ -210,4 +213,6 @@
 					bisection.getGraph(), cluster));
 //				System.out.println("REFINED BISECTION: " + bisection.toString());
+				if(Configuration.instance().getVerboseLevel() > 1)
+					GraphsFrame.instance().addPanel(Util.panelCluster(bisection.getGraph(), cluster));
 			} else
 				finished = true;
Index: src/main/java/weka/clusterers/forMetisMQI/util/Configuration.java
===================================================================
--- src/main/java/weka/clusterers/forMetisMQI/util/Configuration.java	(revision 24)
+++ src/main/java/weka/clusterers/forMetisMQI/util/Configuration.java	(revision 24)
@@ -0,0 +1,59 @@
+package weka.clusterers.forMetisMQI.util;
+
+public class Configuration {
+	
+	private boolean randomBisection = false;
+	
+	private int verboseLevel = 1;
+	
+	private int sizeFinerGraph = 100;
+	
+	private int numberOfClusters = 2;
+	
+	private static Configuration instance = null;
+	
+	private Configuration() {
+		
+	}
+	
+	public static Configuration instance() {
+		if(instance == null)
+			instance = new Configuration();
+		return instance;
+	}
+
+	public boolean isRandomBisection() {
+		return randomBisection;
+	}
+
+	public void setRandomBisection(boolean randomBisection) {
+		this.randomBisection = randomBisection;
+	}
+
+	public int getVerboseLevel() {
+		return verboseLevel;
+	}
+
+	public void setVerboseLevel(int verboseLevel) {
+		this.verboseLevel = verboseLevel;
+	}
+
+	public int getSizeFinerGraph() {
+		return sizeFinerGraph;
+	}
+
+	public void setSizeFinerGraph(int sizeFinerGraph) {
+		this.sizeFinerGraph = sizeFinerGraph;
+	}
+
+	public int getNumberOfClusters() {
+		return numberOfClusters;
+	}
+
+	public void setNumberOfClusters(int numberOfClusters) {
+		this.numberOfClusters = numberOfClusters;
+	}
+	
+	
+
+}
Index: src/main/java/weka/clusterers/forMetisMQI/util/ContractedVertexTransformer.java
===================================================================
--- src/main/java/weka/clusterers/forMetisMQI/util/ContractedVertexTransformer.java	(revision 24)
+++ src/main/java/weka/clusterers/forMetisMQI/util/ContractedVertexTransformer.java	(revision 24)
@@ -0,0 +1,43 @@
+package weka.clusterers.forMetisMQI.util;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.Map.Entry;
+
+import org.apache.commons.collections15.Transformer;
+
+import weka.clusterers.forMetisMQI.graph.Node;
+
+public class ContractedVertexTransformer implements Transformer<Node, String> {
+	Map<Node,Set<Node>> mapContracted = null;
+
+	public ContractedVertexTransformer(CoarserGraphElement cge) {
+		mapContracted = new HashMap<Node,Set<Node>>();
+		Iterator<Entry<Node,Node>> entryIterator = cge.getMap().entrySet().iterator();
+		while(entryIterator.hasNext()) {
+			Entry<Node, Node> entry = entryIterator.next();
+			Node prevNode = entry.getKey();
+			Node mappedNode = entry.getValue();
+			if(!mapContracted.containsKey(mappedNode))
+				mapContracted.put(mappedNode, new HashSet<Node>());
+			mapContracted.get(mappedNode).add(prevNode);
+		}
+	}
+	
+	public String transform(Node n) {
+		StringBuffer buffer = new StringBuffer();
+		Iterator<Node> contracted = mapContracted.get(n).iterator();
+		buffer.append("[");
+		while(contracted.hasNext()) {
+			buffer.append(contracted.next().getId() + ", ");
+		}
+		if(buffer.length() > 1)
+			buffer.setLength(buffer.length() - 2);
+		buffer.append("]");
+		return buffer.toString();
+	}
+
+}
Index: src/main/java/weka/clusterers/forMetisMQI/util/GraphsFrame.java
===================================================================
--- src/main/java/weka/clusterers/forMetisMQI/util/GraphsFrame.java	(revision 23)
+++ src/main/java/weka/clusterers/forMetisMQI/util/GraphsFrame.java	(revision 24)
@@ -16,4 +16,6 @@
 	 */
 	private static final long serialVersionUID = 1L;
+	
+	private static GraphsFrame instance = null;
 
 	private int numberOfPanels = 0;
@@ -23,8 +25,21 @@
 	private JButton nextButton = null;
 	private JButton prevButton = null;
+	
+	public static GraphsFrame instance() {
+		if(instance == null) {
+			instance = new GraphsFrame("Graphs Frame");
+		}
+		return instance;
+	}
+	
+	private GraphsFrame() {
+		
+	}
 
-	public GraphsFrame(String name) {
+	private GraphsFrame(String name) {
 		super(name);
 		setBounds(new Rectangle(800, 700));
+		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+
 
 		graphPanel = new JPanel();
Index: src/main/java/weka/clusterers/forMetisMQI/util/Util.java
===================================================================
--- src/main/java/weka/clusterers/forMetisMQI/util/Util.java	(revision 23)
+++ src/main/java/weka/clusterers/forMetisMQI/util/Util.java	(revision 24)
@@ -4,4 +4,5 @@
 import java.awt.Dimension;
 import java.awt.Paint;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -9,6 +10,6 @@
 import java.util.Map;
 import java.util.Set;
+import java.util.Map.Entry;
 
-import javax.swing.JFrame;
 import javax.swing.JPanel;
 
@@ -20,4 +21,5 @@
 import weka.clusterers.forMetisMQI.graph.UndirectedGraph;
 import edu.uci.ics.jung.algorithms.layout.FRLayout;
+import edu.uci.ics.jung.algorithms.layout.KKLayout;
 import edu.uci.ics.jung.algorithms.layout.Layout;
 import edu.uci.ics.jung.graph.Graph;
@@ -27,13 +29,18 @@
 public class Util {
 	
-	public static JPanel panelCluster(Graph<Node, Edge> g, Set<Node> cluster) {
+	public static JPanel panelCluster(Graph<Node, Edge> g, Collection<Node> cluster) {
+		Set<Node> setNodes = new HashSet<Node>();
+		setNodes.addAll(cluster);
 		Set<Set<Node>> clusters = new HashSet<Set<Node>>();
-		clusters.add(cluster);
+		clusters.add(setNodes);
 		return panelClusters(g, clusters);
 	}
 	
+	public static JPanel panelClusters(Graph<Node, Edge> g, Set<Set<Node>> clusters) {
+		return panelClusters(g,clusters,new ToStringLabeller<Node>());
+	}
 	
-	public static JPanel panelClusters(Graph<Node, Edge> g, Set<Set<Node>> clusters) {
-		Layout<Node, Edge> layout = new FRLayout<Node, Edge>(g);
+	public static JPanel panelClusters(Graph<Node, Edge> g, Set<Set<Node>> clusters, Transformer<Node,String> transformer) {
+		Layout<Node, Edge> layout = new KKLayout<Node, Edge>(g);
 		layout.setSize(new Dimension(800, 600)); // sets the initial size of the space
 		// The BasicVisualizationServer<V,E> is parameterized by the edge types
@@ -80,8 +87,5 @@
 		vv.setPreferredSize(new Dimension(800, 600)); // Sets the viewing area
 														// size
-		vv.getRenderContext().setVertexLabelTransformer(
-				new ToStringLabeller<Node>());
-		vv.getRenderContext().setEdgeLabelTransformer(
-				new ToStringLabeller<Edge>());
+		vv.getRenderContext().setVertexLabelTransformer(transformer);
 		vv.getRenderContext().setVertexFillPaintTransformer(vertexPaint);
 		return vv;
@@ -89,5 +93,5 @@
 	
 	public static JPanel panelGraph(Graph<Node, Edge> g){
-		Layout<Node, Edge> layout = new FRLayout<Node, Edge>(g);
+		Layout<Node, Edge> layout = new KKLayout<Node, Edge>(g);
 		layout.setSize(new Dimension(800,600)); // sets the initial size of the space
 		// The BasicVisualizationServer<V,E> is parameterized by the edge types
@@ -96,5 +100,10 @@
 		vv.setPreferredSize(new Dimension(800,600)); //Sets the viewing area size
 		vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller<Node>());
-		vv.getRenderContext().setEdgeLabelTransformer(new ToStringLabeller<Edge>());
+		vv.getRenderContext().setEdgeLabelTransformer(
+				new Transformer<Edge, String>() {
+					public String transform(Edge e) {
+						return "";
+					}
+				});
 		return vv;
 	}
@@ -120,4 +129,24 @@
 		return vv;
 	}
+	
+	static public JPanel panelContractedGraph(CoarserGraphElement cge, Collection<Node> cluster) {
+		Set<Node> setNodes = new HashSet<Node>();
+		setNodes.addAll(cluster);
+		Set<Set<Node>> clusters = new HashSet<Set<Node>>();
+		clusters.add(setNodes);
+		return panelClusters(cge.getContracted(), clusters, new ContractedVertexTransformer(cge));
+	}
+	
+	static public JPanel panelContractedGraph(CoarserGraphElement cge) {
+		Layout<Node, Edge> layout = new KKLayout<Node, Edge>(cge.getContracted());
+		layout.setSize(new Dimension(800,600)); // sets the initial size of the space
+		// The BasicVisualizationServer<V,E> is parameterized by the edge types
+		BasicVisualizationServer<Node,Edge> vv =
+		new BasicVisualizationServer<Node,Edge>(layout);
+		vv.setPreferredSize(new Dimension(800,600)); //Sets the viewing area size
+		vv.getRenderContext().setVertexLabelTransformer(new ContractedVertexTransformer(cge));
+		return vv;
+	}
+
 	
 	/**
