001 /** 002 * CasesVisualization.java 003 * jCOLIBRI2 framework. 004 * @author Juan A. Recio-García. 005 * GAIA - Group for Artificial Intelligence Applications 006 * http://gaia.fdi.ucm.es 007 * 23/05/2007 008 */ 009 package jcolibri.extensions.visualization; 010 011 import java.util.ArrayList; 012 import java.util.Collection; 013 import java.util.Hashtable; 014 015 import jcolibri.cbrcore.CBRCase; 016 import jcolibri.extensions.classification.ClassificationSolution; 017 import jcolibri.method.retrieve.RetrievalResult; 018 import jcolibri.method.retrieve.NNretrieval.NNConfig; 019 import jcolibri.method.retrieve.NNretrieval.NNScoringMethod; 020 import es.csic.iiia.visualgraph.CBGraph; 021 import es.csic.iiia.visualgraph.CaseBaseVis; 022 import es.csic.iiia.visualgraph.InfoVisual; 023 024 /** 025 * Wrapper to the InfoVisual library develped by Josep Lluis Arcos (IIIA-CSIC) that visualizes cases. 026 * @author Juan A. Recio-Garcia 027 * @version 2.0 028 */ 029 public class CasesVisualization { 030 031 /** 032 * Visualizes a collection of cases using a given NN similarity configuration. 033 */ 034 public static void visualize(Collection<CBRCase> cases, NNConfig knnConfig) 035 { 036 CBGraph graph = new CBGraph(); 037 038 // First add all the nodes saving IDs in a table 039 Hashtable<CBRCase,Integer> case2id = new Hashtable<CBRCase,Integer>(); 040 for(CBRCase c : cases) 041 { 042 ClassificationSolution sol = (ClassificationSolution)c.getSolution(); 043 int id = graph.addCase(c.getID().toString(), sol.getClassification().toString()); 044 case2id.put(c, id); 045 } 046 047 // Now calculate edges distances 048 Collection<CBRCase> copy = new ArrayList<CBRCase>(cases); 049 050 //Compute total cycles 051 int total = cases.size() * (cases.size()-1) / 2; 052 jcolibri.util.ProgressController.init(CasesVisualization.class, "Computing distances", total); 053 054 for(CBRCase c : cases) 055 { 056 copy.remove(c); 057 Collection<RetrievalResult> result = NNScoringMethod.evaluateSimilarity(copy, c, knnConfig); 058 int currentcaseId = case2id.get(c); 059 for(RetrievalResult sim : result) 060 { 061 CBRCase otherCase = sim.get_case(); 062 int othercaseId = case2id.get(otherCase); 063 float distance = (float)(1-sim.getEval()); 064 graph.addDistance(currentcaseId, othercaseId, distance); 065 System.out.println("Distance: "+c.getID()+" <--> "+otherCase.getID()+": "+ distance); 066 jcolibri.util.ProgressController.step(CasesVisualization.class); 067 } 068 } 069 jcolibri.util.ProgressController.finish(CasesVisualization.class); 070 071 // Finally, visualize the data 072 new InfoVisual( new CaseBaseVis(graph), true, false); 073 } 074 }