ó
ç™xTc           @   s5   d  d l  m Z d „  Z e d d „ Z d „  Z d S(	   iÿÿÿÿ(   t   divisionc            së   i  ‰ x6 |  D]. \ } } | ˆ k s+ t  ‚ t ˆ ƒ ˆ | <q Wi  ‰  xN |  D]F \ } } | ˆ  | <x- | D]% } | ˆ k ri t ˆ ƒ ˆ | <qi qi WqL Wi  ‰ g  ‰ ‡  ‡ ‡ ‡ ‡ f d †  ‰ x' |  D] \ } } ˆ d d  d | ƒ qÄ Wˆ S(   Nc            s  | ˆ k r d  S|  d  k r< t ˆ ƒ ˆ | <ˆ j | ƒ ng t ˆ ƒ } ˆ |  } x4 | | k  r‚ ˆ | |  k ru Pn  | d 7} qU Wt ‚ | ˆ | <ˆ j | | ƒ ˆ  j | ƒ } | d  k	 rˆ  | =xM t g  | D] } ˆ | | f ^ qÒ ƒ D] \ } } ˆ d | d | ƒ qï Wn  d  S(   Ni   t   dependent_nodet   node(   t   Nonet   lent   appendt   AssertionErrort   insertt   gett   sorted(   R   R   t   nt   it   depst   dt   rankt
   dependency(   t   deps_by_nodet   lower_boundst	   node_listt   processt   ranks(    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/topological_sort.pyR      s&    

6R   R   (   R   R   R   (   t   connectionsR   R   R   (    (   R   R   R   R   R   sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/topological_sort.pyt   stable   s     
i   i   c            sR   g  ‰ g  ‰ i  ‰  ‡  ‡ ‡ ‡ ‡ ‡ ‡ f d †  ‰ x ˆ D] } ˆ | ƒ q: Wˆ S(   s  
successors_by_node = {
  "node1": ["successor1", "successor2"],
  "node2": ["successor1", "successor3"]
}

http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm
http://www.logarithmic.net/pfh-files/blog/01208083168/sort.py

Original implementation (by Paul Harrison), modified to accommodate
successors that do not appear as a key in successors_by_node.
  c            só   |  ˆ  k r d  St  ˆ  ƒ } | ˆ  |  <t  ˆ ƒ } ˆ j |  ƒ x? ˆ j |  g  ƒ D]+ } ˆ | ƒ t ˆ  |  ˆ  | ƒ ˆ  |  <qR W| ˆ  |  k rï t ˆ | ƒ } ˆ | 3ˆ sÁ t  | ƒ d k rÑ ˆ j | ƒ n  x | D] } ˆ ˆ  | <qØ Wn  d  S(   Ni   (   R   R   R   t   mint   tuple(   R   t   numt	   stack_post	   successort	   componentt   item(   t   lowt   low_infinitet   omit_single_node_componentst   resultt   stackt   successors_by_nodet   visit(    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/topological_sort.pyR$   <   s     

(    (   R#   R    R   R   (    (   R   R   R    R!   R"   R#   R$   sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/topological_sort.pyt   strongly_connected_components)   s    !c            s>   t  ƒ  ‰ g  ‰ ‡  ‡ ‡ ‡ ‡ f d †  ‰  ˆ  | ƒ r: ˆ Sd  S(   Nc            st   ˆ j  |  ƒ x` ˆ j |  g  ƒ D]L } | ˆ k r6 t S| ˆ k r  ˆ j | ƒ ˆ  | ƒ r_ t Sˆ j ƒ  q  q  Wt S(   N(   t   addR   t   TrueR   t   popt   False(   R   R   (   t   depth_first_searcht   pathR#   t   to_nodet   visited(    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/topological_sort.pyR*   T   s    (   t   setR   (   R#   t	   from_nodeR,   (    (   R*   R+   R#   R,   R-   sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/topological_sort.pyt	   find_pathQ   s    	Ni   @(   t
   __future__R    R   R'   R%   R0   (    (    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/topological_sort.pyt   <module>   s   	)%