SystemSetup.java 6.17 KB
Newer Older
1 2
package mvd.jester.model;

3
import java.io.IOException;
4
import java.io.PrintWriter;
5 6 7
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
8
import java.util.HashSet;
9 10 11
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.concurrent.ThreadLocalRandom;
12 13
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
14 15 16 17 18

/**
 * TaskSet
 */
public class SystemSetup {
19
    private Set<Task> tasks;
20 21
    private final long numberOfProcessors;

22
    public SystemSetup(Set<Task> tasks, long numberOfProcessors) {
23 24 25 26 27 28 29
        this.tasks = tasks;
        this.numberOfProcessors = numberOfProcessors;
    }

    /**
     * @return the tasks
     */
30
    public Set<Task> getTasks() {
31 32 33
        return tasks;
    }

34
    public void setTasks(Set<Task> tasks) {
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
        this.tasks = tasks;
    }

    /**
     * @return the numberOfProcessors
     */
    public long getNumberOfProcessors() {
        return numberOfProcessors;
    }

    public double getUtilization() {
        double utilization = 0;
        for (Task t : tasks) {
            utilization += (double) t.getMaximumWcet() / t.getPeriod();
        }

        return utilization;
    }

54 55 56 57 58 59
    @Override
    public String toString() {
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        return gson.toJson(tasks);
    }

60 61 62 63 64 65 66 67 68
    public void writeToFile(String path) {
        try (PrintWriter pw = new PrintWriter(path)) {
            pw.write(toString());
        } catch (Exception e) {
            System.err.println("Something went wrong when writing to file!");
        }
    }

    public static SystemSetup readFromFile(String path) {
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
        String jsonString;
        try {
            byte[] encoded = Files.readAllBytes(Paths.get(path));
            jsonString = new String(encoded, Charset.defaultCharset());
        } catch (IOException e) {
            System.out.println(e.getMessage());
            jsonString = new String("");
        }
        return SystemSetup.fromString(jsonString);
    }

    public static SystemSetup fromString(String json) {
        Gson gson = new GsonBuilder()
                .registerTypeAdapter(SortedTaskSet.class, new SortedTaskSet.Deserializer())
                .create();

        SortedTaskSet tasks = gson.fromJson(json, SortedTaskSet.class);
        return new SystemSetup(tasks, 8);
    }

89
    public static class Builder {
90 91 92 93 94 95 96 97 98 99
        private long numberOfProcessors = 4;
        private long minPeriod = 100;
        private long maxPeriod = 1000;
        private long minNumberOfSegments = 3;
        private long maxNumberOfSegments = 7;
        private long minNumberOfJobs = 2;
        private long maxNumberOfJobs = 3 * numberOfProcessors / 2;
        private long minWcet = 1;
        private long ratio = randomTaskRatio();

100
        public Builder() {
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116

        }

        private long randomTaskPeriod() {
            return ThreadLocalRandom.current().nextLong(minPeriod, maxPeriod);
        }

        private long randomTaskRatio() {
            return ThreadLocalRandom.current().nextLong(0, 100);
        }

        private long randomNumberOfSegments() {
            return ThreadLocalRandom.current().nextLong(minNumberOfSegments, maxNumberOfSegments);
        }

        private long randomNumberOfJobs() {
117
            this.maxNumberOfJobs = 3 * this.numberOfProcessors / 2;
118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
            return ThreadLocalRandom.current().nextLong(minNumberOfJobs, maxNumberOfJobs);
        }

        private long randomWcet(long period, long numberOfSegments) {
            long maxWcet = period / numberOfSegments;

            return ThreadLocalRandom.current().nextLong(minWcet, maxWcet);
        }

        private Task generateTask() {
            boolean serial = randomTaskRatio() > this.ratio;
            long period = randomTaskPeriod();
            long numberOfSegments = 1;
            Set<Segment> segments = new LinkedHashSet<Segment>();
            if (!serial) {
                numberOfSegments = randomNumberOfSegments();
            } else {
                numberOfSegments = 1;
            }
137
            long parallelNumberOfJobs = serial ? 1 : randomNumberOfJobs();
138
            for (int i = 0; i < numberOfSegments; ++i) {
139 140 141 142
                long numberOfJobs = 1;
                if (i % 2 == 1) {
                    numberOfJobs = parallelNumberOfJobs;
                }
143 144 145 146 147 148
                long wcet = randomWcet(period, numberOfSegments);
                segments.add(new Segment(wcet, numberOfJobs));
            }
            return new Task(period, segments);
        }

149 150 151
        private Set<Task> generateTaskSet() {
            // SortedTaskSet taskSet = new SortedTaskSet(priorityManager);
            Set<Task> taskSet = new HashSet<>();
152 153 154 155 156 157 158 159 160 161 162

            for (int i = 0; i < 4; ++i) {
                Task task = generateTask();
                taskSet.add(task);
            }

            return taskSet;
        }

        public SystemSetup build() {
            this.ratio = randomTaskRatio();
163
            Set<Task> taskSet = generateTaskSet();
164 165 166
            return new SystemSetup(taskSet, numberOfProcessors);
        }

167 168 169
        public void rebuild(SystemSetup systemSetup) {
            this.ratio = randomTaskRatio();
            systemSetup.tasks = generateTaskSet();
170 171
        }

172 173
        public void addTask(SystemSetup systemSetup) {
            systemSetup.tasks.add(generateTask());
174 175
        }

176 177 178 179 180
        public Builder setNumberOfProcessors(long numberOfProcessors) {
            this.numberOfProcessors = numberOfProcessors;

            return this;
        }
181

182
        public Builder setNumberOfSegments(long minNumberOfSegments, long maxNumberOfSegments) {
183 184 185 186 187 188
            this.minNumberOfSegments = minNumberOfSegments;
            this.maxNumberOfSegments = maxNumberOfSegments;

            return this;
        }

189
        public Builder setPeriods(long minPeriod, long maxPeriod) {
190 191 192 193 194 195 196 197 198
            this.minPeriod = minPeriod;
            this.maxPeriod = maxPeriod;

            return this;
        }

        /**
         * @param maxNumberOfJobs the maxNumberOfJobs to set
         */
199
        public Builder setNumberOfJobs(long minNumberOfJobs, long maxNumberOfJobs) {
200 201 202 203 204 205 206
            this.minNumberOfJobs = minNumberOfJobs;
            this.maxNumberOfJobs = maxNumberOfJobs;
            return this;
        }

    }
}