001    package jcolibri.test.test15;
002    
003    import jcolibri.casebase.CachedLinealCaseBase;
004    import jcolibri.cbraplications.StandardCBRApplication;
005    import jcolibri.cbrcore.Attribute;
006    import jcolibri.cbrcore.CBRCaseBase;
007    import jcolibri.cbrcore.CBRQuery;
008    import jcolibri.cbrcore.Connector;
009    import jcolibri.connector.PlainTextConnector;
010    import jcolibri.evaluation.Evaluator;
011    import jcolibri.exception.ExecutionException;
012    import jcolibri.extensions.maintenance_evaluation.DetailedEvaluationReport;
013    import jcolibri.method.retrieve.NNretrieval.similarity.global.Average;
014    import jcolibri.method.retrieve.NNretrieval.similarity.local.Interval;
015    import jcolibri.method.reuse.classification.KNNClassificationConfig;
016    import jcolibri.method.reuse.classification.SimilarityWeightedVotingMethod;
017    import jcolibri.method.revise.classification.BasicClassificationOracle;
018    import jcolibri.method.revise.classification.ClassificationOracle;
019    
020    import org.apache.commons.logging.Log;
021    
022    /**
023     * Evaluable application. It is a normal StandardCBRApplication that 
024     * stores its results in the DetailedEvaluationReport 
025     * object obtained from Evaluator.getEvaluationReport().
026     * @author Lisa Cummins
027     * @version 1.0
028     */
029    public class IrisEvaluableApp implements StandardCBRApplication 
030    {
031            Connector _connector;
032            CBRCaseBase _caseBase;
033            KNNClassificationConfig irisSimConfig;
034            
035            private Log log;
036            
037            /**
038             * The name of the data series containing this application's stored results
039             */
040            public static final String DATA_SERIES_NAME = "Iris Prediction Cost";
041    
042            /* (non-Javadoc)
043             * @see jcolibri.cbraplications.BasicCBRApplication#configure()
044             */
045            public void configure() throws ExecutionException
046            {       try
047                    {       _connector = new PlainTextConnector();
048                            _connector.initFromXMLfile(jcolibri.util.FileIO.findFile("jcolibri/test/test15/plaintextconfig.xml"));
049                            _caseBase  = new CachedLinealCaseBase();
050                            
051                            // Configure KNN
052                            irisSimConfig = new KNNClassificationConfig();
053                            
054                            irisSimConfig.setDescriptionSimFunction(new Average());
055                            irisSimConfig.addMapping(new Attribute("sepalLength",IrisDescription.class), new Interval(3.6));
056                            irisSimConfig.addMapping(new Attribute("sepalWidth",IrisDescription.class), new Interval(2.4));
057                            irisSimConfig.addMapping(new Attribute("petalLength",IrisDescription.class), new Interval(5.9));
058                            irisSimConfig.addMapping(new Attribute("petalWidth", IrisDescription.class), new Interval(2.4));
059                            irisSimConfig.setClassificationMethod(new SimilarityWeightedVotingMethod());
060                            irisSimConfig.setK(3);
061    
062                    } catch (Exception e)
063                    {       throw new ExecutionException(e);
064                    }
065                    log = org.apache.commons.logging.LogFactory.getLog(this.getClass());
066            }
067    
068            
069            /* (non-Javadoc)
070             * @see jcolibri.cbraplications.BasicCBRApplication#preCycle()
071             */
072            public CBRCaseBase preCycle() throws ExecutionException 
073            {       _caseBase.init(_connector);             
074                    return _caseBase;
075            }
076            
077            /* (non-Javadoc)
078             * @see jcolibri.cbraplications.BasicCBRApplication#cycle()
079             */
080            public void cycle(CBRQuery query) throws ExecutionException 
081            {       log.info("Query: "+ query.getDescription());
082    
083                    ClassificationOracle oracle = new BasicClassificationOracle();
084                    double predictionCost = oracle.getPredictionCost(query, _caseBase, irisSimConfig);
085                    
086                    // Now we add the cost of the prediction to the series DATA_SERIES_NAME.
087                    ((DetailedEvaluationReport)(Evaluator.getEvaluationReport())).
088                            addDataToSeries(DATA_SERIES_NAME, query, predictionCost);
089            }
090    
091            /* (non-Javadoc)
092             * @see jcolibri.cbraplications.BasicCBRApplication#postCycle()
093             */
094            public void postCycle() throws ExecutionException 
095            {       _connector.close();
096            }
097    }