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 }