source: trunk/quest-ui-core/src/main/java/de/ugoe/cs/quest/plugin/guitar/EFGModelGenerator.java @ 556

Last change on this file since 556 was 556, checked in by sherbold, 12 years ago
  • adapted GUITAR plugin to new event core
  • Property svn:mime-type set to text/plain
File size: 4.4 KB
Line 
1package de.ugoe.cs.quest.plugin.guitar;
2
3import java.util.ArrayList;
4import java.util.Collection;
5import java.util.LinkedList;
6import java.util.List;
7import java.util.Random;
8
9import de.ugoe.cs.quest.eventcore.Event;
10import de.ugoe.cs.quest.plugin.guitar.eventcore.GUITAREventTarget;
11import de.ugoe.cs.quest.plugin.guitar.eventcore.GUITAREventType;
12import de.ugoe.cs.quest.plugin.guitar.eventcore.GUITARReplayable;
13import de.ugoe.cs.quest.ui.commands.CMDupdateModel;
14import de.ugoe.cs.quest.usageprofiles.DeterministicFiniteAutomaton;
15import de.ugoe.cs.quest.usageprofiles.FirstOrderMarkovModel;
16import edu.umd.cs.guitar.model.GUITARConstants;
17import edu.umd.cs.guitar.model.IO;
18import edu.umd.cs.guitar.model.data.EFG;
19import edu.umd.cs.guitar.model.data.EventGraphType;
20import edu.umd.cs.guitar.model.data.EventType;
21
22/**
23 * <p>
24 * Provides functionality to generates models defined in the package
25 * de.ugoe.cs.quest.usageprofiles from EFGs.
26 * </p>
27 *
28 * @author Steffen Herbold
29 * @version 1.0
30 */
31public class EFGModelGenerator {
32
33        /**
34         * <p>
35         * Generates a {@link FirstOrderMarkovModel} from an EFG. In the generated
36         * model, all following events are equally possible, i.e., the model is
37         * equal to a {@link DeterministicFiniteAutomaton}. However, through further
38         * training (e.g., {@link CMDupdateModel}) this can be changed.
39         * </p>
40         *
41         * @param efgFileName
42         *            name of the EFG file
43         * @return model generated from the EFG
44         */
45        public FirstOrderMarkovModel efgToFirstOrderMarkovModel(String efgFileName) {
46                EFG efg = (EFG) IO.readObjFromFile(efgFileName, EFG.class);
47
48                Collection<List<Event>> subsequences = generateEdgeSequences(efg);
49                FirstOrderMarkovModel model = new FirstOrderMarkovModel(new Random());
50                model.train(subsequences);
51                return model;
52        }
53
54        /**
55         * <p>
56         * Generates a {@link DeterministicFiniteAutomaton} from an EFG.
57         * </p>
58         *
59         * @param efgFileName
60         *            name of the EFG file
61         * @return model generated from the EFG
62         */
63        public DeterministicFiniteAutomaton efgToDeterministicFiniteAutomaton(
64                        String efgFileName) {
65                EFG efg = (EFG) IO.readObjFromFile(efgFileName, EFG.class);
66
67                Collection<List<Event>> subsequences = generateEdgeSequences(efg);
68                DeterministicFiniteAutomaton model = new DeterministicFiniteAutomaton(
69                                new Random());
70                model.train(subsequences);
71                return model;
72        }
73
74        /**
75         * <p>
76         * Extracts the graph structure from the EFG. The result is a set of
77         * sequences, where each sequence has length two and represents an edge in
78         * the EFG.
79         * </p>
80         *
81         * @param efg
82         *            EFG for which the edge sequence set is generated
83         * @return edge sequence set
84         */
85        private Collection<List<Event>> generateEdgeSequences(EFG efg) {
86                List<Event> events = createEvents(efg);
87                /*
88                 * getEventGraph returns an adjacency matrix, i.e., a square matrix of
89                 * efgEvents.size(), where a 1 in row i, column j means an edge
90                 * efgEvents.get(i)->efgEvents.get(j) exists.
91                 */
92                EventGraphType efgGraph = efg.getEventGraph();
93                Collection<List<Event>> subsequences = new LinkedList<List<Event>>();
94
95                int efgSize = events.size();
96                for (int row = 0; row < efgSize; row++) {
97                        for (int col = 0; col < efgSize; col++) {
98                                int relation = efgGraph.getRow().get(row).getE().get(col);
99                                // otherEvent is followed by currentEvent
100                                if (relation != GUITARConstants.NO_EDGE) {
101                                        List<Event> edge = new LinkedList<Event>();
102                                        edge.add(events.get(row));
103                                        edge.add(events.get(col));
104                                        subsequences.add(edge);
105                                }
106                        }
107                }
108                return subsequences;
109        }
110
111        /**
112         * <p>
113         * Extracts creates {@link EFGEvent} for every event contained in the EFG.
114         * </p>
115         *
116         * @param efg
117         *            EFG for which the events are created
118         * @return list of events
119         */
120        private List<Event> createEvents(EFG efg) {
121                List<EventType> efgEvents = efg.getEvents().getEvent();
122                List<Event> myEvents = new ArrayList<Event>(efgEvents.size());
123                for (EventType event : efgEvents) {
124                        /*
125                         * the widgetId and eventId are only hash values, the
126                         * "interpretation" is found in the GUI file.
127                         */
128                    GUITAREventType type = new GUITAREventType(event.getEventId());
129                    GUITAREventTarget target = new GUITAREventTarget(event.getWidgetId());
130                    Event myEvent = new Event(type, target);
131                    myEvent.addReplayable(new GUITARReplayable(event.getEventId()));
132                }
133                return myEvents;
134        }
135}
Note: See TracBrowser for help on using the repository browser.