/// <summary> /// Initializes a new instance of the <see cref="SourceFirstBidirectionalTopologicalSortAlgorithm{TVertex,TEdge}"/> class. /// </summary> /// <param name="visitedGraph">Graph to visit.</param> /// <param name="direction">Sort direction.</param> public SourceFirstBidirectionalTopologicalSortAlgorithm( [NotNull] IBidirectionalGraph <TVertex, TEdge> visitedGraph, TopologicalSortDirection direction) : base(visitedGraph) { _direction = direction; _heap = new BinaryQueue <TVertex, int>(vertex => InDegrees[vertex]); }
public SourceFirstBidirectionalTopologicalSortAlgorithm( IBidirectionalGraph <TVertex, TEdge> visitedGraph, TopologicalSortDirection direction ) : base(visitedGraph) { this.direction = direction; this.heap = new BinaryQueue <TVertex, int>(e => this.predCounts[e]); }
/// <summary> /// Initializes a new instance of the <see cref="SourceFirstBidirectionalTopologicalSortAlgorithm{TVertex,TEdge}"/> class. /// </summary> /// <param name="visitedGraph">Graph to visit.</param> /// <param name="direction">Sort direction.</param> /// <param name="capacity">Sorted vertices capacity.</param> public SourceFirstBidirectionalTopologicalSortAlgorithm( [NotNull] IBidirectionalGraph <TVertex, TEdge> visitedGraph, TopologicalSortDirection direction, int capacity = -1) : base(visitedGraph) { _direction = direction; _heap = new BinaryQueue <TVertex, int>(vertex => InDegrees[vertex]); _sortedVertices = capacity > 0 ? new List <TVertex>(capacity) : new List <TVertex>(); }
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 IEnumerable <TVertex> SourceFirstBidirectionalTopologicalSort <TVertex, TEdge>( #if !NET20 this #endif IBidirectionalGraph <TVertex, TEdge> visitedGraph, TopologicalSortDirection direction) where TEdge : IEdge <TVertex> { Contract.Requires(visitedGraph != null); var vertices = new List <TVertex>(visitedGraph.VertexCount); SourceFirstBidirectionalTopologicalSort(visitedGraph, vertices, direction); return(vertices); }
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); }
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) { } }
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) { } }