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

Last change on this file since 93 was 93, checked in by sherbold, 13 years ago
  • moved generation of all possible sequences of a fixed length from de.ugoe.cs.eventbench.coverage.CoverageCalculator? to de.ugoe.cs.eventbench.models.IStochasticProcess
  • Property svn:mime-type set to text/plain
File size: 3.8 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
16public abstract class TrieBasedModel implements IStochasticProcess {
17
18        /**
19         * Id for object serialization.
20         */
21        private static final long serialVersionUID = 1L;
22
23        protected int trieOrder;
24
25        protected Trie<Event<?>> trie;
26        protected final Random r;
27
28       
29        public TrieBasedModel(int markovOrder, Random r) {
30                super();
31                this.trieOrder = markovOrder+1;
32                this.r = r;
33        }
34
35        public void train(List<List<Event<?>>> sequences) {
36                trie = new Trie<Event<?>>();
37               
38                for(List<Event<?>> sequence : sequences) {
39                        List<Event<?>> currentSequence = new LinkedList<Event<?>>(sequence); // defensive copy
40                        currentSequence.add(0, Event.STARTEVENT);
41                        currentSequence.add(Event.ENDEVENT);
42                       
43                        trie.train(currentSequence, trieOrder);
44                }
45        }
46
47        /* (non-Javadoc)
48         * @see de.ugoe.cs.eventbench.models.IStochasticProcess#randomSequence()
49         */
50        @Override
51        public List<? extends Event<?>> randomSequence() {
52                List<Event<?>> sequence = new LinkedList<Event<?>>();
53               
54                IncompleteMemory<Event<?>> context = new IncompleteMemory<Event<?>>(trieOrder-1);
55                context.add(Event.STARTEVENT);
56               
57                Event<?> currentState = Event.STARTEVENT;
58               
59                boolean endFound = false;
60               
61                while(!endFound) {
62                        double randVal = r.nextDouble();
63                        double probSum = 0.0;
64                        List<Event<?>> currentContext = context.getLast(trieOrder);
65                        for( Event<?> symbol : trie.getKnownSymbols() ) {
66                                probSum += getProbability(currentContext, symbol);
67                                if( probSum>=randVal ) {
68                                        endFound = (symbol==Event.ENDEVENT);
69                                        if( !(symbol==Event.STARTEVENT || symbol==Event.ENDEVENT) ) {
70                                                // only add the symbol the sequence if it is not START or END
71                                                context.add(symbol);
72                                                currentState = symbol;
73                                                sequence.add(currentState);
74                                        }
75                                        break;
76                                }
77                        }
78                }
79                return sequence;
80        }
81       
82        public String getTrieDotRepresentation() {
83                return trie.getDotRepresentation();
84        }
85       
86        public Tree<TrieVertex, Edge> getTrieGraph() {
87                return trie.getGraph();
88        }
89
90        @Override
91        public String toString() {
92                return trie.toString();
93        }
94       
95        public int getNumStates() {
96                return trie.getNumSymbols();
97        }
98       
99        public String[] getStateStrings() {
100                String[] stateStrings = new String[getNumStates()];
101                int i=0;
102                for( Event<?> symbol : trie.getKnownSymbols() ) {
103                        stateStrings[i] = symbol.toString();
104                        i++;
105                }
106                return stateStrings;
107        }
108       
109        public Set<? extends Event<?>> getEvents() {
110                return trie.getKnownSymbols();
111        }
112       
113        public Set<List<? extends Event<?>>> generateSequences(int length) {
114                Set<List<? extends Event<?>>> sequenceSet = new LinkedHashSet<List<? extends Event<?>>>();;
115                if( length<1 ) {
116                        throw new InvalidParameterException("Length of generated subsequences must be at least 1.");
117                }
118                if( length==1 ) {
119                        for( Event<?> event : getEvents() ) {
120                                List<Event<?>> subSeq = new LinkedList<Event<?>>();
121                                subSeq.add(event);
122                                sequenceSet.add(subSeq);
123                        }
124                        return sequenceSet;
125                }
126                Set<? extends Event<?>> events = getEvents();
127                Set<List<? extends Event<?>>> seqsShorter = generateSequences(length-1);
128                for( Event<?> event : events ) {
129                        for( List<? extends Event<?>> seqShorter : seqsShorter ) {
130                                Event<?> lastEvent = event;
131                                if( getProbability(seqShorter, lastEvent)>0.0 ) {
132                                        List<Event<?>> subSeq = new ArrayList<Event<?>>(seqShorter);
133                                        subSeq.add(lastEvent);
134                                        sequenceSet.add(subSeq);
135                                }
136                        }
137                }
138                return sequenceSet;
139        }
140
141}
Note: See TracBrowser for help on using the repository browser.