ó
|£*^c           @   sd   d  d l  Z d j d d d g ƒ Z d d g Z e d „ Z d	 „  Z d
 „  Z d d d d „ Z
 d S(   iÿÿÿÿNs   
s%   Aric Hagberg <aric.hagberg@gmail.com>s   Pieter Swart (swart@lanl.gov)s    Dan Schult (dschult@colgate.edu)t   convert_node_labels_to_integerst   relabel_nodesc            sX   t  ˆ  d ƒ s. t ‡  f d †  |  Dƒ ƒ } n ˆ  } | rG t |  | ƒ St |  | ƒ Sd S(   sæ  Relabel the nodes of the graph G.

    Parameters
    ----------
    G : graph
       A NetworkX graph

    mapping : dictionary
       A dictionary with the old labels as keys and new labels as values.
       A partial mapping is allowed.

    copy : bool (optional, default=True)
       If True return a copy, or if False relabel the nodes in place.

    Examples
    --------
    >>> G=nx.path_graph(3)  # nodes 0-1-2
    >>> mapping={0:'a',1:'b',2:'c'}
    >>> H=nx.relabel_nodes(G,mapping)
    >>> print(sorted(H.nodes()))
    ['a', 'b', 'c']

    >>> G=nx.path_graph(26) # nodes 0..25
    >>> mapping=dict(zip(G.nodes(),"abcdefghijklmnopqrstuvwxyz"))
    >>> H=nx.relabel_nodes(G,mapping) # nodes a..z
    >>> mapping=dict(zip(G.nodes(),range(1,27)))
    >>> G1=nx.relabel_nodes(G,mapping) # nodes 1..26

    Partial in-place mapping:

    >>> G=nx.path_graph(3)  # nodes 0-1-2
    >>> mapping={0:'a',1:'b'} # 0->'a' and 1->'b'
    >>> G=nx.relabel_nodes(G,mapping, copy=False)

    print(G.nodes())
    [2, 'b', 'a']

    Mapping as function:

    >>> G=nx.path_graph(3)
    >>> def mapping(x):
    ...    return x**2
    >>> H=nx.relabel_nodes(G,mapping)
    >>> print(H.nodes())
    [0, 1, 4]

    Notes
    -----
    Only the nodes specified in the mapping will be relabeled.

    The keyword setting copy=False modifies the graph in place.
    This is not always possible if the mapping is circular.
    In that case use copy=True.

    See Also
    --------
    convert_node_labels_to_integers
    t   __getitem__c         3   s!   |  ] } | ˆ  | ƒ f Vq d  S(   N(    (   t   .0t   n(   t   mapping(    sd   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/relabel.pys	   <genexpr>K   s    N(   t   hasattrt   dictt   _relabel_copyt   _relabel_inplace(   t   GR   t   copyt   m(    (   R   sd   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/relabel.pyR      s    =c      	   C   sÛ  t  | j ƒ  ƒ } t  | j ƒ  ƒ } t | | @ƒ d k rª t j t | j ƒ  ƒ ƒ } | j | j	 ƒ  ƒ y t j
 | d t ƒ} Wq° t j k
 r¦ t j d ƒ ‚ q° Xn | } |  j ƒ  } |  j ƒ  } x| D]} y | | }	 Wn t k
 rù qÏ n X|	 | k rqÏ n  y |  j |	 d |  j | ƒWn! t k
 rMt d | ƒ ‚ n X| rg  |  j | d t d t ƒD]6 \ }
 } } } |	 | | k r—|	 n | | | f ^ qp} | r¹| g  |  j | d t d t ƒD]6 \ } }
 } } | | k rõ|	 n | |	 | | f ^ qÑ7} q¹n¥ g  |  j | d t ƒD]0 \ }
 } } |	 | | k rN|	 n | | f ^ q*} | r¹| g  |  j | d t ƒD]0 \ } }
 } | | k r |	 n | |	 | f ^ q7} n  |  j | ƒ |  j | ƒ qÏ W|  S(   Ni    t   reverses[   The node label sets are overlapping and no ordering can resolve the mapping. Use copy=True.t	   attr_dicts   Node %s is not in the grapht   datat   keys(   t   setR   t   valuest   lent   nxt   DiGrapht   listt   itemst   remove_edges_fromt   selfloop_edgest   topological_sortt   Truet   NetworkXUnfeasiblet   is_multigrapht   is_directedt   KeyErrort   add_nodet   nodet   edgest   in_edgest   remove_nodet   add_edges_from(   R
   R   t
   old_labelst
   new_labelst   Dt   nodest
   multigrapht   directedt   oldt   newt   _t   targett   keyR   t	   new_edgest   source(    (    sd   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/relabel.pyR	   T   sJ    U\IMc            sì   |  j  ƒ  } d |  j | _ |  j ƒ  rZ | j ‡  f d †  |  j d t d t ƒ Dƒ ƒ n) | j ‡  f d †  |  j d t ƒ Dƒ ƒ | j ‡  f d †  |  Dƒ ƒ | j j t	 ‡  f d †  |  j j
 ƒ  Dƒ ƒ ƒ | j j |  j j ƒ  ƒ | S(   Ns   (%s)c         3   sK   |  ]A \ } } } } ˆ  j  | | ƒ ˆ  j  | | ƒ | | j ƒ  f Vq d  S(   N(   t   getR   (   R   t   n1t   n2t   kt   d(   R   (    sd   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/relabel.pys	   <genexpr>Š   s   R   R   c         3   sE   |  ]; \ } } } ˆ  j  | | ƒ ˆ  j  | | ƒ | j ƒ  f Vq d  S(   N(   R3   R   (   R   R4   R5   R7   (   R   (    sd   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/relabel.pys	   <genexpr>�   s   c         3   s!   |  ] } ˆ  j  | | ƒ Vq d  S(   N(   R3   (   R   R   (   R   (    sd   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/relabel.pys	   <genexpr>�   s    c         3   s3   |  ]) \ } } ˆ  j  | | ƒ | j ƒ  f Vq d  S(   N(   R3   R   (   R   R   R7   (   R   (    sd   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/relabel.pys	   <genexpr>‘   s    (   t	   __class__t   nameR   R%   t
   edges_iterR   t   add_nodes_fromR!   t   updateR   R   t   graphR   (   R
   R   t   H(    (   R   sd   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/relabel.pyR   †   s     /i    t   defaultc         C   sø  |  j  ƒ  | } | d k rC t t |  j ƒ  t | | ƒ ƒ ƒ } nV| d k r† |  j ƒ  } | j ƒ  t t | t | | ƒ ƒ ƒ } n| d k rg  |  j ƒ  D] \ } } | | f ^ qŸ }	 |	 j ƒ  t t g  |	 D] \ } } | ^ qÔ t | | ƒ ƒ ƒ } n˜ | d k r†g  |  j ƒ  D] \ } } | | f ^ q}	 |	 j ƒ  |	 j ƒ  t t g  |	 D] \ } } | ^ qYt | | ƒ ƒ ƒ } n t j	 d | ƒ ‚ t
 |  | ƒ }
 d |  j d |
 _ | d	 k	 rôt j |
 | t d „  | j ƒ  Dƒ ƒ ƒ n  |
 S(
   s’  Return a copy of the graph G with the nodes relabeled using
    consecutive integers.

    Parameters
    ----------
    G : graph
       A NetworkX graph

    first_label : int, optional (default=0)
       An integer specifying the starting offset in numbering nodes.
       The new integer labels are numbered first_label, ..., n-1+first_label.

    ordering : string
       "default" : inherit node ordering from G.nodes()
       "sorted"  : inherit node ordering from sorted(G.nodes())
       "increasing degree" : nodes are sorted by increasing degree
       "decreasing degree" : nodes are sorted by decreasing degree

    label_attribute : string, optional (default=None)
       Name of node attribute to store old label.  If None no attribute
       is created.

    Notes
    -----
    Node and edge attribute data are copied to the new (relabeled) graph.

    See Also
    --------
    relabel_nodes
    R?   t   sorteds   increasing degrees   decreasing degrees   Unknown node ordering: %st   (s   )_with_int_labelsc         s   s!   |  ] \ } } | | f Vq d  S(   N(    (   R   R6   t   v(    (    sd   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/relabel.pys	   <genexpr>Î   s    N(   t   number_of_nodesR   t   zipR)   t   ranget   sortt   degree_iterR   R   t   NetworkXErrorR   R9   t   Nonet   set_node_attributesR   (   R
   t   first_labelt   orderingt   label_attributet   NR   t   nlistR   R7   t   dv_pairsR>   (    (    sd   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/relabel.pyR    —   s.     '
!+
:+

: (   t   networkxR   t   joint
   __author__t   __all__R   R   R	   R   RI   R    (    (    (    sd   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/relabel.pyt   <module>   s   	G	2	