001    package jcolibri.test.test14;
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.method.retrieve.NNretrieval.similarity.global.Average;
013    import jcolibri.method.retrieve.NNretrieval.similarity.local.Interval;
014    import jcolibri.method.reuse.classification.KNNClassificationConfig;
015    import jcolibri.method.reuse.classification.SimilarityWeightedVotingMethod;
016    import jcolibri.method.revise.classification.BasicClassificationOracle;
017    import jcolibri.method.revise.classification.ClassificationOracle;
018    
019    import org.apache.commons.logging.Log;
020    
021    /**
022     * Evaluable application. It is a normal StandardCBRApplication that 
023     * stores its results in the DetailedEvaluationReport 
024     * object obtained from Evaluator.getEvaluationReport().
025     * @author Lisa Cummins
026     * @version 1.0
027     */
028    public class GlassEvaluableApp implements StandardCBRApplication 
029    {
030            Connector _connector;
031            CBRCaseBase _caseBase;
032            KNNClassificationConfig glassSimConfig;
033            
034            private Log log;
035            
036            /**
037             * The name of the data series containing this application's stored results
038             */
039            public static final String DATA_SERIES_NAME = "Glass Prediction Cost";
040            
041            /* (non-Javadoc)
042             * @see jcolibri.cbraplications.BasicCBRApplication#configure()
043             */
044            public void configure() throws ExecutionException
045            {       try
046                    {       _connector = new PlainTextConnector();
047                            _connector.initFromXMLfile(jcolibri.util.FileIO.findFile("jcolibri/test/test14/plaintextconfigGlass.xml"));
048                            _caseBase  = new CachedLinealCaseBase();
049            
050                            // Configure KNN
051                            glassSimConfig = new KNNClassificationConfig();
052                            
053                            glassSimConfig.setDescriptionSimFunction(new Average());
054                            glassSimConfig.addMapping(new Attribute("ri",GlassDescription.class), new Interval(0.02278));
055                            glassSimConfig.addMapping(new Attribute("na",GlassDescription.class), new Interval(6.65));
056                            glassSimConfig.addMapping(new Attribute("mg",GlassDescription.class), new Interval(4.49));
057                            glassSimConfig.addMapping(new Attribute("al",GlassDescription.class), new Interval(3.21));
058                            glassSimConfig.addMapping(new Attribute("si",GlassDescription.class), new Interval(5.6));
059                            glassSimConfig.addMapping(new Attribute("k",GlassDescription.class), new Interval(6.21));
060                            glassSimConfig.addMapping(new Attribute("ca",GlassDescription.class), new Interval(10.76));
061                            glassSimConfig.addMapping(new Attribute("ba",GlassDescription.class), new Interval(3.15));
062                            glassSimConfig.addMapping(new Attribute("fe",GlassDescription.class), new Interval(0.51));
063                            glassSimConfig.setClassificationMethod(new SimilarityWeightedVotingMethod());
064                            glassSimConfig.setK(3);
065                            
066                    } catch (Exception e)
067                    {       throw new ExecutionException(e);
068                    }
069                    log = org.apache.commons.logging.LogFactory.getLog(this.getClass());
070            }
071    
072            /* (non-Javadoc)
073             * @see jcolibri.cbraplications.BasicCBRApplication#preCycle()
074             */
075            public CBRCaseBase preCycle() throws ExecutionException 
076            {       _caseBase.init(_connector);             
077                    return _caseBase;
078            }
079            
080            /* (non-Javadoc)
081             * @see jcolibri.cbraplications.BasicCBRApplication#cycle()
082             */
083            public void cycle(CBRQuery query) throws ExecutionException 
084            {       log.info("Query: "+ query.getDescription());
085    
086                    ClassificationOracle oracle = new BasicClassificationOracle();
087                    double predictionCost = oracle.getPredictionCost(query, _caseBase, glassSimConfig);
088                    
089                    // Now we add the cost of the prediction to the series "Glass Prediction Cost".
090                    Evaluator.getEvaluationReport().addDataToSeries(DATA_SERIES_NAME, predictionCost);
091            }
092    
093            /* (non-Javadoc)
094             * @see jcolibri.cbraplications.BasicCBRApplication#postCycle()
095             */
096            public void postCycle() throws ExecutionException 
097            {       _connector.close();
098            }
099    }