示例#1
0
        protected static void AddVerticesAndEdgeRange_Throws_Clusters_Test(
            [NotNull] ClusteredAdjacencyGraph <int, Edge <int> > graph)
        {
            AssertEmptyGraph(graph);

            // ReSharper disable once AssignNullToNotNullAttribute
            Assert.Throws <ArgumentNullException>(() => graph.AddVerticesAndEdgeRange(null));

            // Edge 1, 2, 3
            var edge1 = new Edge <int>(1, 2);
            var edge3 = new Edge <int>(1, 3);

            Assert.Throws <ArgumentNullException>(() => graph.AddVerticesAndEdgeRange(new[] { edge1, null, edge3 }));
            AssertEmptyGraph(graph);
        }
示例#2
0
        protected static void AddVerticesAndEdgeRange_Clusters_Test(
            [NotNull] ClusteredAdjacencyGraph <int, Edge <int> > graph1,
            [NotNull] ClusteredAdjacencyGraph <int, Edge <int> > parent2,
            [NotNull] ClusteredAdjacencyGraph <int, Edge <int> > graph2)
        {
            // Graph without parent
            AssertEmptyGraph(graph1);

            // Edge 1, 2
            var edge1 = new Edge <int>(1, 2);
            var edge2 = new Edge <int>(1, 3);

            Assert.AreEqual(2, graph1.AddVerticesAndEdgeRange(new[] { edge1, edge2 }));
            AssertHasVertices(graph1, new[] { 1, 2, 3 });
            AssertHasEdges(graph1, new[] { edge1, edge2 });

            // Edge 1, 3
            var edge3 = new Edge <int>(2, 3);

            Assert.AreEqual(1, graph1.AddVerticesAndEdgeRange(new[] { edge1, edge3 })); // Showcase the add of only one edge
            AssertHasVertices(graph1, new[] { 1, 2, 3 });
            AssertHasEdges(graph1, new[] { edge1, edge2, edge3 });


            // Graph with parent
            AssertEmptyGraph(parent2);
            AssertEmptyGraph(graph2);

            // Edge 1, 2
            Assert.AreEqual(2, graph2.AddVerticesAndEdgeRange(new[] { edge1, edge2 }));
            AssertHasVertices(parent2, new[] { 1, 2, 3 });
            AssertHasVertices(graph2, new[] { 1, 2, 3 });
            AssertHasEdges(parent2, new[] { edge1, edge2 });
            AssertHasEdges(graph2, new[] { edge1, edge2 });

            // Edge 1, 3
            Assert.AreEqual(1, parent2.AddVerticesAndEdgeRange(new[] { edge1, edge3 })); // Showcase the add of only one edge
            AssertHasVertices(parent2, new[] { 1, 2, 3 });
            AssertHasVertices(graph2, new[] { 1, 2, 3 });
            AssertHasEdges(parent2, new[] { edge1, edge2, edge3 });
            AssertHasEdges(graph2, new[] { edge1, edge2 });

            Assert.AreEqual(1, graph2.AddVerticesAndEdgeRange(new[] { edge1, edge3 })); // Showcase the add of only one edge
            AssertHasVertices(parent2, new[] { 1, 2, 3 });
            AssertHasVertices(graph2, new[] { 1, 2, 3 });
            AssertHasEdges(parent2, new[] { edge1, edge2, edge3 });
            AssertHasEdges(graph2, new[] { edge1, edge2, edge3 });
        }
        protected static void RemoveOutEdgeIf_Clusters_Test(
            [NotNull] ClusteredAdjacencyGraph <int, Edge <int> > graph)
        {
            Assert.AreEqual(0, graph.RemoveOutEdgeIf(1, edge => true));
            AssertEmptyGraph(graph);

            var edge12    = new Edge <int>(1, 2);
            var edge13    = new Edge <int>(1, 3);
            var edge13Bis = new Edge <int>(1, 3);
            var edge14    = new Edge <int>(1, 4);
            var edge24    = new Edge <int>(2, 4);
            var edge31    = new Edge <int>(3, 1);
            var edge33    = new Edge <int>(3, 3);

            graph.AddVerticesAndEdgeRange(new[] { edge12, edge13, edge13Bis, edge14, edge24, edge31, edge33 });

            Assert.AreEqual(3, graph.RemoveOutEdgeIf(1, edge => edge.Target >= 3));
            AssertHasVertices(graph, new[] { 1, 2, 3, 4 });
            AssertHasEdges(graph, new[] { edge12, edge24, edge31, edge33 });

            Assert.AreEqual(0, graph.RemoveOutEdgeIf(3, edge => edge.Target > 5));
            AssertHasVertices(graph, new[] { 1, 2, 3, 4 });
            AssertHasEdges(graph, new[] { edge12, edge24, edge31, edge33 });

            Assert.AreEqual(2, graph.RemoveOutEdgeIf(3, edge => true));
            AssertHasVertices(graph, new[] { 1, 2, 3, 4 });
            AssertHasEdges(graph, new[] { edge12, edge24 });
        }
        public void TryGetOutEdges()
        {
            var wrappedGraph = new AdjacencyGraph <int, Edge <int> >();
            var graph        = new ClusteredAdjacencyGraph <int, Edge <int> >(wrappedGraph);

            TryGetOutEdges_Test(
                graph,
                edges => graph.AddVerticesAndEdgeRange(edges));
        }
示例#5
0
        protected static void RemoveVertexIf_Clusters_Test2(
            [NotNull] ClusteredAdjacencyGraph <int, Edge <int> > graph)
        {
            var edge11 = new Edge <int>(1, 1);
            var edge13 = new Edge <int>(1, 3);
            var edge24 = new Edge <int>(2, 4);
            var edge31 = new Edge <int>(3, 1);
            var edge32 = new Edge <int>(3, 2);
            var edge34 = new Edge <int>(3, 4);

            graph.AddVerticesAndEdgeRange(new[] { edge11, edge13, edge24, edge31, edge32, edge34 });

            Assert.AreEqual(2, graph.RemoveVertexIf(vertex => vertex == 1 || vertex == 3));
            AssertHasVertices(graph, new[] { 2, 4 });
            AssertHasEdges(graph, new[] { edge24 });
        }
        protected static void RemoveEdge_EquatableEdge_Clusters_Test(
            [NotNull] ClusteredAdjacencyGraph <int, EquatableEdge <int> > graph)
        {
            var edge12                     = new EquatableEdge <int>(1, 2);
            var edge13                     = new EquatableEdge <int>(1, 3);
            var edge13Bis                  = new EquatableEdge <int>(1, 3);
            var edge14                     = new EquatableEdge <int>(1, 4);
            var edge24                     = new EquatableEdge <int>(2, 4);
            var edge31                     = new EquatableEdge <int>(3, 1);
            var edge33                     = new EquatableEdge <int>(3, 3);
            var edgeNotInGraph             = new EquatableEdge <int>(3, 4);
            var edgeWithVertexNotInGraph1  = new EquatableEdge <int>(2, 10);
            var edgeWithVertexNotInGraph2  = new EquatableEdge <int>(10, 2);
            var edgeWithVerticesNotInGraph = new EquatableEdge <int>(10, 11);
            var edgeEquatable              = new EquatableEdge <int>(1, 2);

            graph.AddVerticesAndEdgeRange(new[] { edge12, edge13, edge13Bis, edge14, edge24, edge31, edge33 });

            Assert.IsFalse(graph.RemoveEdge(edgeNotInGraph));
            Assert.IsFalse(graph.RemoveEdge(edgeWithVertexNotInGraph1));
            Assert.IsFalse(graph.RemoveEdge(edgeWithVertexNotInGraph2));
            Assert.IsFalse(graph.RemoveEdge(edgeWithVerticesNotInGraph));

            Assert.IsTrue(graph.RemoveEdge(edgeEquatable));
            AssertHasVertices(graph, new[] { 1, 2, 3, 4 });
            AssertHasEdges(graph, new[] { edge13, edge13Bis, edge14, edge24, edge31, edge33 });

            Assert.IsTrue(graph.RemoveEdge(edge13Bis));
            AssertHasVertices(graph, new[] { 1, 2, 3, 4 });
            AssertHasEdges(graph, new[] { edge13, edge14, edge24, edge31, edge33 });

            Assert.IsTrue(graph.RemoveEdge(edge31));
            AssertHasVertices(graph, new[] { 1, 2, 3, 4 });
            AssertHasEdges(graph, new[] { edge13, edge14, edge24, edge33 });

            Assert.IsTrue(graph.RemoveEdge(edge13));
            Assert.IsTrue(graph.RemoveEdge(edge14));
            Assert.IsTrue(graph.RemoveEdge(edge24));
            Assert.IsTrue(graph.RemoveEdge(edge33));
            AssertHasVertices(graph, new[] { 1, 2, 3, 4 });
            AssertNoEdge(graph);
        }
        protected static void RemoveVertexIf_Clusters_Test(
            [NotNull] ClusteredAdjacencyGraph <int, Edge <int> > graph)
        {
            var edge12 = new Edge <int>(1, 2);
            var edge13 = new Edge <int>(1, 3);
            var edge14 = new Edge <int>(1, 4);
            var edge24 = new Edge <int>(2, 4);
            var edge31 = new Edge <int>(3, 1);
            var edge33 = new Edge <int>(3, 3);

            graph.AddVerticesAndEdgeRange(new[] { edge12, edge13, edge14, edge24, edge31, edge33 });

            Assert.AreEqual(0, graph.RemoveVertexIf(vertex => vertex > 10));

            Assert.AreEqual(2, graph.RemoveVertexIf(vertex => vertex > 2));
            AssertHasVertices(graph, new[] { 1, 2 });
            AssertHasEdges(graph, new[] { edge12 });

            Assert.AreEqual(2, graph.RemoveVertexIf(vertex => true));
            AssertEmptyGraph(graph);
        }
        public void ToGraphvizWithInit()
        {
            var wrappedGraph = new AdjacencyGraph <int, Edge <int> >();

            wrappedGraph.AddVerticesAndEdgeRange(new[]
            {
                new Edge <int>(1, 2),
                new Edge <int>(1, 3),
                new Edge <int>(2, 4)
            });
            wrappedGraph.AddVertex(5);
            var clusteredGraph = new ClusteredAdjacencyGraph <int, Edge <int> >(wrappedGraph);
            ClusteredAdjacencyGraph <int, Edge <int> > subGraph1 = clusteredGraph.AddCluster();

            subGraph1.AddVerticesAndEdgeRange(new[]
            {
                new Edge <int>(6, 7),
                new Edge <int>(7, 8)
            });
            ClusteredAdjacencyGraph <int, Edge <int> > subGraph2 = clusteredGraph.AddCluster();

            subGraph2.AddVerticesAndEdge(new Edge <int>(9, 10));
            subGraph2.AddVertex(11);

            string expectedDot =
                "digraph G {" + Environment.NewLine
                + "node [shape=diamond];" + Environment.NewLine
                + "edge [tooltip=\"Test Edge\"];" + Environment.NewLine
                + "subgraph cluster1 {" + Environment.NewLine
                + "5 [label=\"Test Vertex 6\"];" + Environment.NewLine
                + "6 [label=\"Test Vertex 7\"];" + Environment.NewLine
                + "7 [label=\"Test Vertex 8\"];" + Environment.NewLine
                + "5 -> 6;" + Environment.NewLine
                + "6 -> 7;" + Environment.NewLine
                + "}" + Environment.NewLine
                + "subgraph cluster2 {" + Environment.NewLine
                + "8 [label=\"Test Vertex 9\"];" + Environment.NewLine
                + "9 [label=\"Test Vertex 10\"];" + Environment.NewLine
                + "10 [label=\"Test Vertex 11\"];" + Environment.NewLine
                + "8 -> 9;" + Environment.NewLine
                + "}" + Environment.NewLine
                + "0 [label=\"Test Vertex 1\"];" + Environment.NewLine
                + "1 [label=\"Test Vertex 2\"];" + Environment.NewLine
                + "2 [label=\"Test Vertex 3\"];" + Environment.NewLine
                + "3 [label=\"Test Vertex 4\"];" + Environment.NewLine
                + "4 [label=\"Test Vertex 5\"];" + Environment.NewLine
                + "0 -> 1;" + Environment.NewLine
                + "0 -> 2;" + Environment.NewLine
                + "1 -> 3;" + Environment.NewLine
                + "}";
            string dotGraph = clusteredGraph.ToGraphviz(algorithm =>
            {
                algorithm.CommonVertexFormat.Shape = GraphvizVertexShape.Diamond;
                algorithm.CommonEdgeFormat.ToolTip = "Test Edge";
                algorithm.FormatVertex            += (sender, args) =>
                {
                    args.VertexFormat.Label = $"Test Vertex {args.Vertex}";
                };
            });

            Assert.AreEqual(expectedDot, dotGraph);
        }
        protected static void RemoveVertex_Clusters_Test(
            [NotNull] ClusteredAdjacencyGraph <int, Edge <int> > graph)
        {
            var edge12 = new Edge <int>(1, 2);
            var edge13 = new Edge <int>(1, 3);
            var edge14 = new Edge <int>(1, 4);
            var edge24 = new Edge <int>(2, 4);
            var edge31 = new Edge <int>(3, 1);
            var edge33 = new Edge <int>(3, 3);

            graph.AddVerticesAndEdgeRange(new[] { edge12, edge13, edge14, edge24, edge31, edge33 });

            Assert.IsFalse(graph.RemoveVertex(5));

            Assert.IsTrue(graph.RemoveVertex(3));
            AssertHasVertices(graph, new[] { 1, 2, 4 });
            AssertHasEdges(graph, new[] { edge12, edge14, edge24 });

            Assert.IsTrue(graph.RemoveVertex(1));
            AssertHasVertices(graph, new[] { 2, 4 });
            AssertHasEdges(graph, new[] { edge24 });

            Assert.IsTrue(graph.RemoveVertex(2));
            AssertHasVertices(graph, new[] { 4 });
            AssertNoEdge(graph);

            Assert.IsTrue(graph.RemoveVertex(4));
            AssertEmptyGraph(graph);


            // With cluster
            ClusteredAdjacencyGraph <int, Edge <int> > cluster1 = graph.AddCluster();
            ClusteredAdjacencyGraph <int, Edge <int> > cluster2 = graph.AddCluster();
            ClusteredAdjacencyGraph <int, Edge <int> > cluster3 = graph.AddCluster();

            cluster1.AddVertexRange(new[] { 1, 2 });
            AssertHasVertices(cluster1, new[] { 1, 2 });

            cluster2.AddVertexRange(new[] { 1, 2, 4 });
            AssertHasVertices(cluster2, new[] { 1, 2, 4 });

            cluster3.AddVertex(2);
            AssertHasVertices(cluster3, new[] { 2 });

            graph.AddVertexRange(new[] { 1, 2, 3, 4 });
            AssertHasVertices(graph, new[] { 1, 2, 3, 4 });


            graph.RemoveVertex(2);
            AssertHasVertices(graph, new[] { 1, 3, 4 });
            AssertHasVertices(cluster1, new[] { 1 });
            AssertHasVertices(cluster2, new[] { 1, 4 });
            AssertNoVertex(cluster3);

            graph.RemoveVertex(1);
            AssertHasVertices(graph, new[] { 3, 4 });
            AssertNoVertex(cluster1);
            AssertHasVertices(cluster2, new[] { 4 });
            AssertNoVertex(cluster3);

            graph.RemoveVertex(3);
            AssertHasVertices(graph, new[] { 4 });
            AssertNoVertex(cluster1);
            AssertHasVertices(cluster2, new[] { 4 });
            AssertNoVertex(cluster3);

            graph.RemoveVertex(4);
            AssertNoVertex(graph);
            AssertNoVertex(cluster1);
            AssertNoVertex(cluster2);
            AssertNoVertex(cluster3);
        }
示例#10
0
        public void GenerateWithFormats()
        {
            var graph = new AdjacencyGraph <int, Edge <int> >();

            graph.AddVerticesAndEdgeRange(new[]
            {
                new Edge <int>(1, 2),
                new Edge <int>(1, 3),
                new Edge <int>(3, 2),
                new Edge <int>(3, 4),
                new Edge <int>(4, 6),
                new Edge <int>(5, 2),
                new Edge <int>(5, 5)
            });
            graph.AddVertex(7);
            var clusteredGraph = new ClusteredAdjacencyGraph <int, Edge <int> >(graph);
            ClusteredAdjacencyGraph <int, Edge <int> > subGraph1 = clusteredGraph.AddCluster();

            subGraph1.AddVertexRange(new[] { 8, 9, 10 });
            ClusteredAdjacencyGraph <int, Edge <int> > subGraph2 = clusteredGraph.AddCluster();

            subGraph2.AddVerticesAndEdgeRange(new[]
            {
                new Edge <int>(11, 12),
                new Edge <int>(11, 13),
                new Edge <int>(12, 13)
            });

            var algorithm = new GraphvizAlgorithm <int, Edge <int> >(clusteredGraph);

            algorithm.GraphFormat.Name             = "MyGraph";
            algorithm.GraphFormat.NodeSeparation   = 2;
            algorithm.GraphFormat.FontColor        = GraphvizColor.Red;
            algorithm.CommonVertexFormat.Url       = "https://myurl.com";
            algorithm.CommonVertexFormat.FillColor = GraphvizColor.LightYellow;
            algorithm.CommonVertexFormat.Style     = GraphvizVertexStyle.Filled;
            algorithm.CommonEdgeFormat.Direction   = GraphvizEdgeDirection.Back;
            algorithm.CommonEdgeFormat.ToolTip     = "Edge";

            algorithm.FormatCluster += (sender, args) =>
            {
                args.GraphFormat.Label = args.Cluster == subGraph1
                    ? "Only Vertices cluster"
                    : "Triangle cluster";
            };

            algorithm.FormatVertex += (sender, args) =>
            {
                if (args.Vertex == 2 || args.Vertex == 11)
                {
                    args.VertexFormat.Label = "Special Node";
                }
            };

            algorithm.FormatEdge += (sender, args) =>
            {
                if (args.Edge.Source == args.Edge.Target)
                {
                    args.EdgeFormat.StrokeColor = GraphvizColor.Gold;
                }
            };

            string dot         = algorithm.Generate();
            string expectedDot = "digraph MyGraph {" + Environment.NewLine
                                 + "fontcolor=\"#FF0000FF\"; nodesep=2;" + Environment.NewLine
                                 + "node [style=filled, fillcolor=\"#FFFFE0FF\", URL=\"https://myurl.com\"];" + Environment.NewLine
                                 + "edge [dir=back, tooltip=\"Edge\"];" + Environment.NewLine
                                 + "subgraph cluster1 {" + Environment.NewLine
                                 + "label=\"Only Vertices cluster\"" + Environment.NewLine
                                 + "7 [label=\"8\"];" + Environment.NewLine
                                 + "8 [label=\"9\"];" + Environment.NewLine
                                 + "9 [label=\"10\"];" + Environment.NewLine
                                 + "}" + Environment.NewLine
                                 + "subgraph cluster2 {" + Environment.NewLine
                                 + "label=\"Triangle cluster\"" + Environment.NewLine
                                 + "10 [label=\"Special Node\"];" + Environment.NewLine
                                 + "11 [label=\"12\"];" + Environment.NewLine
                                 + "12 [label=\"13\"];" + Environment.NewLine
                                 + "10 -> 11;" + Environment.NewLine
                                 + "10 -> 12;" + Environment.NewLine
                                 + "11 -> 12;" + Environment.NewLine
                                 + "}" + Environment.NewLine
                                 + "0 [label=\"1\"];" + Environment.NewLine
                                 + "1 [label=\"Special Node\"];" + Environment.NewLine
                                 + "2 [label=\"3\"];" + Environment.NewLine
                                 + "3 [label=\"4\"];" + Environment.NewLine
                                 + "4 [label=\"6\"];" + Environment.NewLine
                                 + "5 [label=\"5\"];" + Environment.NewLine
                                 + "6 [label=\"7\"];" + Environment.NewLine
                                 + "0 -> 1;" + Environment.NewLine
                                 + "0 -> 2;" + Environment.NewLine
                                 + "2 -> 1;" + Environment.NewLine
                                 + "2 -> 3;" + Environment.NewLine
                                 + "3 -> 4;" + Environment.NewLine
                                 + "5 -> 1;" + Environment.NewLine
                                 + "5 -> 5 [color=\"#FFD700FF\"];" + Environment.NewLine
                                 + "}";

            Assert.AreEqual(expectedDot, dot);
        }
示例#11
0
        protected static void RemoveEdge_Clusters_Test(
            ClusteredAdjacencyGraph <int, Edge <int> > graph)
        {
            var edge12                     = new Edge <int>(1, 2);
            var edge13                     = new Edge <int>(1, 3);
            var edge13Bis                  = new Edge <int>(1, 3);
            var edge14                     = new Edge <int>(1, 4);
            var edge24                     = new Edge <int>(2, 4);
            var edge31                     = new Edge <int>(3, 1);
            var edge33                     = new Edge <int>(3, 3);
            var edgeNotInGraph             = new Edge <int>(3, 4);
            var edgeWithVertexNotInGraph1  = new Edge <int>(2, 10);
            var edgeWithVertexNotInGraph2  = new Edge <int>(10, 2);
            var edgeWithVerticesNotInGraph = new Edge <int>(10, 11);
            var edgeNotEquatable           = new Edge <int>(1, 2);

            graph.AddVerticesAndEdgeRange(new[] { edge12, edge13, edge13Bis, edge14, edge24, edge31, edge33 });

            Assert.IsFalse(graph.RemoveEdge(edgeNotInGraph));
            Assert.IsFalse(graph.RemoveEdge(edgeWithVertexNotInGraph1));
            Assert.IsFalse(graph.RemoveEdge(edgeWithVertexNotInGraph2));
            Assert.IsFalse(graph.RemoveEdge(edgeWithVerticesNotInGraph));
            Assert.IsFalse(graph.RemoveEdge(edgeNotEquatable));

            Assert.IsTrue(graph.RemoveEdge(edge13Bis));
            AssertHasVertices(graph, new[] { 1, 2, 3, 4 });
            AssertHasEdges(graph, new[] { edge12, edge13, edge14, edge24, edge31, edge33 });

            Assert.IsTrue(graph.RemoveEdge(edge31));
            AssertHasVertices(graph, new[] { 1, 2, 3, 4 });
            AssertHasEdges(graph, new[] { edge12, edge13, edge14, edge24, edge33 });

            Assert.IsTrue(graph.RemoveEdge(edge12));
            Assert.IsTrue(graph.RemoveEdge(edge13));
            Assert.IsTrue(graph.RemoveEdge(edge14));
            Assert.IsTrue(graph.RemoveEdge(edge24));
            Assert.IsTrue(graph.RemoveEdge(edge33));
            AssertHasVertices(graph, new[] { 1, 2, 3, 4 });
            AssertNoEdge(graph);


            // With cluster
            graph.AddVerticesAndEdgeRange(new[] { edge12, edge13, edge14, edge24, edge31 });
            AssertHasEdges(graph, new[] { edge12, edge13, edge14, edge24, edge31 });

            ClusteredAdjacencyGraph <int, Edge <int> > cluster1 = graph.AddCluster();
            ClusteredAdjacencyGraph <int, Edge <int> > cluster2 = graph.AddCluster();
            ClusteredAdjacencyGraph <int, Edge <int> > cluster3 = graph.AddCluster();

            cluster1.AddVerticesAndEdgeRange(new[] { edge12, edge13 });
            AssertHasEdges(cluster1, new[] { edge12, edge13 });

            cluster2.AddVerticesAndEdgeRange(new[] { edge12, edge14, edge24 });
            AssertHasEdges(cluster2, new[] { edge12, edge14, edge24 });

            cluster3.AddVerticesAndEdge(edge12);
            AssertHasEdges(cluster3, new[] { edge12 });


            graph.RemoveEdge(edge12);
            AssertHasEdges(graph, new[] { edge13, edge14, edge24, edge31 });
            AssertHasEdges(cluster1, new[] { edge13 });
            AssertHasEdges(cluster2, new[] { edge14, edge24 });
            AssertNoEdge(cluster3);

            graph.RemoveEdge(edge13);
            AssertHasEdges(graph, new[] { edge14, edge24, edge31 });
            AssertNoEdge(cluster1);
            AssertHasEdges(cluster2, new[] { edge14, edge24 });
            AssertNoEdge(cluster3);

            graph.RemoveEdge(edge24);
            AssertHasEdges(graph, new[] { edge14, edge31 });
            AssertNoEdge(cluster1);
            AssertHasEdges(cluster2, new[] { edge14 });
            AssertNoEdge(cluster3);

            graph.RemoveEdge(edge14);
            AssertHasEdges(graph, new[] { edge31 });
            AssertNoEdge(cluster1);
            AssertNoEdge(cluster2);
            AssertNoEdge(cluster3);
        }