001    /**
002     * Houses14.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     * 23/10/2007
008     */
009    package jcolibri.test.recommenders.rec14;
010    
011    import java.util.ArrayList;
012    import java.util.Collection;
013    import java.util.HashMap;
014    import java.util.Map;
015    
016    import jcolibri.casebase.LinealCaseBase;
017    import jcolibri.cbraplications.StandardCBRApplication;
018    import jcolibri.cbrcore.Attribute;
019    import jcolibri.cbrcore.CBRCase;
020    import jcolibri.cbrcore.CBRCaseBase;
021    import jcolibri.cbrcore.CBRQuery;
022    import jcolibri.cbrcore.Connector;
023    import jcolibri.connector.PlainTextConnector;
024    import jcolibri.exception.ExecutionException;
025    import jcolibri.extensions.recommendation.casesDisplay.DisplayCasesTableMethod;
026    import jcolibri.extensions.recommendation.casesDisplay.UserChoice;
027    import jcolibri.extensions.recommendation.conditionals.BuyOrQuit;
028    import jcolibri.method.gui.formFilling.ObtainQueryWithFormMethod;
029    import jcolibri.method.retrieve.FilterBasedRetrieval.FilterBasedRetrievalMethod;
030    import jcolibri.method.retrieve.FilterBasedRetrieval.FilterConfig;
031    import jcolibri.method.retrieve.FilterBasedRetrieval.predicates.Equal;
032    import jcolibri.method.retrieve.FilterBasedRetrieval.predicates.QueryLessOrEqual;
033    import jcolibri.method.retrieve.FilterBasedRetrieval.predicates.QueryMoreOrEqual;
034    import jcolibri.test.recommenders.housesData.HouseDescription;
035    
036    /**
037     * Single-Shot flats recommender using form-filling and Filter-Based retrieval.
038     * <br> 
039     * This is the typical web recommender. It obtains the user preferences using a form, retrieves filtering the items
040     * that match with the query, displays the retrieved items and finishes.
041     * <br>Summary:
042     * <ul>
043     * <li>Type: Single-Shot
044     * <li>Case base: houses
045     * <li>One off Preference Elicitation: Form Filling without initial values and custom labels
046     * <li>Retrieval: Filter
047     * <li>Display: In table (basic)
048     * </ul>
049     * This recommender implements the following template:<br>
050     * <center><img src="../Template12_Cycle.jpg"/></center>
051     * 
052     * <br>Read the documentation of the recommenders extension for details about templates
053     * and recommender strategies: {@link jcolibri.extensions.recommendation}
054     * 
055     * @see jcolibri.method.gui.formFilling.ObtainQueryWithFormMethod
056     * @see jcolibri.method.retrieve.FilterBasedRetrieval.FilterBasedRetrievalMethod
057     * @see jcolibri.extensions.recommendation.casesDisplay.DisplayCasesTableMethod
058     * 
059     * 
060     * @author Juan A. Recio-Garcia
061     * @author Developed at University College Cork (Ireland) in collaboration with Derek Bridge.
062     * @version 1.0
063     *
064     */
065    public class Houses14 implements StandardCBRApplication
066    {
067        /** Connector object */
068        Connector _connector;
069        /** CaseBase object */
070        CBRCaseBase _caseBase;
071    
072        /** Configuration object for Form Filling */
073        Map<Attribute,String> labels;
074        /** Configuration object for Form Filling */
075        ArrayList<Attribute> hiddenAtts;
076        /** Configuration object for Filter Based retrieval*/
077        FilterConfig filterConfig;
078        
079        public void configure() throws ExecutionException
080        {
081            // Create a data base connector
082            _connector = new PlainTextConnector();
083            // Init the ddbb connector with the config file
084            _connector.initFromXMLfile(jcolibri.util.FileIO
085                            .findFile("jcolibri/test/recommenders/housesData/plaintextconfig.xml"));
086            // Create a Lineal case base for in-memory organization
087            _caseBase = new LinealCaseBase();
088    
089            // Configure Form Filling
090            hiddenAtts = new ArrayList<Attribute>();
091            labels = new HashMap<Attribute,String>();
092            labels.put(new Attribute("beds", HouseDescription.class), "Min bedrooms");
093            labels.put(new Attribute("price", HouseDescription.class), "Max price");
094            labels.put(new Attribute("baths", HouseDescription.class), "Min bahtrooms");
095            
096            //Configure the Filter based retrieval
097            filterConfig = new FilterConfig();
098            filterConfig.addPredicate(new Attribute("area", HouseDescription.class), new Equal());
099            filterConfig.addPredicate(new Attribute("beds", HouseDescription.class), new QueryLessOrEqual());
100            filterConfig.addPredicate(new Attribute("price", HouseDescription.class), new QueryMoreOrEqual());
101            filterConfig.addPredicate(new Attribute("furnished", HouseDescription.class), new Equal());
102            filterConfig.addPredicate(new Attribute("type", HouseDescription.class), new Equal());
103            filterConfig.addPredicate(new Attribute("baths", HouseDescription.class), new QueryLessOrEqual());
104    
105    
106        }
107    
108        public void cycle(CBRQuery query) throws ExecutionException
109        {   
110            // Obtain the query
111            ObtainQueryWithFormMethod.obtainQueryWithoutInitialValues(query,hiddenAtts,labels);
112    
113            // Retrieve using filter based retrieval
114            Collection<CBRCase> retrievedCases = FilterBasedRetrievalMethod.filterCases(_caseBase.getCases(), query, filterConfig);
115            
116            // Display cases in table
117            UserChoice choice = DisplayCasesTableMethod.displayCasesInTableBasic(retrievedCases);
118            
119            // Buy or Quit
120            if(BuyOrQuit.buyOrQuit(choice))
121                System.out.println("Finish - User Buys: "+choice.getSelectedCase());
122            
123            else
124                System.out.println("Finish - User Quits");
125        }
126        
127        
128    
129        public void postCycle() throws ExecutionException
130        {
131        }
132    
133        public CBRCaseBase preCycle() throws ExecutionException
134        {
135            // Load cases from connector into the case base
136            _caseBase.init(_connector);             
137            // Print the cases
138            java.util.Collection<CBRCase> cases = _caseBase.getCases();
139            for(CBRCase c: cases)
140                    System.out.println(c);
141            return _caseBase;
142        }
143        
144        public static void main(String[] args) {
145            StandardCBRApplication recommender = new Houses14();
146            try
147            {
148                recommender.configure();
149                
150                recommender.preCycle();
151                
152                CBRQuery query = new CBRQuery();
153                
154                HouseDescription hd = new HouseDescription();
155                /*
156                hd.setArea(HouseDescription.Area.Hampstead);
157                hd.setBaths(1);
158                hd.setBeds(HouseDescription.Beds.two);
159                hd.setFurnished(true);
160                hd.setPrice(500);
161                hd.setType(HouseDescription.Type.Flat);
162                */
163                query.setDescription(hd);
164                
165                recommender.cycle(query);
166                
167                recommender.postCycle();
168                
169                //System.exit(0);
170            } catch (Exception e)
171            {
172                org.apache.commons.logging.LogFactory.getLog(Houses14.class).error(e);
173                
174            }
175            
176    
177        }
178    
179    }