Example #1
0
        public void ForestGraph()
        {
            var graph = new BidirectionalGraph <int, Edge <int> >();

            graph.AddVerticesAndEdgeRange(new[]
            {
                new Edge <int>(0, 1),
                new Edge <int>(1, 2),
                new Edge <int>(1, 3),
                new Edge <int>(2, 3),
                new Edge <int>(3, 4),

                new Edge <int>(5, 6)
            });

            var algorithm = new SourceFirstBidirectionalTopologicalSortAlgorithm <int, Edge <int> >(graph);

            algorithm.Compute();

            CollectionAssert.AreEqual(
                new[] { 0, 5, 1, 6, 2, 3, 4 },
                algorithm.SortedVertices);

            algorithm = new SourceFirstBidirectionalTopologicalSortAlgorithm <int, Edge <int> >(graph, TopologicalSortDirection.Backward);
            algorithm.Compute();

            CollectionAssert.AreEqual(
                new[] { 4, 6, 3, 5, 2, 1, 0 },
                algorithm.SortedVertices);
        }
Example #2
0
        public void SimpleGraph()
        {
            var graph = new BidirectionalGraph <int, Edge <int> >();

            graph.AddVerticesAndEdgeRange(new[]
            {
                new Edge <int>(1, 2),
                new Edge <int>(2, 3),
                new Edge <int>(2, 6),
                new Edge <int>(2, 8),
                new Edge <int>(4, 2),
                new Edge <int>(4, 5),
                new Edge <int>(5, 6),
                new Edge <int>(7, 5),
                new Edge <int>(7, 8)
            });

            var algorithm = new SourceFirstBidirectionalTopologicalSortAlgorithm <int, Edge <int> >(graph);

            algorithm.Compute();

            CollectionAssert.AreEqual(
                new[] { 1, 7, 4, 2, 5, 8, 3, 6 },
                algorithm.SortedVertices);

            algorithm = new SourceFirstBidirectionalTopologicalSortAlgorithm <int, Edge <int> >(graph, TopologicalSortDirection.Backward);
            algorithm.Compute();

            CollectionAssert.AreEqual(
                new[] { 3, 6, 8, 5, 2, 7, 1, 4 },
                algorithm.SortedVertices);
        }
Example #3
0
        public void Sort_DCT8()
        {
            BidirectionalGraph <string, Edge <string> > graph = TestGraphFactory.LoadBidirectionalGraph(GetGraphFilePath("DCT8.graphml"));

            var algorithm = new SourceFirstBidirectionalTopologicalSortAlgorithm <string, Edge <string> >(graph, TopologicalSortDirection.Forward);

            algorithm.Compute();

            algorithm = new SourceFirstBidirectionalTopologicalSortAlgorithm <string, Edge <string> >(graph, TopologicalSortDirection.Backward);
            algorithm.Compute();
        }
Example #4
0
        public void Constructor()
        {
            var graph     = new BidirectionalGraph <int, Edge <int> >();
            var algorithm = new SourceFirstBidirectionalTopologicalSortAlgorithm <int, Edge <int> >(graph);

            AssertAlgorithmProperties(algorithm, graph);

            algorithm = new SourceFirstBidirectionalTopologicalSortAlgorithm <int, Edge <int> >(graph, -10);
            AssertAlgorithmProperties(algorithm, graph);

            algorithm = new SourceFirstBidirectionalTopologicalSortAlgorithm <int, Edge <int> >(graph, 0);
            AssertAlgorithmProperties(algorithm, graph);

            algorithm = new SourceFirstBidirectionalTopologicalSortAlgorithm <int, Edge <int> >(graph, 10);
            AssertAlgorithmProperties(algorithm, graph);

            algorithm = new SourceFirstBidirectionalTopologicalSortAlgorithm <int, Edge <int> >(graph, TopologicalSortDirection.Forward);
            AssertAlgorithmProperties(algorithm, graph);

            algorithm = new SourceFirstBidirectionalTopologicalSortAlgorithm <int, Edge <int> >(graph, TopologicalSortDirection.Forward, -10);
            AssertAlgorithmProperties(algorithm, graph);

            algorithm = new SourceFirstBidirectionalTopologicalSortAlgorithm <int, Edge <int> >(graph, TopologicalSortDirection.Forward, 0);
            AssertAlgorithmProperties(algorithm, graph);

            algorithm = new SourceFirstBidirectionalTopologicalSortAlgorithm <int, Edge <int> >(graph, TopologicalSortDirection.Forward, 10);
            AssertAlgorithmProperties(algorithm, graph);

            algorithm = new SourceFirstBidirectionalTopologicalSortAlgorithm <int, Edge <int> >(graph, TopologicalSortDirection.Backward);
            AssertAlgorithmProperties(algorithm, graph);

            algorithm = new SourceFirstBidirectionalTopologicalSortAlgorithm <int, Edge <int> >(graph, TopologicalSortDirection.Backward, -10);
            AssertAlgorithmProperties(algorithm, graph);

            algorithm = new SourceFirstBidirectionalTopologicalSortAlgorithm <int, Edge <int> >(graph, TopologicalSortDirection.Backward, 0);
            AssertAlgorithmProperties(algorithm, graph);

            algorithm = new SourceFirstBidirectionalTopologicalSortAlgorithm <int, Edge <int> >(graph, TopologicalSortDirection.Backward, 10);
            AssertAlgorithmProperties(algorithm, graph);

            #region Local function

            void AssertAlgorithmProperties <TVertex, TEdge>(
                SourceFirstBidirectionalTopologicalSortAlgorithm <TVertex, TEdge> algo,
                IBidirectionalGraph <TVertex, TEdge> g)
                where TEdge : IEdge <TVertex>
            {
                AssertAlgorithmState(algo, g);
                Assert.IsNull(algo.SortedVertices);
                CollectionAssert.IsEmpty(algo.InDegrees);
            }

            #endregion
        }
Example #5
0
        public void SortDCT()
        {
            var g = TestGraphFactory.LoadBidirectionalGraph("DCT8.graphml");

            SourceFirstBidirectionalTopologicalSortAlgorithm <string, Edge <string> > topo;

            topo = new SourceFirstBidirectionalTopologicalSortAlgorithm <string, Edge <string> >(g, TopologicalSortDirection.Forward);
            topo.Compute();

            topo = new SourceFirstBidirectionalTopologicalSortAlgorithm <string, Edge <string> >(g, TopologicalSortDirection.Backward);
            topo.Compute();
        }
Example #6
0
        public void Sort <TVertex, TEdge>([PexAssumeNotNull] IBidirectionalGraph <TVertex, TEdge> g, TopologicalSortDirection direction)
            where TEdge : IEdge <TVertex>
        {
            var topo = new SourceFirstBidirectionalTopologicalSortAlgorithm <TVertex, TEdge>(g, direction);

            try
            {
                topo.Compute();
            }
            catch (NonAcyclicGraphException)
            { }
        }
Example #7
0
        private static void Sort <TVertex, TEdge>([NotNull] IBidirectionalGraph <TVertex, TEdge> graph, TopologicalSortDirection direction)
            where TEdge : IEdge <TVertex>
        {
            var algorithm = new SourceFirstBidirectionalTopologicalSortAlgorithm <TVertex, TEdge>(graph, direction);

            try
            {
                algorithm.Compute();
            }
            catch (NonAcyclicGraphException)
            {
            }
        }
Example #8
0
        private static void RunSourceFirstTopologicalSortAndCheck <TVertex, TEdge>(
            [NotNull] IBidirectionalGraph <TVertex, TEdge> graph,
            TopologicalSortDirection direction)
            where TEdge : IEdge <TVertex>
        {
            var algorithm = new SourceFirstBidirectionalTopologicalSortAlgorithm <TVertex, TEdge>(graph, direction);

            algorithm.Compute();

            Assert.IsNotNull(algorithm.SortedVertices);
            Assert.AreEqual(graph.VertexCount, algorithm.SortedVertices.Length);
            Assert.IsNotNull(algorithm.InDegrees);
            Assert.AreEqual(graph.VertexCount, algorithm.InDegrees.Count);
        }
Example #9
0
        public static (int[], string) Get(BidirectionalGraph <int, Edge <int> > graph)
        {
            var algorithm = new SourceFirstBidirectionalTopologicalSortAlgorithm <int, Edge <int> >(graph);

            try
            {
                algorithm.Compute();
                return(algorithm.SortedVertices, null);
            }
            catch (System.Exception ex)
            {
                return(null, ex.Message);
            }
        }
Example #10
0
        public void SourceFirstBidirectionalTopologicalSort_Throws()
        {
            var cyclicGraph = new BidirectionalGraph <int, Edge <int> >();

            cyclicGraph.AddVerticesAndEdgeRange(new[]
            {
                new Edge <int>(1, 2),
                new Edge <int>(2, 3),
                new Edge <int>(1, 4),
                new Edge <int>(3, 1)
            });

            var algorithm = new SourceFirstBidirectionalTopologicalSortAlgorithm <int, Edge <int> >(cyclicGraph);

            Assert.Throws <NonAcyclicGraphException>(() => algorithm.Compute());
        }
Example #11
0
        public static void SourceFirstBidirectionalTopologicalSort <TVertex, TEdge>(
#if !NET20
            this
#endif
            IBidirectionalGraph <TVertex, TEdge> visitedGraph,
            IList <TVertex> vertices,
            TopologicalSortDirection direction)
            where TEdge : IEdge <TVertex>
        {
            Contract.Requires(visitedGraph != null);
            Contract.Requires(vertices != null);

            var topo = new SourceFirstBidirectionalTopologicalSortAlgorithm <TVertex, TEdge>(visitedGraph, direction);

            topo.Compute(vertices);
        }
Example #12
0
        public void SortAnotherOne()
        {
            var graph = new BidirectionalGraph <int, Edge <int> >();

            graph.AddVertexRange(new[] { 0, 1, 2, 3, 4 });
            graph.AddEdge(new Edge <int>(0, 1));
            graph.AddEdge(new Edge <int>(1, 2));
            graph.AddEdge(new Edge <int>(1, 3));
            graph.AddEdge(new Edge <int>(2, 3));
            graph.AddEdge(new Edge <int>(3, 4));

            var algorithm = new SourceFirstBidirectionalTopologicalSortAlgorithm <int, Edge <int> >(graph, TopologicalSortDirection.Forward);

            algorithm.Compute();

            algorithm = new SourceFirstBidirectionalTopologicalSortAlgorithm <int, Edge <int> >(graph, TopologicalSortDirection.Backward);
            algorithm.Compute();
        }
Example #13
0
        public void GraphWithSelfEdge_Throws()
        {
            var graph = new BidirectionalGraph <int, Edge <int> >();

            graph.AddVerticesAndEdgeRange(new[]
            {
                new Edge <int>(0, 1),
                new Edge <int>(1, 2),
                new Edge <int>(1, 3),
                new Edge <int>(2, 3),
                new Edge <int>(2, 2),
                new Edge <int>(3, 4)
            });

            var algorithm = new SourceFirstBidirectionalTopologicalSortAlgorithm <int, Edge <int> >(graph);

            Assert.Throws <NonAcyclicGraphException>(() => algorithm.Compute());

            algorithm = new SourceFirstBidirectionalTopologicalSortAlgorithm <int, Edge <int> >(graph, TopologicalSortDirection.Backward);
            Assert.Throws <NonAcyclicGraphException>(() => algorithm.Compute());
        }
Example #14
0
        public void SortAnotherOne()
        {
            var g = new BidirectionalGraph <int, Edge <int> >();

            g.AddVertexRange(new int[5] {
                0, 1, 2, 3, 4
            });
            g.AddEdge(new Edge <int>(0, 1));
            g.AddEdge(new Edge <int>(1, 2));
            g.AddEdge(new Edge <int>(1, 3));
            g.AddEdge(new Edge <int>(2, 3));
            g.AddEdge(new Edge <int>(3, 4));

            SourceFirstBidirectionalTopologicalSortAlgorithm <int, Edge <int> > topo;

            topo = new SourceFirstBidirectionalTopologicalSortAlgorithm <int, Edge <int> >(g, TopologicalSortDirection.Forward);
            topo.Compute();

            topo = new SourceFirstBidirectionalTopologicalSortAlgorithm <int, Edge <int> >(g, TopologicalSortDirection.Backward);
            topo.Compute();
        }