/// <summary> /// Creates paths /// </summary> /// <param name="vertexPredecessor">The vertex predecessors</param> /// <returns>Enumeration of paths</returns> private static IEnumerable <Path> CreateAPath(VertexPredecessor vertexPredecessor) { foreach (var aInPred in vertexPredecessor.Incoming) { yield return(new Path(new PathElement(aInPred.Edge, aInPred.EdgePropertyId, Direction.IncomingEdge))); } foreach (var aOutPred in vertexPredecessor.Outgoing) { yield return(new Path(new PathElement(aOutPred.Edge, aOutPred.EdgePropertyId, Direction.OutgoingEdge))); } }
/// <summary> /// Gets the global frontier corresponding to a certain level /// </summary> /// <param name="startingVertices">The starting vertices behind the frontier</param> /// <param name="visitedVertices">The visited vertices corresponding to the frontier</param> /// <param name="edgepropertyFilter">The edge property filter</param> /// <param name="edgeFilter">The edge filter</param> /// <param name="vertexFilter">The vertex filter</param> /// <returns>The frontier vertices and their predecessors</returns> private static Dictionary <VertexModel, VertexPredecessor> GetGlobalFrontier(IEnumerable <VertexModel> startingVertices, BigBitArray visitedVertices, PathDelegates.EdgePropertyFilter edgepropertyFilter, PathDelegates.EdgeFilter edgeFilter, PathDelegates.VertexFilter vertexFilter) { var frontier = new Dictionary <VertexModel, VertexPredecessor>(); foreach (var aKv in startingVertices) { foreach (var aFrontierElement in GetLocalFrontier(aKv, visitedVertices, edgepropertyFilter, edgeFilter, vertexFilter)) { VertexPredecessor pred; if (frontier.TryGetValue(aFrontierElement.FrontierVertex, out pred)) { switch (aFrontierElement.EdgeDirection) { case Direction.IncomingEdge: pred.Incoming.Add(aFrontierElement.EdgeLocation); break; case Direction.OutgoingEdge: pred.Outgoing.Add(aFrontierElement.EdgeLocation); break; default: throw new ArgumentOutOfRangeException(); } } else { pred = new VertexPredecessor(); switch (aFrontierElement.EdgeDirection) { case Direction.IncomingEdge: pred.Incoming.Add(aFrontierElement.EdgeLocation); break; case Direction.OutgoingEdge: pred.Outgoing.Add(aFrontierElement.EdgeLocation); break; default: throw new ArgumentOutOfRangeException(); } frontier.Add(aFrontierElement.FrontierVertex, pred); } } } return(frontier); }
/// <summary> /// Gets the global frontier corresponding to a certain level /// </summary> /// <param name="startingVertices">The starting vertices behind the frontier</param> /// <param name="visitedVertices">The visited vertices corresponding to the frontier</param> /// <param name="edgepropertyFilter">The edge property filter</param> /// <param name="edgeFilter">The edge filter</param> /// <param name="vertexFilter">The vertex filter</param> /// <returns>The frontier vertices and their predecessors</returns> private static Dictionary<VertexModel, VertexPredecessor> GetGlobalFrontier(IEnumerable<VertexModel> startingVertices, BigBitArray visitedVertices, PathDelegates.EdgePropertyFilter edgepropertyFilter, PathDelegates.EdgeFilter edgeFilter, PathDelegates.VertexFilter vertexFilter) { var frontier = new Dictionary<VertexModel, VertexPredecessor>(); foreach (var aKv in startingVertices) { foreach (var aFrontierElement in GetLocalFrontier(aKv, visitedVertices, edgepropertyFilter, edgeFilter, vertexFilter)) { VertexPredecessor pred; if (frontier.TryGetValue(aFrontierElement.FrontierVertex, out pred)) { switch (aFrontierElement.EdgeDirection) { case Direction.IncomingEdge: pred.Incoming.Add(aFrontierElement.EdgeLocation); break; case Direction.OutgoingEdge: pred.Outgoing.Add(aFrontierElement.EdgeLocation); break; default: throw new ArgumentOutOfRangeException(); } } else { pred = new VertexPredecessor(); switch (aFrontierElement.EdgeDirection) { case Direction.IncomingEdge: pred.Incoming.Add(aFrontierElement.EdgeLocation); break; case Direction.OutgoingEdge: pred.Outgoing.Add(aFrontierElement.EdgeLocation); break; default: throw new ArgumentOutOfRangeException(); } frontier.Add(aFrontierElement.FrontierVertex, pred); } } } return frontier; }
/// <summary> /// Creates paths /// </summary> /// <param name="vertexPredecessor">The vertex predecessors</param> /// <returns>Enumeration of paths</returns> private static IEnumerable<Path> CreateAPath(VertexPredecessor vertexPredecessor) { foreach (var aInPred in vertexPredecessor.Incoming) { yield return new Path(new PathElement(aInPred.Edge, aInPred.EdgePropertyId, Direction.IncomingEdge)); } foreach (var aOutPred in vertexPredecessor.Outgoing) { yield return new Path(new PathElement(aOutPred.Edge, aOutPred.EdgePropertyId, Direction.OutgoingEdge)); } }