U
    9vf  ã                   @   s4   d Z ddlZddlZddgZddd„Zd	dd„ZdS )
zT
Provides functions for finding and testing for locally `(k, l)`-connected
graphs.

é    NÚkl_connected_subgraphÚis_kl_connectedFc              	   C   sB  t  | ¡}d}d}|r0d}t| ¡ ƒD ]}|\}	}
|r||	|
h}t|ƒD ] }|  ¡ D ]}| | | ¡ qVqJ|  |¡  ¡ }n
t  | ¡}|	|
g}d}d}|r|d7 }||kr´d}q|	}|D ]}||kr¼| ||¡ |}q¼zt 	||	|
¡}W q– tj
k
r   d}Y q–X q–|dkr(| |	|
¡ d}|r(d}q(q|r>||fS |S )aM  Returns the maximum locally `(k, l)`-connected subgraph of `G`.

    A graph is locally `(k, l)`-connected if for each edge `(u, v)` in the
    graph there are at least `l` edge-disjoint paths of length at most `k`
    joining `u` to `v`.

    Parameters
    ----------
    G : NetworkX graph
        The graph in which to find a maximum locally `(k, l)`-connected
        subgraph.

    k : integer
        The maximum length of paths to consider. A higher number means a looser
        connectivity requirement.

    l : integer
        The number of edge-disjoint paths. A higher number means a stricter
        connectivity requirement.

    low_memory : bool
        If this is True, this function uses an algorithm that uses slightly
        more time but less memory.

    same_as_graph : bool
        If True then return a tuple of the form `(H, is_same)`,
        where `H` is the maximum locally `(k, l)`-connected subgraph and
        `is_same` is a Boolean representing whether `G` is locally `(k,
        l)`-connected (and hence, whether `H` is simply a copy of the input
        graph `G`).

    Returns
    -------
    NetworkX graph or two-tuple
        If `same_as_graph` is True, then this function returns a
        two-tuple as described above. Otherwise, it returns only the maximum
        locally `(k, l)`-connected subgraph.

    See also
    --------
    is_kl_connected

    References
    ----------
    .. [1] Chung, Fan and Linyuan Lu. "The Small World Phenomenon in Hybrid
           Power Law Graphs." *Complex Networks*. Springer Berlin Heidelberg,
           2004. 89--104.

    TFr   é   )ÚcopyÚdeepcopyÚlistÚedgesÚrangeÚupdateÚsubgraphÚremove_edgeÚnxÚshortest_pathÚNetworkXNoPath)ÚGÚkÚlÚ
low_memoryZsame_as_graphÚHÚgraphOKZdeleted_someÚedgeÚuÚvÚvertsÚiÚwÚG2ÚpathÚcntÚacceptÚprev© r!   ú>/tmp/pip-unpacked-wheel-_lngutwb/networkx/algorithms/hybrid.pyr      sN    2

c              	      sö   d}ˆ   ¡ D ]ä}|\}}|rV||h‰t|ƒD ]}‡ ‡fdd„ˆ ¡ D ƒ q,ˆ  ˆ¡}	n
t ˆ ¡}	||g}
d}d}|
rà|d7 }||krŠd}qà|}|
D ]}||kr’|	 ||¡ |}q’zt |	||¡}
W qp tjk
rÜ   d}
Y qpX qp|dkrd} qòq|S )aY  Returns True if and only if `G` is locally `(k, l)`-connected.

    A graph is locally `(k, l)`-connected if for each edge `(u, v)` in the
    graph there are at least `l` edge-disjoint paths of length at most `k`
    joining `u` to `v`.

    Parameters
    ----------
    G : NetworkX graph
        The graph to test for local `(k, l)`-connectedness.

    k : integer
        The maximum length of paths to consider. A higher number means a looser
        connectivity requirement.

    l : integer
        The number of edge-disjoint paths. A higher number means a stricter
        connectivity requirement.

    low_memory : bool
        If this is True, this function uses an algorithm that uses slightly
        more time but less memory.

    Returns
    -------
    bool
        Whether the graph is locally `(k, l)`-connected subgraph.

    See also
    --------
    kl_connected_subgraph

    References
    ----------
    .. [1] Chung, Fan and Linyuan Lu. "The Small World Phenomenon in Hybrid
           Power Law Graphs." *Complex Networks*. Springer Berlin Heidelberg,
           2004. 89--104.

    Tc                    s   g | ]}ˆ  ˆ  |¡¡‘qS r!   )r
   Z	neighbors)Ú.0r   ©r   r   r!   r"   Ú
<listcomp>¤   s     z#is_kl_connected.<locals>.<listcomp>r   r   F)	r   r	   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r    r   r!   r$   r"   r   u   s<    (
)FF)F)Ú__doc__r   Znetworkxr   Ú__all__r   r   r!   r!   r!   r"   Ú<module>   s
   
h