private void calcLevels() { LinkedList<LinkedList<Slice>> levelsList = new LinkedList<LinkedList<Slice>>(); HashSet<Slice> visited = new HashSet<Slice>(); LinkedList<Slice> queue = new LinkedList<Slice>(); // add the top slices and set their level for (int i = 0; i < topSlices.length; i++) { queue.add(topSlices[i]); levelMap.put(topSlices[i], 0); } while (!queue.isEmpty()) { Slice slice = queue.removeFirst(); if (!visited.contains(slice)) { visited.add(slice); for (Edge destEdge : slice.getTail().getDestSet(SchedulingPhase.STEADY)) { Slice current = destEdge.getDest().getParent(); if (!visited.contains(current)) { // only add if all sources has been visited boolean addMe = true; int maxParentLevel = 0; for (Edge sourceEdge : current.getHead().getSourceSet(SchedulingPhase.STEADY)) { if (!visited.contains(sourceEdge.getSrc().getParent())) { addMe = false; break; } // remember the max parent level if (levelMap.get(sourceEdge.getSrc().getParent()).intValue() > maxParentLevel) maxParentLevel = levelMap.get(sourceEdge.getSrc().getParent()).intValue(); } if (addMe) { levelMap.put(current, maxParentLevel + 1); queue.add(current); } } } // add the slice to the appropriate level int sliceLevel = levelMap.get(slice); if (levelsList.size() <= sliceLevel) { int levelsToAdd = sliceLevel - levelsList.size() + 1; for (int i = 0; i < levelsToAdd; i++) ; levelsList.add(new LinkedList<Slice>()); } levelsList.get(sliceLevel).add(slice); } } // set the multi-dim array for the levels from the linkedlist of lists levels = new Slice[levelsList.size()][]; for (int i = 0; i < levels.length; i++) { levels[i] = new Slice[levelsList.get(i).size()]; for (int j = 0; j < levels[i].length; j++) levels[i][j] = levelsList.get(i).get(j); } }