source: trunk/autoquest-core-tasktrees/src/main/java/de/ugoe/cs/autoquest/tasktrees/temporalrelation/TaskInstanceTrie.java @ 1273

Last change on this file since 1273 was 1273, checked in by pharms, 11 years ago
  • removed find bugs warnings
File size: 6.6 KB
Line 
1//   Copyright 2012 Georg-August-Universität Göttingen, Germany
2//
3//   Licensed under the Apache License, Version 2.0 (the "License");
4//   you may not use this file except in compliance with the License.
5//   You may obtain a copy of the License at
6//
7//       http://www.apache.org/licenses/LICENSE-2.0
8//
9//   Unless required by applicable law or agreed to in writing, software
10//   distributed under the License is distributed on an "AS IS" BASIS,
11//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12//   See the License for the specific language governing permissions and
13//   limitations under the License.
14
15package de.ugoe.cs.autoquest.tasktrees.temporalrelation;
16
17import java.util.HashMap;
18import java.util.LinkedList;
19import java.util.List;
20import java.util.Map;
21
22import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskInstance;
23import de.ugoe.cs.autoquest.tasktrees.treeifc.IUserSession;
24import de.ugoe.cs.autoquest.usageprofiles.SymbolMap;
25import de.ugoe.cs.autoquest.usageprofiles.Trie;
26import de.ugoe.cs.autoquest.usageprofiles.TrieProcessor;
27
28/**
29 * <p>
30 * TODO comment
31 * </p>
32 *
33 * @author Patrick Harms
34 */
35public class TaskInstanceTrie extends Trie<ITaskInstance> {
36
37    /**  */
38    private static final long serialVersionUID = 1L;
39
40    /**
41     * <p>
42     * the task comparator to be used for comparing tasks
43     * </p>
44     */
45    private TaskComparator comparator;
46
47    /**
48     * <p>
49     * TODO: comment
50     * </p>
51     *
52     * @param taskComparator2
53     */
54    public TaskInstanceTrie(TaskComparator taskComparator) {
55        super(taskComparator);
56        this.comparator = taskComparator;
57    }
58
59    /**
60     *
61     */
62    public void trainSessions(List<IUserSession> userSessions, int maxOrder) {
63        if (maxOrder < 1) {
64            return;
65        }
66       
67        SymbolMap<ITaskInstance, List<ITaskInstance>> equalTaskInstancesMap =
68            new SymbolMap<ITaskInstance, List<ITaskInstance>>(comparator);
69       
70        Map<ITaskInstance, List<ITaskInstance>> taskInstancesMap =
71            new HashMap<ITaskInstance, List<ITaskInstance>>();
72       
73        System.out.println("preparing training");
74        for (IUserSession session : userSessions) {
75            for (ITaskInstance taskInstance : session) {
76                List<ITaskInstance> equalTaskInstances =
77                    equalTaskInstancesMap.getValue(taskInstance);
78               
79                if (equalTaskInstances == null) {
80                    equalTaskInstances = new LinkedList<ITaskInstance>();
81                    equalTaskInstancesMap.addSymbol(taskInstance, equalTaskInstances);
82                }
83               
84                equalTaskInstances.add(taskInstance);
85                taskInstancesMap.put(taskInstance, equalTaskInstances);
86            }
87        }
88       
89        System.out.println("performing training");
90        for (IUserSession session : userSessions) {
91            train(session, maxOrder, taskInstancesMap);
92        }     
93       
94        updateKnownSymbols();
95    }
96   
97    /* (non-Javadoc)
98     * @see de.ugoe.cs.autoquest.usageprofiles.Trie#equals(java.lang.Object)
99     */
100    @Override
101    public boolean equals(Object other) {
102        if (this == other) {
103            return true;
104        }
105        else if (other instanceof TaskInstanceTrie) {
106            return super.equals(other);
107        }
108        else {
109            return false;
110        }
111    }
112
113    /* (non-Javadoc)
114     * @see de.ugoe.cs.autoquest.usageprofiles.Trie#hashCode()
115     */
116    @Override
117    public int hashCode() {
118        return super.hashCode();
119    }
120
121    /**
122     *
123     */
124    private void train(IUserSession                            userSession,
125                       int                                     maxOrder,
126                       Map<ITaskInstance, List<ITaskInstance>> taskInstancesMap)
127    {
128        List<ITaskInstance> executedTasks = userSession.getExecutedTasks();
129       
130        List<ITaskInstance> subsequence = new LinkedList<ITaskInstance>();
131       
132        int numberOfTrainedSubsequences = 0;
133        int sequenceMaxCount = 0;
134       
135        for (ITaskInstance currentTaskInstance : executedTasks) {
136            int occurrenceCount = taskInstancesMap.get(currentTaskInstance).size();
137           
138            if ((numberOfTrainedSubsequences % 10) == 0) {
139                sequenceMaxCount = getCurrentSequenceMaxCount();
140            }
141           
142            if (occurrenceCount < sequenceMaxCount) {
143                // this task instance does not need to be considered, as it occurs not often enough
144                // to be part of a sequence, that occurs most often. Therefore train all remaining
145                // sequences so far and go on, until the next useful sequence is found.
146               
147                while (subsequence.size() > 1) {
148                    add(subsequence);
149                    subsequence.remove(0);
150                }
151               
152                subsequence.clear();
153            }
154            else {
155                subsequence.add(currentTaskInstance);
156
157                if (subsequence.size() == maxOrder) {
158                    add(subsequence);
159                    subsequence.remove(0);
160
161                    numberOfTrainedSubsequences++;
162                }
163            }
164        }
165       
166        // add shorter remaining subsequences, if any
167        while (subsequence.size() > 1) {
168            add(subsequence);
169            subsequence.remove(0);
170        }
171    }
172
173    /**
174     * <p>
175     * TODO: comment
176     * </p>
177     *
178     * @return
179     */
180    private int getCurrentSequenceMaxCount() {
181        MaxSequenceCountFinder processor = new MaxSequenceCountFinder();
182        super.process(processor);
183        return processor.getMaxCount();
184    }
185
186    /**
187     * @author Patrick Harms
188     */
189    private static class MaxSequenceCountFinder implements TrieProcessor<ITaskInstance> {
190       
191        /**
192         *
193         */
194        private int currentCount = 0;
195       
196        /* (non-Javadoc)
197         * @see de.ugoe.cs.autoquest.usageprofiles.TrieProcessor#process(java.util.List, int)
198         */
199        @Override
200        public TrieProcessor.Result process(List<ITaskInstance> foundTask, int count) {
201            if (foundTask.size() == 2) {
202                this.currentCount = Math.max(this.currentCount, count);
203               
204                // do not consider children
205                return TrieProcessor.Result.SKIP_NODE;
206            }
207            else {
208                return TrieProcessor.Result.CONTINUE;
209            }
210        }
211
212        /**
213         *
214         */
215        private int getMaxCount() {
216            return currentCount;
217        }
218
219    }
220   
221}
Note: See TracBrowser for help on using the repository browser.