B
    ,[h+                 @   sr   d Z dZddlmZmZ ddlmZ ddlZdddgZ	G d	d de
Zd
d ZG dd deZG dd deZdS )z
Min-heaps.
z&ysitu <ysitu@users.noreply.github.com>    )heappopheappush)countNMinHeapPairingHeap
BinaryHeapc               @   sl   e Zd ZdZG dd deZdd Zdd Zdd	 ZdddZ	dddZ
dd Zdd Zdd Zdd Zd
S )r   zBase 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.
    c               @   s$   e Zd ZdZdZdd Zdd ZdS )zMinHeap._Itemz;Used by subclassess to represent a key-value pair.
        )keyvaluec             C   s   || _ || _d S )N)r   r	   )selfr   r	    r   3lib/python3.7/site-packages/networkx/utils/heaps.py__init__   s    zMinHeap._Item.__init__c             C   s   t | j| jfS )N)reprr   r	   )r
   r   r   r   __repr__"   s    zMinHeap._Item.__repr__N)__name__
__module____qualname____doc__	__slots__r   r   r   r   r   r   _Item   s   r   c             C   s
   i | _ dS )z#Initialize a new min-heap.
        N)_dict)r
   r   r   r   r   %   s    zMinHeap.__init__c             C   s   t dS )a   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.
        N)NotImplementedError)r
   r   r   r   min*   s    zMinHeap.minc             C   s   t dS )a  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.
        N)r   )r
   r   r   r   pop9   s    zMinHeap.popNc             C   s   t dS )a  Return 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.
        N)r   )r
   r   defaultr   r   r   getH   s    zMinHeap.getFc             C   s   t dS )a<  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.
        N)r   )r
   r   r	   allow_increaser   r   r   insert[   s    zMinHeap.insertc             C   s
   t | jS )z*Return whether the heap if empty.
        )boolr   )r
   r   r   r   __nonzero__r   s    zMinHeap.__nonzero__c             C   s
   t | jS )z*Return whether the heap if empty.
        )r   r   )r
   r   r   r   __bool__w   s    zMinHeap.__bool__c             C   s
   t | jS )z:Return the number of key-value pairs in the heap.
        )lenr   )r
   r   r   r   __len__|   s    zMinHeap.__len__c             C   s
   || j kS )zReturn whether a key exists in the heap.

        Parameters
        ----------
        key : any hashable object.
            The key to be looked up.
        )r   )r
   r   r   r   r   __contains__   s    zMinHeap.__contains__)N)F)r   r   r   r   objectr   r   r   r   r   r   r   r    r"   r#   r   r   r   r   r      s   

c                s    fdd}|S )z;Decorator for inheriting docstrings from base classes.
    c                s    j | j j| _| S )N)__dict__r   r   )fn)clsr   r   func   s    z_inherit_doc.<locals>.funcr   )r'   r(   r   )r'   r   _inherit_doc   s    r)   c                   s   e Zd ZdZG dd dejZ fddZeedd Z	eedd	 Z
eedddZeedddZdd Zdd Zdd Z  ZS )r   zA pairing heap.
    c                   s$   e Zd ZdZdZ fddZ  ZS )zPairingHeap._NodezA node in a pairing heap.

        A tree in a pairing heap is stored using the left-child, right-sibling
        representation.
        )leftnextprevparentc                s0   t tj| || d | _d | _d | _d | _d S )N)superr   _Noder   r*   r+   r,   r-   )r
   r   r	   )	__class__r   r   r      s
    zPairingHeap._Node.__init__)r   r   r   r   r   r   __classcell__r   r   )r0   r   r/      s   r/   c                s   t t|   d| _dS )z#Initialize a pairing heap.
        N)r.   r   r   _root)r
   )r0   r   r   r      s    zPairingHeap.__init__c             C   s$   | j d krtd| j j| j jfS )Nzheap is empty.)r2   nxNetworkXErrorr   r	   )r
   r   r   r   r      s    

zPairingHeap.minc             C   s>   | j d krtd| j }| | j | _ | j|j= |j|jfS )Nzheap is empty.)r2   r3   r4   _merge_childrenr   r   r	   )r
   Zmin_noder   r   r   r      s    


zPairingHeap.popNc             C   s   | j |}|d k	r|jS |S )N)r   r   r	   )r
   r   r   noder   r   r   r      s    zPairingHeap.getFc             C   s   | j |}| j}|d k	r||jk rZ||_||k	rV||jjk rV| | | ||| _dS |r||jkr||_| |}|d k	r| | j|| _dS | ||}|| j |< |d k	r| ||n|| _dS d S )NTF)	r   r   r2   r	   r-   _cut_linkr5   r/   )r
   r   r	   r   r6   rootZchildr   r   r   r      s&    



zPairingHeap.insertc             C   sF   |j |j k r|| }}|j}||_|dk	r0||_d|_||_||_|S )z_Link two nodes, making the one with the smaller value the parent of
        the other.
        N)r	   r*   r+   r,   r-   )r
   r9   otherr+   r   r   r   r8      s    
zPairingHeap._linkc             C   s   |j }d|_ |dk	r| j}d}xB|j}|dkr6||_P |j}|||}||_|}|dkrZP |}q W |j}x |dk	r|j}|||}|}qjW d|_d|_d|_|S )zMerge the subtrees of the root using the standard two-pass method.
        The resulting subtree is detached from the root.
        N)r*   r8   r+   r,   r-   )r
   r9   r6   linkr,   r+   Z	next_nextZ	prev_prevr   r   r   r5      s4    


zPairingHeap._merge_childrenc             C   sH   |j }|j}|dk	r||_n||j_d|_ |dk	r>||_ d|_d|_dS )z$Cut a node from its parent.
        N)r,   r+   r-   r*   )r
   r6   r,   r+   r   r   r   r7      s    zPairingHeap._cut)N)F)r   r   r   r   r   r   r/   r   r)   r   r   r   r   r8   r5   r7   r1   r   r   )r0   r   r      s   	$&c                   sd   e Zd ZdZ fddZeedd Zeedd Zeedd	d
Z	eedddZ
  ZS )r   zA binary heap.
    c                s    t t|   g | _t | _dS )z"Initialize a binary heap.
        N)r.   r   r   _heapr   _count)r
   )r0   r   r   r   4  s    zBinaryHeap.__init__c             C   sX   | j }|std| j}t}x0|d \}}}||krD||| krDP || q W ||fS )Nzheap is emptyr   )r   r3   r4   r<   r   )r
   dictheapr   r	   _r   r   r   r   r   ;  s    
zBinaryHeap.minc             C   s^   | j }|std| j}t}x0|d \}}}|| ||kr ||| kr P q W ||= ||fS )Nzheap is emptyr   )r   r3   r4   r<   r   )r
   r>   r?   r   r	   r@   r   r   r   r   r   K  s    
zBinaryHeap.popNc             C   s   | j ||S )N)r   r   )r
   r   r   r   r   r   r   \  s    zBinaryHeap.getFc             C   s~   | j }||krV|| }||k s*|rR||krR|||< t| j|t| j|f ||k S dS |||< t| j|t| j|f dS d S )NFT)r   r   r<   r+   r=   )r
   r   r	   r   r>   	old_valuer   r   r   r   `  s    zBinaryHeap.insert)N)F)r   r   r   r   r   r)   r   r   r   r   r   r1   r   r   )r0   r   r   0  s   )r   
__author__heapqr   r   	itertoolsr   Znetworkxr3   __all__r$   r   r)   r   r   r   r   r   r   <module>   s   
{	 