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    }