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