/** * Sorts the operators topologically, i.e. such that operator <var>i</var> in the returned * ordering has dependencies (i.e. connected {@link InputPort}s) only from operators * <var>0..i-1</var>. */ public Vector<Operator> topologicalSort() { final Map<Operator, Integer> originalIndices = new HashMap<Operator, Integer>(); for (int i = 0; i < operators.size(); i++) { originalIndices.put(operators.get(i), i); } EdgeCounter counter = new EdgeCounter(operators); for (Operator child : getOperators()) { for (OutputPort out : child.getOutputPorts().getAllPorts()) { InputPort dest = out.getDestination(); if (dest != null) { counter.incNumEdges(dest.getPorts().getOwner().getOperator()); } } } Vector<Operator> sorted = new Vector<Operator>(); PriorityQueue<Operator> independentOperators = new PriorityQueue<Operator>( Math.max(1, operators.size()), new Comparator<Operator>() { @Override public int compare(Operator o1, Operator o2) { return originalIndices.get(o1) - originalIndices.get(o2); } }); independentOperators.addAll(counter.getIndependentOperators()); while (!independentOperators.isEmpty()) { Operator first = independentOperators.poll(); sorted.add(first); for (OutputPort out : first.getOutputPorts().getAllPorts()) { InputPort dest = out.getDestination(); if (dest != null) { Operator destOp = dest.getPorts().getOwner().getOperator(); if (counter.decNumEdges(destOp) == 0) { // independentOperators.addFirst(destOp); independentOperators.add(destOp); } } } } return sorted; }