Class ClosestFirstIterator<V,​E>

  • Type Parameters:
    V - the graph vertex type
    E - the graph edge type
    All Implemented Interfaces:
    java.util.Iterator<V>, GraphIterator<V,​E>

    public class ClosestFirstIterator<V,​E>
    extends CrossComponentIterator<V,​E,​org.jheaps.AddressableHeap.Handle<java.lang.Double,​org.jgrapht.traverse.ClosestFirstIterator.QueueEntry<V,​E>>>
    A closest-first iterator for a directed or undirected graph. For this iterator to work correctly the graph must not be modified during iteration. Currently there are no means to ensure that, nor to fail-fast. The results of such modifications are undefined.

    The metric for closest here is the weighted path length from a start vertex, i.e. Graph.getEdgeWeight(Edge) is summed to calculate path length. Negative edge weights will result in an IllegalArgumentException. Optionally, path length may be bounded by a finite radius. A custom heap implementation can be specified during the construction time. Pairing heap is used by default.

    Author:
    John V. Sichi
    • Constructor Detail

      • ClosestFirstIterator

        public ClosestFirstIterator​(Graph<V,​E> g,
                                    V startVertex)
        Creates a new closest-first iterator for the specified graph. Iteration will start at the specified start vertex and will be limited to the connected component that includes that vertex. If the specified start vertex is null, iteration will start at an arbitrary vertex and will not be limited, that is, will be able to traverse all the graph.
        Parameters:
        g - the graph to be iterated.
        startVertex - the vertex iteration to be started.
      • ClosestFirstIterator

        public ClosestFirstIterator​(Graph<V,​E> g,
                                    java.lang.Iterable<V> startVertices)
        Creates a new closest-first iterator for the specified graph. Iteration will start at the specified start vertices and will be limited to the subset of the graph reachable from those vertices. Iteration order is based on minimum distance from any of the start vertices, regardless of the order in which the start vertices are supplied. Because of this, the entire traversal is treated as if it were over a single connected component with respect to events fired.
        Parameters:
        g - the graph to be iterated.
        startVertices - the vertices iteration to be started.
      • ClosestFirstIterator

        public ClosestFirstIterator​(Graph<V,​E> g,
                                    V startVertex,
                                    double radius)
        Creates a new radius-bounded closest-first iterator for the specified graph. Iteration will start at the specified start vertex and will be limited to the subset of the connected component which includes that vertex and is reachable via paths of weighted length less than or equal to the specified radius. The specified start vertex may not be null.
        Parameters:
        g - the graph to be iterated.
        startVertex - the vertex iteration to be started.
        radius - limit on weighted path length, or Double.POSITIVE_INFINITY for unbounded search.
      • ClosestFirstIterator

        public ClosestFirstIterator​(Graph<V,​E> g,
                                    V startVertex,
                                    double radius,
                                    java.util.function.Supplier<org.jheaps.AddressableHeap<java.lang.Double,​org.jgrapht.traverse.ClosestFirstIterator.QueueEntry<V,​E>>> heapSupplier)
        Creates a new radius-bounded closest-first iterator for the specified graph. Iteration will start at the specified start vertex and will be limited to the subset of the connected component which includes that vertex and is reachable via paths of weighted length less than or equal to the specified radius. The specified start vertex may not be null. This algorithm will use the heap supplied by the heapSupplier.
        Parameters:
        g - the graph to be iterated.
        startVertex - the vertex iteration to be started.
        radius - limit on weighted path length, or Double.POSITIVE_INFINITY for unbounded search.
        heapSupplier - supplier of the preferable heap implementation
      • ClosestFirstIterator

        public ClosestFirstIterator​(Graph<V,​E> g,
                                    java.lang.Iterable<V> startVertices,
                                    double radius)
        Creates a new radius-bounded closest-first iterator for the specified graph. Iteration will start at the specified start vertices and will be limited to the subset of the graph reachable from those vertices via paths of weighted length less than or equal to the specified radius. The specified collection of start vertices may not be null. Iteration order is based on minimum distance from any of the start vertices, regardless of the order in which the start vertices are supplied. Because of this, the entire traversal is treated as if it were over a single connected component with respect to events fired.
        Parameters:
        g - the graph to be iterated.
        startVertices - the vertices iteration to be started.
        radius - limit on weighted path length, or Double.POSITIVE_INFINITY for unbounded search.
      • ClosestFirstIterator

        public ClosestFirstIterator​(Graph<V,​E> g,
                                    java.lang.Iterable<V> startVertices,
                                    double radius,
                                    java.util.function.Supplier<org.jheaps.AddressableHeap<java.lang.Double,​org.jgrapht.traverse.ClosestFirstIterator.QueueEntry<V,​E>>> heapSupplier)
        Creates a new radius-bounded closest-first iterator for the specified graph. Iteration will start at the specified start vertices and will be limited to the subset of the graph reachable from those vertices via paths of weighted length less than or equal to the specified radius. The specified collection of start vertices may not be null. Iteration order is based on minimum distance from any of the start vertices, regardless of the order in which the start vertices are supplied. Because of this, the entire traversal is treated as if it were over a single connected component with respect to events fired. This algorithm will use the heap supplied by the heapSupplier.
        Parameters:
        g - the graph to be iterated.
        startVertices - the vertices iteration to be started.
        radius - limit on weighted path length, or Double.POSITIVE_INFINITY for unbounded search.
        heapSupplier - supplier of the preferable heap implementation
    • Method Detail

      • setCrossComponentTraversal

        public void setCrossComponentTraversal​(boolean crossComponentTraversal)
        Description copied from class: AbstractGraphIterator
        Sets the cross component traversal flag - indicates whether to traverse the graph across connected components.
        Overrides:
        setCrossComponentTraversal in class AbstractGraphIterator<V,​E>
        Parameters:
        crossComponentTraversal - if true traverses across connected components.
      • getShortestPathLength

        public double getShortestPathLength​(V vertex)
        Get the weighted length of the shortest path known to the given vertex. If the vertex has already been visited, then it is truly the shortest path length; otherwise, it is the best known upper bound.
        Parameters:
        vertex - vertex being sought from start vertex
        Returns:
        weighted length of shortest path known, or Double.POSITIVE_INFINITY if no path found yet
      • getSpanningTreeEdge

        public E getSpanningTreeEdge​(V vertex)
        Get the spanning tree edge reaching a vertex which has been seen already in this traversal. This edge is the last link in the shortest known path between the start vertex and the requested vertex. If the vertex has already been visited, then it is truly the minimum spanning tree edge; otherwise, it is the best candidate seen so far.
        Parameters:
        vertex - the spanned vertex.
        Returns:
        the spanning tree edge, or null if the vertex either has not been seen yet or is a start vertex.
      • encounterVertexAgain

        protected void encounterVertexAgain​(V vertex,
                                            E edge)
        Override superclass. When we see a vertex again, we need to see if the new edge provides a shorter path than the old edge.
        Specified by:
        encounterVertexAgain in class CrossComponentIterator<V,​E,​org.jheaps.AddressableHeap.Handle<java.lang.Double,​org.jgrapht.traverse.ClosestFirstIterator.QueueEntry<V,​E>>>
        Parameters:
        vertex - the vertex re-encountered
        edge - the edge via which the vertex was re-encountered