public DoubledDigraph<SugiyamaNode<V>,SugiyamaArc<V,E>> createLayoutGraph(Digraph<V,E> graph, DigraphLayoutDimensionProvider<V> dimensions, Digraph<V,?> feedback, int horizontalSpacing) {
		DoubledDigraph<SugiyamaNode<V>,SugiyamaArc<V,E>> result =
			DoubledDigraphAdapter.getAdapterFactory(factory).create();

		Map<V,SugiyamaNode<V>> map = new HashMap<V, SugiyamaNode<V>>();

		// create nodes
		for (V vertex : graph.vertices()) {
			SugiyamaNode<V> node = new SugiyamaNode<V>(vertex, dimensions.getDimension(vertex), horizontalSpacing);
			map.put(vertex, node);
			result.add(node);
		}

		// create arcs
		for (V source : graph.vertices()) {
			for (V target : graph.targets(source)) {
				SugiyamaNode<V> s = map.get(source);
				SugiyamaNode<V> t = map.get(target);
				E e = graph.get(source, target);
				if (feedback.contains(source, target)) {
					if (graph.contains(target, source)) {
						result.put(t, s, new SugiyamaArc<V,E>(t, s, e, graph.get(target, source)));
					} else {
						result.put(t, s, new SugiyamaArc<V,E>(t, s, true, e));
					}
				} else if (!graph.contains(target, source)) {
					result.put(s, t, new SugiyamaArc<V,E>(s, t, false, e));
				}
			}
		}
		assert Digraphs.isAcyclic(result);

		computeNodeLayers(result);

		return result;
	}