source: trunk/EventBenchCore/src/de/ugoe/cs/eventbench/coverage/CoverageCalculator.java @ 102

Last change on this file since 102 was 102, checked in by sherbold, 13 years ago
  • replaced java.util.Set and Java.util.List with java.util.Collection where possible
  • Property svn:mime-type set to text/plain
File size: 3.7 KB
Line 
1package de.ugoe.cs.eventbench.coverage;
2
3import java.util.Collection;
4import java.util.LinkedHashMap;
5import java.util.LinkedHashSet;
6import java.util.LinkedList;
7import java.util.List;
8import java.util.Map;
9import java.util.Set;
10
11import de.ugoe.cs.eventbench.data.Event;
12import de.ugoe.cs.eventbench.models.IStochasticProcess;
13
14public class CoverageCalculator {
15       
16        private final IStochasticProcess process;
17        private final Collection<List<? extends Event<?>>> sequences;
18        private final int length;
19       
20        private Collection<List<? extends Event<?>>> containedSubSeqs = null;
21        private Collection<List<? extends Event<?>>> allPossibleSubSeqs = null;
22        private Map<List<? extends Event<?>>, Double> subSeqWeights = null;
23       
24       
25        public CoverageCalculator(IStochasticProcess process, Collection<List<? extends Event<?>>> sequences, int length) {
26                this.process = process;
27                this.sequences = sequences;
28                this.length = length;
29        }
30       
31
32        public double getCoverageAllNoWeight() {
33                if( containedSubSeqs==null ) {
34                        containedSubSeqs = containedSubSequences(sequences, length);
35                }
36                return((double) containedSubSeqs.size())/numSequences(process, length);
37        }
38       
39        public double getCoveragePossibleNoWeight() {
40                if( containedSubSeqs==null ) {
41                        containedSubSeqs = containedSubSequences(sequences, length);
42                }
43                if( allPossibleSubSeqs==null ) {
44                        allPossibleSubSeqs = process.generateSequences(length);
45                }
46                return((double) containedSubSeqs.size())/allPossibleSubSeqs.size();
47        }
48       
49        public double getCoveragePossibleWeight() {
50                if( containedSubSeqs==null ) {
51                        containedSubSeqs = containedSubSequences(sequences, length);
52                }
53                if( allPossibleSubSeqs==null ) {
54                        allPossibleSubSeqs = process.generateSequences(length);
55                }
56                if( subSeqWeights==null ) {
57                        subSeqWeights = generateWeights(process, allPossibleSubSeqs);
58                }
59                double weight = 0.0;
60                for( List<? extends Event<?>> subSeq : containedSubSeqs ) {
61                        weight += subSeqWeights.get(subSeq);
62                }
63                return weight;
64        }
65       
66        private Map<List<? extends Event<?>>, Double> generateWeights(IStochasticProcess process, Collection<List<? extends Event<?>>> sequences) {
67                Map<List<? extends Event<?>>, Double> subSeqWeights = new LinkedHashMap<List<? extends Event<?>>, Double>();
68                double sum = 0.0;
69                for( List<? extends Event<?>> sequence : sequences ) {
70                        double prob = 1.0;
71                        List<Event<?>> context = new LinkedList<Event<?>>();
72                        for( Event<?> event : sequence ) {
73                                prob *= process.getProbability(context, event);
74                                context.add(event);
75                        }
76                        subSeqWeights.put(sequence, prob);
77                        sum += prob;
78                }
79                if( sum<1.0 ) {
80                        for( Map.Entry<List<? extends Event<?>>, Double> entry : subSeqWeights.entrySet() ) {
81                                entry.setValue(entry.getValue()/sum);
82                        }
83                }
84                return subSeqWeights;
85        }
86       
87        private long numSequences(IStochasticProcess process, int length) {
88                return (long) Math.pow(process.getNumStates(), length);
89        }
90       
91        // O(numSeq*lenSeq)     
92        private Set<List<? extends Event<?>>> containedSubSequences(Collection<List<? extends Event<?>>> sequences, int length) {
93                Set<List<? extends Event<?>>> containedSubSeqs = new LinkedHashSet<List<? extends Event<?>>>();
94                List<Event<?>> subSeq = new LinkedList<Event<?>>();
95                boolean minLengthReached = false;
96                for( List<? extends Event<?>> sequence : sequences ) {
97                        for( Event<?> event : sequence ) {
98                                subSeq.add(event);
99                                if( !minLengthReached ) {
100                                        if( subSeq.size()==length ) {
101                                                minLengthReached=true;
102                                        }
103                                } else {
104                                        subSeq.remove(0);
105                                }
106                                if( minLengthReached ) {
107                                        if( !containedSubSeqs.contains(subSeq) ) {
108                                                containedSubSeqs.add(new LinkedList<Event<?>>(subSeq));
109                                        }
110                                }
111                        }
112                }
113                return containedSubSeqs;
114        }
115       
116}
Note: See TracBrowser for help on using the repository browser.