start of new file
[IRC.git] / Robust / src / Analysis / Scheduling / SchedulingUtil.java
index b9e561ed35e6c6f08dfccca074f840195d7cb9ee..37ff19817ef6d9986808c948c351fdcbfab4bb22 100644 (file)
@@ -121,7 +121,6 @@ public class SchedulingUtil {
                }
                
                output.print(" -> ");
-               //if(se.getTargetFState() == null) {
                if(se.isclone()) {
                    if(se.getTargetCNode().isclone()) {
                        output.print(se.getTargetCNode().getLabel());
@@ -154,16 +153,15 @@ public class SchedulingUtil {
                }
                
                output.print(" -> ");
-               //if(se.getTargetFState() == null) {
                if(se.isclone()) {
                    if(se.getTargetCNode().isclone()) {
                        output.print(se.getTargetCNode().getLabel());
                    } else {
                        output.print(se.getTargetCNode().getClusterLabel());
                    }
-                   output.println(" [label=\"" + se.getLabel() + "\", color=red, style=dashed]");
+                   output.println(" [label=\"" + se.getLabel() + "\", color=red, style=dashed];");
                } else {
-                   output.println(se.getTargetFState().getLabel() + " [label=\"" + se.getLabel() + "\", color=red, style=dashed]");
+                   output.println(se.getTargetFState().getLabel() + " [label=\"" + se.getLabel() + "\", color=red, style=dashed];");
                }
             }
         }
@@ -190,7 +188,6 @@ public class SchedulingUtil {
        Vector namers=new Vector();
        namers.add(new Namer());
        namers.add(new Allocations());
-       //namers.add(new TaskEdges());
            
        Iterator it = nodes.iterator();
        while (it.hasNext()) {
@@ -302,40 +299,40 @@ public class SchedulingUtil {
            // time coordinate nodes
            Vector<String> timeNodes = new Vector<String>();
            String[] lastTaskNodes = new String[coreNum];
+           String[] lastTasks = new String[coreNum];
            boolean[] isTaskFinish = new boolean[coreNum];
            for(j = 0; j < coreNum; j++) {
                lastTaskNodes[j] = "first";
                isTaskFinish[j] = true;
+               lastTasks[j] = "";
            }
            timeNodes.add("0");
            for(j = 0; j < checkpoints.size(); j++) {
                CheckPoint tcp = checkpoints.elementAt(j);
+               Hashtable<Integer, String> tmplastTasks = new Hashtable<Integer, String>();
+               Vector<Integer> tmpisTaskFinish = new Vector<Integer>();
+               Vector<Integer> tmpisset = new Vector<Integer>();
                String tnode = String.valueOf(tcp.getTimepoint());
                if(!timeNodes.contains(tnode)) {
                    timeNodes.add(tnode);
                }
                Vector<Action> actions = tcp.getActions();
                Hashtable<String, StringBuffer> tmpTaskNodes = new Hashtable<String, StringBuffer>();
-               //Vector<String> sortedttnodes = new Vector<String>();
                for(int i = 0; i < actions.size(); i++) {
                    Action taction = actions.elementAt(i);
                    int cNum = taction.getCoreNum();
+                   if(!tmplastTasks.contains(cNum)) {
+                       tmplastTasks.put(cNum, lastTasks[cNum]);
+                   }
+                   if(!(tmpisset.contains(cNum)) && (isTaskFinish[cNum]) && !(tmpisTaskFinish.contains(cNum))) {
+                       tmpisTaskFinish.add(cNum); // records those with task finished the first time visit it
+                   }
                    String tmpTaskNode = "\"" + tnode + "core" + cNum + "\"";
                    StringBuffer tmpLabel = null;
                    boolean isfirst = false;
                    if(!tmpTaskNodes.containsKey(tmpTaskNode)) {
                        tmpTaskNodes.put(tmpTaskNode, new StringBuffer(tnode + ":"));
                        isfirst = true;
-                       /*int length = sortedttnodes.size();
-                       int k = length;
-                       for(; k > 0; k--) {
-                           String tmptnode = sortedttnodes.elementAt(k-1);
-                           int tcorenum = Integer.parseInt(tmptnode.substring(tmptnode.indexOf("core") + 4, tmptnode.length() - 1));
-                           if(tcorenum < cNum) {
-                               break;
-                           }
-                       }
-                       sortedttnodes.add(k, tmpTaskNode);*/
                    }
                    tmpLabel = tmpTaskNodes.get(tmpTaskNode);
                    switch(taction.getType()){
@@ -347,11 +344,11 @@ public class SchedulingUtil {
                        if(!(lastTaskNodes[cNum].equals(tmpTaskNode))) {
                            output.print("\t");
                            if(lastTaskNodes[cNum].equals("first")) {
-                               output.println("\"core " + cNum + "\"->" + tmpTaskNode);
+                               output.print("\"core " + cNum + "\"->" + tmpTaskNode);
                            } else {
                                output.print(lastTaskNodes[cNum] + "->" + tmpTaskNode);
                            }
-                           if(isTaskFinish[cNum]) {
+                           if(tmpisTaskFinish.contains(cNum)) {
                                output.print(" [style=invis]");
                            }
                            output.println(";");
@@ -364,12 +361,19 @@ public class SchedulingUtil {
                            tmpLabel.append("\\n");
                        }
                        tmpLabel.append("<" + taction.getTd().getSymbol() + ">finishes;");
-                       if(!(lastTaskNodes[cNum].equals("first")) &&
-                               !(lastTaskNodes[cNum].equals(tmpTaskNode))) {
-                           output.print("\t");
-                           output.println(lastTaskNodes[cNum] + "->" + tmpTaskNode);
-                           lastTaskNodes[cNum] = tmpTaskNode;
-                           isTaskFinish[cNum] = true;
+                       if(!(lastTaskNodes[cNum].equals("first"))) {
+                           if(!(lastTaskNodes[cNum].equals(tmpTaskNode))) {
+                               output.print("\t");
+                               output.println(lastTaskNodes[cNum] + "->" + tmpTaskNode + ";");
+                               lastTaskNodes[cNum] = tmpTaskNode;
+                           }
+                           if(tmpisset.contains(cNum)) {
+                               isTaskFinish[cNum] &= true;
+                           } else {
+                               isTaskFinish[cNum] = true;
+                               tmpisset.add(cNum);
+                           }
+                           lastTasks[cNum] = "";
                        } else {
                            throw new Exception("Error: unexpected task finish");
                        }
@@ -390,12 +394,19 @@ public class SchedulingUtil {
                                tmpLabel.append(";");
                            }
                        }
-                       if(!(lastTaskNodes[cNum].equals("first")) &&
-                               !(lastTaskNodes[cNum].equals(tmpTaskNode))) {
-                           output.print("\t");
-                           output.println(lastTaskNodes[cNum] + "->" + tmpTaskNode);
-                           lastTaskNodes[cNum] = tmpTaskNode;
-                           isTaskFinish[cNum] = true;
+                       if(!(lastTaskNodes[cNum].equals("first"))) {
+                           if (!(lastTaskNodes[cNum].equals(tmpTaskNode))) {
+                               output.print("\t");
+                               output.println(lastTaskNodes[cNum] + "->" + tmpTaskNode + ";");
+                               lastTaskNodes[cNum] = tmpTaskNode;
+                           }
+                           if(tmpisset.contains(cNum)) {
+                               isTaskFinish[cNum] &= true;
+                           } else {
+                               isTaskFinish[cNum] = true;
+                               tmpisset.add(cNum);
+                           }
+                           lastTasks[cNum] = "";
                        } else {
                            throw new Exception("Error: unexpected task finish");
                        }
@@ -406,6 +417,7 @@ public class SchedulingUtil {
                            tmpLabel.append("\\n");
                        }
                        tmpLabel.append("<" + taction.getTd().getSymbol() + ">starts;");
+                       lastTasks[cNum] = taction.getTd().getSymbol();
                        
                        if (!(lastTaskNodes[cNum].equals(tmpTaskNode))) {
                            output.print("\t");
@@ -414,13 +426,13 @@ public class SchedulingUtil {
                            } else {
                                output.print(lastTaskNodes[cNum] + "->" + tmpTaskNode);
                            }
-                           if(isTaskFinish[cNum]) {
+                           if(tmpisTaskFinish.contains(cNum)) {
                                output.print(" [style=invis]");
                            }
                            output.println(";");
                            lastTaskNodes[cNum] = tmpTaskNode;
                        }
-                       isTaskFinish[cNum] = false;
+                       isTaskFinish[cNum] &= false;
                        break;
                    }
                    case Action.TASKABORT: {
@@ -428,12 +440,20 @@ public class SchedulingUtil {
                            tmpLabel.append("\\n");
                        }
                        tmpLabel.append("<" + taction.getTd().getSymbol() + ">aborts;");
-                       if(!(lastTaskNodes[cNum].equals("first")) &&
-                               !(lastTaskNodes[cNum].equals(tmpTaskNode))) {
-                           output.print("\t");
-                           output.println(lastTaskNodes[cNum] + "->" + tmpTaskNode);
-                           lastTaskNodes[cNum] = tmpTaskNode;
-                           isTaskFinish[cNum] = true;
+                       if(!(lastTaskNodes[cNum].equals("first")) && 
+                               (tmplastTasks.get(cNum).equals(taction.getTd().getSymbol()))) {
+                           if(!(lastTaskNodes[cNum].equals(tmpTaskNode))) {
+                               output.print("\t");
+                               output.println(lastTaskNodes[cNum] + "->" + tmpTaskNode + ";");
+                               lastTaskNodes[cNum] = tmpTaskNode;
+                           }
+                           if(tmpisset.contains(cNum)) {
+                               isTaskFinish[cNum] &= true;
+                           } else {
+                               isTaskFinish[cNum] = true;
+                               tmpisset.add(cNum);
+                           }
+                           lastTasks[cNum] = "";
                        } else {
                            throw new Exception("Error: unexpected task aborts");
                        }
@@ -445,11 +465,19 @@ public class SchedulingUtil {
                        }
                        tmpLabel.append("<" + taction.getTd().getSymbol() + ">removes;");
                        if(!(lastTaskNodes[cNum].equals("first")) &&
-                               !(lastTaskNodes[cNum].equals(tmpTaskNode))) {
-                           output.print("\t");
-                           output.println(lastTaskNodes[cNum] + "->" + tmpTaskNode);
-                           lastTaskNodes[cNum] = tmpTaskNode;
-                           isTaskFinish[cNum] = true;
+                               (tmplastTasks.get(cNum).equals(taction.getTd().getSymbol()))) {
+                           if(!(lastTaskNodes[cNum].equals(tmpTaskNode))) {
+                               output.print("\t");
+                               output.println(lastTaskNodes[cNum] + "->" + tmpTaskNode + ";");
+                               lastTaskNodes[cNum] = tmpTaskNode;
+                           }
+                           if(tmpisset.contains(cNum)) {
+                               isTaskFinish[cNum] &= true;
+                           } else {
+                               isTaskFinish[cNum] = true;
+                               tmpisset.add(cNum);
+                           }
+                           lastTasks[cNum] = "";
                        } else {
                            throw new Exception("Error: unexpected task remove");
                        }
@@ -465,10 +493,6 @@ public class SchedulingUtil {
                }
                output.print("\t");
                output.print("{rank=same; rankdir=LR; " + tnode + "; ");
-               /*for(int k = 0; k < sortedttnodes.size(); k++) {
-                   output.print(sortedttnodes.elementAt(k));
-                   output.print("; ");
-               }*/
                keys = tmpTaskNodes.keys();
                while(keys.hasMoreElements()) {
                    String tmpTaskNode = keys.nextElement();
@@ -477,17 +501,10 @@ public class SchedulingUtil {
                }
                output.println("}");
                output.print("\t");
-               /*output.print(tnode + "->");
-               for(int k = 0; k < sortedttnodes.size() - 1; k++) {
-                   output.print(sortedttnodes.elementAt(k) + "->");
-               }
-               output.println(sortedttnodes.lastElement() + " [style=dashed];");*/
            }
            output.print("\t");
-           //output.println("node [shape=point, color=blue];");
            output.print("\t");
            output.println("\"Time\"->" + timeNodes.elementAt(0) + "[style=invis];");
-           //for(j = 0; j < timeNodes.size() - 1; j++) {
            for(j = 0; j < time; j++) {
                output.print(j + "->");
            }