Changeset 120


Ignore:
Timestamp:
07/13/11 11:32:29 (13 years ago)
Author:
sherbold
Message:

+ added command generateFixedLengthSequences to generate sequences of a fixed length. This command first generates all possible sequences. In case not all of them are required, it draws from them according to their probabilities. Does not scale well, as the number of possible sequences grows exponentially.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/commands/CMDgenerateFixedLengthSequences.java

    r103 r120  
    22 
    33import java.security.InvalidParameterException; 
     4import java.util.ArrayList; 
    45import java.util.Collection; 
     6import java.util.HashSet; 
     7import java.util.LinkedHashSet; 
     8import java.util.LinkedList; 
    59import java.util.List; 
     10import java.util.Random; 
     11import java.util.Set; 
    612 
    713import de.ugoe.cs.eventbench.data.Event; 
     
    1723                String modelname; 
    1824                String sequencesName; 
    19                 int length; 
     25                int minLength; 
     26                int maxLength; 
     27                boolean all = true; 
     28                int numSequences = -1; 
    2029                try { 
    2130                        modelname = (String) parameters.get(0); 
    2231                        sequencesName = (String) parameters.get(1); 
    23                         length = Integer.parseInt((String) parameters.get(2)); 
     32                        minLength = Integer.parseInt((String) parameters.get(2)); 
     33                        maxLength = Integer.parseInt((String) parameters.get(3)); 
     34                        if( parameters.size()>=5 ) { 
     35                                all = Boolean.parseBoolean((String) parameters.get(4)); 
     36                        } 
     37                        if( parameters.size()==6 ) { 
     38                                numSequences = Integer.parseInt((String) parameters.get(5));  
     39                        } 
    2440                } 
    2541                catch (Exception e) { 
     
    3652                } else { 
    3753                        model = (IStochasticProcess) dataObject; 
    38                         Collection<List<? extends Event<?>>> sequences = model.generateValidSequences(length+2); 
     54                        Collection<List<? extends Event<?>>> sequences = new LinkedHashSet<List<? extends Event<?>>>(); 
     55                        for( int length=minLength; length<maxLength; length++ ) { 
     56                                sequences.addAll(model.generateValidSequences(length+2)); 
     57                        } 
     58                        Console.traceln("" + sequences.size() + " possible"); 
     59                        if( !all && numSequences<sequences.size() ) { 
     60                                List<Double> probabilities = new ArrayList<Double>(sequences.size()); 
     61                                double probSum = 0.0; 
     62                                for( List<? extends Event<?>> sequence : sequences ) { 
     63                                        double prob = model.getProbability(sequence); 
     64                                        probabilities.add(prob); 
     65                                        probSum += prob; 
     66                                } 
     67                                Set<Integer> drawnSequences = new HashSet<Integer>(numSequences); 
     68                                Random r = new Random(); 
     69                                while( drawnSequences.size()<numSequences ) { 
     70                                        double randVal = r.nextDouble()*probSum; 
     71                                        double sum = 0.0d; 
     72                                        int index = -1; 
     73                                        while( sum<randVal ) { 
     74                                                index++; 
     75                                                double currentProb = probabilities.get(index); 
     76                                                sum += currentProb; 
     77                                        } 
     78                                        if( !drawnSequences.contains(index) ) { 
     79                                                drawnSequences.add(index); 
     80                                                probSum -= probabilities.get(index); 
     81                                                probabilities.set(index, 0.0d); 
     82                                        } 
     83                                } 
     84                                Collection<List<? extends Event<?>>> retainedSequences = new LinkedList<List<? extends Event<?>>>(); 
     85                                int index = 0; 
     86                                for( List<? extends Event<?>> sequence : sequences) { 
     87                                        if( drawnSequences.contains(index) ) { 
     88                                                retainedSequences.add(sequence); 
     89                                        } 
     90                                        index++; 
     91                                } 
     92                                sequences = retainedSequences; 
     93                        } 
    3994                        if( GlobalDataContainer.getInstance().addData(sequencesName, sequences) ) { 
    4095                                Console.traceln("Old data \"" + sequencesName + "\" overwritten"); 
    4196                        } 
     97                        Console.println("" + sequences.size() + " sequences generated"); 
    4298                } 
    4399        } 
     
    45101        @Override 
    46102        public void help() { 
    47                 Console.println("Usage: generateFixedLengthSequences <modelname> <sequencesName> <length>"); 
     103                Console.println("Usage: generateFixedLengthSequences <modelname> <sequencesName> <length> {<all>} {<numSequences>}"); 
    48104        } 
    49105 
Note: See TracChangeset for help on using the changeset viewer.