}
output.print(" -> ");
- //if(se.getTargetFState() == null) {
if(se.isclone()) {
if(se.getTargetCNode().isclone()) {
output.print(se.getTargetCNode().getLabel());
}
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];");
}
}
}
Vector namers=new Vector();
namers.add(new Namer());
namers.add(new Allocations());
- //namers.add(new TaskEdges());
Iterator it = nodes.iterator();
while (it.hasNext()) {
// 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()){
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(";");
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");
}
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");
}
tmpLabel.append("\\n");
}
tmpLabel.append("<" + taction.getTd().getSymbol() + ">starts;");
+ lastTasks[cNum] = taction.getTd().getSymbol();
if (!(lastTaskNodes[cNum].equals(tmpTaskNode))) {
output.print("\t");
} 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: {
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");
}
}
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");
}
}
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();
}
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 + "->");
}