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); }
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); }
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(); }
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 }
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(); }
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) { } }
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) { } }
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); }
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); } }
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()); }
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); }
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(); }
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()); }
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(); }