public void computeRows() {
		for (ANode n : nodes.values()) {
			n.setRow(Integer.MIN_VALUE);
		}
		nodes.values().iterator().next().setRow(0);
		boolean changed;
		do {
			onePass();
			changed = false;
			for (ANode n : nodes.values()) {
				if (n.getRow() != Integer.MIN_VALUE) {
					continue;
				}
				final Map.Entry<ANode, ALink> smallestRowOfChildren = getSmallestRowOfChildren(n);
				if (smallestRowOfChildren != null) {
					n.setRow(getStartingRow(smallestRowOfChildren));
				}
				changed = true;
			}
		} while (changed);

		minToZero();
	}