001    package jcolibri.extensions.evaluation;
002    
003    import java.io.BufferedWriter;
004    import java.io.FileWriter;
005    import java.io.IOException;
006    import java.io.PrintWriter;
007    import java.util.HashMap;
008    import java.util.Set;
009    import java.util.Vector;
010    import java.util.Map.Entry;
011    
012    import jcolibri.cbrcore.CBRQuery;
013    import jcolibri.evaluation.EvaluationReport;
014    
015    import org.apache.commons.logging.LogFactory;
016    
017    public class DetailedEvaluationReport extends EvaluationReport 
018    {
019        /** Stores the query series info */
020        protected HashMap<String, HashMap<CBRQuery, Double>> queryData;
021    
022        
023        public DetailedEvaluationReport()
024        {   super();
025            queryData = new HashMap<String, HashMap<CBRQuery, Double>>();
026        }
027            
028        /**
029         * Gets the evaluation info identified by the label
030         * @param label Identifies the evaluation serie.
031         */
032        public HashMap<CBRQuery, Double> getQuerySeries(String label)
033        {   return queryData.get(label);
034        }
035        
036        /**
037         * Stes the evaluation info
038         * @param label Identifier of the info
039         * @param evaluation Evaluation result
040         */
041        public void setSeries(String label, HashMap<CBRQuery, Double> queryEvaluations)
042        {   queryData.put(label, queryEvaluations);
043        }
044        
045        /**
046         * Adds the given query and value to the series labelled by the given label.
047         * @param label the label whose series the query and value are being added to.
048         * @param query the query.
049         * @param value the query's value.
050         */
051        public void addDataToSeries(String label, CBRQuery query, Double value)
052        {   HashMap<CBRQuery, Double> queries = queryData.get(label);
053            if(queries == null)
054            {       queries = new HashMap<CBRQuery, Double>();
055            }
056            queries.put(query, value);
057            queryData.put(label, queries);
058        }
059        
060        /** 
061         * Returns the name of the contained evaluation series
062         */
063        public String[] getQuerySeriesLabels()
064        {   Set<String> set = queryData.keySet();
065            String[] res = new String[set.size()];
066            int i=0;
067            for( String e : set)
068                res[i++] = e;
069            return res;
070        }
071        
072        public void printDetailedEvaluationReport(String filename)
073        {   PrintWriter pw = null;
074            try
075            {       pw = new PrintWriter(new BufferedWriter(new FileWriter(filename, true)));
076                    
077                    pw.println("Results:");
078                    String[] seriesLabels = getSeriesLabels();
079                    String[] querySeriesLabels = getQuerySeriesLabels();
080                    String[] otherLabels = getOtherLabels();
081                    
082                    for(int i=0; i<seriesLabels.length; i++)
083                    {       pw.println(seriesLabels[i]+ ":");
084                            Vector<Double> results = getSeries(seriesLabels[i]);
085                            String series = "";
086                            for(Double result: results)
087                                series += result + ","; 
088                            pw.println(series.substring(0, series.length()-2));
089                            pw.println("Average: " + getAverageOfDataSeries(seriesLabels[i]));
090                            pw.println();
091                    }
092                    pw.println();
093    
094                    for(int i=0; i<querySeriesLabels.length; i++)
095                    {       pw.println(querySeriesLabels[i]+ ":");
096                            HashMap<CBRQuery, Double> results = getQuerySeries(querySeriesLabels[i]);
097                            for(Entry<CBRQuery, Double> qResult: results.entrySet())
098                                pw.println(qResult.getKey().getID() + ": " + qResult.getValue()); 
099                            pw.println("Average: " + getAverageOfQueryDataSeries(querySeriesLabels[i]));
100                            pw.println();
101                    }
102                    pw.println();
103                    
104                    for(int i=0; i<otherLabels.length; i++)
105                    {       pw.println(otherLabels[i]+ ": " + getOtherData(otherLabels[i]));
106                            pw.println();
107                    }
108                } catch(IOException ioe) {
109            }
110            finally 
111            {       if(pw != null)
112                            pw.close();
113            }
114        }
115            
116        /**
117         * Returns the average of the data series with the given label. If
118         * the label given is not the label of any data series, null will
119         * be returned and an error message will be printed.
120         * @param label the label of the data series.
121         * @return the average of the given data series.
122         */
123        public void removeDataSeries(String label)
124        {   data.remove(label);
125        }
126            
127        /**
128         * Returns the average of the data series with the given label. If
129         * the label given is not the label of any data series, null will
130         * be returned and an error message will be printed.
131         * @param label the label of the data series.
132         * @return the average of the given data series.
133         */
134        public void removeOtherData(String label)
135        {   other.remove(label);
136        }
137    
138        /**
139         * Returns the average of the data series with the given label. If
140         * the label given is not the label of any data series, null will
141         * be returned and an error message will be printed.
142         * @param label the label of the data series.
143         * @return the average of the given data series.
144         */
145        public Double getAverageOfDataSeries(String label)
146        {   Vector<Double> v = data.get(label);
147            if(v == null)
148            {       LogFactory.getLog(this.getClass()).error("Data series by this label does not exist");
149                    return null;
150            }
151            if(v.size() == 0)
152            {       return 0.0;
153            }
154            double total = 0.0;
155            for(Double value: v)
156            {       total += value;             
157            }
158            return total / v.size();
159        }
160            
161        /**
162         * Returns the average of the query data series with the given label. If
163         * the label given is not the label of any data series, null will
164         * be returned and an error message will be printed.
165         * @param label the label of the query data series.
166         * @return the average of the given query data series.
167         */
168        public Double getAverageOfQueryDataSeries(String label)
169        {   HashMap<CBRQuery, Double> results = queryData.get(label);
170            if(results == null)
171            {       LogFactory.getLog(this.getClass()).error("Data series by this label does not exist");
172                    return null;
173            }
174            if(results.size() == 0)
175            {       return 0.0;
176            }
177            double total = 0.0;
178            for(Entry<CBRQuery, Double> result: results.entrySet())
179            {       total += result.getValue();         
180            }
181            return total / results.size();
182        }
183            
184        /**
185         * Returns the String representation of this report.
186         * @return the String representation of this report. 
187         */
188        public String toString()
189        {
190            StringBuffer s = new StringBuffer();
191            s.append("Series:\n");
192            String[] series = this.getSeriesLabels();
193            for(int i=0; i<series.length; i++)
194            {       s.append("  "+series[i]+": \n    ");
195                    Vector<Double> v = this.getSeries(series[i]);
196                    for(Double d: v)
197                            s.append(d+",");
198                    s.append("\n");
199                    s.append("  Average: " + getAverageOfDataSeries(series[i]) + "\n\n");
200            }
201            
202            s.append("\nOther data:\n");
203            String[] other = this.getOtherLabels();
204            for(int i=0; i<other.length; i++)
205            {
206                    s.append("  "+other[i]+": "+ this.getOtherData(other[i])+"\n");
207            }
208            
209            s.append("\nNumber of Cycles: "+ this.getNumberOfCycles());
210            s.append("\nTime per Cycle:   "+ this.getTimePerCycle()+" ms");
211            s.append("\nTotal time:       "+ this.getTotalTime()+" ms");
212            
213            return s.toString();
214        }
215    }