source: trunk/EventBenchCore/src/de/ugoe/cs/eventbench/models/TrieBasedModel.java @ 100

Last change on this file since 100 was 100, checked in by sherbold, 13 years ago
  • code documentation
  • Property svn:mime-type set to text/plain
File size: 7.2 KB
Line 
1package de.ugoe.cs.eventbench.models;
2
3import java.security.InvalidParameterException;
4import java.util.ArrayList;
5import java.util.LinkedHashSet;
6import java.util.LinkedList;
7import java.util.List;
8import java.util.Random;
9import java.util.Set;
10
11import de.ugoe.cs.eventbench.data.Event;
12import de.ugoe.cs.eventbench.models.Trie.Edge;
13import de.ugoe.cs.eventbench.models.Trie.TrieVertex;
14import edu.uci.ics.jung.graph.Tree;
15
16/**
17 * <p>
18 * Implements a skeleton for stochastic processes that can calculate
19 * probabilities based on a trie. The skeleton provides all functionalities of
20 * {@link IStochasticProcess} except
21 * {@link IStochasticProcess#getProbability(List, Event)}.
22 * </p>
23 *
24 * @author Steffen Herbold
25 * @version 1.0
26 */
27public abstract class TrieBasedModel implements IStochasticProcess {
28
29        /**
30         * <p>
31         * Id for object serialization.
32         * </p>
33         */
34        private static final long serialVersionUID = 1L;
35
36        /**
37         * <p>
38         * The order of the trie, i.e., the maximum length of subsequences stored in
39         * the trie.
40         * </p>
41         */
42        protected int trieOrder;
43
44        /**
45         * <p>
46         * Trie on which the probability calculations are based.
47         * </p>
48         */
49        protected Trie<Event<?>> trie;
50
51        /**
52         * <p>
53         * Random number generator used by probabilistic sequence generation
54         * methods.
55         * </p>
56         */
57        protected final Random r;
58
59        /**
60         * <p>
61         * Constructor. Creates a new TrieBasedModel that can be used for stochastic
62         * processes with a Markov order less than or equal to {@code markovOrder}.
63         * </p>
64         *
65         * @param markovOrder
66         *            Markov order of the model
67         * @param r
68         *            random number generator used by probabilistic methods of the
69         *            class
70         */
71        public TrieBasedModel(int markovOrder, Random r) {
72                super();
73                this.trieOrder = markovOrder + 1;
74                this.r = r;
75        }
76
77        /**
78         * <p>
79         * Trains the model by generating a trie from which probabilities are
80         * calculated.
81         * </p>
82         *
83         * @param sequences
84         *            training data
85         */
86        public void train(List<List<Event<?>>> sequences) {
87                trie = new Trie<Event<?>>();
88
89                for (List<Event<?>> sequence : sequences) {
90                        List<Event<?>> currentSequence = new LinkedList<Event<?>>(sequence); // defensive
91                                                                                                                                                                        // copy
92                        currentSequence.add(0, Event.STARTEVENT);
93                        currentSequence.add(Event.ENDEVENT);
94
95                        trie.train(currentSequence, trieOrder);
96                }
97        }
98
99        /*
100         * (non-Javadoc)
101         *
102         * @see de.ugoe.cs.eventbench.models.IStochasticProcess#randomSequence()
103         */
104        @Override
105        public List<? extends Event<?>> randomSequence() {
106                List<Event<?>> sequence = new LinkedList<Event<?>>();
107
108                IncompleteMemory<Event<?>> context = new IncompleteMemory<Event<?>>(
109                                trieOrder - 1);
110                context.add(Event.STARTEVENT);
111
112                Event<?> currentState = Event.STARTEVENT;
113
114                boolean endFound = false;
115
116                while (!endFound) {
117                        double randVal = r.nextDouble();
118                        double probSum = 0.0;
119                        List<Event<?>> currentContext = context.getLast(trieOrder);
120                        for (Event<?> symbol : trie.getKnownSymbols()) {
121                                probSum += getProbability(currentContext, symbol);
122                                if (probSum >= randVal) {
123                                        endFound = (symbol == Event.ENDEVENT);
124                                        if (!(symbol == Event.STARTEVENT || symbol == Event.ENDEVENT)) {
125                                                // only add the symbol the sequence if it is not START
126                                                // or END
127                                                context.add(symbol);
128                                                currentState = symbol;
129                                                sequence.add(currentState);
130                                        }
131                                        break;
132                                }
133                        }
134                }
135                return sequence;
136        }
137
138        /**
139         * <p>
140         * Returns a Dot representation of the internal trie.
141         * </p>
142         *
143         * @return dot representation of the internal trie
144         */
145        public String getTrieDotRepresentation() {
146                return trie.getDotRepresentation();
147        }
148
149        /**
150         * <p>
151         * Returns a {@link Tree} of the internal trie that can be used for
152         * visualization.
153         * </p>
154         *
155         * @return {@link Tree} depicting the internal trie
156         */
157        public Tree<TrieVertex, Edge> getTrieGraph() {
158                return trie.getGraph();
159        }
160
161        /**
162         * <p>
163         * The string representation of the model is {@link Trie#toString()} of
164         * {@link #trie}.
165         * </p>
166         *
167         * @see java.lang.Object#toString()
168         */
169        @Override
170        public String toString() {
171                return trie.toString();
172        }
173
174        /*
175         * (non-Javadoc)
176         *
177         * @see de.ugoe.cs.eventbench.models.IStochasticProcess#getNumStates()
178         */
179        @Override
180        public int getNumStates() {
181                return trie.getNumSymbols();
182        }
183
184        /*
185         * (non-Javadoc)
186         *
187         * @see de.ugoe.cs.eventbench.models.IStochasticProcess#getStateStrings()
188         */
189        @Override
190        public String[] getStateStrings() {
191                String[] stateStrings = new String[getNumStates()];
192                int i = 0;
193                for (Event<?> symbol : trie.getKnownSymbols()) {
194                        stateStrings[i] = symbol.toString();
195                        i++;
196                }
197                return stateStrings;
198        }
199
200        /*
201         * (non-Javadoc)
202         *
203         * @see de.ugoe.cs.eventbench.models.IStochasticProcess#getEvents()
204         */
205        @Override
206        public Set<? extends Event<?>> getEvents() {
207                return trie.getKnownSymbols();
208        }
209
210        /*
211         * (non-Javadoc)
212         *
213         * @see
214         * de.ugoe.cs.eventbench.models.IStochasticProcess#generateSequences(int)
215         */
216        @Override
217        public Set<List<? extends Event<?>>> generateSequences(int length) {
218                return generateSequences(length, false);
219        }
220
221        /*
222         * (non-Javadoc)
223         *
224         * @see
225         * de.ugoe.cs.eventbench.models.IStochasticProcess#generateSequences(int,
226         * boolean)
227         */
228        @Override
229        public Set<List<? extends Event<?>>> generateSequences(int length,
230                        boolean fromStart) {
231                Set<List<? extends Event<?>>> sequenceSet = new LinkedHashSet<List<? extends Event<?>>>();
232                ;
233                if (length < 1) {
234                        throw new InvalidParameterException(
235                                        "Length of generated subsequences must be at least 1.");
236                }
237                if (length == 1) {
238                        if (fromStart) {
239                                List<Event<?>> subSeq = new LinkedList<Event<?>>();
240                                subSeq.add(Event.STARTEVENT);
241                                sequenceSet.add(subSeq);
242                        } else {
243                                for (Event<?> event : getEvents()) {
244                                        List<Event<?>> subSeq = new LinkedList<Event<?>>();
245                                        subSeq.add(event);
246                                        sequenceSet.add(subSeq);
247                                }
248                        }
249                        return sequenceSet;
250                }
251                Set<? extends Event<?>> events = getEvents();
252                Set<List<? extends Event<?>>> seqsShorter = generateSequences(
253                                length - 1, fromStart);
254                for (Event<?> event : events) {
255                        for (List<? extends Event<?>> seqShorter : seqsShorter) {
256                                Event<?> lastEvent = event;
257                                if (getProbability(seqShorter, lastEvent) > 0.0) {
258                                        List<Event<?>> subSeq = new ArrayList<Event<?>>(seqShorter);
259                                        subSeq.add(lastEvent);
260                                        sequenceSet.add(subSeq);
261                                }
262                        }
263                }
264                return sequenceSet;
265        }
266
267        /*
268         * (non-Javadoc)
269         *
270         * @see
271         * de.ugoe.cs.eventbench.models.IStochasticProcess#generateValidSequences
272         * (int)
273         */
274        @Override
275        public Set<List<? extends Event<?>>> generateValidSequences(int length) {
276                // check for min-length implicitly done by generateSequences
277                Set<List<? extends Event<?>>> allSequences = generateSequences(length,
278                                true);
279                Set<List<? extends Event<?>>> validSequences = new LinkedHashSet<List<? extends Event<?>>>();
280                for (List<? extends Event<?>> sequence : allSequences) {
281                        if (sequence.size() == length
282                                        && Event.ENDEVENT.equals(sequence.get(sequence.size() - 1))) {
283                                validSequences.add(sequence);
284                        }
285                }
286                return validSequences;
287        }
288
289}
Note: See TracBrowser for help on using the repository browser.