Commit c5bc69e2 by Michael Schmid

nfj creation now works

parent 471ee8c4
...@@ -6,8 +6,6 @@ import mvd.jester.model.DagTask; ...@@ -6,8 +6,6 @@ import mvd.jester.model.DagTask;
import mvd.jester.model.SystemSetup; import mvd.jester.model.SystemSetup;
import mvd.jester.tests.AbstractTest; import mvd.jester.tests.AbstractTest;
import mvd.jester.tests.FonsecaNelis; import mvd.jester.tests.FonsecaNelis;
import mvd.jester.tests.MelaniButtazzo;
import mvd.jester.tests.SchmidMottok;
/** /**
...@@ -18,7 +16,7 @@ public class App { ...@@ -18,7 +16,7 @@ public class App {
public static void main(String[] args) { public static void main(String[] args) {
for (int p = 8; p <= 8; p *= 2) { for (int p = 8; p <= 8; p *= 2) {
SystemSetup.DagTaskBuilder builder = SystemSetup.DagTaskBuilder builder =
new SystemSetup.DagTaskBuilder(p).setNumberOfProcessors(p); new SystemSetup.DagTaskBuilder().setNumberOfProcessors(p);
TestEnvironment te = new TestEnvironment(); TestEnvironment te = new TestEnvironment();
List<AbstractTest<DagTask>> tests = List<AbstractTest<DagTask>> tests =
......
...@@ -3,7 +3,6 @@ package mvd.jester; ...@@ -3,7 +3,6 @@ package mvd.jester;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.Map.Entry; import java.util.Map.Entry;
import mvd.jester.info.SchedulingInfo.Feasiblity;
import mvd.jester.model.Task; import mvd.jester.model.Task;
import mvd.jester.tests.AbstractTest; import mvd.jester.tests.AbstractTest;
import mvd.jester.utils.Logger; import mvd.jester.utils.Logger;
......
package mvd.jester; package mvd.jester;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
......
...@@ -4,7 +4,6 @@ public class Job { ...@@ -4,7 +4,6 @@ public class Job {
private final long wcet; private final long wcet;
private long relativeCompletionTime; private long relativeCompletionTime;
private boolean visited = false;
public Job(long wcet) { public Job(long wcet) {
this.wcet = wcet; this.wcet = wcet;
...@@ -15,14 +14,6 @@ public class Job { ...@@ -15,14 +14,6 @@ public class Job {
return wcet; return wcet;
} }
public boolean getVisited() {
return visited;
}
public void setVisited(boolean visited) {
this.visited = visited;
}
/** /**
* @return the relativeCompletionTime * @return the relativeCompletionTime
*/ */
......
...@@ -5,7 +5,6 @@ import java.util.HashSet; ...@@ -5,7 +5,6 @@ import java.util.HashSet;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.Random;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.ThreadLocalRandom;
import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ArrayListMultimap;
...@@ -207,14 +206,12 @@ public class SystemSetup<T extends Task> { ...@@ -207,14 +206,12 @@ public class SystemSetup<T extends Task> {
private long numberOfProcessors = 4; private long numberOfProcessors = 4;
private long minimumWcet = 1; private long minimumWcet = 1;
private long maximumWcet = 100; private long maximumWcet = 100;
private long maxNumberOfBranches = 3; // TODO: change back to 5 private long maxNumberOfBranches = 5;
private long depth = 1; // change back to 2 private long depth = 2;
private long p_par = 80; private long p_par = 80;
private long p_add = 20; private long p_add = 20;
private final Random random;
public DagTaskBuilder(long seed) { public DagTaskBuilder() {
random = new Random(seed);
} }
public double getBeta() { public double getBeta() {
...@@ -222,8 +219,7 @@ public class SystemSetup<T extends Task> { ...@@ -222,8 +219,7 @@ public class SystemSetup<T extends Task> {
} }
private long randomProbability() { private long randomProbability() {
return random.nextInt(100); return ThreadLocalRandom.current().nextLong(0, 100);
// return ThreadLocalRandom.current().nextLong(0, 100);
} }
public Set<DagTask> generateTaskSet(final double totalUtilization) { public Set<DagTask> generateTaskSet(final double totalUtilization) {
...@@ -327,20 +323,16 @@ public class SystemSetup<T extends Task> { ...@@ -327,20 +323,16 @@ public class SystemSetup<T extends Task> {
} }
private long randomTaskPeriod(final long criticalPathLength, final long workload) { private long randomTaskPeriod(final long criticalPathLength, final long workload) {
long upper = (long) (workload / getBeta()); return ThreadLocalRandom.current().nextLong(criticalPathLength,
return random.nextInt((int) (upper - criticalPathLength)) + criticalPathLength; (long) (workload / getBeta()));
// return ThreadLocalRandom.current().nextLong(criticalPathLength,
// (long) (workload / getBeta()));
} }
private long randomNumberOfBranches() { private long randomNumberOfBranches() {
return random.nextInt((int) maxNumberOfBranches - 2) + 2; return ThreadLocalRandom.current().nextLong(2, maxNumberOfBranches);
// return ThreadLocalRandom.current().nextLong(2, maxNumberOfBranches);
} }
private long randomWcet() { private long randomWcet() {
return random.nextInt((int) (maximumWcet - minimumWcet)) + minimumWcet; return ThreadLocalRandom.current().nextLong(minimumWcet, maximumWcet);
// return ThreadLocalRandom.current().nextLong(minimumWcet, maximumWcet);
} }
/** /**
......
...@@ -233,6 +233,10 @@ public class FonsecaNelis extends AbstractTest<DagTask> { ...@@ -233,6 +233,10 @@ public class FonsecaNelis extends AbstractTest<DagTask> {
final long totalInterference = (long) Math.floor(taskInterference + selfInterference); final long totalInterference = (long) Math.floor(taskInterference + selfInterference);
responseTime = criticalPath + totalInterference; responseTime = criticalPath + totalInterference;
// TODO: remove check of deadline if bug is found
if (responseTime > task.getDeadline()) {
return responseTime;
}
} while (responseTime != previousResponseTime); } while (responseTime != previousResponseTime);
return responseTime; return responseTime;
...@@ -262,10 +266,10 @@ public class FonsecaNelis extends AbstractTest<DagTask> { ...@@ -262,10 +266,10 @@ public class FonsecaNelis extends AbstractTest<DagTask> {
long workload = getCarryOutWorkload(task, carryOutDistribution, carryInAndOutPeriod); long workload = getCarryOutWorkload(task, carryOutDistribution, carryInAndOutPeriod);
long carryInPeriod = task.getPeriod() - responseTimes.get(task).getResponseTime(); long carryInPeriod = task.getPeriod() - responseTimes.get(task).getResponseTime();
long carryOutPeriod = 0; long carryOutPeriod = 0;
final List<Segment> carryInList = Lists.newArrayList(carryInDistribution); final List<Segment> reverseCarryInList = Lists.newArrayList(carryInDistribution);
Collections.reverse(carryInList); Collections.reverse(reverseCarryInList);
for (final Segment s : carryInList) { for (final Segment s : reverseCarryInList) {
carryInPeriod += s.getJobWcet(); carryInPeriod += s.getJobWcet();
carryOutPeriod = carryInAndOutPeriod - carryInPeriod; carryOutPeriod = carryInAndOutPeriod - carryInPeriod;
final long carryInWorkload = final long carryInWorkload =
...@@ -323,11 +327,11 @@ public class FonsecaNelis extends AbstractTest<DagTask> { ...@@ -323,11 +327,11 @@ public class FonsecaNelis extends AbstractTest<DagTask> {
final long responseTime = responseTimes.get(task).getResponseTime(); final long responseTime = responseTimes.get(task).getResponseTime();
final List<Segment> distributionList = Lists.newArrayList(carryInDistribution); final List<Segment> distributionList = Lists.newArrayList(carryInDistribution);
for (int i = 0; i < carryInDistribution.size(); ++i) { for (int b = 0; b < carryInDistribution.size(); ++b) {
final Segment s = distributionList.get(i); final Segment s = distributionList.get(b);
long weightOfRemainingSegments = 0; long weightOfRemainingSegments = 0;
for (int j = i + 1; j < carryInDistribution.size(); ++j) { for (int p = b + 1; p < carryInDistribution.size(); ++p) {
weightOfRemainingSegments += distributionList.get(j).getJobWcet(); weightOfRemainingSegments += distributionList.get(p).getJobWcet();
} }
final long width = carryInPeriod - period + responseTime - weightOfRemainingSegments; final long width = carryInPeriod - period + responseTime - weightOfRemainingSegments;
......
...@@ -13,7 +13,7 @@ import com.google.common.collect.Sets; ...@@ -13,7 +13,7 @@ import com.google.common.collect.Sets;
import org.jgrapht.Graphs; import org.jgrapht.Graphs;
import org.jgrapht.experimental.dag.DirectedAcyclicGraph; import org.jgrapht.experimental.dag.DirectedAcyclicGraph;
import org.jgrapht.graph.DefaultEdge; import org.jgrapht.graph.DefaultEdge;
import org.jgrapht.traverse.ClosestFirstIterator; import org.jgrapht.traverse.TopologicalOrderIterator;
import mvd.jester.model.Job; import mvd.jester.model.Job;
import mvd.jester.model.Segment; import mvd.jester.model.Segment;
import mvd.jester.utils.BinaryDecompositionTree.Node; import mvd.jester.utils.BinaryDecompositionTree.Node;
...@@ -32,10 +32,6 @@ public class DagUtils { ...@@ -32,10 +32,6 @@ public class DagUtils {
public static long calculateCriticalPath(final DirectedAcyclicGraph<Job, DefaultEdge> jobDag) { public static long calculateCriticalPath(final DirectedAcyclicGraph<Job, DefaultEdge> jobDag) {
long criticalPath = 0; long criticalPath = 0;
// BreadthFirstIterator<Job, DefaultEdge> breadthFirstIterator =
// new BreadthFirstIterator<>(jobDag);
// while (breadthFirstIterator.hasNext()) {
// Job job = breadthFirstIterator.next();
for (final Job job : jobDag) { for (final Job job : jobDag) {
final Set<DefaultEdge> edges = jobDag.incomingEdgesOf(job); final Set<DefaultEdge> edges = jobDag.incomingEdgesOf(job);
long longestRelativeCompletionTime = 0; long longestRelativeCompletionTime = 0;
...@@ -110,10 +106,11 @@ public class DagUtils { ...@@ -110,10 +106,11 @@ public class DagUtils {
private static LinkedList<Job> getUnvisitedJoinNodes( private static LinkedList<Job> getUnvisitedJoinNodes(
final DirectedAcyclicGraph<Job, DefaultEdge> jobDag, final Set<Job> visitedJobs) { final DirectedAcyclicGraph<Job, DefaultEdge> jobDag, final Set<Job> visitedJobs) {
final LinkedList<Job> joinNodes = new LinkedList<>(); final LinkedList<Job> joinNodes = new LinkedList<>();
final ClosestFirstIterator<Job, DefaultEdge> it = new ClosestFirstIterator<>(jobDag); final TopologicalOrderIterator<Job, DefaultEdge> it =
new TopologicalOrderIterator<>(jobDag);
for (; it.hasNext();) { for (; it.hasNext();) {
final Job j = it.next(); final Job j = it.next();
if (jobDag.inDegreeOf(j) > 1 && /* /* !j.getVisited() */!visitedJobs.contains(j)) { if (jobDag.inDegreeOf(j) > 1 && !visitedJobs.contains(j)) {
joinNodes.add(j); joinNodes.add(j);
} }
} }
...@@ -139,16 +136,11 @@ public class DagUtils { ...@@ -139,16 +136,11 @@ public class DagUtils {
} }
final Job joinNode = joins.getFirst(); final Job joinNode = joins.getFirst();
visitedJobs.add(joinNode); visitedJobs.add(joinNode);
joinNode.setVisited(true);
nextEdge: while (modifiedJobDag.inDegreeOf(joinNode) > 1) { nextEdge: while (modifiedJobDag.inDegreeOf(joinNode) > 1) {
final List<Job> predecessors = Graphs.predecessorListOf(modifiedJobDag, joinNode); final List<Job> predecessors = Graphs.predecessorListOf(modifiedJobDag, joinNode);
for (final Job p : predecessors) { for (final Job p : predecessors) {
if (!checkPredecessors(modifiedJobDag, joinNode, p)) { if (!checkPredecessors(modifiedJobDag, joinNode, p)) {
// || !checkPredecessors(modifiedJobDag, p, joinNode, ancestorsOfJ)) {
// DefaultEdge e = modifiedJobDag.getEdge(p, joinNode);
// if ((modifiedJobDag.outDegreeOf(p) > 1)
// || checkForFork(modifiedJobDag, joinNode, e)) {
final DefaultEdge conflictingEdge = modifiedJobDag.getEdge(p, joinNode); final DefaultEdge conflictingEdge = modifiedJobDag.getEdge(p, joinNode);
modifiedJobDag.removeEdge(conflictingEdge); modifiedJobDag.removeEdge(conflictingEdge);
if (modifiedJobDag.outDegreeOf(p) == 0) { if (modifiedJobDag.outDegreeOf(p) == 0) {
...@@ -169,66 +161,11 @@ public class DagUtils { ...@@ -169,66 +161,11 @@ public class DagUtils {
} }
public static boolean checkForFork(final DirectedAcyclicGraph<Job, DefaultEdge> jobDag,
final Job joinNode, final DefaultEdge edge) {
Set<Job> ancestorsOfJ = jobDag.getAncestors(jobDag, joinNode);
nextFork: for (final Job f : jobDag) {
if (jobDag.outDegreeOf(f) > 1) {
final Set<Job> descendantsOfF = jobDag.getDescendants(jobDag, f);
final Set<Job> inbetweenJobs = new HashSet<>(ancestorsOfJ);
inbetweenJobs.retainAll(descendantsOfF);
if (inbetweenJobs.isEmpty()) {
continue;
}
for (final Job a : inbetweenJobs) {
final List<Job> neighboursOfA = Graphs.neighborListOf(jobDag, a);
for (final Job b : neighboursOfA) {
if (!((jobDag.getAncestors(jobDag, joinNode).contains(b) || b == joinNode)
&& (jobDag.getDescendants(jobDag, f).contains(b) || b == f))) {
continue nextFork;
}
}
}
Job source = jobDag.getEdgeSource(edge);
if (inbetweenJobs.contains(source)) {
return true;
}
}
}
return false;
}
private static boolean checkPredecessors(final DirectedAcyclicGraph<Job, DefaultEdge> jobDag,
final Job current, final Job joinNode, final Set<Job> ancestorsOfJ2) {
final List<Job> successorsOfCurrent = Graphs.successorListOf(jobDag, current);
final Set<Job> ancestorsOfJ = jobDag.getAncestors(jobDag, joinNode);
ancestorsOfJ.add(joinNode);
if (ancestorsOfJ.containsAll(successorsOfCurrent)) {
final Set<Job> descendantsOfCurrent = jobDag.getDescendants(jobDag, current);
if (descendantsOfCurrent.containsAll(Graphs.predecessorListOf(jobDag, joinNode))) {
return true;
} else {
for (final Job p : Graphs.predecessorListOf(jobDag, current)) {
if (!checkPredecessors(jobDag, p, joinNode, ancestorsOfJ)) {
return false;
}
}
return true;
}
} else {
return false;
}
}
private static boolean checkPredecessors(final DirectedAcyclicGraph<Job, DefaultEdge> jobDag, private static boolean checkPredecessors(final DirectedAcyclicGraph<Job, DefaultEdge> jobDag,
final Job joinNode, Job current) { final Job joinNode, Job current) {
if (jobDag.outDegreeOf(current) > 1) {
final Set<Job> ancestorsOfJ = jobDag.getAncestors(jobDag, joinNode); final Set<Job> ancestorsOfJ = jobDag.getAncestors(jobDag, joinNode);
ancestorsOfJ.add(joinNode); ancestorsOfJ.add(joinNode);
if (jobDag.outDegreeOf(current) > 1) {
if (!ancestorsOfJ.containsAll(Graphs.successorListOf(jobDag, current))) { if (!ancestorsOfJ.containsAll(Graphs.successorListOf(jobDag, current))) {
return false; return false;
} }
......
...@@ -3,7 +3,6 @@ package mvd.jester.model; ...@@ -3,7 +3,6 @@ package mvd.jester.model;
import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertTrue;
import java.util.List; import java.util.List;
import java.util.Stack; import java.util.Stack;
import java.util.concurrent.ThreadLocalRandom;
import org.jgrapht.Graphs; import org.jgrapht.Graphs;
import org.jgrapht.experimental.dag.DirectedAcyclicGraph; import org.jgrapht.experimental.dag.DirectedAcyclicGraph;
import org.jgrapht.graph.DefaultEdge; import org.jgrapht.graph.DefaultEdge;
...@@ -40,10 +39,7 @@ public class TestDagUtils { ...@@ -40,10 +39,7 @@ public class TestDagUtils {
@DisplayName("Check if NFJ DAGs are created correctly.") @DisplayName("Check if NFJ DAGs are created correctly.")
void checkNfjDagCreation() { void checkNfjDagCreation() {
for (int i = 0; i < 10000; ++i) { for (int i = 0; i < 10000; ++i) {
// { DagTaskBuilder b = new DagTaskBuilder();
// int i = 1992;
System.out.println(i);
DagTaskBuilder b = new DagTaskBuilder(i);
DagTask t = b.generateTask(); DagTask t = b.generateTask();
DirectedAcyclicGraph<Job, DefaultEdge> nfjDag = DagUtils.createNFJGraph(t.getJobDag()); DirectedAcyclicGraph<Job, DefaultEdge> nfjDag = DagUtils.createNFJGraph(t.getJobDag());
...@@ -98,11 +94,11 @@ public class TestDagUtils { ...@@ -98,11 +94,11 @@ public class TestDagUtils {
void checkDecompositionTreeCreation() { void checkDecompositionTreeCreation() {
for (int i = 0; i < 10000; ++i) { for (int i = 0; i < 10000; ++i) {
// { // {
// int i = 847; // int i = 610;
// System.out.println(i); // System.out.println(i);
long numberOfProcessors = ThreadLocalRandom.current().nextLong(4, 16); // long numberOfProcessors = ThreadLocalRandom.current().nextLong(4, 16);
// long numberOfProcessors = 4; long numberOfProcessors = 4;
DagTaskBuilder b = new DagTaskBuilder(i).setNumberOfProcessors(numberOfProcessors); DagTaskBuilder b = new DagTaskBuilder().setNumberOfProcessors(numberOfProcessors);
DagTask t = b.generateTask(); DagTask t = b.generateTask();
DirectedAcyclicGraph<Job, DefaultEdge> jobDag = t.getJobDag(); DirectedAcyclicGraph<Job, DefaultEdge> jobDag = t.getJobDag();
DirectedAcyclicGraph<Job, DefaultEdge> nfjJobDag = DagUtils.createNFJGraph(jobDag); DirectedAcyclicGraph<Job, DefaultEdge> nfjJobDag = DagUtils.createNFJGraph(jobDag);
...@@ -124,9 +120,9 @@ public class TestDagUtils { ...@@ -124,9 +120,9 @@ public class TestDagUtils {
for (DefaultEdge e : nfjJobDag.edgeSet()) { for (DefaultEdge e : nfjJobDag.edgeSet()) {
Job target = nfjJobDag.getEdgeTarget(e); Job target = nfjJobDag.getEdgeTarget(e);
Job source = nfjJobDag.getEdgeSource(e); Job source = nfjJobDag.getEdgeSource(e);
// if (jobDagFromTree.containsEdge(source, target)) { if (!jobDagFromTree.containsEdge(source, target)) {
// drawGraph(jobDag); drawGraph(jobDag);
// } }
assertTrue(jobDagFromTree.containsEdge(source, target)); assertTrue(jobDagFromTree.containsEdge(source, target));
} }
......
...@@ -74,7 +74,7 @@ public class TestSystemSetup { ...@@ -74,7 +74,7 @@ public class TestSystemSetup {
@DisplayName("Check if DagTaskBuilder works correctly") @DisplayName("Check if DagTaskBuilder works correctly")
void testDagTaskBuilder() { void testDagTaskBuilder() {
for (int i = 0; i < 100; ++i) { for (int i = 0; i < 100; ++i) {
DagTaskBuilder builder = new DagTaskBuilder(i); DagTaskBuilder builder = new DagTaskBuilder();
DagTask task = builder.generateTask(); DagTask task = builder.generateTask();
DirectedAcyclicGraph<Job, DefaultEdge> jobDag = task.getJobDag(); DirectedAcyclicGraph<Job, DefaultEdge> jobDag = task.getJobDag();
...@@ -103,7 +103,7 @@ public class TestSystemSetup { ...@@ -103,7 +103,7 @@ public class TestSystemSetup {
void testUtil() { void testUtil() {
for (int i = 0; i < 5; ++i) { for (int i = 0; i < 5; ++i) {
for (double d = 0.25; d < 4; d += 0.25) { for (double d = 0.25; d < 4; d += 0.25) {
DagTaskBuilder builder = new DagTaskBuilder(i); DagTaskBuilder builder = new DagTaskBuilder();
Set<DagTask> taskSet = builder.generateTaskSet(d); Set<DagTask> taskSet = builder.generateTaskSet(d);
double taskSetUtil = 0; double taskSetUtil = 0;
for (DagTask t : taskSet) { for (DagTask t : taskSet) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment