U
    :vf(                     @   sd   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Z	G d	d de	Z
G d
d de	ZdS )z
Min-heaps.
    )heappopheappush)countNMinHeapPairingHeap
BinaryHeapc                   @   sj   e Zd ZdZG dd d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._Itemz2Used by subclassess to represent a key-value pair.keyvaluec                 C   s   || _ || _d S Nr   selfr	   r
    r   8/tmp/pip-unpacked-wheel-_lngutwb/networkx/utils/heaps.py__init__   s    zMinHeap._Item.__init__c                 C   s   t | j| jfS r   )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_dictr   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NotImplementedErrorr   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.
        Nr   r   r   r   r   pop4   s    zMinHeap.popNc                 C   s   t dS )a  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.
        Nr   r   r	   defaultr   r   r   getC   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.
        Nr   )r   r	   r
   allow_increaser   r   r   insertV   s    zMinHeap.insertc                 C   s
   t | jS z"Returns whether the heap if empty.boolr   r   r   r   r   __nonzero__m   s    zMinHeap.__nonzero__c                 C   s
   t | jS r%   r&   r   r   r   r   __bool__q   s    zMinHeap.__bool__c                 C   s
   t | jS )z2Returns the number of key-value pairs in the heap.)lenr   r   r   r   r   __len__u   s    zMinHeap.__len__c                 C   s
   || j kS )zReturns 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__y   s    zMinHeap.__contains__)N)F)r   r   r   r   r   r   r   r   r"   r$   r(   r)   r+   r,   r   r   r   r   r      s   

c                       sn   e Zd ZdZG dd dejZ f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  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                    s*   t  || d | _d | _d | _d | _d S r   )superr   r-   r.   r/   r0   r   	__class__r   r   r      s
    zPairingHeap._Node.__init__)r   r   r   r   r   r   __classcell__r   r   r2   r   _Node   s   r5   c                    s   t    d| _dS )zInitialize a pairing heap.N)r1   r   _rootr   r2   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.)r6   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 r7   )r6   r8   r9   _merge_childrenr   r	   r
   )r   Zmin_noder   r   r   r      s    


zPairingHeap.popNc                 C   s   | j |}|d k	r|jS |S r   )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"   r6   r
   r0   _cut_linkr:   r5   )r   r	   r
   r#   r;   root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/   r0   )r   r>   otherr.   r   r   r   r=      s    
zPairingHeap._linkc                 C   s   |j }d|_ |dk	r| j}d}|j}|dkr4||_q^|j}|||}||_|}|dkrXq^|}q|j}|dk	r|j}|||}|}qdd|_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-   r=   r.   r/   r0   )r   r>   r;   linkr/   r.   Z	next_nextZ	prev_prevr   r   r   r:      s2    

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.   r0   r-   )r   r;   r/   r.   r   r   r   r<   
  s    zPairingHeap._cut)N)F)r   r   r   r   r   r   r5   r   r   r   r"   r$   r=   r:   r<   r4   r   r   r2   r   r      s   

$&c                       sD   e Zd ZdZ fddZdd Zdd Zdd	d
ZdddZ  Z	S )r   zA binary heap.c                    s   t    g | _t | _dS )zInitialize a binary heap.N)r1   r   _heapr   _countr   r2   r   r   r     s    
zBinaryHeap.__init__c                 C   sT   | j }|std| j}t}|d \}}}||krB||| krBqL|| q||fS Nzheap is emptyr   r   r8   r9   rB   r   r   dictheapr   r
   _r	   r   r   r   r   "  s    

zBinaryHeap.minc                 C   sZ   | j }|std| j}t}|d \}}}|| ||kr||| krqLq||= ||fS rD   rE   rF   r   r   r   r   1  s    
zBinaryHeap.popNc                 C   s   | j ||S r   )r   r"   r    r   r   r   r"   A  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   rB   r.   rC   )r   r	   r
   r#   rG   	old_valuer   r   r   r$   D  s    zBinaryHeap.insert)N)F)
r   r   r   r   r   r   r   r"   r$   r4   r   r   r2   r   r     s   
)r   heapqr   r   	itertoolsr   Znetworkxr8   __all__r   r   r   r   r   r   r   <module>   s   
w 