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

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