Beispiel #1
0
        public MaximumFlowDemo()
        {
            graph = new AdjacencyGraph(
                new NamedVertexProvider(),
                new EdgeProvider(),
                true);

            s = (NamedVertex)graph.AddVertex(); s.Name = "s";
            x = (NamedVertex)graph.AddVertex(); x.Name = "x";
            v = (NamedVertex)graph.AddVertex(); v.Name = "v";
            w = (NamedVertex)graph.AddVertex(); w.Name = "w";
            t = (NamedVertex)graph.AddVertex(); t.Name = "t";

            sx = graph.AddEdge(s, x); capacities[sx] = 5;
            sv = graph.AddEdge(s, v); capacities[sv] = 7;
            xv = graph.AddEdge(x, v); capacities[xv] = 3;
            xw = graph.AddEdge(x, w); capacities[xw] = 7;
            wv = graph.AddEdge(w, v); capacities[wv] = 5;
            wt = graph.AddEdge(w, t); capacities[wt] = 4;
            vt = graph.AddEdge(v, t); capacities[vt] = 6;

            this.graphviz           = new GraphvizAlgorithm(this.graph);
            this.graphviz.ImageType = NGraphviz.Helpers.GraphvizImageType.Svg;
            this.graphviz.GraphFormat.RankDirection = NGraphviz.Helpers.GraphvizRankDirection.LR;
            this.graphviz.FormatVertex += new FormatVertexEventHandler(graphviz_FormatVertex);
            this.graphviz.FormatEdge   += new FormatEdgeEventHandler(graphviz_FormatEdge);

            this.reversedEdgeAugmentor = new ReversedEdgeAugmentorAlgorithm(this.graph);
            this.reversedEdgeAugmentor.ReversedEdgeAdded += new EdgeEventHandler(reversedEdgeAugmentor_ReversedEdgeAdded);
        }
Beispiel #2
0
        public static BidirectionalGraph Simple()
        {
            // create a new adjacency graph
            BidirectionalGraph g = new BidirectionalGraph(
                new NamedVertexProvider(),
                new EdgeProvider(),
                false);

            NamedVertex u = (NamedVertex)g.AddVertex(); u.Name = "u";
            NamedVertex w = (NamedVertex)g.AddVertex(); w.Name = "w";
            NamedVertex x = (NamedVertex)g.AddVertex(); x.Name = "x";
            NamedVertex y = (NamedVertex)g.AddVertex(); y.Name = "y";
            NamedVertex z = (NamedVertex)g.AddVertex(); z.Name = "z";
            NamedVertex v = (NamedVertex)g.AddVertex(); v.Name = "v";

            g.AddEdge(u, x);
            g.AddEdge(u, v);
            g.AddEdge(w, z);
            g.AddEdge(w, y);
            g.AddEdge(w, u);
            g.AddEdge(x, v);
            g.AddEdge(v, y);
            g.AddEdge(y, x);
            g.AddEdge(z, y);

            return(g);
        }
Beispiel #3
0
        public static BidirectionalGraph FileDependency()
        {
            // create a new adjacency graph
            BidirectionalGraph g = new BidirectionalGraph(
                new NamedVertexProvider(),
                new EdgeProvider(),
                false);

            // adding files and storing names
            NamedVertex zig_cpp = (NamedVertex)g.AddVertex();

            zig_cpp.Name = "zip.cpp";
            NamedVertex boz_h = (NamedVertex)g.AddVertex();

            boz_h.Name = "boz.h";
            NamedVertex zag_cpp = (NamedVertex)g.AddVertex();

            zag_cpp.Name = "zag.cpp";
            NamedVertex yow_h   = (NamedVertex)g.AddVertex();         yow_h.Name = "yow.h";
            NamedVertex dax_h   = (NamedVertex)g.AddVertex();         dax_h.Name = "dax.h";
            NamedVertex bar_cpp = (NamedVertex)g.AddVertex();       bar_cpp.Name = "bar.cpp";
            NamedVertex zow_h   = (NamedVertex)g.AddVertex();         zow_h.Name = "zow.h";
            NamedVertex foo_cpp = (NamedVertex)g.AddVertex();       foo_cpp.Name = "foo.cpp";

            NamedVertex zig_o       = (NamedVertex)g.AddVertex();         zig_o.Name = "zig.o";
            NamedVertex zag_o       = (NamedVertex)g.AddVertex();         zag_o.Name = "zago";
            NamedVertex bar_o       = (NamedVertex)g.AddVertex();         bar_o.Name = "bar.o";
            NamedVertex foo_o       = (NamedVertex)g.AddVertex();         foo_o.Name = "foo.o";
            NamedVertex libzigzag_a = (NamedVertex)g.AddVertex(); libzigzag_a.Name = "libzigzig.a";
            NamedVertex libfoobar_a = (NamedVertex)g.AddVertex(); libfoobar_a.Name = "libfoobar.a";

            NamedVertex killerapp = (NamedVertex)g.AddVertex();     killerapp.Name = "killerapp";

            // adding dependencies
            g.AddEdge(dax_h, foo_cpp);
            g.AddEdge(dax_h, bar_cpp);
            g.AddEdge(dax_h, yow_h);
            g.AddEdge(yow_h, bar_cpp);
            g.AddEdge(yow_h, zag_cpp);
            g.AddEdge(boz_h, bar_cpp);
            g.AddEdge(boz_h, zig_cpp);
            g.AddEdge(boz_h, zag_cpp);
            g.AddEdge(zow_h, foo_cpp);
            g.AddEdge(foo_cpp, foo_o);
            g.AddEdge(foo_o, libfoobar_a);
            g.AddEdge(bar_cpp, bar_o);
            g.AddEdge(bar_o, libfoobar_a);
            g.AddEdge(libfoobar_a, libzigzag_a);
            g.AddEdge(zig_cpp, zig_o);
            g.AddEdge(zig_o, libzigzag_a);
            g.AddEdge(zag_cpp, zag_o);
            g.AddEdge(zag_o, libzigzag_a);
            g.AddEdge(libzigzag_a, killerapp);

            return(g);
        }
Beispiel #4
0
        public void FinishEdge(Object sender, EdgeEventArgs args)
        {
            NamedEdge   e = (NamedEdge)args.Edge;
            NamedVertex v = (NamedVertex)args.Edge.Target;

            Console.WriteLine("-- {0}, {1}",
                              e.Name,
                              v.Name
                              );
        }
Beispiel #5
0
        public void GenerateGraph()
        {
            this.vertexIndices = new Hashtable();

            // create a new adjacency graph
            this.graph = new BidirectionalGraph(
                new NamedVertexProvider(),
                new EdgeProvider(),
                false);

            int rows    = this.Rows;
            int columns = this.Columns;

            // adding vertices
            for (int i = 0; i < rows; ++i)
            {
                for (int j = 0; j < columns; ++j)
                {
                    NamedVertex v = (NamedVertex)this.graph.AddVertex();
                    v.Name = String.Format("{0},{1}", i.ToString(), j.ToString());

                    latice[i, j]     = v;
                    vertexIndices[v] = new DictionaryEntry(i, j);
                }
            }

            // adding edges
            for (int i = 0; i < rows - 1; ++i)
            {
                for (int j = 0; j < columns - 1; ++j)
                {
                    this.graph.AddEdge(latice[i, j], latice[i, j + 1]);
                    this.graph.AddEdge(latice[i, j + 1], latice[i, j]);

                    this.graph.AddEdge(latice[i, j], latice[i + 1, j]);
                    this.graph.AddEdge(latice[i + 1, j], latice[i, j]);
                }
            }

            for (int j = 0; j < columns - 1; ++j)
            {
                this.graph.AddEdge(latice[rows - 1, j], latice[rows - 1, j + 1]);
                this.graph.AddEdge(latice[rows - 1, j + 1], latice[rows - 1, j]);
            }

            for (int i = 0; i < rows - 1; ++i)
            {
                this.graph.AddEdge(latice[i, columns - 1], latice[i + 1, columns - 1]);
                this.graph.AddEdge(latice[i + 1, columns - 1], latice[i, columns - 1]);
            }
        }
Beispiel #6
0
        public XmlSerializationTest()
        {
            m_Graph = new AdjacencyGraph(
                new NamedVertexProvider(),
                new NamedEdgeProvider(),
                true
                );

            u = (NamedVertex)Graph.AddVertex(); u.Name = "u";
            v = (NamedVertex)Graph.AddVertex(); v.Name = "v";
            w = (NamedVertex)Graph.AddVertex(); w.Name = "w";

            uv = (NamedEdge)Graph.AddEdge(u, v); uv.Name = "uv";
            uw = (NamedEdge)Graph.AddEdge(u, w); uw.Name = "uw";
        }
Beispiel #7
0
        public static AdjacencyGraph Fsm()
        {
            // create a new adjacency graph
            AdjacencyGraph g = new BidirectionalGraph(
                new NamedVertexProvider(),
                new NamedEdgeProvider(),
                true);
            NamedEdge e = null;

            NamedVertex s0 = (NamedVertex)g.AddVertex(); s0.Name = "S0";
            NamedVertex s1 = (NamedVertex)g.AddVertex(); s1.Name = "S1";
            NamedVertex s2 = (NamedVertex)g.AddVertex(); s2.Name = "S2";
            NamedVertex s3 = (NamedVertex)g.AddVertex(); s3.Name = "S3";
            NamedVertex s4 = (NamedVertex)g.AddVertex(); s4.Name = "S4";
            NamedVertex s5 = (NamedVertex)g.AddVertex(); s5.Name = "S5";

            e = (NamedEdge)g.AddEdge(s0, s1); e.Name = "StartCalc";

            e = (NamedEdge)g.AddEdge(s1, s0); e.Name = "StopCalc";
            e = (NamedEdge)g.AddEdge(s1, s1); e.Name = "SelectStandard";
            e = (NamedEdge)g.AddEdge(s1, s1); e.Name = "ClearDisplay";
            e = (NamedEdge)g.AddEdge(s1, s2); e.Name = "SelectScientific";
            e = (NamedEdge)g.AddEdge(s1, s3); e.Name = "EnterDecNumber";

            e = (NamedEdge)g.AddEdge(s2, s1); e.Name = "SelectStandard";
            e = (NamedEdge)g.AddEdge(s2, s2); e.Name = "SelectScientific";
            e = (NamedEdge)g.AddEdge(s2, s2); e.Name = "ClearDisplay";
            e = (NamedEdge)g.AddEdge(s2, s4); e.Name = "EnterDecNumber";
            e = (NamedEdge)g.AddEdge(s2, s5); e.Name = "StopCalc";

            e = (NamedEdge)g.AddEdge(s3, s0); e.Name = "StopCalc";
            e = (NamedEdge)g.AddEdge(s3, s1); e.Name = "ClearDisplay";
            e = (NamedEdge)g.AddEdge(s3, s3); e.Name = "SelectStandard";
            e = (NamedEdge)g.AddEdge(s3, s3); e.Name = "EnterDecNumber";
            e = (NamedEdge)g.AddEdge(s3, s4); e.Name = "SelectScientific";

            e = (NamedEdge)g.AddEdge(s4, s2); e.Name = "ClearDisplay";
            e = (NamedEdge)g.AddEdge(s4, s3); e.Name = "SelectStandard";
            e = (NamedEdge)g.AddEdge(s4, s4); e.Name = "SelectScientific";
            e = (NamedEdge)g.AddEdge(s4, s4); e.Name = "EnterDecNumber";
            e = (NamedEdge)g.AddEdge(s4, s5); e.Name = "StopCalc";

            e = (NamedEdge)g.AddEdge(s5, s2); e.Name = "StartCalc";

            return(g);
        }
Beispiel #8
0
        public static BidirectionalGraph RegularLattice(int rows, int columns)
        {
            // create a new adjacency graph
            BidirectionalGraph g = new BidirectionalGraph(
                new NamedVertexProvider(),
                new EdgeProvider(),
                false);

            NamedVertex[,] latice = new NamedVertex[rows, columns];
            // adding vertices
            for (int i = 0; i < rows; ++i)
            {
                for (int j = 0; j < columns; ++j)
                {
                    latice[i, j]      = (NamedVertex)g.AddVertex();
                    latice[i, j].Name = String.Format("{0},{1}", i.ToString(), j.ToString());
                }
            }

            // adding edges
            for (int i = 0; i < rows - 1; ++i)
            {
                for (int j = 0; j < columns - 1; ++j)
                {
                    g.AddEdge(latice[i, j], latice[i, j + 1]);
                    g.AddEdge(latice[i, j + 1], latice[i, j]);

                    g.AddEdge(latice[i, j], latice[i + 1, j]);
                    g.AddEdge(latice[i + 1, j], latice[i, j]);
                }
            }

            for (int j = 0; j < columns - 1; ++j)
            {
                g.AddEdge(latice[rows - 1, j], latice[rows - 1, j + 1]);
                g.AddEdge(latice[rows - 1, j + 1], latice[rows - 1, j]);
            }

            for (int i = 0; i < rows - 1; ++i)
            {
                g.AddEdge(latice[i, columns - 1], latice[i + 1, columns - 1]);
                g.AddEdge(latice[i + 1, columns - 1], latice[i, columns - 1]);
            }

            return(g);
        }
Beispiel #9
0
        public static BidirectionalGraph Loop()
        {
            // create a new adjacency graph
            BidirectionalGraph g = new BidirectionalGraph(
                new NamedVertexProvider(),
                new EdgeProvider(),
                false);

            NamedVertex x = (NamedVertex)g.AddVertex(); x.Name = "x";
            NamedVertex y = (NamedVertex)g.AddVertex(); y.Name = "y";
            NamedVertex z = (NamedVertex)g.AddVertex(); z.Name = "z";

            g.AddEdge(x, y);
            g.AddEdge(y, z);
            g.AddEdge(z, x);

            return(g);
        }
Beispiel #10
0
        public static BidirectionalGraph UnBalancedFlow()
        {
            // create a new adjacency graph
            BidirectionalGraph g = new BidirectionalGraph(
                new NamedVertexProvider(),
                new EdgeProvider(),
                false);

            NamedVertex x = (NamedVertex)g.AddVertex(); x.Name = "x";
            NamedVertex y = (NamedVertex)g.AddVertex(); y.Name = "y";
            NamedVertex z = (NamedVertex)g.AddVertex(); z.Name = "z";
            NamedVertex w = (NamedVertex)g.AddVertex(); w.Name = "w";

            g.AddEdge(x, y);
            g.AddEdge(x, z);
            g.AddEdge(y, z);
            g.AddEdge(x, w);
            g.AddEdge(w, y);
            g.AddEdge(w, z);

            return(g);
        }
Beispiel #11
0
 /// <summary>
 /// Updates a vertex that has not been created with the provider
 /// </summary>
 /// <param name="v">vertex to update</param>
 public void UpdateVertex(NamedVertex v)
 {
     v.ID = m_NextID++;
 }
 /// <summary>
 /// Updates a vertex that has not been created with the provider
 /// </summary>
 /// <param name="v">vertex to update</param>
 public void UpdateVertex(NamedVertex v)
 {
     v.ID = m_NextID++;
 }
Beispiel #13
0
        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");
        }
Beispiel #14
0
        void graphviz_FormatVertex(object sender, FormatVertexEventArgs e)
        {
            NamedVertex v = (NamedVertex)e.Vertex;

            e.VertexFormatter.Label = v.Name;
        }