TaskInstanceTrieTest
contains tests for the class
* {@link TaskInstanceTrie}
.
*
* @author Patrick Harms
* @version 1.0
*/
public class TaskInstanceTrieTest {
/** */
private ITaskBuilder taskBuilder = new TaskBuilder();
/** */
private ITaskFactory taskFactory = new TaskFactory();
/** */
private TaskTreeDecoder decoder = new TaskTreeDecoder(taskFactory, taskBuilder);
/** */
private TaskHandlingStrategy strategy =
new TaskHandlingStrategy(TaskEquality.IDENTICAL);
/** */
private IUserSession session = (IUserSession) decoder.decode
("UserSession {" +
" Event actionA {}" +
" Event actionB {}" +
" Event actionR {}" +
" Event actionA {}" +
" Event actionC {}" +
" Event actionA {}" +
" Event actionD {}" +
" Event actionA {}" +
" Event actionB {}" +
" Event actionR {}" +
" Event actionA {}" +
"}");
/**
*
*/
private static void assertCollectionContent(Collection> c1, Collection> c2) {
assertEquals(c1.size(), c2.size());
for (Object obj : c1) {
assertTrue(c2.contains(obj));
}
}
@Test
public void testTaskInstanceTaskInstanceTrie_1() throws Exception {
TaskInstanceTrie result = new TaskInstanceTrie(strategy);
assertNotNull(result);
assertEquals(0, result.getNumLeafs());
assertEquals(0, result.getNumSymbols());
assertEquals(0, result.getNumLeafAncestors());
assertTrue(result.getKnownSymbols().isEmpty());
}
@Test(expected = java.lang.IllegalArgumentException.class)
public void testTaskInstanceTrie_2() throws Exception {
new TaskInstanceTrie((TaskHandlingStrategy) null);
}
@Test
public void testTrainSessions_1() throws Exception {
TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
IUserSession session = (IUserSession) decoder.decode
("UserSession {" +
" Event action1 {}" +
" Event action2 {}" +
" Event action3 {}" +
" Event action4 {}" +
"}");
fixture.trainSessions(Arrays.asList(session), 2);
assertEquals(1, fixture.getCount(Arrays.asList(session.get(0))));
assertEquals(1, fixture.getCount(Arrays.asList(session.get(1))));
assertEquals(1, fixture.getCount(Arrays.asList(session.get(2))));
// subsequences of length 1 are not trained. So for the single item sequence of the last
// task, the count must be 0
assertEquals(0, fixture.getCount(Arrays.asList(session.get(3))));
assertEquals(1, fixture.getCount(Arrays.asList(session.get(0), session.get(1))));
assertEquals(1, fixture.getCount(Arrays.asList(session.get(1), session.get(2))));
assertEquals(1, fixture.getCount(Arrays.asList(session.get(2), session.get(3))));
// this must return 0 as we only trained shorter sequences
assertEquals(0, fixture.getCount(Arrays.asList(session.get(0), session.get(1),
session.get(2))));
// subsequences of length 1 are not trained. So the single item sequence of the last
// task, is not counted
assertEquals(3, fixture.getNumSymbols());
}
@Test
public void testTrainSessions_2() throws Exception {
TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
IUserSession session = (IUserSession) decoder.decode
("UserSession {" +
" Event action1 {}" +
" Event action1 {}" +
" Event action1 {}" +
" Event action1 {}" +
"}");
fixture.trainSessions(Arrays.asList(session), 2);
for (int i = 0; i < session.size(); i++) {
// subsequences of length 1 are not trained. So the single item sequence of the last
// task is not counted. Therefore, the result must be 3
assertEquals(3, fixture.getCount(Arrays.asList(session.get(i))));
for (int j = 0; j < session.size(); j++) {
assertEquals(3, fixture.getCount(Arrays.asList(session.get(i), session.get(j))));
}
}
// this must return 0 as we only trained shorter sequences
assertEquals(0, fixture.getCount(Arrays.asList(session.get(0), session.get(1),
session.get(2))));
assertEquals(1, fixture.getNumSymbols());
}
@Test
public void testTrainSessions_3() throws Exception {
TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
IUserSession session = (IUserSession) decoder.decode
("UserSession {" +
" Event action1 {}" +
" Event action2 {}" +
" Event action1 {}" +
" Event action2 {}" +
"}");
fixture.trainSessions(Arrays.asList(session), 2);
// subsequences of length 1 are not trained. So the single item sequence of the last
// task is not counted. Therefore, the result must be 3
assertEquals(2, fixture.getCount(Arrays.asList(session.get(0))));
assertEquals(1, fixture.getCount(Arrays.asList(session.get(1))));
assertEquals(2, fixture.getCount(Arrays.asList(session.get(2))));
assertEquals(1, fixture.getCount(Arrays.asList(session.get(3))));
assertEquals(2, fixture.getCount(Arrays.asList(session.get(0), session.get(1))));
assertEquals(1, fixture.getCount(Arrays.asList(session.get(1), session.get(2))));
assertEquals(2, fixture.getCount(Arrays.asList(session.get(2), session.get(3))));
// this must return 0 as we only trained shorter sequences
assertEquals(0, fixture.getCount(Arrays.asList(session.get(0), session.get(1),
session.get(2))));
assertEquals(2, fixture.getNumSymbols());
}
@Test
public void testTrainSessions_4() throws Exception {
TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
IUserSession session = (IUserSession) decoder.decode
("UserSession {" +
" Event action1 {}" +
" Event action2 {}" +
" Event action3 {}" +
" Event action4 {}" +
"}");
fixture.trainSessions(Arrays.asList(session), 3);
assertEquals(1, fixture.getCount(Arrays.asList(session.get(0))));
assertEquals(1, fixture.getCount(Arrays.asList(session.get(1))));
assertEquals(1, fixture.getCount(Arrays.asList(session.get(2))));
// subsequences of length 1 are not trained. So for the single item sequence of the last
// task, the count must be 0
assertEquals(0, fixture.getCount(Arrays.asList(session.get(3))));
assertEquals(1, fixture.getCount(Arrays.asList(session.get(0), session.get(1))));
assertEquals(1, fixture.getCount(Arrays.asList(session.get(1), session.get(2))));
assertEquals(1, fixture.getCount(Arrays.asList(session.get(2), session.get(3))));
assertEquals(1, fixture.getCount(Arrays.asList(session.get(0), session.get(1),
session.get(2))));
assertEquals(1, fixture.getCount(Arrays.asList(session.get(1), session.get(2),
session.get(3))));
// we only trained shorter sequences, so we expect a count of 0 for longer ones
assertEquals(0, fixture.getCount(Arrays.asList(session.get(0), session.get(1),
session.get(2), session.get(3))));
// subsequences of length 1 are not trained. So the single item sequence of the last
// task, is not counted
assertEquals(3, fixture.getNumSymbols());
}
@Test
public void testTrainSessions_5() throws Exception {
TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
IUserSession session = (IUserSession) decoder.decode
("UserSession {" +
" Event action1 {}" +
" Event action1 {}" +
" Event action1 {}" +
" Event action1 {}" +
"}");
fixture.trainSessions(Arrays.asList(session), 3);
for (int i = 0; i < session.size(); i++) {
// subsequences of length 1 are not trained. So the single item sequence of the last
// task is not counted. Therefore, the result must be 3
assertEquals(3, fixture.getCount(Arrays.asList(session.get(i))));
for (int j = 0; j < session.size(); j++) {
assertEquals(3, fixture.getCount(Arrays.asList(session.get(i), session.get(j))));
for (int k = 0; k < session.size(); k++) {
assertEquals(2, fixture.getCount(Arrays.asList(session.get(i), session.get(j),
session.get(k))));
}
}
}
// we only trained shorter sequences, so we expect a count of 0 for longer ones
assertEquals(0, fixture.getCount(Arrays.asList(session.get(0), session.get(1),
session.get(2), session.get(3))));
assertEquals(1, fixture.getNumSymbols());
}
@Test
public void testTrainSessions_6() throws Exception {
TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
IUserSession session = (IUserSession) decoder.decode
("UserSession {" +
" Event action1 {}" +
" Event action2 {}" +
" Event action1 {}" +
" Event action2 {}" +
"}");
fixture.trainSessions(Arrays.asList(session), 3);
// subsequences of length 1 are not trained. So the single item sequence of the last
// task is not counted. Therefore, the result must be 3
assertEquals(2, fixture.getCount(Arrays.asList(session.get(0))));
assertEquals(1, fixture.getCount(Arrays.asList(session.get(1))));
assertEquals(2, fixture.getCount(Arrays.asList(session.get(2))));
assertEquals(1, fixture.getCount(Arrays.asList(session.get(3))));
assertEquals(2, fixture.getCount(Arrays.asList(session.get(0), session.get(1))));
assertEquals(1, fixture.getCount(Arrays.asList(session.get(1), session.get(2))));
assertEquals(2, fixture.getCount(Arrays.asList(session.get(2), session.get(3))));
assertEquals(1, fixture.getCount(Arrays.asList(session.get(0), session.get(1),
session.get(2))));
assertEquals(1, fixture.getCount(Arrays.asList(session.get(1), session.get(2),
session.get(3))));
// we only trained shorter sequences, so we expect a count of 0 for longer ones
assertEquals(0, fixture.getCount(Arrays.asList(session.get(0), session.get(1),
session.get(2), session.get(3))));
assertEquals(2, fixture.getNumSymbols());
}
@Test
public void testTrainSessions_7() throws Exception {
TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
IUserSession session = (IUserSession) decoder.decode
("UserSession {" +
" Event action1 {}" +
" Event action2 {}" +
" Event action3 {}" +
" Event action4 {}" +
"}");
fixture.trainSessions(Arrays.asList(session), 4);
assertEquals(1, fixture.getCount(Arrays.asList(session.get(0))));
assertEquals(1, fixture.getCount(Arrays.asList(session.get(1))));
assertEquals(1, fixture.getCount(Arrays.asList(session.get(2))));
// subsequences of length 1 are not trained. So for the single item sequence of the last
// task, the count must be 0
assertEquals(0, fixture.getCount(Arrays.asList(session.get(3))));
assertEquals(1, fixture.getCount(Arrays.asList(session.get(0), session.get(1))));
assertEquals(1, fixture.getCount(Arrays.asList(session.get(1), session.get(2))));
assertEquals(1, fixture.getCount(Arrays.asList(session.get(2), session.get(3))));
assertEquals(1, fixture.getCount(Arrays.asList(session.get(0), session.get(1),
session.get(2))));
assertEquals(1, fixture.getCount(Arrays.asList(session.get(1), session.get(2),
session.get(3))));
// we only trained shorter sequences, so we expect a count of 0 for longer ones
assertEquals(1, fixture.getCount(Arrays.asList(session.get(0), session.get(1),
session.get(2), session.get(3))));
// subsequences of length 1 are not trained. So the single item sequence of the last
// task, is not counted
assertEquals(3, fixture.getNumSymbols());
}
@Test
public void testTrainSessions_8() throws Exception {
TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
IUserSession session = (IUserSession) decoder.decode
("UserSession {" +
" Event action1 {}" +
" Event action1 {}" +
" Event action1 {}" +
" Event action1 {}" +
"}");
fixture.trainSessions(Arrays.asList(session), 4);
for (int i = 0; i < session.size(); i++) {
// subsequences of length 1 are not trained. So the single item sequence of the last
// task is not counted. Therefore, the result must be 3
assertEquals(3, fixture.getCount(Arrays.asList(session.get(i))));
for (int j = 0; j < session.size(); j++) {
assertEquals(3, fixture.getCount(Arrays.asList(session.get(i), session.get(j))));
for (int k = 0; k < session.size(); k++) {
assertEquals(2, fixture.getCount(Arrays.asList(session.get(i), session.get(j),
session.get(k))));
}
}
}
// we only trained shorter sequences, so we expect a count of 0 for longer ones
assertEquals(1, fixture.getCount(Arrays.asList(session.get(0), session.get(1),
session.get(2), session.get(3))));
assertEquals(1, fixture.getNumSymbols());
}
@Test
public void testTrainSessions_9() throws Exception {
TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
IUserSession session = (IUserSession) decoder.decode
("UserSession {" +
" Event action1 {}" +
" Event action2 {}" +
" Event action1 {}" +
" Event action2 {}" +
"}");
fixture.trainSessions(Arrays.asList(session), 4);
// subsequences of length 1 are not trained. So the single item sequence of the last
// task is not counted. Therefore, the result must be 3
assertEquals(2, fixture.getCount(Arrays.asList(session.get(0))));
assertEquals(1, fixture.getCount(Arrays.asList(session.get(1))));
assertEquals(2, fixture.getCount(Arrays.asList(session.get(2))));
assertEquals(1, fixture.getCount(Arrays.asList(session.get(3))));
assertEquals(2, fixture.getCount(Arrays.asList(session.get(0), session.get(1))));
assertEquals(1, fixture.getCount(Arrays.asList(session.get(1), session.get(2))));
assertEquals(2, fixture.getCount(Arrays.asList(session.get(2), session.get(3))));
assertEquals(1, fixture.getCount(Arrays.asList(session.get(0), session.get(1),
session.get(2))));
assertEquals(1, fixture.getCount(Arrays.asList(session.get(1), session.get(2),
session.get(3))));
// we only trained shorter sequences, so we expect a count of 0 for longer ones
assertEquals(1, fixture.getCount(Arrays.asList(session.get(0), session.get(1),
session.get(2), session.get(3))));
assertEquals(2, fixture.getNumSymbols());
}
@Test
public void testGetSequencesWithMostOccurrences_1() throws Exception {
TaskInstanceTrie fixture = new TaskInstanceTrie(strategy);
fixture.trainSessions(Arrays.asList(session), 3);
// get all sequences with a minimal length of one that occur most often
Collection* class internally used for testing large tries. *
* * @author Patrick Harms */ private class TaskInstanceTrieTester implements TrieProcessor* stores the counts for the subsequence denoted by the start and end index (inclusive). *
*/ private void storeCounts(int[] sequence, int startIndex, int endIndex) { long key = 0; for (int i = startIndex; i <= endIndex; i++) { key = key << 10; key += 1 + sequence[i]; Integer count = this.counts.get(key); if (count == null) { count = 0; } //System.out.println(key + " " + (count + 1)); count++; this.counts.put(key, count); maxCount = Math.max(count, maxCount); } } /* (non-Javadoc) * @see de.ugoe.cs.autoquest.usageprofiles.TaskInstanceTrieProcessor#process(List, int) */ @Override public TrieProcessor.Result process(List