ó
|£*^c           @   sî   d  Z  d d l Z d d l m Z d d l m Z m Z d d l m	 Z	 m
 Z
 m Z m Z d j d d g ƒ Z d	 d
 d d g Z d „  Z e d d d ƒd „  ƒ Z e d ƒ d e d „ ƒ Z e d d d ƒd e d „ ƒ Z d „  Z d S(   s@  Sparse6

Read and write graphs in sparse6 format.

Format
------

"graph6 and sparse6 are formats for storing undirected graphs in a
compact manner, using only printable ASCII characters. Files in these
formats have text type and contain one line per graph."

See http://cs.anu.edu.au/~bdm/data/formats.txt for details.
iÿÿÿÿN(   t   NetworkXError(   t	   open_filet   not_implemented_for(   t   data_to_graph6t   graph6_to_datat	   data_to_nt	   n_to_datas   
s    Tomas Gavenciak <gavento@ucw.cz>s#   Aric Hagberg <aric.hagberg@lanl.govt   read_sparse6t   parse_sparse6t   generate_sparse6t   write_sparse6c            se  |  j  d ƒ r |  d }  n  |  j  d ƒ s: t d ƒ ‚ n  t t |  d ƒ ƒ \ } ‰  d ‰ x d ˆ >| k  r| ˆ d 7‰ q_ W‡  ‡ f d †  } d } t j ƒ  } | j t | ƒ ƒ t } xŒ | ƒ  D]� \ } } | d k ré | d 7} n  | | k s| | k rPqÄ | | k r| } qÄ | j	 | | ƒ r5t
 } n  | j | | ƒ qÄ W| sat j | ƒ } n  | S(   sD  Read an undirected graph in sparse6 format from string.

    Parameters
    ----------
    string : string
       Data in sparse6 format

    Returns
    -------
    G : Graph

    Raises
    ------
    NetworkXError
        If the string is unable to be parsed in sparse6 format

    Examples
    --------
    >>> G = nx.parse_sparse6(':A_')
    >>> sorted(G.edges())
    [(0, 1), (0, 1), (0, 1)]

    See Also
    --------
    generate_sparse6, read_sparse6, write_sparse6

    References
    ----------
    Sparse6 specification: http://cs.anu.edu.au/~bdm/data/formats.txt
    s   >>sparse6<<i   t   :s!   Expected leading colon in sparse6i   c          3   sÔ   t  ˆ  ƒ }  d } d } xµ | d k  r< t |  ƒ } d } n  | d 8} | | ?d @} | d | >d @} | } x: | ˆ k  r¨ t |  ƒ } d } | d >| } | d 7} qo W| | ˆ ?} | ˆ } | | f Vq Wd S(   s5   Return stream of pairs b[i], x[i] for sparse6 format.i    i   i   N(   t   itert   Nonet   next(   t   chunkst   dt   dLent   bt   xt   xLen(   t   datat   k(    sn   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/readwrite/sparse6.pyt	   parseDataI   s&    	

i    (   t
   startswithR    R   R   t   nxt
   MultiGrapht   add_nodes_fromt   ranget   Falset   has_edget   Truet   add_edget   Graph(   t   stringt   nR   t   vt   Gt
   multigraphR   R   (    (   R   R   sn   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/readwrite/sparse6.pyR   !   s4    		i    t   modet   rtc         C   sj   g  } x? |  D]7 } | j  ƒ  } t | ƒ s1 q n  | j t | ƒ ƒ q Wt | ƒ d k rb | d S| Sd S(   s÷  Read an undirected graph in sparse6 format from path.

    Parameters
    ----------
    path : file or string
       File or filename to write.

    Returns
    -------
    G : Graph/Multigraph or list of Graphs/MultiGraphs
       If the file contains multple lines then a list of graphs is returned

    Raises
    ------
    NetworkXError
        If the string is unable to be parsed in sparse6 format

    Examples
    --------
    >>> nx.write_sparse6(nx.Graph([(0,1),(0,1),(0,1)]), 'test.s6')
    >>> G = nx.read_sparse6('test.s6')
    >>> sorted(G.edges())
    [(0, 1)]

    See Also
    --------
    generate_sparse6, read_sparse6, parse_sparse6

    References
    ----------
    Sparse6 specification: http://cs.anu.edu.au/~bdm/data/formats.txt
    i   i    N(   t   stript   lent   appendR   (   t   patht   glistt   line(    (    sn   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/readwrite/sparse6.pyR   w   s    "t   directedc            s.  |  j  ƒ  } d ‰  x d ˆ  >| k  r2 ˆ  d 7‰  q W‡  f d †  } | d k rc t |  j ƒ  ƒ ‰ n t | ƒ ‰ t ‡ f d †  t t ˆ ƒ ƒ Dƒ ƒ } g  |  j ƒ  D]  \ } } | | | | f ^ q¤ } g  | D]* \ } } t | | ƒ t	 | | ƒ f ^ qÑ } | j
 ƒ  g  }	 d }
 xÆ | D]¾ \ } } | |
 k rY|	 j d ƒ |	 j | | ƒ ƒ q| |
 d k r–|
 d 7}
 |	 j d ƒ |	 j | | ƒ ƒ q| }
 |	 j d ƒ |	 j | | ƒ ƒ |	 j d ƒ |	 j | | ƒ ƒ qWˆ  d k  rR| d ˆ  >k rRt |	 ƒ d ˆ  k rR|
 | d k  rR|	 j d ƒ |	 j d g t |	 ƒ d ƒ n |	 j d g t |	 ƒ d ƒ g  t d t |	 ƒ d ƒ D]h } |	 | d d >|	 | d d >|	 | d d	 >|	 | d	 d >|	 | d d >|	 | d d >^ qŠ} d
 t t | ƒ ƒ t | ƒ } | r&d | S| Sd S(   sm  Generate sparse6 format string from an undirected graph.

    Parameters
    ----------
    G : Graph (undirected)

    nodes: list or iterable
       Nodes are labeled 0...n-1 in the order provided.  If None the ordering
       given by G.nodes() is used.

    header: bool
       If True add '>>sparse6<<' string to head of data

    Returns
    -------
    s : string
       String in sparse6 format

    Raises
    ------
    NetworkXError
        If the graph is directed

    Examples
    --------
    >>> G = nx.MultiGraph([(0, 1), (0, 1), (0, 1)])
    >>> nx.generate_sparse6(G)
    '>>sparse6<<:A_'

    See Also
    --------
    read_sparse6, parse_sparse6, write_sparse6

    Notes
    -----
    The format does not support edge or node labels.
    References
    ----------
    Sparse6 specification:
    http://cs.anu.edu.au/~bdm/data/formats.txt for details.
    i   c            s9   g  t  ˆ  ƒ D]( } |  d ˆ  d | >@r/ d n d ^ q S(   s   Big endian k-bit encoding of xi   i    (   R   (   R   t   i(   R   (    sn   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/readwrite/sparse6.pyt   encÔ   s    c         3   s   |  ] } ˆ  | | f Vq d  S(   N(    (   t   .0R0   (   t   ns(    sn   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/readwrite/sparse6.pys	   <genexpr>Ü   s    i    i   i   i   i   i   R   s   >>sparse6<<N(   t   orderR   t   listt   nodest   dictR   R*   t   edgest   maxt   mint   sortR+   t   extendR   R   (   R%   R6   t   headerR#   R1   t   ndictt   uR$   R8   t   bitst   curvR0   R   t   res(    (   R   R3   sn   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/readwrite/sparse6.pyR	   ¤   sL    +(37

C"„i   t   wtc         C   s0   | j  t |  d | d | ƒƒ | j  d ƒ d S(   sH  Write graph G to given path in sparse6 format.
    Parameters
    ----------
    G : Graph (undirected)

    path : file or string
       File or filename to write

    nodes: list or iterable
       Nodes are labeled 0...n-1 in the order provided.  If None the ordering
       given by G.nodes() is used.

    header: bool
       If True add '>>sparse6<<' string to head of data

    Raises
    ------
    NetworkXError
        If the graph is directed

    Examples
    --------
    >>> G = nx.Graph([(0, 1), (0, 1), (0, 1)])
    >>> nx.write_sparse6(G, 'test.s6')

    See Also
    --------
    read_sparse6, parse_sparse6, generate_sparse6

    Notes
    -----
    The format does not support edge or node labels.

    References
    ----------
    Sparse6 specification:
    http://cs.anu.edu.au/~bdm/data/formats.txt for details.
    R6   R=   s   
N(   t   writeR	   (   R%   R,   R6   R=   (    (    sn   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/readwrite/sparse6.pyR
     s    (c         C   s2   d d  l  } | j j d ƒ r. | j d ƒ n  d  S(   Niÿÿÿÿs   test.s6(   t   osR,   t   isfilet   unlink(   t   testRE   (    (    sn   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/readwrite/sparse6.pyt   teardown_module1  s    (   t   __doc__t   networkxR   t   networkx.exceptionR    t   networkx.utilsR   R   t   networkx.readwrite.graph6R   R   R   R   t   joint
   __author__t   __all__R   R   R   R   R	   R
   RI   (    (    (    sn   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/readwrite/sparse6.pyt   <module>   s   
"		V-	`+