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

Last change on this file since 94 was 94, checked in by sherbold, 13 years ago

+ added de.ugoe.cs.eventbench.models.generateValidSequences() to IStochasticProcess

  • Property svn:mime-type set to text/plain
File size: 5.6 KB
RevLine 
[13]1package de.ugoe.cs.eventbench.models;
[12]2
[93]3import java.security.InvalidParameterException;
4import java.util.ArrayList;
5import java.util.LinkedHashSet;
[12]6import java.util.LinkedList;
7import java.util.List;
8import java.util.Random;
[80]9import java.util.Set;
[12]10
11import de.ugoe.cs.eventbench.data.Event;
[23]12import de.ugoe.cs.eventbench.models.Trie.Edge;
13import de.ugoe.cs.eventbench.models.Trie.TrieVertex;
14import edu.uci.ics.jung.graph.Tree;
[12]15
[17]16public abstract class TrieBasedModel implements IStochasticProcess {
[12]17
[86]18        /**
19         * Id for object serialization.
20         */
21        private static final long serialVersionUID = 1L;
22
[16]23        protected int trieOrder;
[12]24
25        protected Trie<Event<?>> trie;
26        protected final Random r;
27
28       
[16]29        public TrieBasedModel(int markovOrder, Random r) {
[12]30                super();
[16]31                this.trieOrder = markovOrder+1;
[12]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                       
[16]43                        trie.train(currentSequence, trieOrder);
[12]44                }
45        }
46
[17]47        /* (non-Javadoc)
48         * @see de.ugoe.cs.eventbench.models.IStochasticProcess#randomSequence()
49         */
50        @Override
[12]51        public List<? extends Event<?>> randomSequence() {
52                List<Event<?>> sequence = new LinkedList<Event<?>>();
53               
[16]54                IncompleteMemory<Event<?>> context = new IncompleteMemory<Event<?>>(trieOrder-1);
[12]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;
[16]64                        List<Event<?>> currentContext = context.getLast(trieOrder);
[12]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        }
[23]81       
[30]82        public String getTrieDotRepresentation() {
83                return trie.getDotRepresentation();
84        }
85       
[23]86        public Tree<TrieVertex, Edge> getTrieGraph() {
87                return trie.getGraph();
88        }
[12]89
90        @Override
91        public String toString() {
92                return trie.toString();
93        }
[66]94       
95        public int getNumStates() {
96                return trie.getNumSymbols();
97        }
[70]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        }
[80]108       
[93]109        public Set<? extends Event<?>> getEvents() {
[80]110                return trie.getKnownSymbols();
111        }
[93]112       
113        public Set<List<? extends Event<?>>> generateSequences(int length) {
[94]114                return generateSequences(length, false);
115                /*Set<List<? extends Event<?>>> sequenceSet = new LinkedHashSet<List<? extends Event<?>>>();;
[93]116                if( length<1 ) {
117                        throw new InvalidParameterException("Length of generated subsequences must be at least 1.");
118                }
119                if( length==1 ) {
120                        for( Event<?> event : getEvents() ) {
121                                List<Event<?>> subSeq = new LinkedList<Event<?>>();
122                                subSeq.add(event);
123                                sequenceSet.add(subSeq);
124                        }
125                        return sequenceSet;
126                }
127                Set<? extends Event<?>> events = getEvents();
128                Set<List<? extends Event<?>>> seqsShorter = generateSequences(length-1);
129                for( Event<?> event : events ) {
130                        for( List<? extends Event<?>> seqShorter : seqsShorter ) {
131                                Event<?> lastEvent = event;
132                                if( getProbability(seqShorter, lastEvent)>0.0 ) {
133                                        List<Event<?>> subSeq = new ArrayList<Event<?>>(seqShorter);
134                                        subSeq.add(lastEvent);
135                                        sequenceSet.add(subSeq);
136                                }
137                        }
138                }
139                return sequenceSet;
[94]140                */
[93]141        }
[94]142       
143        // if startValid, all sequences will start in Event.STARTEVENT
144        public Set<List<? extends Event<?>>> generateSequences(int length, boolean fromStart) {
145                Set<List<? extends Event<?>>> sequenceSet = new LinkedHashSet<List<? extends Event<?>>>();;
146                if( length<1 ) {
147                        throw new InvalidParameterException("Length of generated subsequences must be at least 1.");
148                }
149                if( length==1 ) {
150                        if( fromStart ) {
151                                List<Event<?>> subSeq = new LinkedList<Event<?>>();
152                                subSeq.add(Event.STARTEVENT);
153                        } else {
154                                for( Event<?> event : getEvents() ) {
155                                        List<Event<?>> subSeq = new LinkedList<Event<?>>();
156                                        subSeq.add(event);
157                                        sequenceSet.add(subSeq);
158                                }
159                        }
160                        return sequenceSet;
161                }
162                Set<? extends Event<?>> events = getEvents();
163                Set<List<? extends Event<?>>> seqsShorter = generateSequences(length-1);
164                for( Event<?> event : events ) {
165                        for( List<? extends Event<?>> seqShorter : seqsShorter ) {
166                                Event<?> lastEvent = event;
167                                if( getProbability(seqShorter, lastEvent)>0.0 ) {
168                                        List<Event<?>> subSeq = new ArrayList<Event<?>>(seqShorter);
169                                        subSeq.add(lastEvent);
170                                        sequenceSet.add(subSeq);
171                                }
172                        }
173                }
174                return sequenceSet;
175        }
176       
177        // sequences from start to end
178        public Set<List<? extends Event<?>>> generateValidSequences(int length) {
179                // check for min-length implicitly done by generateSequences
180                Set<List<? extends Event<?>>> validSequences = generateSequences(length, true);
181                for( List<? extends Event<?>> sequence : validSequences ) {
182                        if( sequence.size()!=length ) {
183                                validSequences.remove(sequence);
184                        } else {
185                                if( !Event.ENDEVENT.equals(sequence.get(sequence.size()-1)) ) {
186                                        validSequences.remove(sequence);
187                                }
188                        }
189                }
190                return validSequences;
191        }
[12]192
193}
Note: See TracBrowser for help on using the repository browser.