/** * Counts the total of edges crossing in all layers. * @param layers Existing layers. * @param edges Existing edges. * @return The sum of edges crossing between all layers. */ int crossing(final List<GraphLayer> layers, final List<OrientedEdge> edges) { int crossingCount = 0; for (int i = 1; i < layers.size(); i++) { crossingCount += crossing(edges, layers.get(i - 1), layers.get(i)); } return crossingCount; }
private boolean doTranspose(final GraphLayer current, final GraphLayer previous, final List<OrientedEdge> edges) { final List<Vertex> vertices = current.getVertices(); boolean improved = false; for (int i = 1; i < vertices.size(); i++) { final int currentCrossing = this.crossingCount.crossing(edges, previous, current); Collections.swap(vertices, i, i - 1); final int newCrossing = this.crossingCount.crossing(edges, previous, current); if (newCrossing >= currentCrossing) { Collections.swap(vertices, i - 1, i); } else { improved = true; } } return improved; } }
@Test public void testSimpleNoCrossing() { final GraphLayerImpl top = new GraphLayerImpl(0); top.addNewVertex("A"); top.addNewVertex("B"); final GraphLayerImpl bottom = new GraphLayerImpl(1); bottom.addNewVertex("C"); bottom.addNewVertex("D"); final List<OrientedEdge> edges = new ArrayList<>(); edges.add(new OrientedEdgeImpl("A", "C")); edges.add(new OrientedEdgeImpl("B", "D")); final LayerCrossingCount cc = new LayerCrossingCount(); final int result = cc.crossing(edges, top, bottom); assertEquals(0, result); }
@Test public void testSimpleCrossing() { final GraphLayerImpl top = new GraphLayerImpl(0); top.addNewVertex("A"); top.addNewVertex("B"); final GraphLayerImpl bottom = new GraphLayerImpl(1); bottom.addNewVertex("C"); bottom.addNewVertex("D"); final List<OrientedEdge> edges = new ArrayList<>(); edges.add(new OrientedEdgeImpl("A", "D")); edges.add(new OrientedEdgeImpl("B", "C")); final LayerCrossingCount cc = new LayerCrossingCount(); final int result = cc.crossing(edges, top, bottom); assertEquals(1, result); }
@Test public void testK33GraphCrossing() { /* * k33 - every vertex from layer 1 connected to every vertex in layer 2 */ final GraphLayerImpl top = new GraphLayerImpl(0); top.addNewVertex("A"); top.addNewVertex("B"); top.addNewVertex("C"); final GraphLayerImpl bottom = new GraphLayerImpl(1); bottom.addNewVertex("D"); bottom.addNewVertex("E"); bottom.addNewVertex("F"); final List<OrientedEdge> edges = new ArrayList<>(); edges.add(new OrientedEdgeImpl("A", "D")); edges.add(new OrientedEdgeImpl("A", "E")); edges.add(new OrientedEdgeImpl("A", "F")); edges.add(new OrientedEdgeImpl("B", "D")); edges.add(new OrientedEdgeImpl("B", "E")); edges.add(new OrientedEdgeImpl("B", "F")); edges.add(new OrientedEdgeImpl("C", "D")); edges.add(new OrientedEdgeImpl("C", "E")); edges.add(new OrientedEdgeImpl("C", "F")); final LayerCrossingCount cc = new LayerCrossingCount(); final int result = cc.crossing(edges, top, bottom); assertEquals(9, result); }
final int result = cc.crossing(edges, top, bottom);
@Test public void test2CrossingsUnevenLayers() { /* * 2 crossings * A B * /\\ / * / \ -------+ -- * / /-- +-----/ \ * / / \ \ * D E F * */ final GraphLayerImpl top = new GraphLayerImpl(0); top.addNewVertex("A"); top.addNewVertex("B"); final GraphLayerImpl bottom = new GraphLayerImpl(1); bottom.addNewVertex("D"); bottom.addNewVertex("E"); bottom.addNewVertex("F"); final List<OrientedEdge> edges = new ArrayList<>(); edges.add(new OrientedEdgeImpl("A", "D")); edges.add(new OrientedEdgeImpl("E", "A")); edges.add(new OrientedEdgeImpl("A", "F")); edges.add(new OrientedEdgeImpl("D", "B")); final LayerCrossingCount cc = new LayerCrossingCount(); final int result = cc.crossing(edges, top, bottom); assertEquals(2, result); }
@Test public void test3CrossingsInMiddle() { /* * 3 crossings * A B C * \ | / * X * / | \ * D E F */ final GraphLayerImpl top = new GraphLayerImpl(0); top.addNewVertex("A"); top.addNewVertex("B"); top.addNewVertex("C"); final GraphLayerImpl bottom = new GraphLayerImpl(1); bottom.addNewVertex("D"); bottom.addNewVertex("E"); bottom.addNewVertex("F"); final List<OrientedEdge> edges = new ArrayList<>(); edges.add(new OrientedEdgeImpl("A", "F")); edges.add(new OrientedEdgeImpl("B", "E")); edges.add(new OrientedEdgeImpl("C", "D")); final LayerCrossingCount cc = new LayerCrossingCount(); final int result = cc.crossing(edges, top, bottom); assertEquals(3, result); }
@Test public void test2Crossings() { /* * 2 crossings * A B C * \ | / * x x * / \| * D E F * */ final GraphLayerImpl top = new GraphLayerImpl(0); top.addNewVertex("A"); top.addNewVertex("B"); top.addNewVertex("C"); final GraphLayerImpl bottom = new GraphLayerImpl(1); bottom.addNewVertex("D"); bottom.addNewVertex("E"); bottom.addNewVertex("F"); final List<OrientedEdge> edges = new ArrayList<>(); edges.add(new OrientedEdgeImpl("A", "E")); edges.add(new OrientedEdgeImpl("B", "E")); edges.add(new OrientedEdgeImpl("C", "D")); final LayerCrossingCount cc = new LayerCrossingCount(); final int result = cc.crossing(edges, top, bottom); assertEquals(2, result); }
final int result = cc.crossing(edges, top, bottom);
@Test public void test1Crossing() { /* * 1 crossing * A B C * \ / * X * / \ * D E F */ final GraphLayerImpl top = new GraphLayerImpl(0); top.addNewVertex("A"); top.addNewVertex("B"); top.addNewVertex("C"); final GraphLayerImpl bottom = new GraphLayerImpl(1); bottom.addNewVertex("D"); bottom.addNewVertex("E"); bottom.addNewVertex("F"); final List<OrientedEdge> edges = new ArrayList<>(); edges.add(new OrientedEdgeImpl("A", "F")); edges.add(new OrientedEdgeImpl("D", "C")); final LayerCrossingCount cc = new LayerCrossingCount(); final int result = cc.crossing(edges, top, bottom); assertEquals(1, result); }