Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
las3_pub
/
jester
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
c5bc69e2
authored
4 years ago
by
Michael Schmid
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
nfj creation now works
parent
471ee8c4
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
36 additions
and
121 deletions
+36
-121
src/main/java/mvd/jester/App.java
+1
-3
src/main/java/mvd/jester/ResultLogger.java
+0
-1
src/main/java/mvd/jester/TestEnvironment.java
+0
-2
src/main/java/mvd/jester/model/Job.java
+0
-9
src/main/java/mvd/jester/model/SystemSetup.java
+8
-16
src/main/java/mvd/jester/tests/FonsecaNelis.java
+11
-7
src/main/java/mvd/jester/utils/DagUtils.java
+6
-69
src/test/java/mvd/jester/model/TestDagUtils.java
+8
-12
src/test/java/mvd/jester/model/TestSystemSetup.java
+2
-2
No files found.
src/main/java/mvd/jester/App.java
View file @
c5bc69e2
...
...
@@ -6,8 +6,6 @@ import mvd.jester.model.DagTask;
import
mvd.jester.model.SystemSetup
;
import
mvd.jester.tests.AbstractTest
;
import
mvd.jester.tests.FonsecaNelis
;
import
mvd.jester.tests.MelaniButtazzo
;
import
mvd.jester.tests.SchmidMottok
;
/**
...
...
@@ -18,7 +16,7 @@ public class App {
public
static
void
main
(
String
[]
args
)
{
for
(
int
p
=
8
;
p
<=
8
;
p
*=
2
)
{
SystemSetup
.
DagTaskBuilder
builder
=
new
SystemSetup
.
DagTaskBuilder
(
p
).
setNumberOfProcessors
(
p
);
new
SystemSetup
.
DagTaskBuilder
().
setNumberOfProcessors
(
p
);
TestEnvironment
te
=
new
TestEnvironment
();
List
<
AbstractTest
<
DagTask
>>
tests
=
...
...
This diff is collapsed.
Click to expand it.
src/main/java/mvd/jester/ResultLogger.java
View file @
c5bc69e2
...
...
@@ -3,7 +3,6 @@ package mvd.jester;
import
java.util.Map
;
import
java.util.Set
;
import
java.util.Map.Entry
;
import
mvd.jester.info.SchedulingInfo.Feasiblity
;
import
mvd.jester.model.Task
;
import
mvd.jester.tests.AbstractTest
;
import
mvd.jester.utils.Logger
;
...
...
This diff is collapsed.
Click to expand it.
src/main/java/mvd/jester/TestEnvironment.java
View file @
c5bc69e2
package
mvd
.
jester
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.HashSet
;
import
java.util.LinkedHashMap
;
import
java.util.List
;
import
java.util.Map
;
...
...
This diff is collapsed.
Click to expand it.
src/main/java/mvd/jester/model/Job.java
View file @
c5bc69e2
...
...
@@ -4,7 +4,6 @@ public class Job {
private
final
long
wcet
;
private
long
relativeCompletionTime
;
private
boolean
visited
=
false
;
public
Job
(
long
wcet
)
{
this
.
wcet
=
wcet
;
...
...
@@ -15,14 +14,6 @@ public class Job {
return
wcet
;
}
public
boolean
getVisited
()
{
return
visited
;
}
public
void
setVisited
(
boolean
visited
)
{
this
.
visited
=
visited
;
}
/**
* @return the relativeCompletionTime
*/
...
...
This diff is collapsed.
Click to expand it.
src/main/java/mvd/jester/model/SystemSetup.java
View file @
c5bc69e2
...
...
@@ -5,7 +5,6 @@ import java.util.HashSet;
import
java.util.LinkedHashSet
;
import
java.util.Map
;
import
java.util.Optional
;
import
java.util.Random
;
import
java.util.Set
;
import
java.util.concurrent.ThreadLocalRandom
;
import
com.google.common.collect.ArrayListMultimap
;
...
...
@@ -207,14 +206,12 @@ public class SystemSetup<T extends Task> {
private
long
numberOfProcessors
=
4
;
private
long
minimumWcet
=
1
;
private
long
maximumWcet
=
100
;
private
long
maxNumberOfBranches
=
3
;
// TODO: change back to 5
private
long
depth
=
1
;
// change back to 2
private
long
maxNumberOfBranches
=
5
;
private
long
depth
=
2
;
private
long
p_par
=
80
;
private
long
p_add
=
20
;
private
final
Random
random
;
public
DagTaskBuilder
(
long
seed
)
{
random
=
new
Random
(
seed
);
public
DagTaskBuilder
()
{
}
public
double
getBeta
()
{
...
...
@@ -222,8 +219,7 @@ public class SystemSetup<T extends Task> {
}
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
)
{
...
...
@@ -327,20 +323,16 @@ public class SystemSetup<T extends Task> {
}
private
long
randomTaskPeriod
(
final
long
criticalPathLength
,
final
long
workload
)
{
long
upper
=
(
long
)
(
workload
/
getBeta
());
return
random
.
nextInt
((
int
)
(
upper
-
criticalPathLength
))
+
criticalPathLength
;
// return ThreadLocalRandom.current().nextLong(criticalPathLength,
// (long) (workload / getBeta()));
return
ThreadLocalRandom
.
current
().
nextLong
(
criticalPathLength
,
(
long
)
(
workload
/
getBeta
()));
}
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
()
{
return
random
.
nextInt
((
int
)
(
maximumWcet
-
minimumWcet
))
+
minimumWcet
;
// return ThreadLocalRandom.current().nextLong(minimumWcet, maximumWcet);
return
ThreadLocalRandom
.
current
().
nextLong
(
minimumWcet
,
maximumWcet
);
}
/**
...
...
This diff is collapsed.
Click to expand it.
src/main/java/mvd/jester/tests/FonsecaNelis.java
View file @
c5bc69e2
...
...
@@ -233,6 +233,10 @@ public class FonsecaNelis extends AbstractTest<DagTask> {
final
long
totalInterference
=
(
long
)
Math
.
floor
(
taskInterference
+
selfInterference
);
responseTime
=
criticalPath
+
totalInterference
;
// TODO: remove check of deadline if bug is found
if
(
responseTime
>
task
.
getDeadline
())
{
return
responseTime
;
}
}
while
(
responseTime
!=
previousResponseTime
);
return
responseTime
;
...
...
@@ -262,10 +266,10 @@ public class FonsecaNelis extends AbstractTest<DagTask> {
long
workload
=
getCarryOutWorkload
(
task
,
carryOutDistribution
,
carryInAndOutPeriod
);
long
carryInPeriod
=
task
.
getPeriod
()
-
responseTimes
.
get
(
task
).
getResponseTime
();
long
carryOutPeriod
=
0
;
final
List
<
Segment
>
c
arryInList
=
Lists
.
newArrayList
(
carryInDistribution
);
Collections
.
reverse
(
c
arryInList
);
final
List
<
Segment
>
reverseC
arryInList
=
Lists
.
newArrayList
(
carryInDistribution
);
Collections
.
reverse
(
reverseC
arryInList
);
for
(
final
Segment
s
:
c
arryInList
)
{
for
(
final
Segment
s
:
reverseC
arryInList
)
{
carryInPeriod
+=
s
.
getJobWcet
();
carryOutPeriod
=
carryInAndOutPeriod
-
carryInPeriod
;
final
long
carryInWorkload
=
...
...
@@ -323,11 +327,11 @@ public class FonsecaNelis extends AbstractTest<DagTask> {
final
long
responseTime
=
responseTimes
.
get
(
task
).
getResponseTime
();
final
List
<
Segment
>
distributionList
=
Lists
.
newArrayList
(
carryInDistribution
);
for
(
int
i
=
0
;
i
<
carryInDistribution
.
size
();
++
i
)
{
final
Segment
s
=
distributionList
.
get
(
i
);
for
(
int
b
=
0
;
b
<
carryInDistribution
.
size
();
++
b
)
{
final
Segment
s
=
distributionList
.
get
(
b
);
long
weightOfRemainingSegments
=
0
;
for
(
int
j
=
i
+
1
;
j
<
carryInDistribution
.
size
();
++
j
)
{
weightOfRemainingSegments
+=
distributionList
.
get
(
j
).
getJobWcet
();
for
(
int
p
=
b
+
1
;
p
<
carryInDistribution
.
size
();
++
p
)
{
weightOfRemainingSegments
+=
distributionList
.
get
(
p
).
getJobWcet
();
}
final
long
width
=
carryInPeriod
-
period
+
responseTime
-
weightOfRemainingSegments
;
...
...
This diff is collapsed.
Click to expand it.
src/main/java/mvd/jester/utils/DagUtils.java
View file @
c5bc69e2
...
...
@@ -13,7 +13,7 @@ import com.google.common.collect.Sets;
import
org.jgrapht.Graphs
;
import
org.jgrapht.experimental.dag.DirectedAcyclicGraph
;
import
org.jgrapht.graph.DefaultEdge
;
import
org.jgrapht.traverse.
ClosestFirst
Iterator
;
import
org.jgrapht.traverse.
TopologicalOrder
Iterator
;
import
mvd.jester.model.Job
;
import
mvd.jester.model.Segment
;
import
mvd.jester.utils.BinaryDecompositionTree.Node
;
...
...
@@ -32,10 +32,6 @@ public class DagUtils {
public
static
long
calculateCriticalPath
(
final
DirectedAcyclicGraph
<
Job
,
DefaultEdge
>
jobDag
)
{
long
criticalPath
=
0
;
// BreadthFirstIterator<Job, DefaultEdge> breadthFirstIterator =
// new BreadthFirstIterator<>(jobDag);
// while (breadthFirstIterator.hasNext()) {
// Job job = breadthFirstIterator.next();
for
(
final
Job
job
:
jobDag
)
{
final
Set
<
DefaultEdge
>
edges
=
jobDag
.
incomingEdgesOf
(
job
);
long
longestRelativeCompletionTime
=
0
;
...
...
@@ -110,10 +106,11 @@ public class DagUtils {
private
static
LinkedList
<
Job
>
getUnvisitedJoinNodes
(
final
DirectedAcyclicGraph
<
Job
,
DefaultEdge
>
jobDag
,
final
Set
<
Job
>
visitedJobs
)
{
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
();)
{
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
);
}
}
...
...
@@ -139,16 +136,11 @@ public class DagUtils {
}
final
Job
joinNode
=
joins
.
getFirst
();
visitedJobs
.
add
(
joinNode
);
joinNode
.
setVisited
(
true
);
nextEdge:
while
(
modifiedJobDag
.
inDegreeOf
(
joinNode
)
>
1
)
{
final
List
<
Job
>
predecessors
=
Graphs
.
predecessorListOf
(
modifiedJobDag
,
joinNode
);
for
(
final
Job
p
:
predecessors
)
{
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
);
modifiedJobDag
.
removeEdge
(
conflictingEdge
);
if
(
modifiedJobDag
.
outDegreeOf
(
p
)
==
0
)
{
...
...
@@ -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
,
final
Job
joinNode
,
Job
current
)
{
final
Set
<
Job
>
ancestorsOfJ
=
jobDag
.
getAncestors
(
jobDag
,
joinNode
);
ancestorsOfJ
.
add
(
joinNode
);
if
(
jobDag
.
outDegreeOf
(
current
)
>
1
)
{
final
Set
<
Job
>
ancestorsOfJ
=
jobDag
.
getAncestors
(
jobDag
,
joinNode
);
ancestorsOfJ
.
add
(
joinNode
);
if
(!
ancestorsOfJ
.
containsAll
(
Graphs
.
successorListOf
(
jobDag
,
current
)))
{
return
false
;
}
...
...
This diff is collapsed.
Click to expand it.
src/test/java/mvd/jester/model/TestDagUtils.java
View file @
c5bc69e2
...
...
@@ -3,7 +3,6 @@ package mvd.jester.model;
import
static
org
.
junit
.
jupiter
.
api
.
Assertions
.
assertTrue
;
import
java.util.List
;
import
java.util.Stack
;
import
java.util.concurrent.ThreadLocalRandom
;
import
org.jgrapht.Graphs
;
import
org.jgrapht.experimental.dag.DirectedAcyclicGraph
;
import
org.jgrapht.graph.DefaultEdge
;
...
...
@@ -40,10 +39,7 @@ public class TestDagUtils {
@DisplayName
(
"Check if NFJ DAGs are created correctly."
)
void
checkNfjDagCreation
()
{
for
(
int
i
=
0
;
i
<
10000
;
++
i
)
{
// {
// int i = 1992;
System
.
out
.
println
(
i
);
DagTaskBuilder
b
=
new
DagTaskBuilder
(
i
);
DagTaskBuilder
b
=
new
DagTaskBuilder
();
DagTask
t
=
b
.
generateTask
();
DirectedAcyclicGraph
<
Job
,
DefaultEdge
>
nfjDag
=
DagUtils
.
createNFJGraph
(
t
.
getJobDag
());
...
...
@@ -98,11 +94,11 @@ public class TestDagUtils {
void
checkDecompositionTreeCreation
()
{
for
(
int
i
=
0
;
i
<
10000
;
++
i
)
{
// {
// int i =
847
;
// int i =
610
;
// System.out.println(i);
long
numberOfProcessors
=
ThreadLocalRandom
.
current
().
nextLong
(
4
,
16
);
//
long numberOfProcessors = 4;
DagTaskBuilder
b
=
new
DagTaskBuilder
(
i
).
setNumberOfProcessors
(
numberOfProcessors
);
//
long numberOfProcessors = ThreadLocalRandom.current().nextLong(4, 16);
long
numberOfProcessors
=
4
;
DagTaskBuilder
b
=
new
DagTaskBuilder
().
setNumberOfProcessors
(
numberOfProcessors
);
DagTask
t
=
b
.
generateTask
();
DirectedAcyclicGraph
<
Job
,
DefaultEdge
>
jobDag
=
t
.
getJobDag
();
DirectedAcyclicGraph
<
Job
,
DefaultEdge
>
nfjJobDag
=
DagUtils
.
createNFJGraph
(
jobDag
);
...
...
@@ -124,9 +120,9 @@ public class TestDagUtils {
for
(
DefaultEdge
e
:
nfjJobDag
.
edgeSet
())
{
Job
target
=
nfjJobDag
.
getEdgeTarget
(
e
);
Job
source
=
nfjJobDag
.
getEdgeSource
(
e
);
// if (
jobDagFromTree.containsEdge(source, target)) {
//
drawGraph(jobDag);
//
}
if
(!
jobDagFromTree
.
containsEdge
(
source
,
target
))
{
drawGraph
(
jobDag
);
}
assertTrue
(
jobDagFromTree
.
containsEdge
(
source
,
target
));
}
...
...
This diff is collapsed.
Click to expand it.
src/test/java/mvd/jester/model/TestSystemSetup.java
View file @
c5bc69e2
...
...
@@ -74,7 +74,7 @@ public class TestSystemSetup {
@DisplayName
(
"Check if DagTaskBuilder works correctly"
)
void
testDagTaskBuilder
()
{
for
(
int
i
=
0
;
i
<
100
;
++
i
)
{
DagTaskBuilder
builder
=
new
DagTaskBuilder
(
i
);
DagTaskBuilder
builder
=
new
DagTaskBuilder
();
DagTask
task
=
builder
.
generateTask
();
DirectedAcyclicGraph
<
Job
,
DefaultEdge
>
jobDag
=
task
.
getJobDag
();
...
...
@@ -103,7 +103,7 @@ public class TestSystemSetup {
void
testUtil
()
{
for
(
int
i
=
0
;
i
<
5
;
++
i
)
{
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
);
double
taskSetUtil
=
0
;
for
(
DagTask
t
:
taskSet
)
{
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment