U
    ¹mœd¼!  ã                   @   st   d Z ddlZddlZddlmZ ddddgZdd„ Zed	d
d�ddd„ƒZeddd�ddd„ƒZ	dd„ Z
dd„ ZdS )a
  
*****
Pajek
*****
Read graphs in Pajek format.

This implementation handles directed and undirected graphs including
those with self loops and parallel edges.

Format
------
See http://vlado.fmf.uni-lj.si/pub/networks/pajek/doc/draweps.htm
for format information.

é    N)Ú	open_fileÚ
read_pajekÚparse_pajekÚgenerate_pajekÚwrite_pajekc                 c   sV  | j dkrd}n| j }d|  ¡ › �V  t| ƒ}tt|tdt|ƒd ƒƒƒ}|D �]"}| j |i ¡ 	¡ }| 
dd¡}| 
dd¡}zt| 
d|| ¡ƒ}W n2 tk
rÈ }	 z|	 jd	7  _‚ W 5 d
}	~	X Y nX |||< | 
dd¡}
d tt|||||
fƒ¡}| ¡ D ]j\}}t|tƒ�r@| ¡ dk�r@|dt|ƒ› dt|ƒ› �7 }n(t d|› dt|tƒ�r\dnd› d�¡ �q |V  qN|  ¡ �r†dV  ndV  | jdd�D ]¸\}}}| 	¡ }| 
dd¡}d tt|| || |fƒ¡}| ¡ D ]j\}}t|tƒ�r| ¡ dk�r|dt|ƒ› dt|ƒ› �7 }n(t d|› dt|tƒ�r8dnd› d�¡ �qÜ|V  �q˜d
S )zðGenerate lines in Pajek graph format.

    Parameters
    ----------
    G : graph
       A Networkx graph

    References
    ----------
    See http://vlado.fmf.uni-lj.si/pub/networks/pajek/doc/draweps.htm
    for format information.
    Ú ZNetworkXz
*vertices é   Úxg        ÚyÚid)zSPajek format requires 'id' to be an int(). Refer to the 'Relabeling nodes' section.NÚshapeZellipseú zNode attribute z is not processed. zEmpty attributezNon-string attributeÚ.ú*arcsú*edgesT)ÚdataÚweightg      ð?zEdge attribute )ÚnameÚorderÚlistÚdictÚzipÚrangeÚlenÚnodesÚgetÚcopyÚpopÚintÚ
ValueErrorÚargsÚjoinÚmapÚ	make_qstrÚitemsÚ
isinstanceÚstrÚstripÚwarningsÚwarnZis_directedÚedges)ÚGr   r   Z
nodenumberÚnÚnar	   r
   r   Úerrr   ÚsÚkÚvÚuZedgedataÚdÚvalue© r5   úQ/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/networkx/readwrite/pajek.pyr      sN    

 ÿ
 ÿr   Úwb)ÚmodeúUTF-8c                 C   s*   t | ƒD ]}|d7 }| | |¡¡ qdS )a²  Write graph in Pajek format to path.

    Parameters
    ----------
    G : graph
       A Networkx graph
    path : file or string
       File or filename to write.
       Filenames ending in .gz or .bz2 will be compressed.

    Examples
    --------
    >>> G = nx.path_graph(4)
    >>> nx.write_pajek(G, "test.net")

    Warnings
    --------
    Optional node attributes and edge attributes must be non-empty strings.
    Otherwise it will not be written into the file. You will need to
    convert those attributes to strings if you want to keep them.

    References
    ----------
    See http://vlado.fmf.uni-lj.si/pub/networks/pajek/doc/draweps.htm
    for format information.
    Ú
N)r   ÚwriteÚencode)r+   ÚpathÚencodingÚliner5   r5   r6   r   c   s    Úrbc                    s   ‡ fdd„| D ƒ}t |ƒS )aZ  Read graph in Pajek format from path.

    Parameters
    ----------
    path : file or string
       File or filename to write.
       Filenames ending in .gz or .bz2 will be uncompressed.

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

    Examples
    --------
    >>> G = nx.path_graph(4)
    >>> nx.write_pajek(G, "test.net")
    >>> G = nx.read_pajek("test.net")

    To create a Graph instead of a MultiGraph use

    >>> G1 = nx.Graph(G)

    References
    ----------
    See http://vlado.fmf.uni-lj.si/pub/networks/pajek/doc/draweps.htm
    for format information.
    c                 3   s   | ]}|  ˆ ¡V  qd S )N©Údecode©Ú.0r?   ©r>   r5   r6   Ú	<genexpr>¡   s     zread_pajek.<locals>.<genexpr>)r   )r=   r>   Úlinesr5   rE   r6   r   „   s    c              	      sj  ddl }t| tƒr t|  d¡ƒ} tdd„ | D ƒƒ} t ¡ }g ‰ | �rfzt| ƒ}W n   Y �qfY nX | ¡  	d¡r¨z| dd¡\}}W n t
k
rš   Y nX ||jd< q>| ¡  	d	¡�rÚi }| ¡ \}}tt|ƒƒD �] }t| ƒ}z"d
d„ | t|ƒ d¡¡D ƒ}	W n$ tk
�r(   | t|ƒ¡}	Y nX |	dd… \}
}ˆ  |¡ | |¡ |||
< |
|j| d< z6|	dd… \}}}|j|  t|ƒt|ƒ|dœ¡ W n   Y nX t|	ddd… |	ddd… ƒ}|j|  |¡ qÔq>| ¡  	d¡�sú| ¡  	d¡�r,| ¡  	d¡�rt |¡}| ¡  	d¡�r,| ¡ }| D ]ø}z"dd„ | t|ƒ d¡¡D ƒ}	W n$ tk
�rz   | t|ƒ¡}	Y nX t|	ƒdk �rŽ�q0|	dd… \}}| ||¡}| ||¡}i }z&|	dd… }| dt|d ƒi¡ W n   Y nX t|	ddd… |	ddd… ƒ}| |¡ |j||f|Ž �q0q>| ¡  	d¡r>t |¡}‡ fdd„t| ƒD ƒ}| |¡ q>|S )zìParse Pajek format graph from string or iterable.

    Parameters
    ----------
    lines : string or iterable
       Data in Pajek format.

    Returns
    -------
    G : NetworkX graph

    See Also
    --------
    read_pajek

    r   Nr:   c                 S   s   g | ]}|  d ¡‘qS )r:   )ÚrstriprC   r5   r5   r6   Ú
<listcomp>»   s     zparse_pajek.<locals>.<listcomp>z*networkr   r   z	*verticesc                 S   s   g | ]}|  d ¡‘qS ©úutf-8rA   ©rD   r	   r5   r5   r6   rI   Ñ   s    rK   é   r   é   )r	   r
   r   é   r   r   z*edgec                 S   s   g | ]}|  d ¡‘qS rJ   rA   rL   r5   r5   r6   rI   í   s    é   r   é   z*matrixc                 3   sN   | ]F\}}t | ¡ ƒD ]0\}}t|ƒd krˆ | ˆ | dt|ƒifV  qqdS )r   r   N)Ú	enumerateÚsplitr   )rD   Úrowr?   Úcolr   ©Úlabelsr5   r6   rF   	  s
    ýzparse_pajek.<locals>.<genexpr>)Úshlexr%   r&   ÚiterrS   ÚnxZMultiDiGraphÚnextÚlowerÚ
startswithr   Úgraphr   r   r<   ÚAttributeErrorÚappendÚadd_noder   ÚupdateÚfloatr   Z
MultiGraphZto_directedr   r   Zadd_edgeZDiGraphrR   Zadd_edges_from)rG   rX   r+   ÚlÚlabelr   Z
nodelabelsZnnodesÚiZ	splitliner   r	   r
   r   Z
extra_attrZuiÚvir2   r1   Z	edge_dataÚwZadj_listr5   rV   r6   r   ¥   s–    
ÿ



ÿ 
ÿ



þc                 C   s*   t | tƒst| ƒ} d| kr&d| › d�} | S )zcReturns the string representation of t.
    Add outer double-quotes if the string has a space.
    r   ú")r%   r&   )Útr5   r5   r6   r#     s
    
r#   )r9   )r9   )Ú__doc__r(   ZnetworkxrZ   Znetworkx.utilsr   Ú__all__r   r   r   r   r#   r5   r5   r5   r6   Ú<module>   s   J
 
 o