mò
‘oÞFc           @   s¯  d  e  e f d „  ƒ  YZ d d „ Z d „  Z d d „ Z e d j odd d d	 d
 d d g Z d d f d d	 f d d
 f d d f g Z x- e e e ƒ D] Z	 x e	 D] Z
 e
 GHq¦ Wq™ We ‚ d k Z d k Z d d d d d d g Z d d f d d f d d f d d f d d f g d d f d d f d d f d d f d d f g d d f d d f d d f d d f d d f d d f d d f g d d f d d f d d f d d f d d f d d f d d f g d d f d d f d d f d d f d d f d d f d d f d d f d d f g	 d d f d d f d d f d d f g d d f d d f d d f d d f g g Z d GHxC e e e ƒ ƒ D]/ Z y d Ge e e e ƒ GHWn d GHn XqWd GHxC e e e ƒ ƒ D]/ Z y d Ge e e e ƒ GHWn d GHn XqØWd GHxF e e e ƒ ƒ D]2 Z y d Ge e e e d ƒ GHWn d GHn Xq#Wd GHxF e e e ƒ ƒ D]2 Z y d Ge e e e d ƒ GHWn d GHn XqqWn d S(   t   RecursionErrorc           B   s   t  Z d  Z RS(   s9   Unable to calculate result because of recursive structure(   t   __name__t
   __module__t   __doc__(    (    (    t   ../tools/toposort.pyR    	   s   i   c         C   ss  t  | ƒ \ } } g  } | g } g  }
 x/ |  D]' } | i	 | ƒ p | i
 | ƒ q. q. W|  o | o | i
 |  d ƒ n |
 i | ƒ t | d „ |  ƒ }  xÍ|  oÅg  }	 t |  ƒ } x€ | D]x } xo | i	 | g  ƒ D][ } | |	 j o | |
 j o |	 i
 | ƒ qÛ | |
 j o | o t | | f ƒ ‚ qÛ qÛ WqÂ W|	 } g  } xy | D]q } | i	 | g  ƒ } xV | D]N } | | j o; | | j o. | | i	 | g  ƒ j o | i
 | ƒ q¾qpqpWqQWx0 | D]( } x | | j o | i | ƒ qÖWqÍW| i
 | ƒ |
 i | ƒ t | d „ |  ƒ }  | t |  ƒ j o/ | o t |  ƒ ‚ qj| i
 |  ƒ g  }  q¢ q¢ W| S(   sœ   Passed a list of node IDs and a list of source,dest ID routes
    attempt to create a list of stages where each sub list
    is one stage in a process.
    i    c         C   s
   |  | j S(   N(   t   xt   l(   R   R   (    (    R   t   <lambda>    s    c         C   s
   |  | j S(   N(   R   R   (   R   R   (    (    R   R   =   s    N(   t   _buildChildrenListst   routest   childrent   parentst   staget   stagest   takent   nodest   nodet   gett   appendt   extendt   filtert   previousStageChildrent   lent   nodelent   childt   noRecursionR    t   removest   currentt   currentParentst   parentt   remove(   R   R	   R   R   R   R   R   R   R   R   R   R   R   R   R   R
   R   (    (    R   t   sort   sb     	        c         C   s¡   h  } h  } xˆ |  D]€ \ } } | i | g  ƒ } | i | g  ƒ } | | j o | i | ƒ n | | j o | i | ƒ n | | | <| | | <q W| | f S(   N(	   t   childrenTablet   parentTableR	   t   sourceIDt   destinationIDR   t   currentChildrenR   R   (   R	   R   R"   R$   R#   R    R!   (    (    R   R   F   s     
c         C   sÜ  h  } h  } |  p g  Sn | p |  g Sn x( |  D]  } d | f | | <g  | | <q4 Wx¿ | D]· \ } } y" | i | d | f ƒ \ } } Wn t
 j
 o | GH‚  n X| d | f | | <| i | d | f ƒ \ } } | | f | | <| i | g  ƒ }
 |
 i | ƒ |
 | | <q_ W| i ƒ  } | i ƒ  g  } xŸ| o—g  }	 g  } | i | ƒ xÕ | oÍ | d d d j o¸ | d \ } } | i | ƒ |	 i | ƒ x€ | i | f  ƒ D]l } yP | | \ } } | d j o | d | f | | <n |	 i | ƒ g  | | <Wqµt j
 o qµXqµW| d =q\W|	 p; | o t | ƒ ‚ qsd | d d f | | d d <n x/ |	 D]' } y | | =Wqzt j
 o qzXqzW| i ƒ  } | p | i | ƒ n | i ƒ  q9W| S(   sP   Topological sort from Tim Peters, fairly efficient
    in comparison (it seems).i    i   N(   t   dependenciest   inversedependenciesR   R	   R   t   dependedt   dependsR   t   newdependencylevelt   objectt	   TypeErrort   dependencieslistR   t   valuest   sortinglistR   t   outputt
   deletelistt
   generationt   numbert   inverset   oldcountt   KeyErrorR   R    t   itemR   (   R   R	   R   R1   R2   R(   R3   R'   R.   R0   R,   R4   R   R)   R*   R&   R%   R6   R/   (    (    R   t   toposortU   s~       "
   	$ 	t   __main__t   at   bt   ct   dt   et   fNi    i   i   i   i   s   sort, no recursion alloweds           s   exception raiseds   toposort, no recursion alloweds   sort, recursion alloweds   toposort, recursion allowed(   t   OverflowErrort
   ValueErrorR    R   R   R7   R   R   t   routeR   R9   t
   SystemExitt   pprintt	   tracebackt   testingValuest   rangeR   t   index(   R   R7   RD   RG   RA   RC   R   RE   R9   R   R   R    (    (    R   t   ?	   sX   9	X*  ÿ *    