/** * 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; }
current = layers.get(index - 1); previous = layers.get(index); improved = doTranspose(current, previous, edges); current = layers.get(index); previous = layers.get(index - 1); improved = doTranspose(current, previous, edges);
final LayeredGraph layered = (LayeredGraph)graph; final List<OrientedEdge> edges = graph.getEdges(); final List<GraphLayer> virtualized = createVirtual(edges, layered); List<GraphLayer> best = clone(virtualized); this.vertexPositioning.positionVertices(virtualized, edges, i); this.verticesTransposer.transpose(virtualized, edges, i); if (this.crossingCount.crossing(best, edges) > this.crossingCount.crossing(virtualized, edges)) { best = clone(virtualized); } else { break;
@Test public void testTwoSeparateTrees() { final LayeredGraph graph = new LayeredGraph(Graphs.TwoSeparateTreesFromRoots); final ReverseEdgesCycleBreaker s01 = new ReverseEdgesCycleBreaker(); s01.breakCycle(graph); final LongestPathVertexLayerer s02 = new LongestPathVertexLayerer(); s02.createLayers(graph); final MedianVertexLayerPositioning vertexPositioning = new MedianVertexLayerPositioning(); final LayerCrossingCount crossingCount = new LayerCrossingCount(); final VerticesTransposer verticesTransposer = new VerticesTransposer(crossingCount); final DefaultVertexOrdering s03 = new DefaultVertexOrdering(vertexPositioning, crossingCount, verticesTransposer); s03.orderVertices(graph); Assertions.assertThat(graph.getLayers()) .as("TwoSeparateTreesFromRoots graph vertices should be placed into three layers") .hasSize(3); }
@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 calculateMedianTest() { final List<OrientedEdge> edges = new ArrayList<>(); edges.add(new OrientedEdgeImpl("G", "A")); edges.add(new OrientedEdgeImpl("G", "D")); edges.add(new OrientedEdgeImpl("G", "E")); final GraphLayerImpl layer00 = new GraphLayerImpl(0); layer00.addNewVertex("A"); layer00.addNewVertex("B"); layer00.addNewVertex("C"); layer00.addNewVertex("D"); layer00.addNewVertex("E"); final GraphLayerImpl layer01 = new GraphLayerImpl(1); layer01.addNewVertex("F"); layer01.addNewVertex("G"); layer01.addNewVertex("H"); layer01.addNewVertex("I"); layer01.addNewVertex("J"); final MedianVertexLayerPositioning vertexMedian = new MedianVertexLayerPositioning(); final double median = vertexMedian.calculateMedianOfVerticesConnectedTo("G", layer00, edges); assertEquals(3.0, median, 0.0001); }
for (final Vertex vertex : currentLayer.getVertices()) { final double median = calculateMedianOfVerticesConnectedTo(vertex.getId(), layers.get(j - 1), edges); vertex.setMedian(median); final double median = calculateMedianOfVerticesConnectedTo(vertex.getId(), layers.get(j + 1), edges); vertex.setMedian(median);
final GraphLayer south) { final Object[] entries = flat(edges, north, south);
@Test public void testFullGraph() { final LayeredGraph graph = new LayeredGraph(Graphs.Full); final ReverseEdgesCycleBreaker s01 = new ReverseEdgesCycleBreaker(); s01.breakCycle(graph); final LongestPathVertexLayerer s02 = new LongestPathVertexLayerer(); s02.createLayers(graph); final MedianVertexLayerPositioning vertexPositioning = new MedianVertexLayerPositioning(); final LayerCrossingCount crossingCount = new LayerCrossingCount(); final VerticesTransposer verticesTransposer = new VerticesTransposer(crossingCount); final DefaultVertexOrdering s03 = new DefaultVertexOrdering(vertexPositioning, crossingCount, verticesTransposer); s03.orderVertices(graph); Assertions.assertThat(graph.getLayers()) .as("Full graph vertices should be in 4 layers") .hasSize(4); } }
@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); }
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 testRealCase1() { final LayeredGraph graph = new LayeredGraph(Graphs.REAL_CASE_1); final ReverseEdgesCycleBreaker s01 = new ReverseEdgesCycleBreaker(); s01.breakCycle(graph); final LongestPathVertexLayerer s02 = new LongestPathVertexLayerer(); s02.createLayers(graph); final MedianVertexLayerPositioning vertexPositioning = new MedianVertexLayerPositioning(); final LayerCrossingCount crossingCount = new LayerCrossingCount(); final VerticesTransposer verticesTransposer = new VerticesTransposer(crossingCount); final DefaultVertexOrdering s03 = new DefaultVertexOrdering(vertexPositioning, crossingCount, verticesTransposer); s03.orderVertices(graph); Assert.assertEquals(6, graph.getLayers().size()); final DefaultVertexPositioning defaultVertexPositioning = new DefaultVertexPositioning(); defaultVertexPositioning.calculateVerticesPositions(graph, LayerArrangement.TopDown); }
edges.add(new OrientedEdgeImpl("F", "B")); final LayerCrossingCount cc = new LayerCrossingCount(); final int result = cc.crossing(edges, top, bottom);
@Test public void testSimpleReorder() { final LayeredGraph graph = new LayeredGraph(); graph.addEdge("A", "D"); graph.addEdge("B", "C"); final GraphLayerImpl layer01 = new GraphLayerImpl(1); layer01.addNewVertex("A"); layer01.addNewVertex("B"); graph.getLayers().add(layer01); final GraphLayerImpl layer02 = new GraphLayerImpl(2); layer02.addNewVertex("C"); layer02.addNewVertex("D"); graph.getLayers().add(layer02); final MedianVertexLayerPositioning median = new MedianVertexLayerPositioning(); final LayerCrossingCount layersCount = new LayerCrossingCount(); final VerticesTransposer verticesTransposer = new VerticesTransposer(layersCount); final DefaultVertexOrdering ordering = new DefaultVertexOrdering(median, layersCount, verticesTransposer); ordering.orderVertices(graph); Assertions.assertThat(graph.getLayers().get(0).getVertices()) .extracting(Vertex::getId) .containsExactly("A", "B"); Assertions.assertThat(graph.getLayers().get(1).getVertices()) .extracting(Vertex::getId) .containsExactly("D", "C"); }
@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); }
graph.getLayers().add(layer03); final MedianVertexLayerPositioning median = new MedianVertexLayerPositioning(); final LayerCrossingCount layersCount = new LayerCrossingCount(); final VerticesTransposer verticesTransposer = new VerticesTransposer(layersCount); final DefaultVertexOrdering ordering = new DefaultVertexOrdering(median, layersCount, verticesTransposer); ordering.orderVertices(graph); final List<GraphLayer> orderedLayers = graph.getLayers();
@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 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); }
@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 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); }