ó
|£*^c           @   sù   d  Z  d d l Z d d l m Z m Z d d l Z d d d d d d	 g Z y e Wn e	 k
 rm e
 Z n Xe d
 d d ƒd „  ƒ Z e d d d ƒd „  ƒ Z d „  Z e d „ Z d „  Z d d „ Z d d d „ Z d d d „ Z d „  Z d S(   sm  
*****
Pydot
*****

Import and export NetworkX graphs in Graphviz dot format using pydotplus.

Either this module or nx_agraph can be used to interface with graphviz.

See Also
--------
PyDotPlus: https://github.com/carlos-jenkins/pydotplus
Graphviz:          http://www.research.att.com/sw/tools/graphviz/
DOT Language:  http://www.graphviz.org/doc/info/lang.html
iÿÿÿÿN(   t	   open_filet   make_strt	   write_dott   read_dott   graphviz_layoutt   pydot_layoutt   to_pydott
   from_pydoti   t   modet   wc         C   s#   t  |  ƒ } | j | j ƒ  ƒ d S(   sg   Write NetworkX graph G to Graphviz dot format on path.

    Path can be a string or a file handle.
    N(   R   t   writet	   to_string(   t   Gt   patht   P(    (    sm   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/drawing/nx_pydot.pyR   %   s    i    t   rc         C   s1   d d l  } |  j ƒ  } | j | ƒ } t | ƒ S(   sL  Return a NetworkX MultiGraph or MultiDiGraph from a dot file on path.

    Parameters
    ----------
    path : filename or file handle

    Returns
    -------
    G : NetworkX multigraph
        A MultiGraph or MultiDiGraph.

    Notes
    -----
    Use G = nx.Graph(read_dot(path)) to return a Graph instead of a MultiGraph.
    iÿÿÿÿN(   t	   pydotplust   readt   graph_from_dot_dataR   (   R   R   t   dataR   (    (    sm   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/drawing/nx_pydot.pyR   /   s    c         C   sˆ  |  j  d ƒ r t } n t } |  j ƒ  d k rT | rE t j ƒ  } qu t j ƒ  } n! | ri t j ƒ  } n t j	 ƒ  } |  j
 ƒ  j d ƒ } | d k r¢ | | _ n  xQ |  j ƒ  D]C } | j
 ƒ  j d ƒ } | d	 k rÜ q¯ n  | j | | j ƒ  � q¯ Wx|  j ƒ  D]} | j ƒ  } | j ƒ  } | j ƒ  }	 g  }
 g  } t | t ƒ ra|
 j | j d ƒ ƒ n+ x( | d D] } |
 j | j d ƒ ƒ qlWt | t ƒ r´| j | j d ƒ ƒ n+ x( | d D] } | j | j d ƒ ƒ q¿Wx2 |
 D]* } x! | D] } | j | | |	 � qóWqæWqW|  j ƒ  } | r:| | j d <n  y |  j ƒ  d | j d <Wn n Xy |  j ƒ  d | j d <Wn n X| S(
   s×  Return a NetworkX graph from a Pydot graph.

    Parameters
    ----------
    P : Pydot graph
      A graph created with Pydot

    Returns
    -------
    G : NetworkX multigraph
        A MultiGraph or MultiDiGraph.

    Examples
    --------
    >>> K5 = nx.complete_graph(5)
    >>> A = nx.nx_pydot.to_pydot(K5)
    >>> G = nx.nx_pydot.from_pydot(A) # return MultiGraph

    # make a Graph instead of MultiGraph
    >>> G = nx.Graph(nx.nx_pydot.from_pydot(A)) 

    t   grapht   "t    t   nodet   edget   nodesi    N(   R   R   R   (   t
   get_strictt   Nonet   Falset   Truet   get_typet   nxt
   MultiGrapht   Grapht   MultiDiGrapht   DiGrapht   get_namet   stript   namet   get_node_listt   add_nodet   get_attributest   get_edge_listt
   get_sourcet   get_destinationt
   isinstancet
   basestringt   appendt   add_edgeR   t   get_node_defaultst   get_edge_defaults(   R   t
   multiedgest   NR&   t   pt   nt   et   ut   vt   attrt   st   dt   unodest   vnodest   source_nodet   destination_nodet   pattr(    (    sm   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/drawing/nx_pydot.pyR   E   s^    	c         C   sw  d d l  } |  j ƒ  r! d } n d } |  j ƒ  d k oC |  j ƒ  } |  j } |  j j d i  ƒ } | d k r‘ | j d d | d | | �} n" | j d	 | d | d | | �} y | j |  j d
 �  Wn t	 k
 rÞ n Xy | j
 |  j d �  Wn t	 k
 r
n Xxa |  j d t ƒ D]M \ } } t d „  | j ƒ  Dƒ ƒ }	 | j t | ƒ |	 � }
 | j |
 ƒ qW|  j ƒ  rxõ |  j d t d t ƒ D]h \ } } } } t d „  | j ƒ  Dƒ ƒ } | j t | ƒ t | ƒ d t | ƒ | �} | j | ƒ q”Wnp xm |  j d t ƒ D]Y \ } } } t d „  | j ƒ  Dƒ ƒ } | j t | ƒ t | ƒ | � } | j | ƒ qW| S(   s  Return a pydot graph from a NetworkX graph N.

    Parameters
    ----------
    N : NetworkX graph
      A graph created with NetworkX

    Examples
    --------
    >>> K5 = nx.complete_graph(5)
    >>> P = nx.nx_pydot.to_pydot(K5)

    Notes
    -----

    iÿÿÿÿNt   digraphR   i    R   t
   graph_typet   stricts   "%s"R   R   R   c         s   s'   |  ] \ } } | t  | ƒ f Vq d  S(   N(   R   (   t   .0t   kR9   (    (    sm   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/drawing/nx_pydot.pys	   <genexpr>É   s    t   keysc         s   s'   |  ] \ } } | t  | ƒ f Vq d  S(   N(   R   (   RE   RF   R9   (    (    sm   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/drawing/nx_pydot.pys	   <genexpr>Ï   s    t   keyc         s   s'   |  ] \ } } | t  | ƒ f Vq d  S(   N(   R   (   RE   RF   R9   (    (    sm   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/drawing/nx_pydot.pys	   <genexpr>Ö   s    (   R   t   is_directedt   number_of_selfloopst   is_multigraphR&   R   t   gett   Dott   set_node_defaultst   KeyErrort   set_edge_defaultst
   nodes_iterR   t   dictt   itemst   NodeR   R(   t
   edges_itert   EdgeR0   (   R4   RD   R   RC   R&   t   graph_defaultsR   R6   t   nodedatat   str_nodedataR5   R8   R9   RH   t   edgedatat   str_edgedataR   (    (    sm   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/drawing/nx_pydot.pyR   ž   sF    			+"!c         C   s'   d d l  m } | d t ƒ t |  ƒ S(   s+   Create a Pydot graph from a NetworkX graph.iÿÿÿÿ(   t   warns+   pydot_from_networkx is replaced by to_pydot(   t   warningsR\   t   DeprecationWarningR   (   R4   R\   (    (    sm   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/drawing/nx_pydot.pyt   pydot_from_networkxÜ   s    c         C   s'   d d l  m } | d t ƒ t |  ƒ S(   s+   Create a NetworkX graph from a Pydot graph.iÿÿÿÿ(   R\   s-   networkx_from_pydot is replaced by from_pydot(   R]   R\   R^   R   (   t   Dt   create_usingR\   (    (    sm   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/drawing/nx_pydot.pyt   networkx_from_pydotâ   s    t   neatoc         K   s   t  d |  d | d | | � S(   sI  Create node positions using Pydot and Graphviz.

    Returns a dictionary of positions keyed by node.

    Examples
    --------
    >>> G = nx.complete_graph(4)
    >>> pos = nx.nx_pydot.graphviz_layout(G)
    >>> pos = nx.nx_pydot.graphviz_layout(G, prog='dot')

    Notes
    -----
    This is a wrapper for pydot_layout.
    R   t   progt   root(   R   (   R   Rd   Re   t   kwds(    (    sm   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/drawing/nx_pydot.pyR   é   s    c         K   sN  d d l  } t |  ƒ } | d k	 r= | j d t | ƒ ƒ n  | j d | ƒ } | d k r… d | GHd GHd GHd GHd	 GHd
 | GHd S| j | ƒ } i  } x­ |  j ƒ  D]Ÿ }	 | j t |	 ƒ ƒ j	 ƒ  }
 | j
 |
 ƒ } t | t ƒ ró | d } n  | j ƒ  d d !} | d k r§ | j d ƒ \ } } t | ƒ t | ƒ f | |	 <q§ q§ W| S(   s  Create node positions using Pydot and Graphviz.

    Returns a dictionary of positions keyed by node.

    Examples
    --------
    >>> G = nx.complete_graph(4)
    >>> pos = nx.nx_pydot.pydot_layout(G)
    >>> pos = nx.nx_pydot.pydot_layout(G, prog='dot')
    iÿÿÿÿNRe   Rd   R   s   Graphviz layout with %s faileds   To debug what happened try:s   P=pydot_from_networkx(G)s   P.write_dot("file.dot")s   And then run %s on file.doti    i   t   ,(    (   R   R   R   t   setR   t
   create_dotR   R   RT   R$   t   get_nodeR-   t   listt   get_post   splitt   float(   R   Rd   Re   Rf   R   R   R`   t   Qt   node_posR6   t
   pydot_nodeR   t   post   xxt   yy(    (    sm   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/drawing/nx_pydot.pyR   û   s2    		#c         C   sD   d d l  m } y d d  l } Wn t k
 r? | d ƒ ‚ n Xd  S(   Niÿÿÿÿ(   t   SkipTests   pydotplus not available(   t   noseRu   R   t   ImportError(   t   moduleRu   R   (    (    sm   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/drawing/nx_pydot.pyt   setup_module&  s
    (   t   __doc__t	   importlibt   networkx.utilsR    R   t   networkxR   t   __all__R.   t	   NameErrort   strR   R   R   R   R   R_   R   Rb   R   R   Ry   (    (    (    sm   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/drawing/nx_pydot.pyt   <module>   s$   	

	Y>	+