
 ,[c           @   sI   d  Z  d d l Z d d l Z d d g Z e e d  Z e d  Z d S(   sT   
Provides functions for finding and testing for locally `(k, l)`-connected
graphs.

iNt   kl_connected_subgrapht   is_kl_connectedc         C   s  t  j |   } t } t } x| rt } xt | j    D]{} | \ }	 }
 | r t |	 |
 g  } x< t |  D]. } x% | j    D] } | j |  |  q Wqt W|  j	 |  j    } n t  j |   } |	 |
 g } d } d } x | r| d 7} | | k rd } Pn  |	 } x3 | D]+ } | | k r| j
 | |  | } qqWy t j | |	 |
  } Wq t j k
 rt } q Xq W| d k r= | j
 |	 |
  t } | rt } qq= q= Wq W| r| | f S| S(   sP  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.

    i    i   (   t   copyt   deepcopyt   Truet   Falset   listt   edgest   sett   ranget   updatet   subgrapht   remove_edget   nxt   shortest_patht   NetworkXNoPath(   t   Gt   kt   lt
   low_memoryt   same_as_grapht   Ht   graphOKt   deleted_somet   edget   ut   vt   vertst   it   wt   G2t   patht   cntt   acceptt   prev(    (    s9   lib/python2.7/site-packages/networkx/algorithms/hybrid.pyR       sN    2		

c         C   sy  t  } xl|  j   D]^} | \ } } | r t | | g  } xC t |  D]5 }	 g  | j   D] }
 | j |  j |
   ^ q] qJ W|  j |  } n t j |   } | | g } d } d } x | rZ| d 7} | | k r d } Pn  | } x3 | D]+ }
 |
 | k r | j	 | |
  |
 } q q Wy t
 j | | |  } Wq t
 j k
 rVt } q Xq W| d k r t } Pq q W| S(   s\  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.

    i    i   (   R   R   R   R	   R   R
   t	   neighborsR   R   R   R   R   R   R   (   R   R   R   R   R   R   R   R   R   R   R   R   R   R    R!   R"   (    (    s9   lib/python2.7/site-packages/networkx/algorithms/hybrid.pyR   ~   s<    (3	
(   t   __doc__R   t   networkxR   t   __all__R   R    R   (    (    (    s9   lib/python2.7/site-packages/networkx/algorithms/hybrid.pyt   <module>   s
   h