ó
|£*^c           @   sP   d  Z  d d l m Z d j d d g ƒ Z d d g Z d „  Z e d	 „ Z d
 S(   s   
********
Matching
********
iÿÿÿÿ(   t   repeats   
s   Joris van Rantwijks)   Nicholas Mancuso (nick.mancuso@gmail.com)t   max_weight_matchingt   maximal_matchingc         C   s¥   t  g  ƒ } t  g  ƒ } x† |  j ƒ  D]x \ } } | | f | k r% | | f | k r% | j | | f ƒ | t  |  j | ƒ ƒ O} | t  |  j | ƒ ƒ O} q% q% W| S(   s  Find a maximal cardinality matching in the graph.

    A matching is a subset of edges in which no node occurs more than once.
    The cardinality of a matching is the number of matched edges.

    Parameters
    ----------
    G : NetworkX graph
        Undirected graph

    Returns
    -------
    matching : set
        A maximal matching of the graph.

    Notes
    -----
    The algorithm greedily selects a maximal matching M of the graph G
    (i.e. no superset of M exists). It runs in `O(|E|)` time.
    (   t   sett
   edges_itert   addt   edges(   t   Gt   matchingR   t   ut   v(    (    sp   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/algorithms/matching.pyR      s    $ c            s5
  d d d „  ƒ  Y‰ d d ‡  f d †  ƒ  Y‰  ˆ j  ƒ  ‰ ˆ sB i  Sd } t } x� ˆ j d t ƒ D]m \ } } } | j d d ƒ } | | k r£ | | k r£ | } n  | oË t t | ƒ ƒ j d	 ƒ d d k } qa Wi  ‰ i  ‰ i  ‰ t t ˆ ˆ ƒ ƒ ‰ t t ˆ t	 d ƒ ƒ ƒ ‰	 t t ˆ ˆ ƒ ƒ ‰ i  ‰ t t ˆ t	 | ƒ ƒ ƒ ‰
 i  ‰ i  ‰ g  ‰ ‡ ‡
 f d †  ‰ ‡  ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ f	 d †  ‰ ‡ ‡ ‡ ‡ ‡ ‡ f d †  } ‡  ‡ ‡ ‡ ‡ ‡	 ‡ ‡ ‡ ‡ ‡ ‡ f d †  }	 ‡  ‡ ‡ ‡ ‡ ‡ ‡	 ‡ ‡ ‡ ‡ ‡ f d †  ‰ ‡  ‡ ‡ ‡	 ‡ f d †  ‰ ‡  ‡ ‡ ‡ ‡ ‡ ‡ f d †  }
 ‡ ‡ ‡	 ‡
 ‡ ‡ ‡ f d †  } x®ˆ j ƒ  ˆ j ƒ  ˆ j ƒ  x ˆ D] } d | _ q˜Wˆ j ƒ  g  ˆ (xF ˆ D]> } | ˆ k rÃˆ j ˆ | ƒ d k rÃˆ | d d ƒ qÃqÃWd } xfxeˆ ru| ruˆ j ƒ  } ˆ ˆ | d k sDt ‚ x+ˆ j | ƒ D]} | | k rlqTn  ˆ | } ˆ | } | | k r’qTn  | | f ˆ k rãˆ | | ƒ } | d k rãt ˆ | | f <ˆ | | f <qãn  | | f ˆ k rÂˆ j | ƒ d k rˆ | d | ƒ qnˆ j | ƒ d k rw| | | ƒ } | ˆ k	 r`|	 | | | ƒ q¿|
 | | ƒ d } Pqnˆ j | ƒ d k rnˆ | d k s¢t ‚ d ˆ | <| | f ˆ | <qnqTˆ j | ƒ d k rˆ j | ƒ d k s| ˆ ˆ | Œ  k  rn| | f ˆ | <qnqTˆ j | ƒ d k rTˆ j | ƒ d k sX| ˆ ˆ | Œ  k  rn| | f ˆ | <qnqTqTWqW| r€Pn  d } d } } } ˆ sµd } t ˆ
 j ƒ  ƒ } n  x† ˆ j ƒ  D]x } ˆ j ˆ | ƒ d k rÂˆ j | ƒ d k	 rÂˆ ˆ | Œ  } | d k s| | k  r:| } d } ˆ | } q:qÂqÂWx¿ ˆ	 D]· } ˆ	 | d k rEˆ j | ƒ d k rEˆ j | ƒ d k	 rEˆ ˆ | Œ  } | r¾| d d k s±t ‚ | d } n
 | d } | d k sà| | k  rü| } d } ˆ | } qüqEqEWxh ˆ D]` } ˆ	 | d k rˆ j | ƒ d k r| d k sNˆ | | k  rˆ | } d } | } qqW| d k r§ˆ sƒt ‚ d } t d t ˆ
 j ƒ  ƒ ƒ } n  xf ˆ D]^ } ˆ j ˆ | ƒ d k ràˆ
 | c | 8<q®ˆ j ˆ | ƒ d k r®ˆ
 | c | 7<q®q®Wxq ˆ D]i } ˆ	 | d k rˆ j | ƒ d k rUˆ | c | 7<q€ˆ j | ƒ d k r€ˆ | c | 8<q€qqW| d k r”Pq| d k rô| \ } } ˆ ˆ | d k sÆt ‚ t ˆ | | f <ˆ | | f <ˆ j | ƒ q| d k rT	| \ } } t ˆ | | f <ˆ | | f <ˆ ˆ | d k sD	t ‚ ˆ j | ƒ q| d k rˆ | t ƒ qqWx( ˆ D]  } ˆ ˆ | | k s{	t ‚ q{	W| s©	Pn  xq t ˆ j ƒ  ƒ D]] } | ˆ k rÔ	q¼	n  ˆ	 | d k r¼	ˆ j | ƒ d k r¼	ˆ | d k r¼	ˆ | t ƒ q¼	q¼	WqsW| r1
| ƒ  n  ˆ S(   sf  Compute a maximum-weighted matching of G.

    A matching is a subset of edges in which no node occurs more than once.
    The cardinality of a matching is the number of matched edges.
    The weight of a matching is the sum of the weights of its edges.

    Parameters
    ----------
    G : NetworkX graph
      Undirected graph

    maxcardinality: bool, optional
       If maxcardinality is True, compute the maximum-cardinality matching
       with maximum weight among all maximum-cardinality matchings.

    Returns
    -------
    mate : dictionary
       The matching is returned as a dictionary, mate, such that
       mate[v] == w if node v is matched to node w.  Unmatched nodes do not
       occur as a key in mate.


    Notes
    -----
    If G has edges with 'weight' attribute the edge data are used as
    weight values else the weights are assumed to be 1.

    This function takes time O(number_of_nodes ** 3).

    If all edge weights are integers, the algorithm uses only integer
    computations.  If floating point weights are used, the algorithm
    could return a slightly suboptimal matching due to numeric
    precision errors.

    This method is based on the "blossom" method for finding augmenting
    paths and the "primal-dual" method for finding a matching of maximum
    weight, both methods invented by Jack Edmonds [1]_.

    Bipartite graphs can also be matched using the functions present in
    :mod:`networkx.algorithms.bipartite.matching`.

    References
    ----------
    .. [1] "Efficient Algorithms for Finding Maximum Matching in Graphs",
       Zvi Galil, ACM Computing Surveys, 1986.
    t   NoNodec           B   s   e  Z d  Z RS(   s-   Dummy value which is different from any node.(   t   __name__t
   __module__t   __doc__(    (    (    sp   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/algorithms/matching.pyR   v   s   t   Blossomc              s,   e  Z d  Z d d d g Z ‡  f d †  Z RS(   s7   Representation of a non-trivial blossom or sub-blossom.t   childsR   t   mybestedgesc         3   sK   xD |  j  D]9 } t | ˆ  ƒ r> x! | j ƒ  D] } | Vq, Wq
 | Vq
 Wd  S(   N(   R   t
   isinstancet   leaves(   t   selft   tR
   (   R   (    sp   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/algorithms/matching.pyR   Œ   s
    (   R   R   R   t	   __slots__R   (    (   R   (    sp   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/algorithms/matching.pyR   z   s   i    t   datat   weighti   t   't   intt   longc            s,   ˆ |  ˆ | d ˆ  |  | j  d d ƒ S(   Ni   R   i   (   t   get(   R
   t   w(   R   t   dualvar(    sp   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/algorithms/matching.pyt   slacké   s    c            s	  ˆ |  } ˆ j  |  ƒ d  k r4 ˆ j  | ƒ d  k s: t ‚ | ˆ |  <ˆ | <| d  k	 rs | |  f ˆ |  <ˆ | <n d  ˆ |  <ˆ | <d  ˆ |  <ˆ | <| d k rØ t | ˆ  ƒ rÈ ˆ j | j ƒ  ƒ qˆ j | ƒ n- | d k rˆ | } ˆ ˆ | d | ƒ n  d  S(   Ni   i   (   R   t   Nonet   AssertionErrorR   t   extendR   t   append(   R   R   R
   t   bt   base(	   R   t   assignLabelt   bestedget   blossombaset	   inblossomt   labelt	   labeledget   matet   queue(    sp   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/algorithms/matching.pyR&   î   s    
0
c            s:  g  } ˆ  } x|  ˆ  k	 rˆ |  } ˆ | d @rA ˆ | } Pn  ˆ | d k sW t  ‚ | j | ƒ d ˆ | <ˆ | d  k r� ˆ | ˆ k s” t  ‚ ˆ  }  n^ ˆ | d ˆ ˆ | k s¿ t  ‚ ˆ | d }  ˆ |  } ˆ | d k sí t  ‚ ˆ | d }  | ˆ  k	 r | |  }  } q q Wx | D] } d ˆ | <q"W| S(   Ni   i   i   i    i   (   R!   R#   R    (   R
   R   t   pathR%   R$   (   R   R(   R)   R*   R+   R,   (    sp   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/algorithms/matching.pyt   scanBlossom  s.    


	"
c            s.  ˆ |  } ˆ | } ˆ | } ˆ  ƒ  } |  ˆ | <d  ˆ | <| ˆ | <g  | _ } | | f g | _ } x’ | | k rü | ˆ | <| j | ƒ | j ˆ | ƒ ˆ | d k sá ˆ | d k rÛ ˆ | d ˆ	 ˆ | k sá t ‚ ˆ | d } ˆ | } qk W| j | ƒ | j ƒ  | j ƒ  x¤ | | k rÄ| ˆ | <| j | ƒ | j ˆ | d ˆ | d f ƒ ˆ | d k s©ˆ | d k r£ˆ | d ˆ	 ˆ | k s©t ‚ ˆ | d } ˆ | } q!Wˆ | d k sÛt ‚ d ˆ | <ˆ | ˆ | <d ˆ | <xB | j ƒ  D]4 } ˆ ˆ | d k r4ˆ
 j | ƒ n  | ˆ | <q
Wi  }	 xi| D]a} t | ˆ  ƒ rÒ| j d  k	 rˆ| j }
 d  | _ qg  | j ƒ  D]4 } ˆ j	 | ƒ D] } | | k r¨| | f ^ q¨q•}
 n4 g  ˆ j	 | ƒ D] } | | k râ| | f ^ qâ}
 x� |
 D]• } | \ } } ˆ | | k r?| | } } n  ˆ | } | | k rˆ j
 | ƒ d k r| |	 k s•ˆ | | ƒ ˆ |	 | Œ  k  r| |	 | <qqWd  ˆ | <qOWt |	 j ƒ  ƒ | _ d  } d  ˆ | <xD | j D]9 } ˆ | Œ  } | d  k s| | k  rã| } | } qãqãW| ˆ | <d  S(   Ni   i   i    (   R    R   R   R#   R!   t   reverseR   R   R   t   neighbors_iterR   t   listt   values(   R%   R
   R   t   bbt   bvt   bwR$   R.   t   edgst
   bestedgetot   nblistt   kt   it   jt   bjt
   mybestedget   kslackt   mybestslack(   R   R   R'   R(   t   blossomdualt   blossomparentR)   R*   R+   R,   R-   R   (    sp   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/algorithms/matching.pyt
   addBlossom,  s„    


	



B


#B

	$
!
c            s—  x~ |  j  D]s } d  ˆ | <t | ˆ  ƒ rs | rO ˆ | d k rO ˆ | | ƒ q} x+ | j ƒ  D] } | ˆ | <q\ Wq
 | ˆ | <q
 W| rNˆ	 j |  ƒ d k rNˆ ˆ
 |  d } |  j  j | ƒ } | d @rç | t |  j  ƒ 8} d } n d } ˆ
 |  \ } } xö | d k rõ| d k r.|  j | \ } }	 n |  j | d \ }	 } d  ˆ	 | <d  ˆ	 |	 <ˆ | d | ƒ t ˆ | |	 f <ˆ |	 | f <| | 7} | d k r³|  j | \ } } n |  j | d \ } } t ˆ | | f <ˆ | | f <| | 7} q W|  j  | }
 d ˆ	 | <ˆ	 |
 <| | f ˆ
 | <ˆ
 |
 <d  ˆ |
 <| | 7} x
|  j  | | k rJ|  j  | } ˆ	 j | ƒ d k r‰| | 7} qDn  t | ˆ  ƒ rÅx0 | j ƒ  D] } ˆ	 j | ƒ r¥Pq¥q¥Wn | } ˆ	 j | ƒ r=ˆ	 | d k sðt	 ‚ ˆ | | k st	 ‚ d  ˆ	 | <d  ˆ	 ˆ ˆ | <ˆ | d ˆ
 | d ƒ n  | | 7} qDWn  ˆ	 j
 |  d  ƒ ˆ
 j
 |  d  ƒ ˆ j
 |  d  ƒ ˆ |  =ˆ |  =ˆ |  =d  S(   Ni    i   i   iÿÿÿÿ(   R   R    R   R   R   t   indext   lenR   t   TrueR!   t   pop(   R$   t   endstaget   sR
   t
   entrychildR<   t   jstepR   t   pt   qR6   R5   (   R   t	   allowedgeR&   R'   R(   RA   RB   t   expandBlossomR)   R*   R+   R,   (    sp   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/algorithms/matching.pyRO   ˆ  st    

	






c            s¹  | } x ˆ | |  k r& ˆ | } q	 Wt  | ˆ  ƒ rF ˆ | | ƒ n  |  j j | ƒ } } | d @r‚ | t |  j ƒ 8} d } n d } xÉ | d k rS| | 7} |  j | } | d k rÐ |  j | \ } } n |  j | d \ } } t  | ˆ  ƒ rˆ | | ƒ n  | | 7} |  j | } t  | ˆ  ƒ r<ˆ | | ƒ n  | ˆ | <| ˆ | <q‹ W|  j | |  j |  |  _ |  j | |  j |  |  _ ˆ |  j d ˆ |  <ˆ |  | k sµt ‚ d  S(   Ni   iÿÿÿÿi    (   R   R   RD   RE   R   R!   (   R$   R
   R   R;   R<   RK   R   t   x(   R   t   augmentBlossomR(   RB   R,   (    sp   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/algorithms/matching.pyRQ   ç  s8    
	


c            sP  xI|  | f | |  f f D]/\ } } x ˆ | } ˆ | d k sH t  ‚ ˆ | d  k rh ˆ | ˆ k sŠ ˆ | d ˆ ˆ | k sŠ t  ‚ t | ˆ  ƒ r© ˆ | | ƒ n  | ˆ | <ˆ | d  k rÇ Pn  ˆ | d } ˆ | } ˆ | d k sõ t  ‚ ˆ | \ } } ˆ | | k st  ‚ t | ˆ  ƒ r:ˆ | | ƒ n  | ˆ | <q( Wq Wd  S(   Ni   i    i   (   R!   R    R   (   R
   R   RI   R<   t   bsR   t   bt(   R   RQ   R(   R)   R*   R+   R,   (    sp   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/algorithms/matching.pyt   augmentMatching  s$    %
B

c             së  ˆ r% t  d t ˆ j ƒ  ƒ ƒ }  n d }  t ˆ j ƒ  ƒ |  d k sM t ‚ t ˆ ƒ d k s} t ˆ j ƒ  ƒ d k s} t ‚ x ˆ  j d t ƒ D]Œ\ } } } | j d d ƒ } | | k rÃ q� n  ˆ | ˆ | d | } | g } | g } x- ˆ | d d  k	 r| j	 ˆ | d ƒ qò Wx- ˆ | d d  k	 rN| j	 ˆ | d ƒ q"W| j
 ƒ  | j
 ƒ  x? t | | ƒ D]. \ } }	 | |	 k r�Pn  | d ˆ | 7} qsW| d k s·t ‚ ˆ j | ƒ | k sáˆ j | ƒ | k r� ˆ | | k rˆ | | k st ‚ | d k st ‚ q� q� Wx4 ˆ D], }
 |
 ˆ k s'ˆ |
 |  d k s't ‚ q'Wx� ˆ D]… } ˆ | d k r^t | j ƒ d d k s“t ‚ xM | j d d  d … D]2 \ } } ˆ | | k rÖˆ | | k sªt ‚ qªWq^q^Wd  S(   Ni    R   R   i   i   iÿÿÿÿ(   t   maxt   minR3   R!   RE   R   RF   R   R    R#   R0   t   zipR   (   t   vdualoffsetR;   R<   t   dt   wtRI   t	   iblossomst	   jblossomst   biR=   R
   R$   (   R   RA   RB   R   t   gnodesR,   t   maxcardinality(    sp   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/algorithms/matching.pyt   verifyOptimum3  sB    "0"		

*&*#i   iÿÿÿÿg       @i   i   (    (    (   R   R   N(   t   nodesRF   R   R   t   strt   typet   splitt   dictRW   R    R    t   clearR   RG   R!   R1   RV   R3   t
   nodes_iterRU   R#   t   FalseR2   t   keys(   R   R_   t	   maxweightt
   allintegerR;   R<   RY   RZ   R/   RC   RT   R`   R$   R
   t	   augmentedR   R5   R6   R?   R%   t	   deltatypet   deltat	   deltaedget   deltablossom(    (   R   R   R   RN   R&   RQ   R'   R(   RA   RB   R   RO   R^   R)   R*   R+   R,   R_   R-   R   sp   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/algorithms/matching.pyR   8   s2   >"	"	'%0\0_-!!-



%

$
++.%
%
%
N(	   R   t	   itertoolsR    t   joint
   __author__t   __all__R   Rh   R   (    (    (    sp   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/algorithms/matching.pyt   <module>   s   		!