001    /**
002     * AskingAndProposingPreferenceElicitation.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     * 05/11/2007
008     */
009    package jcolibri.extensions.recommendation.askingAndProposing;
010    
011    import java.util.Collection;
012    import java.util.HashMap;
013    import java.util.Map;
014    
015    import jcolibri.cbrcore.Attribute;
016    import jcolibri.cbrcore.CBRCase;
017    import jcolibri.cbrcore.CBRQuery;
018    import jcolibri.exception.ExecutionException;
019    import jcolibri.extensions.recommendation.askingAndProposing.DisplayCasesIfNumberAndChangeNavigation.NavigationMode;
020    import jcolibri.extensions.recommendation.navigationByAsking.ObtainQueryWithAttributeQuestionMethod;
021    import jcolibri.extensions.recommendation.navigationByAsking.SelectAttributeMethod;
022    import jcolibri.extensions.recommendation.navigationByProposing.CriticalUserChoice;
023    import jcolibri.extensions.recommendation.navigationByProposing.queryElicitation.MoreLikeThis;
024    
025    /**
026     * Method that implements the Preference elicitation task for the Expert Clerk system.<br>
027     * See recommender 8 for details.<br>
028     * In NbA it elicits the query asking for the value of an attribute.<br>
029     * In NbP it uses the MoreLikeThis method.
030     * 
031     * @author Juan A. Recio-Garcia
032     * @author Developed at University College Cork (Ireland) in collaboration with Derek Bridge.
033     * @version 1.0
034     * @see jcolibri.test.recommenders.rec8.Houses8
035     */
036    public class AskingAndProposingPreferenceElicitation
037    {
038        
039        private static NavigationMode mode = NavigationMode.NBA;
040        
041        /** 
042         * Changes the navigation type.
043         */
044        public static void changeTo(NavigationMode _mode)
045        {
046            mode = _mode;
047        }
048        
049        /**
050         * Executes the preference elicitation. <br>
051         * If NbA mode it obtains a new query using the ObtainQueryWithAttributeQuestionMethod.<br>
052         * If NBP mode it revises the query using MoreLikeThis.<br> 
053         * @param query to elicit
054         * @param cases is the working cases set
055         * @param sam is the method used to obtain the next attribute to ask (only in NbA mode).
056         * @param cuc is the user critique in NbP mode.
057         * @throws ExecutionException if any error.
058         */
059        public static void doPreferenceElicitation(CBRQuery query, Collection<CBRCase> cases, SelectAttributeMethod sam, CriticalUserChoice cuc) throws ExecutionException
060        {
061            if(mode == NavigationMode.NBA)
062            {
063                Attribute att = sam.getAttribute(cases, query);
064                Map<Attribute,String> labels = new HashMap<Attribute,String>();
065                ObtainQueryWithAttributeQuestionMethod.obtainQueryWithAttributeQuestion(query, att, labels,cases);
066            } 
067            else if(mode == NavigationMode.NBP)
068            {
069                new MoreLikeThis().reviseQuery(query, cuc.getSelectedCase(), cases);
070            }
071    
072        }
073    }