001    /**
002     * MoviesRecommender.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/11/2007
008     */
009    package jcolibri.test.recommenders.rec12;
010    
011    import java.util.Collection;
012    
013    import jcolibri.cbraplications.StandardCBRApplication;
014    import jcolibri.cbrcore.Attribute;
015    import jcolibri.cbrcore.CBRCase;
016    import jcolibri.cbrcore.CBRCaseBase;
017    import jcolibri.cbrcore.CBRQuery;
018    import jcolibri.cbrcore.Connector;
019    import jcolibri.connector.PlainTextConnector;
020    import jcolibri.exception.ExecutionException;
021    import jcolibri.extensions.recommendation.ContentBasedProfile.ObtainQueryFromProfile;
022    import jcolibri.extensions.recommendation.casesDisplay.DisplayCasesTableMethod;
023    import jcolibri.extensions.recommendation.casesDisplay.UserChoice;
024    import jcolibri.extensions.recommendation.collaborative.CollaborativeRetrievalMethod;
025    import jcolibri.extensions.recommendation.collaborative.MatrixCaseBase;
026    import jcolibri.extensions.recommendation.collaborative.PearsonMatrixCaseBase;
027    import jcolibri.extensions.recommendation.conditionals.BuyOrQuit;
028    import jcolibri.method.retrieve.RetrievalResult;
029    import jcolibri.method.retrieve.selection.SelectCases;
030    import jcolibri.test.recommenders.rec12.moviesDB.Rating;
031    import jcolibri.test.recommenders.rec12.moviesDB.User;
032    
033    /**
034     * Single-Shot movies recommender obtaining description from profile and scoring cases using collaborative recommendation.
035     * <br>
036     * This recommender uses a collaborative retrieval algorithm. These collaborative algorithms 
037     * return items depending on the recommendations of other users. They require an special organization of the
038     * case base to be executed (see {@link jcolibri.extensions.recommendation.collaborative.PearsonMatrixCaseBase}).
039     * The query is obtained from a serialized profile following the behaviour of many existing on-line movies recommenders.
040     * <br>Summary:
041     * <ul>
042     * <li>Type: Single-Shot
043     * <li>Case base: movies
044     * <li>One off Preference Elicitation: Profile
045     * <li>Retrieval: Collaborative + topKselection
046     * <li>Display: In table (basic)
047     * </ul>
048     * This recommender implements the following template:<br>
049     * <center><img src="../Template1_Cycle.jpg"/></center>
050     * 
051     * <br>Read the documentation of the recommenders extension for details about templates
052     * and recommender strategies: {@link jcolibri.extensions.recommendation}
053     * 
054     * @see jcolibri.extensions.recommendation.ContentBasedProfile.ObtainQueryFromProfile
055     * @see jcolibri.extensions.recommendation.collaborative.CollaborativeRetrievalMethod
056     * @see jcolibri.method.retrieve.selection.SelectCases
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 MoviesRecommender implements StandardCBRApplication
066    {
067        /** Connector object */
068        Connector _connector;
069        /** CaseBase object */
070        PearsonMatrixCaseBase _caseBase;
071        
072        /* (non-Javadoc)
073         * @see jcolibri.cbraplications.StandardCBRApplication#configure()
074         */
075        public void configure() throws ExecutionException
076        {
077            // Create a data base connector
078            _connector = new PlainTextConnector();
079            // Init the ddbb connector with the config file
080            _connector.initFromXMLfile(jcolibri.util.FileIO
081                            .findFile("jcolibri/test/recommenders/rec12/plaintextconfig.xml"));
082            // Create a Lineal case base for in-memory organization
083            _caseBase = new PearsonMatrixCaseBase(new Attribute("rating", Rating.class), 20);
084    
085        }
086    
087        /* (non-Javadoc)
088         * @see jcolibri.cbraplications.StandardCBRApplication#cycle(jcolibri.cbrcore.CBRQuery)
089         */
090        public void cycle(CBRQuery query) throws ExecutionException
091        {
092            query = ObtainQueryFromProfile.obtainQueryFromProfile( "src/jcolibri/test/recommenders/rec12/profile.xml");
093            
094            Collection<RetrievalResult> res = CollaborativeRetrievalMethod.getRecommendation(_caseBase, query, 10);
095            
096            Collection<CBRCase> cases = SelectCases.selectTopK(res, 5);
097            
098            UserChoice choice = DisplayCasesTableMethod.displayCasesInTableBasic(cases);
099            
100            // Buy or Quit
101            if(BuyOrQuit.buyOrQuit(choice))
102                System.out.println("Finish - User Buys: "+choice.getSelectedCase());
103            
104            else
105                System.out.println("Finish - User Quits");
106    
107        }
108    
109        /* (non-Javadoc)
110         * @see jcolibri.cbraplications.StandardCBRApplication#postCycle()
111         */
112        public void postCycle() throws ExecutionException
113        {
114            // TODO Auto-generated method stub
115    
116        }
117    
118        /* (non-Javadoc)
119         * @see jcolibri.cbraplications.StandardCBRApplication#preCycle()
120         */
121        public CBRCaseBase preCycle() throws ExecutionException
122        {
123            // Load cases from connector into the case base
124            _caseBase.init(_connector);             
125            // Print the cases
126            java.util.Collection<CBRCase> cases = _caseBase.getCases();
127    //      for(CBRCase c: cases)
128    //              System.out.println(c);
129            org.apache.commons.logging.LogFactory.getLog(this.getClass()).info(cases.size() +" cases loaded");
130            return _caseBase;
131        }
132    
133        /**
134         * @param args
135         */
136        public static void main(String[] args)
137        {
138            //SwingProgressBar shows the progress
139            jcolibri.util.ProgressController.clear();
140            jcolibri.util.ProgressController.register(new jcolibri.test.main.SwingProgressBar(), MatrixCaseBase.class);
141    
142            
143            
144                    StandardCBRApplication recommender = new MoviesRecommender();
145                    try
146                    {
147                        recommender.configure();
148                        
149                        recommender.preCycle();
150                        
151                        CBRQuery query = new CBRQuery();
152                        query.setDescription(new User());
153                        
154                        recommender.cycle(query);
155                        
156                        recommender.postCycle();
157                        
158                        //System.exit(0);
159                    } catch (Exception e)
160                    {
161                        org.apache.commons.logging.LogFactory.getLog(MoviesRecommender.class).error(e);
162                        
163                    }
164                    
165    
166        }
167    
168    }