001    /**
002     * EvaluableApp.java
003     * jCOLIBRI2 framework. 
004     * @author Juan A. Recio-García.
005     * GAIA - Group for Artificial Intelligence Applications
006     * http://gaia.fdi.ucm.es
007     * 11/05/2007
008     */
009    package jcolibri.test.test8;
010    
011    import java.util.Collection;
012    
013    import jcolibri.casebase.CachedLinealCaseBase;
014    import jcolibri.cbraplications.StandardCBRApplication;
015    import jcolibri.cbrcore.Attribute;
016    import jcolibri.cbrcore.CBRCase;
017    import jcolibri.cbrcore.CBRCaseBase;
018    import jcolibri.cbrcore.CBRQuery;
019    import jcolibri.cbrcore.Connector;
020    import jcolibri.connector.DataBaseConnector;
021    import jcolibri.evaluation.Evaluator;
022    import jcolibri.exception.ExecutionException;
023    import jcolibri.method.retrieve.RetrievalResult;
024    import jcolibri.method.retrieve.NNretrieval.NNConfig;
025    import jcolibri.method.retrieve.NNretrieval.NNScoringMethod;
026    import jcolibri.method.retrieve.NNretrieval.similarity.global.Average;
027    import jcolibri.method.retrieve.NNretrieval.similarity.local.Equal;
028    import jcolibri.method.retrieve.NNretrieval.similarity.local.Interval;
029    
030    import org.apache.commons.logging.Log;
031    
032    /**
033     * Evaluable application. It is a normal StandardCBRApplication that stores its results in the EvaluationReport object
034     * obtained from Evaluator.getEvaluationReport()
035     * @author Juan A. Recio-Garci
036     * @version 1.0
037     * 
038     * @see jcolibri.evaluation.Evaluator
039     * @see jcolibri.evaluation.EvaluationReport
040     *
041     */
042    public class EvaluableApp implements StandardCBRApplication {
043    
044            Connector _connector;
045            CBRCaseBase _caseBase;
046            
047            private Log log;
048            
049            /* (non-Javadoc)
050             * @see jcolibri.cbraplications.BasicCBRApplication#configure()
051             */
052            public void configure() throws ExecutionException{
053                    try{
054                    _connector = new DataBaseConnector();
055                    _connector.initFromXMLfile(jcolibri.util.FileIO.findFile("jcolibri/test/test8/databaseconfig.xml"));
056                    _caseBase  = new CachedLinealCaseBase();
057                    } catch (Exception e){
058                            throw new ExecutionException(e);
059                    }
060                    log = org.apache.commons.logging.LogFactory.getLog(this.getClass());
061    
062            }
063    
064            
065            /* (non-Javadoc)
066             * @see jcolibri.cbraplications.BasicCBRApplication#preCycle()
067             */
068            public CBRCaseBase preCycle() throws ExecutionException {
069                    _caseBase.init(_connector);             
070                    java.util.Collection<CBRCase> cases = _caseBase.getCases();
071                    for(CBRCase c: cases)
072                            System.out.println(c);
073                    return _caseBase;
074            }
075            
076            /* (non-Javadoc)
077             * @see jcolibri.cbraplications.BasicCBRApplication#cycle()
078             */
079            public void cycle(CBRQuery query) throws ExecutionException 
080            {               
081                    NNConfig simConfig = new NNConfig();
082                    simConfig.setDescriptionSimFunction(new Average());
083                    simConfig.addMapping(new Attribute("Accomodation", TravelDescription.class), new Equal());
084                    Attribute duration = new Attribute("Duration", TravelDescription.class);
085                    simConfig.addMapping(duration, new Interval(31));
086                    simConfig.setWeight(duration, 0.5);
087                    simConfig.addMapping(new Attribute("HolidayType", TravelDescription.class), new Equal());
088                    simConfig.addMapping(new Attribute("NumberOfPersons", TravelDescription.class), new Equal());
089                    simConfig.addMapping(new Attribute("Price", TravelDescription.class), new Interval(4000));
090                    
091                    log.info("Query: "+ query.getDescription());
092    
093                    
094                    Collection<RetrievalResult> eval = NNScoringMethod.evaluateSimilarity(_caseBase.getCases(), query, simConfig);
095                    
096                    // Now we add the similarity of the most similar case to the serie "Similarity".
097                    Evaluator.getEvaluationReport().addDataToSeries("Similarity", new Double(eval.iterator().next().getEval()));
098            }
099    
100            /* (non-Javadoc)
101             * @see jcolibri.cbraplications.BasicCBRApplication#postCycle()
102             */
103            public void postCycle() throws ExecutionException {
104                    this._caseBase.close();
105    
106            }
107    
108    }