001 /** 002 * DetailedHoldOutEvaluator.java 003 * jCOLIBRI2 framework. 004 * @author Lisa Cummins. 005 * 27/07/2007 006 */ 007 package jcolibri.extensions.evaluation; 008 009 import jcolibri.cbraplications.StandardCBRApplication; 010 import jcolibri.cbrcore.CBRCaseBase; 011 import jcolibri.evaluation.Evaluator; 012 import jcolibri.exception.ExecutionException; 013 import jcolibri.method.maintenance.AbstractCaseBaseEditMethod; 014 import jcolibri.method.retrieve.KNNretrieval.KNNConfig; 015 016 import org.apache.commons.logging.LogFactory; 017 018 /** 019 * This abstract class defines the common behaviour of a maintenance evaluator. 020 * 021 * @author Lisa Cummins. 022 * @version 2.0 023 */ 024 public abstract class MaintenanceEvaluator extends Evaluator 025 { 026 protected StandardCBRApplication app; 027 protected AbstractCaseBaseEditMethod editMethod = null; 028 protected KNNConfig simConfig = null; 029 030 public static final String PERCENT_REDUCED = "Percent reduced"; 031 032 public void init(StandardCBRApplication cbrApp) 033 { if(report == null || !(report instanceof DetailedEvaluationReport)) 034 { report = new DetailedEvaluationReport(); 035 } 036 app = cbrApp; 037 try 038 { app.configure(); 039 } catch (ExecutionException e) 040 { LogFactory.getLog(this.getClass()).error(e); 041 } 042 } 043 044 public void init(StandardCBRApplication cbrApp, AbstractCaseBaseEditMethod editMethod, 045 KNNConfig simConfig) 046 { this.init(cbrApp); 047 setEditMethod(editMethod); 048 setSimConfig(simConfig); 049 } 050 051 public void setEditMethod(AbstractCaseBaseEditMethod editMethod) 052 { this.editMethod = editMethod; 053 } 054 055 public void setSimConfig(KNNConfig simConfig) 056 { this.simConfig = simConfig; 057 } 058 059 protected void editCaseBase(CBRCaseBase caseBase) 060 { //Perform maintenance on this case base 061 int sizeBefore = caseBase.getCases().size(); 062 LogFactory.getLog(this.getClass()).info("Editing Case-Base"); 063 editMethod.edit(caseBase, simConfig); 064 LogFactory.getLog(this.getClass()).info("Finished Editing Case-Base"); 065 int sizeAfter = caseBase.getCases().size(); 066 double percentReduced = ((sizeBefore - sizeAfter)/(double)sizeBefore) * 100.0; 067 report.addDataToSeries(PERCENT_REDUCED, percentReduced); 068 } 069 }