예제 #1
0
        /// <summary>Constructs a maximum flow algorithm.</summary>
        /// <param name="g">Graph to compute maximum flow on.</param>
        /// <param name="capacities">edge capacities</param>
        /// <param name="reversedEdges">reversed edge map</param>
        /// <exception cref="ArgumentNullException"><paramref name="g"/> or
        /// <paramref name="capacities"/> or <paramref name="reversedEdges"/> is a null
        /// reference.
        /// </exception>
        public MaximumFlowAlgorithm(
            IVertexListGraph g,
            EdgeDoubleDictionary capacities,
            EdgeEdgeDictionary reversedEdges
            )
        {
            if (g == null)
            {
                throw new ArgumentNullException("g");
            }
            if (capacities == null)
            {
                throw new ArgumentNullException("capacities");
            }
            if (reversedEdges == null)
            {
                throw new ArgumentNullException("reversedEdges");
            }

            this.visitedGraph  = g;
            this.capacities    = capacities;
            this.reversedEdges = reversedEdges;

            this.predecessors       = new VertexEdgeDictionary();
            this.residualCapacities = new EdgeDoubleDictionary();
            this.colors             = new VertexColorDictionary();
        }
예제 #2
0
        /// <summary>
        /// Generates the dot code to be rendered with GraphViz
        /// </summary>
        /// <param name="outputFileName">output file name</param>
        /// <returns>corrected output file name</returns>
        /// <remarks>
        /// The output filename extension is automatically matched with the
        /// output file type.
        /// </remarks>
        public string Write(string outputFileName)
        {
            if (outputFileName == null)
            {
                throw new ArgumentNullException("outputFileName");
            }

            ClusterCount   = 0;
            m_StringWriter = new StringWriter();

            Output.WriteLine("digraph G {");

            String gf = GraphFormat.ToDot();

            if (gf.Length > 0)
            {
                Output.WriteLine(gf);
            }
            String vf = CommonVertexFormat.ToDot();

            if (vf.Length > 0)
            {
                Output.WriteLine("node [{0}];", vf);
            }
            String ef = CommonEdgeFormat.ToDot();

            if (ef.Length > 0)
            {
                Output.WriteLine("edge [{0}];", ef);
            }

            OnWriteGraph();

            // initialize vertex map
            VertexColorDictionary colors = new VertexColorDictionary();

            foreach (IVertex v in VisitedGraph.Vertices)
            {
                colors[v] = GraphColor.White;
            }
            EdgeColorDictionary edgeColors = new EdgeColorDictionary();

            foreach (IEdge e in VisitedGraph.Edges)
            {
                edgeColors[e] = GraphColor.White;
            }

            // write
            if (VisitedGraph is IClusteredGraph)
            {
                WriteClusters(colors, edgeColors, VisitedGraph as IClusteredGraph);
            }

            WriteVertices(colors, VisitedGraph.Vertices);
            WriteEdges(edgeColors, VisitedGraph.Edges);

            Output.WriteLine("}");

            return(m_Dot.Run(ImageType, Output.ToString(), outputFileName));
        }
예제 #3
0
        public static FilteredVertexAndEdgeListGraph FilteredFsm()
        {
            AdjacencyGraph g = Fsm();

            // putting all black besides S4
            // therefore all the edges touching s4 will be filtered out.
            VertexColorDictionary vertexColors = new VertexColorDictionary();
            IVertexPredicate      pred         = new NameEqualPredicate("S4");

            foreach (IVertex v in g.Vertices)
            {
                if (pred.Test(v))
                {
                    vertexColors[v] = GraphColor.Black;
                }
                else
                {
                    vertexColors[v] = GraphColor.White;
                }
            }

            IVertexPredicate vp = new NoBlackVertexPredicate(vertexColors);
            IEdgePredicate   ep = new EdgePredicate(
                new KeepAllEdgesPredicate(),
                vp
                );

            return(new FilteredVertexAndEdgeListGraph(g,
                                                      ep,
                                                      vp
                                                      ));
        }
예제 #4
0
        private void edgeDepthFirstSearchItem_Click(object sender, System.EventArgs e)
        {
            if (this.netronPanel.Graph == null)
            {
                throw new Exception("Generate a graph first");
            }
            if (this.netronPanel.Populator == null)
            {
                throw new Exception("Populator should not be null.");
            }

            ResetVertexAndEdgeColors();

            // create algorithm
            this.vertexColors = null;
            this.edgeColors   = new EdgeColorDictionary();
            EdgeDepthFirstSearchAlgorithm edfs =
                new EdgeDepthFirstSearchAlgorithm(this.netronPanel.Graph, this.edgeColors);

            // create tracer
            LayoutAlgorithmTraverVisitor tracer = new LayoutAlgorithmTraverVisitor(this.netronPanel.Populator);

            // link to algo
            edfs.RegisterTreeEdgeBuilderHandlers(tracer);
            edfs.RegisterEdgeColorizerHandlers(tracer);

            // add handler to tracers
            tracer.UpdateVertex += new ShapeVertexEventHandler(tracer_UpdateVertex);
            tracer.UpdateEdge   += new ConnectionEdgeEventHandler(tracer_UpdateEdge);

            // running algorithm
            Thread thread = new Thread(new ThreadStart(edfs.Compute));

            thread.Start();
        }
예제 #5
0
 /// <summary>
 /// Construct the edge predicate with the edge color map
 /// </summary>
 /// <param name="edgeColors">edge color map</param>
 /// <remarks>
 /// The vertex color map must be initialize for the graph edges.
 /// </remarks>
 public NoBlackVertexPredicate(VertexColorDictionary vertexColors)
 {
     if (vertexColors == null)
     {
         throw new ArgumentNullException("vertexColors");
     }
     m_VertexColors = vertexColors;
 }
예제 #6
0
 /// <summary>
 /// A depth first search algorithm on a directed graph
 /// </summary>
 /// <param name="g">The graph to traverse</param>
 /// <exception cref="ArgumentNullException">g is null</exception>
 public DepthFirstSearchAlgorithm(IVertexListGraph g)
 {
     if (g == null)
     {
         throw new ArgumentNullException("g");
     }
     m_VisitedGraph = g;
     m_Colors       = new VertexColorDictionary();
 }
 /// <summary>
 /// A height first search algorithm on a directed graph
 /// </summary>
 /// <param name="g">The graph to traverse</param>
 /// <exception cref="ArgumentNullException">g is null</exception>
 public HeightFirstSearchAlgorithm(IBidirectionalVertexListGraph g)
 {
     if (g == null)
     {
         throw new ArgumentNullException("g");
     }
     this.visitedGraph = g;
     this.colors       = new VertexColorDictionary();
 }
예제 #8
0
 /// <summary>
 /// Create a undirected dfs algorithm
 /// </summary>
 /// <param name="g">Graph to search on.</param>
 public UndirectedDepthFirstSearchAlgorithm(IBidirectionalVertexAndEdgeListGraph g)
 {
     if (g == null)
     {
         throw new ArgumentNullException("g");
     }
     visitedGraph = g;
     edgeColors   = new EdgeColorDictionary();
     colors       = new VertexColorDictionary();
 }
예제 #9
0
 internal void WriteVertices(VertexColorDictionary colors,
                             IVertexEnumerable vertices)
 {
     foreach (IVertex v in vertices)
     {
         if (colors[v] == GraphColor.White)
         {
             OnWriteVertex(v);
             OnFormatVertex(v);
             colors[v] = GraphColor.Black;
         }
     }
 }
예제 #10
0
        private void breadthFirstSearchItem_Click(object sender, System.EventArgs e)
        {
            if (this.netronPanel.Graph == null)
            {
                throw new Exception("Generate a graph first");
            }
            if (this.netronPanel.Populator == null)
            {
                throw new Exception("Populator should not be null.");
            }

            ResetVertexAndEdgeColors();

            // create algorithm
            this.edgeColors = new EdgeColorDictionary();
            foreach (IEdge edge in this.netronPanel.Graph.Edges)
            {
                this.edgeColors[edge] = GraphColor.White;
            }
            this.vertexColors = new VertexColorDictionary();
            BreadthFirstSearchAlgorithm bfs = new BreadthFirstSearchAlgorithm(
                this.netronPanel.Graph,
                new VertexBuffer(),
                this.vertexColors);

            // create tracer
            LayoutAlgorithmTraverVisitor tracer = new LayoutAlgorithmTraverVisitor(this.netronPanel.Populator);

            // link to algo
            bfs.RegisterTreeEdgeBuilderHandlers(tracer);
            bfs.RegisterVertexColorizerHandlers(tracer);

            bfs.TreeEdge    += new EdgeEventHandler(dfs_TreeEdge);
            bfs.NonTreeEdge += new EdgeEventHandler(dfs_BackEdge);
            bfs.BlackTarget += new EdgeEventHandler(dfs_ForwardOrCrossEdge);


            // add handler to tracers
            tracer.UpdateVertex += new ShapeVertexEventHandler(tracer_UpdateVertex);
            tracer.UpdateEdge   += new ConnectionEdgeEventHandler(tracer_UpdateEdge);

            // running algorithm
            VertexMethodCaller vm =
                new VertexMethodCaller(
                    new ComputeVertexDelegate(bfs.Compute),
                    Traversal.FirstVertex(this.netronPanel.Graph)
                    );
            Thread thread = new Thread(new ThreadStart(vm.Run));

            thread.Start();
        }
        /// <summary>
        /// Builds a new Bellman Ford searcher.
        /// </summary>
        /// <param name="g">The graph</param>
        /// <param name="weights">Edge weights</param>
        /// <exception cref="ArgumentNullException">Any argument is null</exception>
        /// <remarks>This algorithm uses the <seealso cref="BreadthFirstSearchAlgorithm"/>.</remarks>
        public BellmanFordShortestPathAlgorithm(
            IVertexAndEdgeListGraph g,
            EdgeDoubleDictionary weights
            )
        {
            if (weights == null)
            {
                throw new ArgumentNullException("Weights");
            }

            m_VisitedGraph = g;
            m_Colors       = new VertexColorDictionary();
            m_Weights      = weights;
            m_Distances    = new VertexDoubleDictionary();
            m_Predecessors = new VertexVertexDictionary();
        }
예제 #12
0
        /// <summary>
        /// A depth first search algorithm on a directed graph
        /// </summary>
        /// <param name="g">The graph to traverse</param>
        /// <param name="colors">vertex color map</param>
        /// <exception cref="ArgumentNullException">g or colors are null</exception>
        public NeighborDepthFirstSearchAlgorithm(
            IBidirectionalVertexListGraph g,
            VertexColorDictionary colors
            )
        {
            if (g == null)
            {
                throw new ArgumentNullException("g");
            }
            if (colors == null)
            {
                throw new ArgumentNullException("Colors");
            }

            this.visitedGraph = g;
            this.colors       = colors;
        }
예제 #13
0
        internal void WriteClusters(
            VertexColorDictionary colors,
            EdgeColorDictionary edgeColors,
            IClusteredGraph parent
            )
        {
            ++ClusterCount;
            foreach (IVertexAndEdgeListGraph g in parent.Clusters)
            {
                Output.Write("subgraph cluster{0}", ClusterCount.ToString());
                Output.WriteLine(" {");

                OnFormatCluster(g);

                if (g is IClusteredGraph)
                {
                    WriteClusters(colors, edgeColors, g as IClusteredGraph);
                }

                if (parent.Colapsed)
                {
                    // draw cluster
                    // put vertices as black
                    foreach (IVertex v in g.Vertices)
                    {
                        colors[v] = GraphColor.Black;
                    }
                    foreach (IEdge e in g.Edges)
                    {
                        edgeColors[e] = GraphColor.Black;
                    }

                    // add fake vertex
                }
                else
                {
                    WriteVertices(colors, g.Vertices);
                    WriteEdges(edgeColors, g.Edges);
                }

                Output.WriteLine("}");
            }
        }
예제 #14
0
        private void depthFirstSearchAlgorithmItem_Click(object sender, System.EventArgs e)
        {
            if (this.netronPanel.Graph == null)
            {
                throw new Exception("Generate a graph first");
            }

            // clear colors
            ResetVertexAndEdgeColors();

            // create algorithm
            this.edgeColors = new EdgeColorDictionary();
            foreach (IEdge edge in this.netronPanel.Graph.Edges)
            {
                this.edgeColors[edge] = GraphColor.White;
            }

            this.vertexColors = new VertexColorDictionary();
            DepthFirstSearchAlgorithm dfs = new DepthFirstSearchAlgorithm(
                this.netronPanel.Graph,
                this.vertexColors);

            // create tracer
            LayoutAlgorithmTraverVisitor tracer = new LayoutAlgorithmTraverVisitor(this.netronPanel.Populator);

            // link to algo
            dfs.RegisterTreeEdgeBuilderHandlers(tracer);
            dfs.RegisterVertexColorizerHandlers(tracer);

            dfs.TreeEdge           += new EdgeEventHandler(dfs_TreeEdge);
            dfs.BackEdge           += new EdgeEventHandler(dfs_BackEdge);
            dfs.ForwardOrCrossEdge += new EdgeEventHandler(dfs_ForwardOrCrossEdge);

            // add handler to tracers
            tracer.UpdateVertex += new ShapeVertexEventHandler(tracer_UpdateVertex);
            tracer.UpdateEdge   += new ConnectionEdgeEventHandler(tracer_UpdateEdge);

            // running algorithm
            Thread thread = new Thread(new ThreadStart(dfs.Compute));

            thread.Start();
        }
        /// <summary>
        /// Builds a new Dijsktra searcher.
        /// </summary>
        /// <param name="g">The graph</param>
        /// <param name="weights">Edge weights</param>
        /// <exception cref="ArgumentNullException">Any argument is null</exception>
        /// <remarks>This algorithm uses the <seealso cref="BreadthFirstSearchAlgorithm"/>.</remarks>
        public DijkstraShortestPathAlgorithm(
            IVertexListGraph g,
            EdgeDoubleDictionary weights
            )
        {
            if (g == null)
            {
                throw new ArgumentNullException("g");
            }
            if (weights == null)
            {
                throw new ArgumentNullException("Weights");
            }

            this.visitedGraph = g;
            this.colors       = new VertexColorDictionary();
            this.distances    = new VertexDoubleDictionary();
            this.weights      = weights;
            this.vertexQueue  = null;
        }
예제 #16
0
        /// <summary>
        /// Builds a new Dijsktra searcher.
        /// </summary>
        /// <param name="g">The graph</param>
        /// <param name="weights">Edge weights</param>
        /// <exception cref="ArgumentNullException">Any argument is null</exception>
        /// <remarks>This algorithm uses the <seealso cref="BreadthFirstSearchAlgorithm"/>.</remarks>
        public DijkstraShortestPathAlgorithm(
            IVertexListGraph g,
            EdgeDoubleDictionary weights
            )
        {
            if (g == null)
            {
                throw new ArgumentNullException("g");
            }
            if (weights == null)
            {
                throw new ArgumentNullException("Weights");
            }

            m_VisitedGraph = g;
            m_Colors       = new VertexColorDictionary();
            m_Distances    = new VertexDoubleDictionary();
            m_Predecessors = new VertexVertexDictionary();
            m_Weights      = weights;
            m_VertexQueue  = null;
        }
예제 #17
0
        /// <summary>
        /// BreadthFirstSearch searcher contructor
        /// </summary>
        /// <param name="g">Graph to visit</param>
        /// <param name="q">Vertex buffer</param>
        /// <param name="colors">Vertex color map</param>
        public BreadthFirstSearchAlgorithm(
            IVertexListGraph g,
            VertexBuffer q,
            VertexColorDictionary colors
            )
        {
            if (g == null)
            {
                throw new ArgumentNullException("g");
            }
            if (q == null)
            {
                throw new ArgumentNullException("Stack Q is null");
            }
            if (colors == null)
            {
                throw new ArgumentNullException("Colors");
            }

            m_VisitedGraph = g;
            m_Colors       = colors;
            m_Q            = q;
        }
예제 #18
0
        private void FilterFsm()
        {
            AdjacencyGraph graph = GraphProvider.Fsm();

            // drawing the fsm
            DrawGraph(graph, "fsm");

            // filtering
            // putting all black besides S4
            // therefore all the edges touching s4 will be filtered out.
            VertexColorDictionary vertexColors = new VertexColorDictionary();
            IVertexPredicate      pred         = new NameEqualPredicate("S4");

            foreach (IVertex v in graph.Vertices)
            {
                if (pred.Test(v))
                {
                    vertexColors[v] = GraphColor.Black;
                }
                else
                {
                    vertexColors[v] = GraphColor.White;
                }
            }

            IVertexPredicate vp = new NoBlackVertexPredicate(vertexColors);
            IEdgePredicate   ep = new EdgePredicate(
                Preds.KeepAllEdges(),
                vp
                );
            IVertexAndEdgeListGraph filteredGraph = new FilteredVertexAndEdgeListGraph(graph,
                                                                                       ep,
                                                                                       vp
                                                                                       );

            DrawGraph(filteredGraph, "fsmfiltered");
        }
예제 #19
0
        public ReportResult RunTests()
        {
            ReportResult result = new ReportResult();

            if (graph.VerticesCount == 0)
            {
                this.OnLog("No assembly to execute");
                result.UpdateCounts();
                return(result);
            }

            this.OnLog("Sorting assemblies by dependencies");
            // create topological sort
            ArrayList sortedVertices      = new ArrayList();
            TopologicalSortAlgorithm topo = new TopologicalSortAlgorithm(graph);

            topo.Compute(sortedVertices);
            if (sortedVertices.Count == 0)
            {
                throw new InvalidOperationException("Cannot be zero");
            }

            // set vertices colors
            this.OnLog("Setting up fixture colors");
            VertexColorDictionary colors = new VertexColorDictionary();

            foreach (TestDomainVertex v in graph.Vertices)
            {
                colors.Add(v, GraphColor.White);
            }

            // execute each domain
            foreach (TestDomainVertex v in sortedVertices)
            {
                // if vertex color is not white, skip it
                GraphColor color = colors[v];
                if (color != GraphColor.White)
                {
                    this.OnLog("Skipping assembly {0} because dependent assembly failed", v.Domain.TestEngine.Explorer.AssemblyName);
                    // mark children
                    foreach (TestDomainVertex child in graph.AdjacentVertices(v))
                    {
                        colors[child] = GraphColor.Black;
                    }
                    continue;
                }

                this.OnLog("Loading {0}", v.Domain.TestEngine.Explorer.AssemblyName);

                ReportCounter counter = v.Domain.TestEngine.GetTestCount();
                this.OnLog("Found  {0} tests", counter.RunCount);
                this.OnLog("Running fixtures.");
                v.Domain.TestEngine.RunPipes();
                counter = v.Domain.TestEngine.GetTestCount();
                this.OnLog("Tests finished: {0} tests, {1} success, {2} failures, {3} ignored"
                           , counter.RunCount
                           , counter.SuccessCount
                           , counter.FailureCount
                           , counter.IgnoreCount
                           );

                result.Merge(v.Domain.TestEngine.Report.Result);

                if (counter.FailureCount != 0)
                {
                    // mark children as failed
                    colors[v] = GraphColor.Black;
                    foreach (TestDomainVertex child in graph.AdjacentVertices(v))
                    {
                        colors[child] = GraphColor.Black;
                    }
                }
                else
                {
                    // mark vertex as succesfull
                    colors[v] = GraphColor.Gray;
                }
            }

            result.UpdateCounts();
            MbUnit.Framework.Assert.IsNotNull(result);
            MbUnit.Framework.Assert.IsNotNull(result.Counter);

            this.OnLog("All Tests finished: {0} tests, {1} success, {2} failures, {3} ignored in {4} seconds"
                       , result.Counter.RunCount
                       , result.Counter.SuccessCount
                       , result.Counter.FailureCount
                       , result.Counter.IgnoreCount
                       , result.Counter.Duration
                       );

            return(result);
        }