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 }