ó
r™xTc           @   sF   d  d l  m Z d  d l Z d  d l m Z d e f d „  ƒ  YZ d S(   iÿÿÿÿ(   t   divisionN(   t   Sorryt   graphc           B   sq   e  Z d  „  Z d
 d „ Z d „  Z d „  Z d „  Z d „  Z g  d „ Z	 g  d „ Z
 g  d „ Z d
 d	 „ Z RS(   c         C   s   i  |  _  i  |  _ i  |  _ d  S(   N(   t   node_objectst   edge_objectst   o(   t   self(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/python_utils/graph_tools.pyt   __init__   s    		c         C   s³  |  j  j | ƒ rB |  j  | g  k rY |  j  j i | | 6ƒ qY n |  j  j i | | 6ƒ |  j j | ƒ sö |  j j i i  | 6ƒ |  j j i g  | 6ƒ x| D]O } |  j | j i | | | 6ƒ | |  j | k r  |  j | j | ƒ q  q  Wn¹ |  j | } x© | D]¡ } |  j | j | ƒ rb|  j | | d  k r�|  j | j i | | | 6ƒ q�n |  j | j i | | | 6ƒ | |  j | k r
|  j | j | ƒ q
q
Wd  S(   N(   R   t   has_keyt   updateR   R   t   appendt   None(   R   t   namet   edge_objectt   node_objectt   itemt	   tmp_edges(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/python_utils/graph_tools.pyt   insert_node   s&    %c         C   sä   |  j  j | ƒ r |  j  | =n  |  j j | ƒ r> |  j | =n  |  j j | ƒ r] |  j | =n  x8 |  j D]- } |  j | j | ƒ rg |  j | | =qg qg WxE |  j D]: } | |  j | k r¢ |  j | |  j | j | ƒ =q¢ q¢ Wd  S(   N(   R   R   R   R   t   index(   R   R   R   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/python_utils/graph_tools.pyt   remove_node5   s    c         C   s'  t  } x, |  j D]! } |  j j | ƒ s t } q q Wx, |  j D]! } |  j j | ƒ s? t } q? q? W| sy t d ƒ ‚ n  | s… t ‚ t  } x• |  j D]Š } t  } |  j j | ƒ r|  j | } t | ƒ d k r
x, | D]! } |  j j | ƒ sÙ t } qÙ qÙ Wq
n t } | s• t d ƒ ‚ q• q• Wd  S(   Ns   The graph is not cleani    sN   The graph does not seem to be finished, 
some connections point into thin air!(	   t   TrueR   R   R   t   FalseR   t   AssertionErrorR   t   len(   R   t   cleanR   t   con_listt
   trial_node(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/python_utils/graph_tools.pyt   assert_is_cleanI   s,    c         C   s‹   | j  ƒ  t } xt |  j D]i } t |  j | ƒ t | j | ƒ k rO t } n  x1 |  j | D]" } | | j | k r] t } q] q] Wq W| S(   N(   R   R   R   R   R   (   R   t	   new_grapht   is_contained_inR   t   this_one(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/python_utils/graph_tools.pyR   j   s    
&	c         C   sF   |  j  | ƒ } | j  |  ƒ } t } | s3 t } n  | sB t } n  | S(   N(   R   R   R   (   R   R   t   self_in_newt   new_in_selft   is_equivalent(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/python_utils/graph_tools.pyt   is_equivalent_to   s    		c         C   sš   | | g } | | k r  | g S|  j  j | ƒ s6 g  Sg  } xW |  j  | D]H } | | k rJ |  j | | | ƒ } x | D] } | j | ƒ qx WqJ qJ W| S(   N(   R   R   t   find_all_pathsR
   (   R   t   startt   endt   patht   pathst   nodet   newpathst   newpath(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/python_utils/graph_tools.pyR#   Œ   s    c         C   s    | | g } t  | ƒ | k r& | g S|  j j | ƒ s< g  Sg  } xW |  j | D]H } | | k rP |  j | | | ƒ } x | D] } | j | ƒ q~ WqP qP W| S(   N(   R   R   R   t   find_paths_of_lengthR
   (   R   R$   t   lengthR&   R'   R(   R)   R*   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/python_utils/graph_tools.pyR+   �   s    c         C   sª   | | g } | | k r | S|  j  j | ƒ s3 d  Sd  } xj |  j  | D][ } | | k rG |  j | | | ƒ } | r¢ | s“ t | ƒ t | ƒ k  rŸ | } qŸ q¢ qG qG W| S(   N(   R   R   R   t   find_shortest_pathR   (   R   R$   R%   R&   t   shortestR(   R*   (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/python_utils/graph_tools.pyR-   °   s    	c         C   sË   | d  k r t j } n  | J| d IJ| J| d IJx. |  j D]# } | | Id I|  j | IJq> W| JxI |  j D]> } x5 |  j | D]& } | Gd G| Gd G|  j | | GHq‡ Wqs W| J| d IJ| Jd  S(   Ns   ----------------------------s   Outgoing edgess   ---->s    ---> s    :: (   R   t   syst   stdoutR   R   (   R   t   outR(   t   node_1t   node_2(    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/python_utils/graph_tools.pyt   showÈ   s     

!
N(   t   __name__t
   __module__R   R   R   R   R   R   R"   R#   R+   R-   R4   (    (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/python_utils/graph_tools.pyR      s   	
		!		(   t
   __future__R    R/   t   libtbx.utilsR   t   objectR   (    (    (    sM   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/python_utils/graph_tools.pyt   <module>   s   