ó
H`¾Tc           @   s]   d  Z  d d l m Z d d l m Z d d d g Z d „  Z d „  Z d	 „  Z d
 „  Z	 d S(   s   Topological sorting algorithms.i   (   t   CircularDependencyError(   t   utilt   sortt   sort_as_subsetst   find_cyclesc         c   sÓ   t  j t ƒ } x% |  D] \ } } | | j | ƒ q Wt | ƒ } x‰ | rÎ t ƒ  } x7 t | ƒ D]) } | j | | ƒ sb | j | ƒ qb qb W| s¹ t d t |  | ƒ t | ƒ ƒ ‚ n  | j	 | ƒ | VqF Wd  S(   Ns   Circular dependency detected.(
   R   t   defaultdictt   sett   addt   listt   intersectionR    R   t
   _gen_edgest   difference_update(   t   tuplest   allitemst   edgest   parentt   childt   todot   outputt   node(    (    sa   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/util/topological.pyR      s     		c         c   s4   x- t  |  | ƒ D] } x | D] } | Vq Wq Wd S(   ss   sort the given list of items by dependency.

    'tuples' is a list of tuples representing a partial ordering.
    N(   R   (   R   R   t   set_t   s(    (    sa   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/util/topological.pyR   )   s    c         C   s  t  j t ƒ } x% |  D] \ } } | | j | ƒ q Wt | ƒ } t ƒ  } xÄ | D]¼ } | g } | j | ƒ }	 x› | r| d }
 x„ | |
 D]l } | | k rÑ | | j | ƒ } |	 j | ƒ | j | ƒ n  | |	 k r | j | ƒ |	 j	 | ƒ Pq q W| j
 ƒ  } qt WqS W| S(   Niÿÿÿÿ(   R   R   R   R   t
   differencet   indexR   t   updatet   appendt   removet   pop(   R   R   R   R   R   t   nodes_to_testR   R   t   stackR   t   topt   cyc(    (    sa   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/util/topological.pyR   4   s*    			
c         C   s4   t  g  |  D]# } |  | D] } | | f ^ q q
 ƒ S(   N(   R   (   R   t   leftt   right(    (    sa   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/util/topological.pyR
   \   s    
N(
   t   __doc__t   excR    t    R   t   __all__R   R   R   R
   (    (    (    sa   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/util/topological.pyt   <module>   s   			(