/// <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));
            }
        }