public void RemoveCluster() { var wrappedGraph = new AdjacencyGraph <int, Edge <int> >(); var graph = new ClusteredAdjacencyGraph <int, Edge <int> >(wrappedGraph); AssertNoCluster(graph); IClusteredGraph cluster = graph.AddCluster(); IClusteredGraph cluster2 = graph.AddCluster(); IClusteredGraph cluster3 = graph.AddCluster(); var wrappedGraph2 = new AdjacencyGraph <int, Edge <int> >(); var graphNotInClusters = new ClusteredAdjacencyGraph <int, Edge <int> >(wrappedGraph2); graph.RemoveCluster(graphNotInClusters); AssertHasClusters(graph, new[] { cluster, cluster2, cluster3 }); graph.RemoveCluster(cluster2); AssertHasClusters(graph, new[] { cluster, cluster3 }); graph.RemoveCluster(cluster); AssertHasClusters(graph, new[] { cluster3 }); graph.RemoveCluster(cluster3); AssertNoCluster(graph); }
public void GenerateSameDot() { var graph = new AdjacencyGraph <int, Edge <int> >(); // Empty graph TestGenerate(graph); // Only vertices graph.AddVertexRange(new[] { 1, 2 }); TestGenerate(graph); // With edges graph.AddVerticesAndEdgeRange(new[] { new Edge <int>(1, 2), new Edge <int>(2, 3), new Edge <int>(3, 1) }); TestGenerate(graph); // With no cluster var clusteredGraph = new ClusteredAdjacencyGraph <int, Edge <int> >(graph); TestGenerate(clusteredGraph); // With clusters ClusteredAdjacencyGraph <int, Edge <int> > subGraph1 = clusteredGraph.AddCluster(); subGraph1.AddVertexRange(new[] { 4, 5 }); ClusteredAdjacencyGraph <int, Edge <int> > subGraph2 = clusteredGraph.AddCluster(); subGraph2.AddVerticesAndEdge(new Edge <int>(1, 6)); TestGenerate(clusteredGraph); #region Local function void TestGenerate <TVertex, TEdge>(IEdgeListGraph <TVertex, TEdge> g) where TEdge : IEdge <TVertex> { var algorithm = new GraphvizAlgorithm <TVertex, TEdge>(g); string generatedDot = algorithm.Generate(); Assert.IsNotEmpty(generatedDot); var dotEngine = new TestDotEngine { ExpectedDot = generatedDot }; // ReSharper disable once ReturnValueOfPureMethodIsNotUsed algorithm.Generate(dotEngine, "NotSaved.dot"); } #endregion }
public void AddingClusterVertex() { var graph = new AdjacencyGraph <int, IEdge <int> >(); var clusteredGraph = new ClusteredAdjacencyGraph <int, IEdge <int> >(graph); ClusteredAdjacencyGraph <int, IEdge <int> > cluster = clusteredGraph.AddCluster(); cluster.AddVertex(5); Assert.IsTrue(ContainsVertexParent(clusteredGraph, 5)); }
public void AddingClustVertexTest1() { var graph = new AdjacencyGraph <int, IEdge <int> >(); var clusteredGraph = new ClusteredAdjacencyGraph <int, IEdge <int> >(graph); var cluster1 = clusteredGraph.AddCluster(); cluster1.AddVertex(5); var a = ContainsVertexParent(clusteredGraph, 5); Assert.IsTrue(a); }
public void RemovingClustVertexTest1() { var graph = new AdjacencyGraph <int, IEdge <int> >(); var clusteredGraph = new ClusteredAdjacencyGraph <int, IEdge <int> >(graph); var cluster1 = clusteredGraph.AddCluster(); var cluster2 = cluster1.AddCluster(); var cluster3 = cluster2.AddCluster(); cluster3.AddVertex(5); cluster2.RemoveVertex(5); Assert.IsFalse(ContainsVertexParent(cluster3, 5)); }
public void AddingClusterEdge() { var graph = new AdjacencyGraph <int, IEdge <int> >(); var clusteredGraph = new ClusteredAdjacencyGraph <int, IEdge <int> >(graph); ClusteredAdjacencyGraph <int, IEdge <int> > cluster1 = clusteredGraph.AddCluster(); cluster1.AddVertex(5); cluster1.AddVertex(6); var edge = new TaggedEdge <int, int>(5, 6, 1); cluster1.AddEdge(edge); Assert.IsTrue(ContainsEdgeParent(clusteredGraph, edge)); }
public void RemovingClustEdgeTest1() { var graph = new AdjacencyGraph <int, IEdge <int> >(); var clusteredGraph = new ClusteredAdjacencyGraph <int, IEdge <int> >(graph); var cluster1 = clusteredGraph.AddCluster(); var cluster2 = cluster1.AddCluster(); var cluster3 = cluster2.AddCluster(); cluster3.AddVertex(5); cluster3.AddVertex(6); var edge = new TaggedEdge <int, int>(5, 6, 1); cluster1.RemoveEdge(edge); Assert.IsFalse(ContainsEdgeParent(cluster2, edge)); }
public void AddCluster() { var wrappedGraph = new AdjacencyGraph <int, Edge <int> >(); var graph = new ClusteredAdjacencyGraph <int, Edge <int> >(wrappedGraph); AssertNoCluster(graph); IClusteredGraph cluster = graph.AddCluster(); Assert.IsNotNull(cluster); AssertHasClusters(graph, new[] { cluster }); IClusteredGraph cluster2 = ((IClusteredGraph)graph).AddCluster(); Assert.IsNotNull(cluster2); AssertHasClusters(graph, new[] { cluster, cluster2 }); }
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); }
protected static void RemoveEdge_Clusters_Test( [NotNull] 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); }
public void FormatHandlers() { var graph = new AdjacencyGraph <int, Edge <int> >(); var algorithm = new GraphvizAlgorithm <int, Edge <int> >(graph); algorithm.FormatVertex += NoVertexOnFormatVertex; algorithm.FormatEdge += NoEdgeOnFormatEdge; algorithm.FormatCluster += NoClusterOnFormatCluster; // Empty graph algorithm.Generate(); // Only vertices graph.AddVertexRange(new[] { 1, 2 }); algorithm = new GraphvizAlgorithm <int, Edge <int> >(graph); List <int> notFormattedVertices = RegisterOnFormatVertex(algorithm, graph.Vertices); algorithm.FormatEdge += NoEdgeOnFormatEdge; algorithm.FormatCluster += NoClusterOnFormatCluster; algorithm.Generate(); CollectionAssert.IsEmpty(notFormattedVertices); // With edges graph.AddVerticesAndEdgeRange(new[] { new Edge <int>(1, 2), new Edge <int>(2, 3), new Edge <int>(3, 1) }); algorithm = new GraphvizAlgorithm <int, Edge <int> >(graph); notFormattedVertices = RegisterOnFormatVertex(algorithm, graph.Vertices); List <Edge <int> > notFormattedEdges = RegisterOnFormatEdge(algorithm, graph.Edges); algorithm.FormatCluster += NoClusterOnFormatCluster; algorithm.Generate(); CollectionAssert.IsEmpty(notFormattedVertices); CollectionAssert.IsEmpty(notFormattedEdges); // With no cluster var clusteredGraph = new ClusteredAdjacencyGraph <int, Edge <int> >(graph); algorithm = new GraphvizAlgorithm <int, Edge <int> >(clusteredGraph); notFormattedVertices = RegisterOnFormatVertex(algorithm, clusteredGraph.Vertices); notFormattedEdges = RegisterOnFormatEdge(algorithm, clusteredGraph.Edges); algorithm.FormatCluster += NoClusterOnFormatCluster; algorithm.Generate(); CollectionAssert.IsEmpty(notFormattedVertices); CollectionAssert.IsEmpty(notFormattedEdges); // With clusters ClusteredAdjacencyGraph <int, Edge <int> > subGraph1 = clusteredGraph.AddCluster(); subGraph1.AddVertexRange(new[] { 4, 5 }); ClusteredAdjacencyGraph <int, Edge <int> > subGraph2 = clusteredGraph.AddCluster(); subGraph2.AddVerticesAndEdge(new Edge <int>(1, 6)); algorithm = new GraphvizAlgorithm <int, Edge <int> >(clusteredGraph); notFormattedVertices = RegisterOnFormatVertex(algorithm, clusteredGraph.Vertices); notFormattedEdges = RegisterOnFormatEdge(algorithm, clusteredGraph.Edges); List <IVertexAndEdgeListGraph <int, Edge <int> > > notFormattedClusters = RegisterOnFormatCluster( algorithm, new[] { subGraph1, subGraph2 }); algorithm.Generate(); CollectionAssert.IsEmpty(notFormattedVertices); CollectionAssert.IsEmpty(notFormattedEdges); CollectionAssert.IsEmpty(notFormattedClusters); #region Local functions void NoVertexOnFormatVertex(object sender, FormatVertexEventArgs <int> args) { Assert.Fail($"{nameof(GraphvizAlgorithm<object, Edge<object>>.FormatVertex)} called while no vertex in graph."); } List <TVertex> RegisterOnFormatVertex <TVertex, TEdge>(GraphvizAlgorithm <TVertex, TEdge> algo, IEnumerable <TVertex> vertices) where TEdge : IEdge <TVertex> { var verticesList = new List <TVertex>(vertices); algo.FormatVertex += (sender, args) => { Assert.IsTrue(verticesList.Remove(args.Vertex)); }; return(verticesList); } void NoEdgeOnFormatEdge(object sender, FormatEdgeEventArgs <int, Edge <int> > args) { Assert.Fail($"{nameof(GraphvizAlgorithm<object, Edge<object>>.FormatEdge)} called while no edge in graph."); } List <TEdge> RegisterOnFormatEdge <TVertex, TEdge>(GraphvizAlgorithm <TVertex, TEdge> algo, IEnumerable <TEdge> edges) where TEdge : IEdge <TVertex> { var edgeList = new List <TEdge>(edges); algo.FormatEdge += (sender, args) => { Assert.IsTrue(edgeList.Remove(args.Edge)); }; return(edgeList); } void NoClusterOnFormatCluster(object sender, FormatClusterEventArgs <int, Edge <int> > args) { Assert.Fail($"{nameof(GraphvizAlgorithm<object, Edge<object>>.FormatCluster)} called while no cluster in graph."); } List <IVertexAndEdgeListGraph <TVertex, TEdge> > RegisterOnFormatCluster <TVertex, TEdge>(GraphvizAlgorithm <TVertex, TEdge> algo, IEnumerable <IVertexAndEdgeListGraph <TVertex, TEdge> > clusters) where TEdge : IEdge <TVertex> { var clusterList = new List <IVertexAndEdgeListGraph <TVertex, TEdge> >(clusters); algo.FormatCluster += (sender, args) => { Assert.IsTrue(clusterList.Remove(args.Cluster)); }; return(clusterList); } #endregion }
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); }
public void Run() { // create an adjacency graph AdjacencyGraph g = new AdjacencyGraph( new NamedVertexProvider(), new NamedEdgeProvider(), true ); // create a clustered graph ClusteredAdjacencyGraph cg = new ClusteredAdjacencyGraph(g); // adding some vertices to the main graph NamedVertex a = cg.AddVertex() as NamedVertex; a.Name = "a"; NamedVertex b = cg.AddVertex() as NamedVertex; b.Name = "b"; NamedVertex c = cg.AddVertex() as NamedVertex; c.Name = "c"; NamedEdge ab = cg.AddEdge(a, b) as NamedEdge; ab.Name = "ab"; NamedEdge ac = cg.AddEdge(a, c) as NamedEdge; ac.Name = "ac"; // adding a cluster ClusteredAdjacencyGraph cg1 = cg.AddCluster(); // adding vertices and edges to the cluster NamedVertex d = cg1.AddVertex() as NamedVertex; d.Name = "d"; NamedVertex e = cg1.AddVertex() as NamedVertex; e.Name = "e"; NamedVertex f = cg1.AddVertex() as NamedVertex; f.Name = "f"; NamedEdge de = cg1.AddEdge(d, e) as NamedEdge; de.Name = "de"; NamedEdge df = cg1.AddEdge(d, f) as NamedEdge; df.Name = "df"; // adding a second cluster ClusteredAdjacencyGraph cg2 = cg.AddCluster(); // adding vertices NamedVertex h = cg2.AddVertex() as NamedVertex; h.Name = "h"; NamedVertex i = cg2.AddVertex() as NamedVertex; i.Name = "i"; NamedEdge hi = cg2.AddEdge(h, i) as NamedEdge; hi.Name = "hi"; // adding a sub-sub-cluster ClusteredAdjacencyGraph cg21 = cg2.AddCluster(); // adding vertices NamedVertex k = cg21.AddVertex() as NamedVertex; k.Name = "k"; NamedVertex l = cg21.AddVertex() as NamedVertex; l.Name = "l"; NamedEdge ak = cg.AddEdge(a, k) as NamedEdge; ak.Name = "ak"; NamedEdge kl = cg21.AddEdge(k, l) as NamedEdge; kl.Name = "kl"; // interconnecting NamedEdge cd = cg.AddEdge(c, d) as NamedEdge; cd.Name = "cd"; NamedEdge bh = cg.AddEdge(b, h) as NamedEdge; bh.Name = "bh"; NamedEdge ei = cg.AddEdge(e, i) as NamedEdge; ei.Name = "ei"; GraphvizAlgorithm gw = new GraphvizAlgorithm( cg, "../cluster", GraphvizImageType.Svgz ); gw.FormatVertex += new FormatVertexEventHandler(this.FormatVertex); gw.FormatEdge += new FormatEdgeEventHandler(this.FormatEdge); gw.Write("cluster"); cg2.Colapsed = true; gw.Write("cluster_collapsed"); }