ó
|£*^c           @   s|   d  Z  d j d d g ƒ Z d d g Z d d l Z d d	 „ Z d
 „  Z d d „ Z	 d „  Z
 d „  Z d „  Z d „  Z d S(   s  
Implementation of the Wright, Richmond, Odlyzko and McKay (WROM)
algorithm for the enumeration of all non-isomorphic free trees of a
given order.  Rooted trees are represented by level sequences, i.e.,
lists in which the i-th element specifies the distance of vertex i to
the root.

s   
s   Aric Hagberg (hagberg@lanl.gov)s#   Mridul Seth (seth.mridul@gmail.com)t   nonisomorphic_treest   number_of_nonisomorphic_treesiÿÿÿÿNt   graphc         c   s¼   |  d k  r t  ‚ n  t t |  d d ƒ ƒ t t d |  d d ƒ ƒ } xk | d k	 r· t | ƒ } | d k	 rM | d k r‹ t | ƒ Vn | d k r¥ t | ƒ Vn  t | ƒ } qM qM Wd S(   sµ  Returns a list of nonisomporphic trees

    Parameters
    ----------
    order : int
      order of the desired tree(s)

    create : graph or matrix (default="Graph)
      If graph is selected a list of trees will be returned,
      if matrix is selected a list of adjancency matrix will
      be returned

    Returns
    -------
    G : List of NetworkX Graphs

    M : List of Adjacency matrices

    References
    ----------

    i   i   R   t   matrixN(   t
   ValueErrort   listt   ranget   Nonet
   _next_treet   _layout_to_grapht   _layout_to_matrixt   _next_rooted_tree(   t   ordert   createt   layout(    (    s{   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/generators/nonisomorphic_trees.pyR       s    	5c         C   s    t  d „  t |  ƒ Dƒ ƒ } | S(   sù   Returns the number of nonisomorphic trees

    Parameters
    ----------
    order : int
      order of the desired tree(s)

    Returns
    -------
    length : Number of nonisomorphic graphs for the given order

    References
    ----------

    c         s   s   |  ] } d  Vq d S(   i   N(    (   t   .0t   _(    (    s{   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/generators/nonisomorphic_trees.pys	   <genexpr>O   s    (   t   sumR    (   R   t   length(    (    s{   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/generators/nonisomorphic_trees.pyR   ?   s    c         C   sÉ   | d k r@ t |  ƒ d } x! |  | d k r< | d 8} q Wn  | d k rP d S| d } x& |  | |  | d k r‚ | d 8} q] Wt |  ƒ } x3 t | t | ƒ ƒ D] } | | | | | | <q¥ W| S(   s0   One iteration of the Beyer-Hedetniemi algorithm.i   i    N(   R   t   lenR   R   (   t   predecessort   pt   qt   resultt   i(    (    s{   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/generators/nonisomorphic_trees.pyR   S   s    
c         C   s  t  |  ƒ \ } } t | ƒ } t | ƒ } | | k } | r™ | | k r™ t | ƒ t | ƒ k ri t } q™ t | ƒ t | ƒ k r™ | | k r™ t } q™ n  | r£ |  St | ƒ } t |  | ƒ } |  | d k rt  | ƒ \ } }	 t | ƒ }
 t d |
 d ƒ } | | t | ƒ )n  | Sd S(   sG   One iteration of the Wright, Richmond, Odlyzko and McKay
    algorithm.i   i   N(   t   _split_treet   maxR   t   FalseR   R   (   t	   candidatet   leftt   restt   left_heightt   rest_heightt   validR   t   new_candidatet   new_leftt   new_restt   new_left_heightt   suffix(    (    s{   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/generators/nonisomorphic_trees.pyR   f   s&    	$c         C   sÔ   t  } d } xC t t |  ƒ ƒ D]/ } |  | d k r | rE | } PqN t } q q W| d k rm t |  ƒ } n  g  t d | ƒ D] } |  | d ^ q} } d g g  t | t |  ƒ ƒ D] } |  | ^ q³ } | | f S(   sž   Return a tuple of two layouts, one containing the left
    subtree of the root vertex, and one containing the original tree
    with the left subtree removed.i   i    N(   R   R   R   R   t   True(   R   t	   one_foundt   mR   R   R   (    (    s{   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/generators/nonisomorphic_trees.pyR   �   s    *3c         C   sØ   g  t  t |  ƒ ƒ D] } d g t |  ƒ ^ q } g  } x™ t  t |  ƒ ƒ D]… } |  | } | rÃ | d } |  | } x. | | k r¥ | j ƒ  | d } |  | } qx Wd | | | <| | | <n  | j | ƒ qK W| S(   s\   Create the adjacency matrix for the tree specified by the
    given layout (level sequence).i    iÿÿÿÿi   (   R   R   t   popt   append(   R   R   R   t   stackt   i_levelt   jt   j_level(    (    s{   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/generators/nonisomorphic_trees.pyR
   ¤   s    2




c         C   sÚ   g  t  t |  ƒ ƒ D] } d g t |  ƒ ^ q } t j ƒ  } g  } x� t  t |  ƒ ƒ D]{ } |  | } | rÅ | d } |  | } x. | | k r± | j ƒ  | d } |  | } q„ W| j | | ƒ n  | j | ƒ qW W| S(   sV   Create a NetworkX Graph for the tree specified by the
    given layout(level sequence)i    iÿÿÿÿ(   R   R   t   nxt   GraphR*   t   add_edgeR+   (   R   R   R   t   GR,   R-   R.   R/   (    (    s{   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/generators/nonisomorphic_trees.pyR	   ¸   s    2




(   t   __doc__t   joint
   __author__t   __all__t   networkxR0   R    R   R   R   R   R   R
   R	   (    (    (    s{   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/generators/nonisomorphic_trees.pyt   <module>   s   		'		'		