TestEnvironment.java 5.24 KB
Newer Older
1 2
package mvd.jester;

3 4
import java.util.ArrayList;
import java.util.LinkedHashMap;
5
import java.util.List;
6
import java.util.Map;
7
import java.util.Set;
8
import mvd.jester.info.SchedulingInfo;
9
import mvd.jester.info.SchedulingInfo.Feasiblity;
10 11 12 13 14 15
import mvd.jester.model.DagTask;
import mvd.jester.model.SortedTaskSet;
import mvd.jester.model.SynchronousTask;
import mvd.jester.model.Task;
import mvd.jester.model.SystemSetup.DagTaskBuilder;
import mvd.jester.model.SystemSetup.SynchronousTaskBuilder;
16
import mvd.jester.priority.PriorityManager;
17 18 19 20 21 22 23
import mvd.jester.tests.AbstractTest;

/**
 * TestEnvironment
 */
public class TestEnvironment {

24

25
    public TestEnvironment() {
26 27
    }

28 29 30 31 32 33
    public <T extends Task> List<AbstractTest<T>> registerTests(final List<AbstractTest<T>> tests) {
        // Set<ResultCollector<AbstractTest<T>>> testSet = new HashSet<>();
        // for (AbstractTest<T> t : tests) {
        // testSet.add(new ResultCollector<AbstractTest<T>>(t.getPriorityManager(), t));
        // }
        return new ArrayList<>(tests);
34 35 36
    }


37 38 39
    public void runExperiments(final SynchronousTaskBuilder builder,
            final Set<ResultCollector<AbstractTest<SynchronousTask>>> abstractTestInstances,
            final long numberOfProcessors, final long numberOfTaskSets) {
40

41
        long checkedTasksets = 0;
42 43
        System.out.print(Math.round((double) checkedTasksets / numberOfTaskSets * 100) + "% of "
                + numberOfTaskSets + " tasksets tested!\r");
44
        while (checkedTasksets < numberOfTaskSets) {
45
            final Set<SynchronousTask> tasks = builder.generateTaskSet();
46

47
            double utilization = tasks.stream().mapToDouble(SynchronousTask::getUtilization).sum();
48

49
            while (utilization <= numberOfProcessors && checkedTasksets < numberOfTaskSets) {
50 51
                checkedTasksets++;

52
                if (checkedTasksets % 10 == 0) {
53 54
                    System.out.print(Math.round((double) checkedTasksets / numberOfTaskSets * 100)
                            + "% of " + numberOfTaskSets + " tasksets tested!\r");
55 56
                }

57 58 59 60
                for (final ResultCollector<AbstractTest<SynchronousTask>> testInstance : abstractTestInstances) {
                    final PriorityManager priorityManager = testInstance.getPriorityManager();
                    final AbstractTest<SynchronousTask> abstractTest =
                            testInstance.getAbstractValue();
61

62
                    final SortedTaskSet<SynchronousTask> sortedTaskSet =
63 64
                            new SortedTaskSet<>(priorityManager);
                    sortedTaskSet.addAll(tasks);
65
                    final SchedulingInfo schedulingInfo =
66
                            abstractTest.runSchedulabilityCheck(sortedTaskSet);
67
                    testInstance.addResult(schedulingInfo);
Michael Schmid committed
68 69
                }

70
                builder.addTask(tasks);
71

72 73 74 75
                utilization = tasks.stream().mapToDouble(SynchronousTask::getUtilization).sum();
            }
        }
        System.out.println("");
76
        final ResultLogger resultLogger = new ResultLogger(numberOfProcessors);
Michael Schmid committed
77

78
        // resultLogger.logTests(abstractTestInstances);
79 80 81
    }


82 83 84
    public void runExperiments(final DagTaskBuilder builder,
            final List<AbstractTest<DagTask>> abstractTestInstances, final long numberOfProcessors,
            final long numberOfTaskSetsPerUtil) {
85 86

        long checkedTasksets = 0;
87
        final long numberOfTaskSets = ((numberOfProcessors * 4) - 3) * numberOfTaskSetsPerUtil;
88

89 90 91
        final ResultLogger resultLogger = new ResultLogger(numberOfProcessors);
        final Map<AbstractTest<DagTask>, Long> resultMap = new LinkedHashMap<>();
        abstractTestInstances.forEach(t -> resultMap.put(t, (long) 0));
92
        for (double util = 1; util <= numberOfProcessors; util += 0.25) {
93 94 95
            resultMap.replaceAll((k, v) -> (long) 0);
            nextTry: for (int i = 0; i < numberOfTaskSetsPerUtil; ++i) {
                final Set<DagTask> taskSet = builder.generateTaskSet(util);
96 97 98

                System.out.print(Math.round((double) checkedTasksets / numberOfTaskSets * 100)
                        + "% of " + numberOfTaskSets + " tasksets tested!\r");
99 100
                for (final AbstractTest<DagTask> testInstance : abstractTestInstances) {
                    final PriorityManager priorityManager = testInstance.getPriorityManager();
101

102 103
                    final SortedTaskSet<DagTask> sortedTaskSet =
                            new SortedTaskSet<>(priorityManager);
104
                    sortedTaskSet.addAll(taskSet);
105 106 107 108 109 110 111 112 113 114 115 116
                    final SchedulingInfo schedulingInfo;
                    try {
                        schedulingInfo = testInstance.runSchedulabilityCheck(sortedTaskSet);
                    } catch (Exception e) {
                        i--;
                        continue nextTry;
                        // TODO: remove this exception
                    }

                    if (schedulingInfo.getFeasibility() == Feasiblity.SUCCEEDED) {
                        resultMap.computeIfPresent(testInstance, (k, v) -> v + 1);
                    }
117 118
                }
                checkedTasksets++;
119
            }
120 121
            resultLogger.logLine(util, resultMap);
            resultLogger.newLine();
122
        }
123
        System.out.println("");
124
        resultLogger.finalize();
125 126
    }
}
Michael Schmid committed
127 128