o
    ˷e7                     @   s   d Z ddlZddlmZ ddlZddlmZ g dZedddd	d
 Z	eddddd Z
dd Zdd Zdd ZdddZdddZdS )a  
*****
Pydot
*****

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

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

Examples
--------
>>> G = nx.complete_graph(5)
>>> PG = nx.nx_pydot.to_pydot(G)
>>> H = nx.nx_pydot.from_pydot(PG)

See Also
--------
 - pydot:         https://github.com/erocarrera/pydot
 - Graphviz:      https://www.graphviz.org
 - DOT Language:  http://www.graphviz.org/doc/info/lang.html
    N)getpreferredencoding)	open_file)	write_dotread_dotgraphviz_layoutpydot_layoutto_pydot
from_pydot   w)modec                 C   s.   d}t j|tdd t| }||  dS )zgWrite NetworkX graph G to Graphviz dot format on path.

    Path can be a string or a file handle.
    znx.nx_pydot.write_dot depends on the pydot package, which hasknown issues and is not actively maintained. Consider usingnx.nx_agraph.write_dot instead.

See https://github.com/networkx/networkx/issues/5723   
stacklevelN)warningswarnPendingDeprecationWarningr   write	to_string)GpathmsgP r   P/var/www/ideatree/venv/lib/python3.10/site-packages/networkx/drawing/nx_pydot.pyr   &   s   r   rc                 C   s:   ddl }d}tj|tdd |  }||}t|d S )aO  Returns a NetworkX :class:`MultiGraph` or :class:`MultiDiGraph` from the
    dot file with the passed path.

    If this file contains multiple graphs, only the first such graph is
    returned. All graphs _except_ the first are silently ignored.

    Parameters
    ----------
    path : str or file
        Filename or file handle.

    Returns
    -------
    G : MultiGraph or MultiDiGraph
        A :class:`MultiGraph` or :class:`MultiDiGraph`.

    Notes
    -----
    Use `G = nx.Graph(nx.nx_pydot.read_dot(path))` to return a :class:`Graph` instead of a
    :class:`MultiGraph`.
    r   Nznx.nx_pydot.read_dot depends on the pydot package, which hasknown issues and is not actively maintained. Consider usingnx.nx_agraph.read_dot instead.

See https://github.com/networkx/networkx/issues/5723r   r   )pydotr   r   r   readgraph_from_dot_datar	   )r   r   r   dataP_listr   r   r   r   8   s   
r   c              	   C   s  d}t j|tdd | drd}nd}|  dkr&|r!t }nt }n|r-t }nt	 }| 
 d}|d	kr?||_|  D ]}|
 d}|d
v rQqC|j|fi |  qC|  D ]`}| }| }	| }
g }g }t|tr||d n|d D ]
}||d qt|	tr||	d n|	d D ]
}||d q|D ]}|D ]}|j||fi |
 qqqa|  }|r||jd< z|  d |jd< W n ttfy   Y nw z|  d |jd< W |S  ttfy   Y |S w )a  Returns 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))

    znx.nx_pydot.from_pydot depends on the pydot package, which hasknown issues and is not actively maintained.

See https://github.com/networkx/networkx/issues/5723r   r   NFTgraph" )noder!   edgenodesr   r$   r%   )r   r   r   
get_strictget_typenx
MultiGraphGraphMultiDiGraphDiGraphget_namestripnameget_node_listadd_nodeget_attributesget_edge_list
get_sourceget_destination
isinstancestrappendadd_edger!   get_node_defaults
IndexError	TypeErrorget_edge_defaults)r   r   
multiedgesNr0   pneuvattrsdunodesvnodessource_nodedestination_nodepattrr   r   r   r	   b   sn   






r	   c                 C   s    d| v o| d dkp| d dkS )N:r   r"   r   )rG   r   r   r   _check_colon_quotes   s    rP   c                 C   s  ddl }d}tj|tdd |  rd}nd}t| dko"|   }| j}| j	
di }|dkr=|jd||d	|}n|jd
| d
f||d	|}z|jdi | j	d  W n	 tyc   Y nw z|jdi | j	d  W n	 tyz   Y nw | jddD ]4\}}	dd |	 D }
t|}t|ptdd |
 D }|rtd|j|fi |
}|| q|  r	| jdddD ]D\}}}}dd | D }t|t|}}t|pt|ptdd | D }|rtd|j||fdt|i|}|| q|S | jddD ]C\}}}dd | D }t|t|}}t|p:t|p:tdd | D }|rBtd|j||fi |}|| q|S )a  Returns 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
    -----

    r   Nznx.nx_pydot.to_pydot depends on the pydot package, which hasknown issues and is not actively maintained.

See https://github.com/networkx/networkx/issues/5723r   r   digraphr!   r#   )
graph_typestrictr"   r$   r%   T)r   c                 S      i | ]\}}t |t |qS r   r8   .0krE   r   r   r   
<dictcomp>       zto_pydot.<locals>.<dictcomp>c                 s   $    | ]\}}t |pt |V  qd S NrP   rV   r   r   r   	<genexpr>  
    
zto_pydot.<locals>.<genexpr>zNode names and attributes should not contain ":" unless they are quoted with "".                For example the string 'attribute:data1' should be written as '"attribute:data1"'.                Please refer https://github.com/pydot/pydot/issues/258)r   keysc                 S   s&   i | ]\}}|d krt |t |qS )keyrU   rV   r   r   r   rY     s   & c                 s   r[   r\   r]   rW   rX   valr   r   r   r^     r_   a   Node names and attributes should not contain ":" unless they are quoted with "".                    For example the string 'attribute:data1' should be written as '"attribute:data1"'.                    Please refer https://github.com/pydot/pydot/issues/258ra   c                 S   rT   r   rU   rV   r   r   r   rY   (  rZ   c                 s   r[   r\   r]   rb   r   r   r   r^   .  r_   )r#   r   )r   r   r   r   is_directedr)   number_of_selfloopsis_multigraphr0   r!   getDotset_node_defaultsKeyErrorset_edge_defaultsr&   itemsr8   rP   any
ValueErrorNoder2   edgesEdger:   )r@   r   r   rR   rS   r0   graph_defaultsr   rB   nodedatastr_nodedataraise_errorrA   rD   rE   ra   edgedatastr_edgedatar%   r   r   r   r      s   




r   neatoc                 C   s"   d}t j|tdd t| ||dS )a=  Create node positions using Pydot and Graphviz.

    Returns a dictionary of positions keyed by node.

    Parameters
    ----------
    G : NetworkX Graph
        The graph for which the layout is computed.
    prog : string (default: 'neato')
        The name of the GraphViz program to use for layout.
        Options depend on GraphViz version but may include:
        'dot', 'twopi', 'fdp', 'sfdp', 'circo'
    root : Node from G or None (default: None)
        The node of G from which to start some layout algorithms.

    Returns
    -------
      Dictionary of (x, y) 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.
    znx.nx_pydot.graphviz_layout depends on the pydot package, which hasknown issues and is not actively maintained. Consider usingnx.nx_agraph.graphviz_layout instead.

See https://github.com/networkx/networkx/issues/5723r   r   )r   progroot)r   r   r   r   )r   ry   rz   r   r   r   r   r   ?  s   r   c                 C   sT  ddl }d}tj|tdd t| }|dur|dt| |j|d}t|t d}|d	krPt	d
| d t	  t	d t	d t	d t	d| d dS |
|}t|dks]J |d }	i }
|  D ]@}t|}t|rutd|| }|	|}t|tr|d }| dd }|dur|d\}}t|t|f|
|< qg|
S )a  Create node positions using :mod:`pydot` and Graphviz.

    Parameters
    ----------
    G : Graph
        NetworkX graph to be laid out.
    prog : string  (default: 'neato')
        Name of the GraphViz command to use for layout.
        Options depend on GraphViz version but may include:
        'dot', 'twopi', 'fdp', 'sfdp', 'circo'
    root : Node from G or None (default: None)
        The node of G from which to start some layout algorithms.

    Returns
    -------
    dict
        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")

    Notes
    -----
    If you use complex node objects, they may have the same string
    representation and GraphViz could treat them as the same node.
    The layout may assign both nodes a single location. See Issue #1568
    If this occurs in your case, consider relabeling the nodes just
    for the layout computation using something similar to::

        H = nx.convert_node_labels_to_integers(G, label_attribute='node_label')
        H_layout = nx.nx_pydot.pydot_layout(G, prog='dot')
        G_layout = {H.nodes[n]['node_label']: p for n, p in H_layout.items()}

    r   Nznx.nx_pydot.pydot_layout depends on the pydot package, which hasknown issues and is not actively maintained.

See https://github.com/networkx/networkx/issues/5723r   r   rz   )ry   )encodingr#   zGraphviz layout with z failedzTo debug what happened try:zP = nx.nx_pydot.to_pydot(G)zP.write_dot("file.dot")zAnd then run z on file.dotr
   zNode names and node attributes should not contain ":" unless they are quoted with "".                For example the string 'attribute:data1' should be written as '"attribute:data1"'.                Please refer https://github.com/pydot/pydot/issues/258rO   ,)r   r   r   r   r   setr8   
create_dotr   printr   lenr&   rP   rn   ro   r.   get_noder7   listget_possplitfloat)r   ry   rz   r   r   r   D_bytesDQ_listQnode_posrB   str_n
pydot_noder$   posxxyyr   r   r   r   h  sJ   &


r   )rx   N)__doc__r   localer   networkxr)   networkx.utilsr   __all__r   r   r	   rP   r   r   r   r   r   r   r   <module>   s    




)a
u)