source: trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/commands/CMDgenerateGreedy.java @ 293

Last change on this file since 293 was 293, checked in by sherbold, 13 years ago
  • finished command generateGreedy
  • Property svn:mime-type set to text/plain
File size: 4.5 KB
Line 
1package de.ugoe.cs.eventbench.commands;
2
3import java.security.InvalidParameterException;
4import java.util.ArrayList;
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.CommandHelpers;
12import de.ugoe.cs.eventbench.coverage.CoverageCalculatorProcess;
13import de.ugoe.cs.eventbench.coverage.SequenceTools;
14import de.ugoe.cs.eventbench.data.Event;
15import de.ugoe.cs.eventbench.data.GlobalDataContainer;
16import de.ugoe.cs.eventbench.models.IStochasticProcess;
17import de.ugoe.cs.util.ArrayTools;
18import de.ugoe.cs.util.console.Command;
19import de.ugoe.cs.util.console.Console;
20
21/**
22 * <p>
23 * Command to generate test suite with a greedy strategy to achieve a desired coverage.
24 * </p>
25 * @author Steffen Herbold
26 * @version 1.0
27 */
28public class CMDgenerateGreedy implements Command {
29       
30        final double eps = 0.000000000001;
31
32        @Override
33        public void run(List<Object> parameters) {
34                String modelname;
35                String sequencesName;
36                int minLength;
37                int maxLength;
38                int coverageDepth;
39                float desiredCoverage;
40                try {
41                        modelname = (String) parameters.get(0);
42                        sequencesName = (String) parameters.get(1);
43                        minLength = Integer.parseInt((String) parameters.get(2));
44                        maxLength = Integer.parseInt((String) parameters.get(3));
45                        coverageDepth = Integer.parseInt((String) parameters.get(4));
46                        desiredCoverage = Float.parseFloat((String) parameters.get(5));
47                } catch (Exception e) {
48                        throw new InvalidParameterException();
49                }
50
51                IStochasticProcess model = null;
52                Object dataObject = GlobalDataContainer.getInstance()
53                                .getData(modelname);
54                if (dataObject == null) {
55                        CommandHelpers.objectNotFoundMessage(modelname);
56                        return;
57                } else if (!(dataObject instanceof IStochasticProcess)) {
58                        CommandHelpers.objectNotType(modelname, "IStochasticProcess");
59                        return;
60                }
61                model = (IStochasticProcess) dataObject;
62               
63                // set up everything
64                List<List<? extends Event<?>>> allSequences = new ArrayList<List<? extends Event<?>>>();
65                for (int length = minLength; length <= maxLength; length++) {
66                        allSequences.addAll(model.generateValidSequences(length + 2));
67                }
68                Console.traceln("" + allSequences.size() + " possible");
69               
70                Set<List<? extends Event<?>>> allSubSeqs = SequenceTools.containedSubSequences(allSequences, coverageDepth);
71                Map<List<? extends Event<?>>, Double> weightMap = SequenceTools.generateWeights(model, allSubSeqs);
72                Set<List<? extends Event<?>>> coveredSubSeqs = new LinkedHashSet<List<? extends Event<?>>>();
73               
74                List<Set<List<? extends Event<?>>>> containedSubSeqs = new ArrayList<Set<List<? extends Event<?>>>>(allSequences.size());
75                for( List<? extends Event<?>> sequence : allSequences ) {
76                        List<List<? extends Event<?>>>  wrapper = new LinkedList<List<? extends Event<?>>>();
77                        wrapper.add(sequence);
78                        Set<List<? extends Event<?>>> currentSubSeqs = SequenceTools.containedSubSequences(wrapper, coverageDepth);
79                        containedSubSeqs.add(currentSubSeqs);
80                }
81               
82                Double[] sequenceGain = new Double[allSequences.size()];
83                List<List<? extends Event<?>>> testSuite = new LinkedList<List<? extends Event<?>>>();
84                CoverageCalculatorProcess coverageCalculator = new CoverageCalculatorProcess(model, testSuite, coverageDepth);
85                double currentCoverage = 0.0d;
86               
87                // Build test suite
88                while( currentCoverage<desiredCoverage ) {
89                        for( int i=0 ; i<allSequences.size() ; i++ ) {
90                                double gain = 0.0d;
91                                for( List<? extends Event<?>> subSeq : containedSubSeqs.get(i) ) {
92                                        if( !coveredSubSeqs.contains(subSeq) ) {
93                                                gain += weightMap.get(subSeq);
94                                        }
95                                }
96                                sequenceGain[i] = gain;
97                        }
98                        int maxIndex = ArrayTools.findMax(sequenceGain);
99                        if( sequenceGain[maxIndex] <= 0.0+eps ) {
100                                Console.traceln("No gain anymore! Desired coverage cannot be satisfied!");
101                                break;
102                        }
103                        testSuite.add(allSequences.get(maxIndex));
104                        coveredSubSeqs.addAll(containedSubSeqs.get(maxIndex));
105                        coverageCalculator.setSequences(testSuite);
106                        currentCoverage = coverageCalculator.getCoveragePossibleWeight();
107                }
108               
109                if (GlobalDataContainer.getInstance().addData(sequencesName, testSuite)) {
110                        CommandHelpers.dataOverwritten(sequencesName);
111                }
112                Console.println("" + testSuite.size() + " sequences generated");
113                Console.println("" + currentCoverage + " coverage achieved");
114        }
115
116        @Override
117        public void help() {
118                Console.println("generateGreedy <modelname> <sequencesName> <minLength> <maxLength> <coverageDepth> <desiredCoverage>");
119        }
120
121}
Note: See TracBrowser for help on using the repository browser.