ó
|£*^c           @   sO   d  Z  d Z d d g Z d d l Z d d l Z e e d „ Z e d „ Z d S(   sT   
Provides functions for finding and testing for locally `(k, l)`-connected
graphs.

s@   Aric Hagberg (hagberg@lanl.gov)
Dan Schult (dschult@colgate.edu)t   kl_connected_subgrapht   is_kl_connectediÿÿÿÿNc         C   sÕ  t  j |  ƒ } t } t } x£| rÀt } x�| j ƒ  D]‚} | \ }	 }
 | r¿ t |	 |
 g ƒ } xC t | ƒ D]5 } g  | j  ƒ  D] } | j |  j | ƒ ƒ ^ q� qn W|  j	 t
 | ƒ ƒ } 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 r7 | j |	 |
 ƒ t } | r¹t } q¹q7 q7 Wq W| rÑ| | f S| S(   st  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 this is ``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   edgest   sett   ranget   updatet	   neighborst   subgrapht   listt   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(    (    sn   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/algorithms/hybrid.pyR       sL    2	3	
 
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(   sf  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	   R
   R   R   R   R   R   R   R   (   R   R   R   R   R   R   R   R   R   R   R   R   R    R!   R"   R#   (    (    sn   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/algorithms/hybrid.pyR   w   s<    (3	
(	   t   __doc__t
   __author__t   _all__R   t   networkxR   R   R    R   (    (    (    sn   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/algorithms/hybrid.pyt   <module>   s   b