ó
 ,µ[c           @   s°   d  Z  d d l Z d d l Z d d l m Z m Z m Z d d d d g Z d „  Z	 e d	 d
 d ƒd d „ ƒ Z
 e d d
 d ƒd d „ ƒ Z d „  Z d „  Z d „  Z d S(   s
  
*****
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.

iÿÿÿÿN(   t   is_string_liket	   open_filet   make_strt
   read_pajekt   parse_pajekt   generate_pajekt   write_pajekc      	   c   sµ  |  j  d k r d } n	 |  j  } d |  j ƒ  Vt |  ƒ } t t | t d t | ƒ d ƒ ƒ ƒ } x8| D]0} |  j j | i  ƒ j	 ƒ  } | j
 d d ƒ } | j
 d d ƒ } t | j
 d | | ƒ ƒ } | | | <| j
 d	 d
 ƒ }	 d j t t | | | | |	 f ƒ ƒ }
 x„ | j ƒ  D]v \ } } t | ƒ ri| j ƒ  d k ri|
 d t | ƒ t | ƒ f 7}
 qt j d | t | ƒ r‡d n d f ƒ qW|
 Vqk W|  j ƒ  r³d Vn d Vxö |  j d t ƒ D]â \ } } } | j	 ƒ  } | j
 d d ƒ } d j t t | | | | | f ƒ ƒ }
 x„ | j ƒ  D]v \ } } t | ƒ r{| j ƒ  d k r{|
 d t | ƒ t | ƒ f 7}
 q.t j d | t | ƒ r™d n d f ƒ q.W|
 VqËWd S(   sð   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.
    t    t   NetworkXs   *vertices %si   t   xg        t   yt   idt   shapet   ellipset    s    %s %ss'   Node attribute %s is not processed. %s.s   Empty attributes   Non-string attributes   *arcss   *edgest   datat   weightg      ð?s'   Edge attribute %s is not processed. %s.N(   t   namet   ordert   listt   dictt   zipt   ranget   lent   nodest   gett   copyt   popt   intt   joint   mapt	   make_qstrt   itemsR    t   stript   warningst   warnt   is_directedt   edgest   True(   t   GR   R   t
   nodenumbert   nt   naR	   R
   R   R   t   st   kt   vt   ut   edgedatat   dt   value(    (    s7   lib/python2.7/site-packages/networkx/readwrite/pajek.pyR   !   sJ    		(
'#		")#	i   t   modet   wbs   UTF-8c         C   s;   x4 t  |  ƒ D]& } | d 7} | j | j | ƒ ƒ q Wd S(   s°  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.
    s   
N(   R   t   writet   encode(   R'   t   patht   encodingt   line(    (    s7   lib/python2.7/site-packages/networkx/readwrite/pajek.pyR   d   s    
i    t   rbc            s    ‡  f d †  |  Dƒ } t  | ƒ S(   sT  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   |  ] } | j  ˆ  ƒ Vq d  S(   N(   t   decode(   t   .0R8   (   R7   (    s7   lib/python2.7/site-packages/networkx/readwrite/pajek.pys	   <genexpr>¢   s    (   R   (   R6   R7   t   lines(    (   R7   s7   lib/python2.7/site-packages/networkx/readwrite/pajek.pyR   …   s    c            s   d d l  } t |  ƒ r0 t |  j d ƒ ƒ }  n  t g  |  D] } | j d ƒ ^ q: ƒ }  t j ƒ  } g  ‰  x/|  r›y t |  ƒ } Wn Pn X| j ƒ  j	 d ƒ rã y | j d d ƒ \ } } Wn t k
 rÒ q˜X| | j d <qm | j ƒ  j	 d ƒ ri  } | j ƒ  \ } } x…t t | ƒ ƒ D]W}	 t |  ƒ } y> g  | j t | ƒ j d ƒ ƒ D] }
 |
 j d ƒ ^ qW} Wn& t k
 r›| j t | ƒ ƒ } n X| d	 d
 !\ } } ˆ  j | ƒ | j | ƒ | | | <| | j | d <yO | d
 d !\ }
 } } | j | j i t |
 ƒ d 6t | ƒ d 6| d 6ƒ Wn n Xt | d d d
 … | d d d
 … ƒ } | j | j | ƒ q#Wqm | j ƒ  j	 d ƒ s«| j ƒ  j	 d ƒ rH| j ƒ  j	 d ƒ rÒt j | ƒ } n  | j ƒ  j	 d ƒ rö| j ƒ  } n  xŸ|  D]D} y> g  | j t | ƒ j d ƒ ƒ D] }
 |
 j d ƒ ^ q%} Wn& t k
 ri| j t | ƒ ƒ } n Xt | ƒ d
 k  r‚qýn  | d	 d
 !\ } } | j | | ƒ } | j | | ƒ } i  } y/ | d
 d !} | j i t | d	 ƒ d 6ƒ Wn n Xt | d d d
 … | d d d
 … ƒ } | j | ƒ | j | | |  qýWqm | j ƒ  j	 d ƒ rm t j | ƒ } ‡  f d †  t  |  ƒ Dƒ } | j! | ƒ qm qm W| S(   sî   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()

    iÿÿÿÿNs   
s   *networki   R   s	   *verticess   utf-8i    i   R   i   R	   R
   R   i   s   *edgess   *arcss   *edgei   R   i   s   *matrixc         3   sj   |  ]` \ } } t  | j ƒ  ƒ D]A \ } } t | ƒ d  k r ˆ  | ˆ  | i t | ƒ d 6f Vq q d S(   i    R   N(   t	   enumeratet   splitR   (   R;   t   rowR8   t   colR   (   t   labels(    s7   lib/python2.7/site-packages/networkx/readwrite/pajek.pys	   <genexpr>  s   	("   t   shlexR    t   iterR>   t   rstript   nxt   MultiDiGrapht   nextt   lowert
   startswitht   Nonet
   ValueErrort   graphR   R   R   R5   R:   t   AttributeErrort   strt   appendt   add_nodeR   t   updatet   floatR   t
   MultiGrapht   to_directedR   R   t   add_edget   DiGraphR=   t   add_edges_from(   R<   RB   R8   R'   t   lt   labelR   t
   nodelabelst   nnodest   iR	   t	   splitlineR   R
   R   t
   extra_attrt   uit   viR.   R-   t	   edge_datat   wt   adj_list(    (   RA   s7   lib/python2.7/site-packages/networkx/readwrite/pajek.pyR   ¦   s    (	;
)*;")c         C   s8   t  |  ƒ s t |  ƒ }  n  d |  k r4 d |  }  n  |  S(   sb   Return the string representation of t.
    Add outer double-quotes if the string has a space.
    R   s   "%s"(   R    RN   (   t   t(    (    s7   lib/python2.7/site-packages/networkx/readwrite/pajek.pyR     s
    c         C   s   d d  l  } | j d ƒ d  S(   Niÿÿÿÿs   test.net(   t   ost   unlink(   t   moduleRe   (    (    s7   lib/python2.7/site-packages/networkx/readwrite/pajek.pyt   teardown_module  s    (   t   __doc__R"   t   networkxRE   t   networkx.utilsR    R   R   t   __all__R   R   R   R   R   Rh   (    (    (    s7   lib/python2.7/site-packages/networkx/readwrite/pajek.pyt   <module>   s   	C  	j	