1 package Analysis.Scheduling;
3 import Analysis.TaskStateAnalysis.*;
9 /** This class holds flag transition diagram(s) can be put on one core.
11 public class ScheduleNode extends GraphNode implements Cloneable{
15 private static int nodeID=0;
17 private Vector<ClassNode> classNodes;
18 Vector<ScheduleEdge> scheduleEdges;
20 private int executionTime;
24 private Hashtable<ClassDescriptor, Vector<ScheduleNode>> targetSNodes;
25 private boolean sorted = false;
28 * @param cd ClassDescriptor
31 public ScheduleNode(int gid) {
32 this.uid = ScheduleNode.nodeID++;
35 this.executionTime = -1;
38 public ScheduleNode(ClassNode cn, int gid) {
39 this.uid = ScheduleNode.nodeID++;
42 this.classNodes = new Vector<ClassNode>();
43 this.scheduleEdges = new Vector<ScheduleEdge>();
44 this.classNodes.add(cn);
45 this.addEdge(cn.getEdgeVector());
46 this.executionTime = -1;
53 public int getCoreNum() {
57 public void setCoreNum(int coreNum) {
58 this.coreNum = coreNum;
61 public void addTargetSNode(ClassDescriptor cd, ScheduleNode sn) {
62 if(this.targetSNodes == null) {
63 this.targetSNodes = new Hashtable<ClassDescriptor, Vector<ScheduleNode>>();
66 if(!this.targetSNodes.containsKey(cd)) {
67 this.targetSNodes.put(cd, new Vector<ScheduleNode>());
69 this.targetSNodes.get(cd).add(sn);
72 public void listTasks() {
73 if(this.tasks == null) {
74 this.tasks = new Vector();
78 for(i = 0; i < classNodes.size(); i++) {
79 Iterator it_flags = classNodes.elementAt(i).getFlags();
80 while(it_flags.hasNext()) {
81 FlagState fs = (FlagState)it_flags.next();
82 Iterator it_edges = fs.edges();
83 while(it_edges.hasNext()) {
84 TaskDescriptor td = ((FEdge)it_edges.next()).getTask();
85 if(!this.tasks.contains(td)) {
93 public void addTask(TaskDescriptor task){
97 public Vector getTasks(){
101 public boolean isSorted() {
105 public void setSorted(boolean sorted) {
106 this.sorted = sorted;
109 public String toString() {
110 String temp = new String("");
111 for(int i = 0; i < classNodes.size(); i++) {
112 temp += classNodes.elementAt(i).getClassDescriptor().toString() + ", ";
114 temp += getTextLabel();
118 public Vector getClassNodes() {
122 public Iterator getClassNodesIterator() {
123 if(classNodes == null) {
126 return classNodes.iterator();
129 public void resetClassNodes() {
133 public Vector getScheduleEdges() {
134 return scheduleEdges;
137 public Iterator getScheduleEdgesIterator() {
138 if(scheduleEdges == null) {
141 return scheduleEdges.iterator();
144 public void resetScheduleEdges() {
145 scheduleEdges = null;
148 public int getExeTime() {
149 if(this.executionTime == -1) {
152 } catch (Exception e) {
156 return this.executionTime;
159 public void calExeTime() throws Exception {
160 if(this.classNodes.size() != 1) {
161 throw new Exception("Error: there are multiple ClassNodes inside the ScheduleNode when calculating executionTime");
163 ClassNode cn = this.classNodes.elementAt(0);
165 throw new Error("Error: Non-sorted ClassNode!");
167 this.executionTime = cn.getFlagStates().elementAt(0).getExeTime();
170 /** Tests for equality of two flagstate objects.
173 public boolean equals(Object o) {
174 if (o instanceof ScheduleNode) {
175 ScheduleNode fs=(ScheduleNode)o;
176 if(fs.gid == this.gid) {
177 if(fs.uid != this.uid) {
181 if ((fs.sorted != this.sorted) ||
182 (fs.executionTime != this.executionTime)){
185 if(fs.classNodes != null) {
186 if(!fs.classNodes.equals(classNodes)) {
189 } else if(classNodes != null) {
197 public int hashCode() {
198 int hashcode = gid^uid^Boolean.toString(sorted).hashCode()^executionTime;//^scheduleEdges.hashCode();
199 if(this.classNodes != null) {
200 hashcode ^= classNodes.hashCode();
205 public String getLabel() {
206 return "cluster" + uid;
209 public String getTextLabel() {
211 if(this.coreNum != -1) {
212 label = "Core " + this.coreNum;
220 public Object clone(Hashtable<ClassNode, ClassNode> cn2cn, int gid) {
221 ScheduleNode o = null;
223 o = (ScheduleNode)super.clone();
224 } catch(CloneNotSupportedException e){
227 o.uid = ScheduleNode.nodeID++;
229 // Clone all the internal ClassNodes and ScheduleEdges
230 Vector<ClassNode> tcns = new Vector<ClassNode>();
231 Vector<ScheduleEdge> tses = new Vector<ScheduleEdge>();
233 for(i = 0; i < this.classNodes.size(); i++) {
234 ClassNode tcn = this.classNodes.elementAt(i);
235 ClassNode cn = (ClassNode)tcn.clone();
236 cn.setScheduleNode(o);
240 for(i = 0; i < this.scheduleEdges.size(); i++) {
241 ScheduleEdge temp = this.scheduleEdges.elementAt(i);
242 ScheduleEdge se = null;
243 if(!temp.getIsNew()) {
244 se = new ScheduleEdge(o, "transmit",temp.getClassDescriptor(), false, gid);
246 se = new ScheduleEdge(o, "new",temp.getClassDescriptor(), gid);
248 se.setSourceCNode(cn2cn.get(temp.getSourceCNode()));
249 se.setTargetCNode(cn2cn.get(temp.getTargetCNode()));
250 se.setProbability(temp.getProbability());
251 se.setNewRate(temp.getNewRate());
252 se.setTransTime(temp.getTransTime());
256 o.scheduleEdges = tses;
259 o.inedges = new Vector();
260 o.edges = new Vector();
265 public void mergeSEdge(ScheduleEdge se) {
266 assert(se.getIsNew());
268 Vector<ClassNode> targetCNodes = (Vector<ClassNode>)((ScheduleNode)se.getTarget()).getClassNodes();
269 Vector<ScheduleEdge> targetSEdges = (Vector<ScheduleEdge>)((ScheduleNode)se.getTarget()).getScheduleEdges();
271 for(int i = 0; i < targetCNodes.size(); i++) {
272 targetCNodes.elementAt(i).setScheduleNode(this);
275 if(classNodes == null) {
276 classNodes = targetCNodes;
277 scheduleEdges = targetSEdges;
279 if(targetCNodes.size() != 0) {
280 classNodes.addAll(targetCNodes);
282 if(targetSEdges.size() != 0) {
283 scheduleEdges.addAll(targetSEdges);
289 scheduleEdges.add(se);
290 se.resetListExeTime();
291 se.getTarget().removeInedge(se);
293 Iterator it_edges = se.getTarget().edges();
294 while(it_edges.hasNext()) {
295 ScheduleEdge tse = (ScheduleEdge)it_edges.next();
297 this.edges.addElement(tse);
300 // As all tasks inside one ScheduleNode are executed sequentially,
301 // simply add the execution time of all the ClassNodes inside one ScheduleNode.
302 if(this.executionTime == -1) {
303 this.executionTime = 0;
305 this.executionTime += ((ScheduleNode)se.getTarget()).getExeTime();
308 public void mergeSNode(ScheduleNode sn) throws Exception {
309 Vector<ClassNode> targetCNodes = (Vector<ClassNode>)sn.getClassNodes();
310 Vector<ScheduleEdge> targetSEdges = (Vector<ScheduleEdge>)sn.getScheduleEdges();
312 for(int i = 0; i < targetCNodes.size(); i++) {
313 targetCNodes.elementAt(i).setScheduleNode(this);
316 if(classNodes == null) {
317 classNodes = targetCNodes;
318 scheduleEdges = targetSEdges;
320 if(targetCNodes.size() != 0) {
321 classNodes.addAll(targetCNodes);
323 if(targetSEdges.size() != 0) {
324 scheduleEdges.addAll(targetSEdges);
330 Iterator it_edges = sn.edges();
331 while(it_edges.hasNext()) {
332 ScheduleEdge tse = (ScheduleEdge)it_edges.next();
334 this.edges.addElement(tse);
337 // As all tasks inside one ScheduleNode are executed sequentially,
338 // simply add the execution time of all the ClassNodes inside one ScheduleNode.
339 if(this.executionTime == -1) {
340 throw new Exception("Error: ScheduleNode without initiate execution time when analysising.");
342 if(this.executionTime < sn.getExeTime()) {
343 this.executionTime = sn.getExeTime();