From 5a80ed70cce315d92cbda96d283237d91d4a75c2 Mon Sep 17 00:00:00 2001 From: Emna Gharbi <amna.gharbi@telecom-paristech.fr> Date: Wed, 13 Mar 2019 16:00:19 +0100 Subject: [PATCH] display of tasks scheduling --- .../dsez3engine/OptimizationModel.java | 145 ++++++++++-------- 1 file changed, 84 insertions(+), 61 deletions(-) diff --git a/src/main/java/tmltranslator/dsez3engine/OptimizationModel.java b/src/main/java/tmltranslator/dsez3engine/OptimizationModel.java index f45a2cbb99..697f25ff42 100644 --- a/src/main/java/tmltranslator/dsez3engine/OptimizationModel.java +++ b/src/main/java/tmltranslator/dsez3engine/OptimizationModel.java @@ -6,16 +6,13 @@ import tmltranslator.*; import javax.swing.*; import java.lang.reflect.Array; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.HashMap; +import java.util.*; public class OptimizationModel { private Map<String, Integer> optimizedSolutionX = new HashMap<String, Integer>(); - private Map<String, Integer> optimizedSolutionStart = new HashMap<String, Integer>(); + private Map<String, Integer> optimizedSolutionStart = new HashMap<>(); private InputInstance inputInstance; private TMLMapping tmlMapping; @@ -47,7 +44,7 @@ public class OptimizationModel { this.optimizedSolutionStart = optimizedSolutionStart; } - public OptimizationResult findOptimizedMapping() { + public OptimizationResult findOptimizedMapping() { Context ctx; OptimizationResult result = null; try { @@ -151,7 +148,7 @@ public class OptimizationModel { for (Object tmlTask : inputInstance.getModeling().getTasks()) { int t = inputInstance.getModeling().getTasks().indexOf(tmlTask); - TMLTask taskCast = (TMLTask)tmlTask; + TMLTask taskCast = (TMLTask) tmlTask; for (HwNode hwNode : inputInstance.getArchitecture().getCPUs()) { @@ -170,9 +167,9 @@ public class OptimizationModel { //Constraint on start >=0 BoolExpr[] c_bound_start = new BoolExpr[inputInstance.getModeling().getTasks().size()]; - for (Object tmlTask : inputInstance.getModeling().getTasks()) { + for (Object tmlTask : inputInstance.getModeling().getTasks()) { int t = inputInstance.getModeling().getTasks().indexOf(tmlTask); - TMLTask taskCast = (TMLTask)tmlTask; + TMLTask taskCast = (TMLTask) tmlTask; start[t] = ctx.mkIntConst("start_" + taskCast.getID()); c_bound_start[t] = ctx.mkGe(start[t], ctx.mkInt(0)); @@ -188,7 +185,7 @@ public class OptimizationModel { //TraceManager.addDev("\nUnique task-CPU mapping constraints (3)"); BoolExpr[] c_unique_x = new BoolExpr[inputInstance.getModeling().getTasks().size()]; - for (Object tmlTask : inputInstance.getModeling().getTasks()) { + for (Object tmlTask : inputInstance.getModeling().getTasks()) { int t = inputInstance.getModeling().getTasks().indexOf(tmlTask); ArithExpr sum_X = ctx.mkAdd(X[t]); @@ -201,9 +198,9 @@ public class OptimizationModel { //Feasible Task map: ∀t, SUM p in F(t) (X tp) = 1 //TraceManager.addDev("\nFeasible task-CPU mapping constraints (4)"); BoolExpr[] c_feasibleMapX = new BoolExpr[inputInstance.getModeling().getTasks().size()]; - for (Object tmlTask : inputInstance.getModeling().getTasks()) { + for (Object tmlTask : inputInstance.getModeling().getTasks()) { int t = inputInstance.getModeling().getTasks().indexOf(tmlTask); - TMLTask taskCast = (TMLTask)tmlTask; + TMLTask taskCast = (TMLTask) tmlTask; ArithExpr sum_X = ctx.mkInt(0); for (HwNode hwNode : inputInstance.getFeasibleCPUs(taskCast)) { @@ -229,9 +226,9 @@ public class OptimizationModel { IntExpr mem = ctx.mkInt(inputInstance.getLocalMemoryOfHwExecutionNode(hwNode).memorySize); - for (Object tmlTask : inputInstance.getModeling().getTasks()) { + for (Object tmlTask : inputInstance.getModeling().getTasks()) { int t = inputInstance.getModeling().getTasks().indexOf(tmlTask); - TMLTask taskCast = (TMLTask)tmlTask; + TMLTask taskCast = (TMLTask) tmlTask; IntExpr bin_plus_bout = ctx.mkInt(inputInstance.getBufferIn(taskCast) + inputInstance.getBufferOut(taskCast)); @@ -294,7 +291,7 @@ public class OptimizationModel { TMLTask producer = channelCast.getOriginTask(); int prodIndex = inputInstance.getModeling().getTasks().indexOf(producer); - TraceManager.addDev("prodIndex" + prodIndex + "producer "+producer + inputInstance.getModeling().getTasks()); + TraceManager.addDev("prodIndex" + prodIndex + "producer " + producer + inputInstance.getModeling().getTasks()); TMLTask consumer = channelCast.getDestinationTask(); @@ -329,10 +326,10 @@ public class OptimizationModel { for (HwNode hwNode : inputInstance.getArchitecture().getCPUs()) { int p = inputInstance.getArchitecture().getCPUs().indexOf(hwNode); - for (Object taski : inputInstance.getModeling().getTasks()) { + for (Object taski : inputInstance.getModeling().getTasks()) { int ti = inputInstance.getModeling().getTasks().indexOf(taski); - TMLTask taskiCast = (TMLTask)taski; + TMLTask taskiCast = (TMLTask) taski; //Calculate End times of ti ArithExpr wceti = ctx.mkInt(0); @@ -348,7 +345,7 @@ public class OptimizationModel { for (Object taskj : inputInstance.getModeling().getTasks()) { int tj = inputInstance.getModeling().getTasks().indexOf(taskj); - TMLTask taskjCast = (TMLTask)taskj; + TMLTask taskjCast = (TMLTask) taskj; if (tj != ti) { @@ -388,10 +385,10 @@ public class OptimizationModel { //Grouping remaining constraints of the model // TraceManager.addDev("\nAll mapping constraints"); - for (Object task : inputInstance.getModeling().getTasks()) { + for (Object task : inputInstance.getModeling().getTasks()) { int t = inputInstance.getModeling().getTasks().indexOf(task); - TMLTask taskCast = (TMLTask)task; + TMLTask taskCast = (TMLTask) task; for (HwNode hwNode : inputInstance.getArchitecture().getCPUs()) { int p = inputInstance.getArchitecture().getCPUs().indexOf(hwNode); @@ -422,7 +419,7 @@ public class OptimizationModel { for (Object task : inputInstance.getModeling().getTasks()) { int t = inputInstance.getModeling().getTasks().indexOf(task); - TMLTask taskCast = (TMLTask)task; + TMLTask taskCast = (TMLTask) task; for (HwNode hwNode : inputInstance.getArchitecture().getCPUs()) { int p = inputInstance.getArchitecture().getCPUs().indexOf(hwNode); @@ -438,7 +435,7 @@ public class OptimizationModel { for (Object task : inputInstance.getModeling().getTasks()) { int t = inputInstance.getModeling().getTasks().indexOf(task); - TMLTask taskCast = (TMLTask)task; + TMLTask taskCast = (TMLTask) task; optimized_result_start[t] = m.evaluate(start[t], false); TraceManager.addDev("start[" + taskCast.getName() + "] = " + optimized_result_start[t]); @@ -457,7 +454,7 @@ public class OptimizationModel { }//findFeasibleMapping() - public OptimizationResult findOptimizedMapping(Context ctx) { + public OptimizationResult findOptimizedMapping(Context ctx) { OptimizationResult result = new OptimizationResult(); @@ -481,10 +478,10 @@ public class OptimizationModel { //TraceManager.addDev("\nDefining the bounds of Xtp (1)"); - for (Object tmlTask : inputInstance.getModeling().getTasks()) { + for (Object tmlTask : inputInstance.getModeling().getTasks()) { int t = inputInstance.getModeling().getTasks().indexOf(tmlTask); - TMLTask taskCast = (TMLTask)tmlTask; + TMLTask taskCast = (TMLTask) tmlTask; for (HwNode hwNode : inputInstance.getArchitecture().getCPUs()) { @@ -503,10 +500,10 @@ public class OptimizationModel { //Constraint on start >=0 BoolExpr[] c_bound_start = new BoolExpr[inputInstance.getModeling().getTasks().size()]; - for (Object tmlTask : inputInstance.getModeling().getTasks()) { + for (Object tmlTask : inputInstance.getModeling().getTasks()) { int t = inputInstance.getModeling().getTasks().indexOf(tmlTask); - TMLTask taskCast = (TMLTask)tmlTask; + TMLTask taskCast = (TMLTask) tmlTask; start[t] = ctx.mkIntConst("start_" + taskCast.getName()); c_bound_start[t] = ctx.mkGe(start[t], ctx.mkInt(0)); mapping_constraints = ctx.mkAnd(mapping_constraints, c_bound_start[t]); @@ -521,7 +518,7 @@ public class OptimizationModel { //TraceManager.addDev("\nUnique task-CPU mapping constraints (3)"); BoolExpr[] c_unique_x = new BoolExpr[inputInstance.getModeling().getTasks().size()]; - for (Object tmlTask : inputInstance.getModeling().getTasks()) { + for (Object tmlTask : inputInstance.getModeling().getTasks()) { int t = inputInstance.getModeling().getTasks().indexOf(tmlTask); // TODO or use the local instance modeling ArithExpr sum_X = ctx.mkAdd(X[t]); @@ -534,11 +531,11 @@ public class OptimizationModel { //Feasible Task map: ∀t, SUM p in F(t) (X tp) = 1 //TraceManager.addDev("\nFeasible task-CPU mapping constraints (4)"); BoolExpr[] c_feasibleMapX = new BoolExpr[inputInstance.getModeling().getTasks().size()]; - for (Object tmlTask : inputInstance.getModeling().getTasks()) { + for (Object tmlTask : inputInstance.getModeling().getTasks()) { int t = inputInstance.getModeling().getTasks().indexOf(tmlTask); ArithExpr sum_X = ctx.mkInt(0); - TMLTask taskCast = (TMLTask)tmlTask; + TMLTask taskCast = (TMLTask) tmlTask; for (HwNode hwNode : inputInstance.getFeasibleCPUs(taskCast)) { @@ -567,7 +564,7 @@ public class OptimizationModel { for (Object tmlTask : inputInstance.getModeling().getTasks()) { int t = inputInstance.getModeling().getTasks().indexOf(tmlTask); - TMLTask taskCast = (TMLTask)tmlTask; + TMLTask taskCast = (TMLTask) tmlTask; IntExpr bin_plus_bout = ctx.mkInt(inputInstance.getBufferIn(taskCast) + inputInstance.getBufferOut(taskCast)); ArithExpr bin_plus_bout_times_X = ctx.mkMul(bin_plus_bout, X[t][p]); @@ -620,11 +617,11 @@ public class OptimizationModel { // TraceManager.addDev("\nPrecedence constraints (11)"); BoolExpr[] c_precedence = new BoolExpr[inputInstance.getModeling().getChannels().size()]; - for (Object channel : inputInstance.getModeling().getChannels()) { + for (Object channel : inputInstance.getModeling().getChannels()) { int c = inputInstance.getModeling().getChannels().indexOf(channel); //for each channel get producer and consumer - TMLChannel channelCast = (TMLChannel)channel; + TMLChannel channelCast = (TMLChannel) channel; TMLTask producer = channelCast.getOriginTask(); int prodIndex = inputInstance.getModeling().getTasks().indexOf(producer); @@ -663,13 +660,13 @@ public class OptimizationModel { for (HwNode hwNode : inputInstance.getArchitecture().getCPUs()) { int p = inputInstance.getArchitecture().getCPUs().indexOf(hwNode); - for (Object taski : inputInstance.getModeling().getTasks()) { + for (Object taski : inputInstance.getModeling().getTasks()) { int ti = inputInstance.getModeling().getTasks().indexOf(taski); //Calculate End times of ti ArithExpr wceti = ctx.mkInt(0); - TMLTask taskiCast = (TMLTask)taski; + TMLTask taskiCast = (TMLTask) taski; for (HwExecutionNode ihwNode : inputInstance.getFeasibleCPUs(taskiCast)) { int ip = inputInstance.getArchitecture().getCPUs().indexOf(ihwNode); @@ -680,7 +677,7 @@ public class OptimizationModel { ArithExpr endti = ctx.mkAdd(start[ti], wceti); - for (Object taskj : inputInstance.getModeling().getTasks()) { + for (Object taskj : inputInstance.getModeling().getTasks()) { int tj = inputInstance.getModeling().getTasks().indexOf(taskj); @@ -690,7 +687,7 @@ public class OptimizationModel { ArithExpr wcetj = ctx.mkInt(0); - TMLTask taskjCast = (TMLTask)taskj; + TMLTask taskjCast = (TMLTask) taskj; for (HwExecutionNode jhwNode : inputInstance.getFeasibleCPUs(taskjCast)) { @@ -783,11 +780,14 @@ public class OptimizationModel { Expr[][] optimized_result_X = new Expr[inputInstance.getModeling().getTasks().size()][inputInstance.getArchitecture().getCPUs().size()]; Expr[] optimized_result_start = new Expr[inputInstance.getModeling().getTasks().size()]; - tmlMapping = new TMLMapping<>( inputInstance.getModeling(), inputInstance.getArchitecture(),false); + tmlMapping = new TMLMapping<>(inputInstance.getModeling(), inputInstance.getArchitecture(), false); - outputToDisplay ="The optimal mapping solution is:\n\n"; + outputToDisplay = "The optimal mapping solution is:\n\n"; - for ( Object task : inputInstance.getModeling().getTasks()) { + outputToDisplay = outputToDisplay + "(1) Spatial mapping of tasks:\n"; + outputToDisplay = outputToDisplay + "\nTASK --> PLATFORM NODE\n"; + + for (Object task : inputInstance.getModeling().getTasks()) { int t = inputInstance.getModeling().getTasks().indexOf(task); for (HwNode hwNode : inputInstance.getArchitecture().getCPUs()) { @@ -795,61 +795,86 @@ public class OptimizationModel { //evaluate optimal solution optimized_result_X[t][p] = m.evaluate(X[t][p], true); - TMLTask taskCast = (TMLTask)task; + TMLTask taskCast = (TMLTask) task; - if(Integer.parseInt(optimized_result_X[t][p].toString()) == 1){ + if (Integer.parseInt(optimized_result_X[t][p].toString()) == 1) { //mapping of task on hwExecutionNode - tmlMapping.addTaskToHwExecutionNode(taskCast,(HwExecutionNode) hwNode); + tmlMapping.addTaskToHwExecutionNode(taskCast, (HwExecutionNode) hwNode); //mapping of R/W channels on local memory of hwExecutionNode TODO get(0) - if(!taskCast.getReadChannels().isEmpty()) - tmlMapping.addCommToHwCommNode(taskCast.getReadChannels().get(0),inputInstance.getLocalMemoryOfHwExecutionNode(hwNode)); + if (!taskCast.getReadChannels().isEmpty()) + tmlMapping.addCommToHwCommNode(taskCast.getReadChannels().get(0), inputInstance.getLocalMemoryOfHwExecutionNode(hwNode)); - if(!taskCast.getWriteChannels().isEmpty()) - tmlMapping.addCommToHwCommNode(taskCast.getWriteChannels().get(0),inputInstance.getLocalMemoryOfHwExecutionNode(hwNode)); + if (!taskCast.getWriteChannels().isEmpty()) + tmlMapping.addCommToHwCommNode(taskCast.getWriteChannels().get(0), inputInstance.getLocalMemoryOfHwExecutionNode(hwNode)); - outputToDisplay = outputToDisplay + "\n" + taskCast.getName() + " --> " + hwNode.getName(); + outputToDisplay = outputToDisplay + "\n" + taskCast.getName() + " --> " + hwNode.getName(); } optimizedSolutionX.put("X[" + taskCast.getName() + "][" + hwNode.getName() + "] = ", Integer.parseInt (optimized_result_X[t][p] - .toString())); + .toString())); - // TraceManager.addDev("X[" + task.getName() + "][" + hwNode.getName() + "] = " + optimized_result_X[t][p]); + // TraceManager.addDev("X[" + task.getName() + "][" + hwNode.getName() + "] = " + optimized_result_X[t][p]); } TraceManager.addDev("\n"); } - for (Object task : inputInstance.getModeling().getTasks()) { + outputToDisplay = outputToDisplay + "\n\n(2) Temporal mapping of tasks:\n"; + + for (Object task : inputInstance.getModeling().getTasks()) { int t = inputInstance.getModeling().getTasks().indexOf(task); optimized_result_start[t] = m.evaluate(start[t], false); - TMLTask taskCast = (TMLTask)task; + TMLTask taskCast = (TMLTask) task; - optimizedSolutionStart.put("start[" + taskCast.getName() + "] = ", Integer.parseInt(optimized_result_start[t].toString())); + //optimizedSolutionStart.put("start[" + taskCast.getName() + "] ", Integer.parseInt(optimized_result_start[t].toString())); - // TraceManager.addDev("start[" + task.getName() + "] = " + optimized_result_start[t]); + // TraceManager.addDev("start[" + task.getName() + "] = " + optimized_result_start[t]); } - /* for(Map.Entry<String, Integer> entry : optimizedSolutionX.entrySet()) { - outputToDisplay = outputToDisplay + entry.getKey() + " = " + entry.getValue() + "\n"; - }*/ + + // reordering and displaying schedule + for (HwNode hwNode : inputInstance.getArchitecture().getCPUs()) { + int p = inputInstance.getArchitecture().getCPUs().indexOf(hwNode); + + TreeMap<Integer, String> treeHwNode = new TreeMap<>(); + + outputToDisplay = outputToDisplay + "\n" + hwNode.getName() + " : "; + + for (Object task : inputInstance.getModeling().getTasks()) { + int t = inputInstance.getModeling().getTasks().indexOf(task); + + TMLTask taskCast = (TMLTask) task; + + if (Integer.parseInt(optimized_result_X[t][p].toString()) == 1) { + treeHwNode.put(Integer.parseInt(optimized_result_start[t].toString()), taskCast.getName()); + } + + } + + for (Map.Entry<Integer, String> entry : treeHwNode.entrySet()) { + outputToDisplay = outputToDisplay + entry.getValue() + " at " + entry.getKey() + " ; "; + } + } + outputToDisplay += "\n\n"; - for(Map.Entry<String, Integer> entry : optimizedSolutionStart.entrySet()) { + for (Map.Entry<String, Integer> entry : optimizedSolutionStart.entrySet()) { outputToDisplay = outputToDisplay + entry.getKey() + " = " + entry.getValue() + "\n"; } + TraceManager.addDev(outputToDisplay); result.mappingFound = true; result.resultingMapping = tmlMapping; } else { - outputToDisplay ="No suitable mapping could be found"; + outputToDisplay = "No suitable mapping could be found"; TraceManager.addDev(outputToDisplay); result.mappingFound = false; } @@ -860,6 +885,4 @@ public class OptimizationModel { } - - } -- GitLab