diff env/lib/python3.7/site-packages/networkx/utils/heaps.py @ 5:9b1c78e6ba9c draft default tip

"planemo upload commit 6c0a8142489327ece472c84e558c47da711a9142"
author shellac
date Mon, 01 Jun 2020 08:59:25 -0400
parents 79f47841a781
children
line wrap: on
line diff
--- a/env/lib/python3.7/site-packages/networkx/utils/heaps.py	Thu May 14 16:47:39 2020 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,369 +0,0 @@
-"""
-Min-heaps.
-"""
-
-__author__ = """ysitu <ysitu@users.noreply.github.com>"""
-# Copyright (C) 2014 ysitu <ysitu@users.noreply.github.com>
-# All rights reserved.
-# BSD license.
-
-from heapq import heappop, heappush
-from itertools import count
-import networkx as nx
-
-__all__ = ['MinHeap', 'PairingHeap', 'BinaryHeap']
-
-
-class MinHeap(object):
-    """Base class for min-heaps.
-
-    A MinHeap stores a collection of key-value pairs ordered by their values.
-    It supports querying the minimum pair, inserting a new pair, decreasing the
-    value in an existing pair and deleting the minimum pair.
-    """
-
-    class _Item(object):
-        """Used by subclassess to represent a key-value pair.
-        """
-        __slots__ = ('key', 'value')
-
-        def __init__(self, key, value):
-            self.key = key
-            self.value = value
-
-        def __repr__(self):
-            return repr((self.key, self.value))
-
-    def __init__(self):
-        """Initialize a new min-heap.
-        """
-        self._dict = {}
-
-    def min(self):
-        """Query the minimum key-value pair.
-
-        Returns
-        -------
-        key, value : tuple
-            The key-value pair with the minimum value in the heap.
-
-        Raises
-        ------
-        NetworkXError
-            If the heap is empty.
-        """
-        raise NotImplementedError
-
-    def pop(self):
-        """Delete the minimum pair in the heap.
-
-        Returns
-        -------
-        key, value : tuple
-            The key-value pair with the minimum value in the heap.
-
-        Raises
-        ------
-        NetworkXError
-            If the heap is empty.
-        """
-        raise NotImplementedError
-
-    def get(self, key, default=None):
-        """Returns the value associated with a key.
-
-        Parameters
-        ----------
-        key : hashable object
-            The key to be looked up.
-
-        default : object
-            Default value to return if the key is not present in the heap.
-            Default value: None.
-
-        Returns
-        -------
-        value : object.
-            The value associated with the key.
-        """
-        raise NotImplementedError
-
-    def insert(self, key, value, allow_increase=False):
-        """Insert a new key-value pair or modify the value in an existing
-        pair.
-
-        Parameters
-        ----------
-        key : hashable object
-            The key.
-
-        value : object comparable with existing values.
-            The value.
-
-        allow_increase : bool
-            Whether the value is allowed to increase. If False, attempts to
-            increase an existing value have no effect. Default value: False.
-
-        Returns
-        -------
-        decreased : bool
-            True if a pair is inserted or the existing value is decreased.
-        """
-        raise NotImplementedError
-
-    def __nonzero__(self):
-        """Returns whether the heap if empty.
-        """
-        return bool(self._dict)
-
-    def __bool__(self):
-        """Returns whether the heap if empty.
-        """
-        return bool(self._dict)
-
-    def __len__(self):
-        """Returns the number of key-value pairs in the heap.
-        """
-        return len(self._dict)
-
-    def __contains__(self, key):
-        """Returns whether a key exists in the heap.
-
-        Parameters
-        ----------
-        key : any hashable object.
-            The key to be looked up.
-        """
-        return key in self._dict
-
-
-def _inherit_doc(cls):
-    """Decorator for inheriting docstrings from base classes.
-    """
-    def func(fn):
-        fn.__doc__ = cls.__dict__[fn.__name__].__doc__
-        return fn
-    return func
-
-
-class PairingHeap(MinHeap):
-    """A pairing heap.
-    """
-
-    class _Node(MinHeap._Item):
-        """A node in a pairing heap.
-
-        A tree in a pairing heap is stored using the left-child, right-sibling
-        representation.
-        """
-        __slots__ = ('left', 'next', 'prev', 'parent')
-
-        def __init__(self, key, value):
-            super(PairingHeap._Node, self).__init__(key, value)
-            # The leftmost child.
-            self.left = None
-            # The next sibling.
-            self.next = None
-            # The previous sibling.
-            self.prev = None
-            # The parent.
-            self.parent = None
-
-    def __init__(self):
-        """Initialize a pairing heap.
-        """
-        super(PairingHeap, self).__init__()
-        self._root = None
-
-    @_inherit_doc(MinHeap)
-    def min(self):
-        if self._root is None:
-            raise nx.NetworkXError('heap is empty.')
-        return (self._root.key, self._root.value)
-
-    @_inherit_doc(MinHeap)
-    def pop(self):
-        if self._root is None:
-            raise nx.NetworkXError('heap is empty.')
-        min_node = self._root
-        self._root = self._merge_children(self._root)
-        del self._dict[min_node.key]
-        return (min_node.key, min_node.value)
-
-    @_inherit_doc(MinHeap)
-    def get(self, key, default=None):
-        node = self._dict.get(key)
-        return node.value if node is not None else default
-
-    @_inherit_doc(MinHeap)
-    def insert(self, key, value, allow_increase=False):
-        node = self._dict.get(key)
-        root = self._root
-        if node is not None:
-            if value < node.value:
-                node.value = value
-                if node is not root and value < node.parent.value:
-                    self._cut(node)
-                    self._root = self._link(root, node)
-                return True
-            elif allow_increase and value > node.value:
-                node.value = value
-                child = self._merge_children(node)
-                # Nonstandard step: Link the merged subtree with the root. See
-                # below for the standard step.
-                if child is not None:
-                    self._root = self._link(self._root, child)
-                # Standard step: Perform a decrease followed by a pop as if the
-                # value were the smallest in the heap. Then insert the new
-                # value into the heap.
-                # if node is not root:
-                #     self._cut(node)
-                #     if child is not None:
-                #         root = self._link(root, child)
-                #     self._root = self._link(root, node)
-                # else:
-                #     self._root = (self._link(node, child)
-                #                   if child is not None else node)
-            return False
-        else:
-            # Insert a new key.
-            node = self._Node(key, value)
-            self._dict[key] = node
-            self._root = self._link(root, node) if root is not None else node
-            return True
-
-    def _link(self, root, other):
-        """Link two nodes, making the one with the smaller value the parent of
-        the other.
-        """
-        if other.value < root.value:
-            root, other = other, root
-        next = root.left
-        other.next = next
-        if next is not None:
-            next.prev = other
-        other.prev = None
-        root.left = other
-        other.parent = root
-        return root
-
-    def _merge_children(self, root):
-        """Merge the subtrees of the root using the standard two-pass method.
-        The resulting subtree is detached from the root.
-        """
-        node = root.left
-        root.left = None
-        if node is not None:
-            link = self._link
-            # Pass 1: Merge pairs of consecutive subtrees from left to right.
-            # At the end of the pass, only the prev pointers of the resulting
-            # subtrees have meaningful values. The other pointers will be fixed
-            # in pass 2.
-            prev = None
-            while True:
-                next = node.next
-                if next is None:
-                    node.prev = prev
-                    break
-                next_next = next.next
-                node = link(node, next)
-                node.prev = prev
-                prev = node
-                if next_next is None:
-                    break
-                node = next_next
-            # Pass 2: Successively merge the subtrees produced by pass 1 from
-            # right to left with the rightmost one.
-            prev = node.prev
-            while prev is not None:
-                prev_prev = prev.prev
-                node = link(prev, node)
-                prev = prev_prev
-            # Now node can become the new root. Its has no parent nor siblings.
-            node.prev = None
-            node.next = None
-            node.parent = None
-        return node
-
-    def _cut(self, node):
-        """Cut a node from its parent.
-        """
-        prev = node.prev
-        next = node.next
-        if prev is not None:
-            prev.next = next
-        else:
-            node.parent.left = next
-        node.prev = None
-        if next is not None:
-            next.prev = prev
-            node.next = None
-        node.parent = None
-
-
-class BinaryHeap(MinHeap):
-    """A binary heap.
-    """
-
-    def __init__(self):
-        """Initialize a binary heap.
-        """
-        super(BinaryHeap, self).__init__()
-        self._heap = []
-        self._count = count()
-
-    @_inherit_doc(MinHeap)
-    def min(self):
-        dict = self._dict
-        if not dict:
-            raise nx.NetworkXError('heap is empty')
-        heap = self._heap
-        pop = heappop
-        # Repeatedly remove stale key-value pairs until a up-to-date one is
-        # met.
-        while True:
-            value, _, key = heap[0]
-            if key in dict and value == dict[key]:
-                break
-            pop(heap)
-        return (key, value)
-
-    @_inherit_doc(MinHeap)
-    def pop(self):
-        dict = self._dict
-        if not dict:
-            raise nx.NetworkXError('heap is empty')
-        heap = self._heap
-        pop = heappop
-        # Repeatedly remove stale key-value pairs until a up-to-date one is
-        # met.
-        while True:
-            value, _, key = heap[0]
-            pop(heap)
-            if key in dict and value == dict[key]:
-                break
-        del dict[key]
-        return (key, value)
-
-    @_inherit_doc(MinHeap)
-    def get(self, key, default=None):
-        return self._dict.get(key, default)
-
-    @_inherit_doc(MinHeap)
-    def insert(self, key, value, allow_increase=False):
-        dict = self._dict
-        if key in dict:
-            old_value = dict[key]
-            if value < old_value or (allow_increase and value > old_value):
-                # Since there is no way to efficiently obtain the location of a
-                # key-value pair in the heap, insert a new pair even if ones
-                # with the same key may already be present. Deem the old ones
-                # as stale and skip them when the minimum pair is queried.
-                dict[key] = value
-                heappush(self._heap, (value, next(self._count), key))
-                return value < old_value
-            return False
-        else:
-            dict[key] = value
-            heappush(self._heap, (value, next(self._count), key))
-            return True