ó ŸÃÒYc@sÞdZddlZddlmZddlmZmZddddgZd „Z ed d d ƒd „ƒZ eddƒde d„ƒZ edd dƒde d„ƒZd„Zd„Zd„Zd„Zd„ZdS(s7Functions for reading and writing graphs in the *graph6* format. The *graph6* file format is suitable for small graphs or large dense graphs. For large sparse graphs, use the *sparse6* format. For more information, see the `graph6`_ homepage. .. _graph6: http://users.cecs.anu.edu.au/~bdm/data/formats.html iÿÿÿÿN(t NetworkXError(t open_filetnot_implemented_fort read_graph6t parse_graph6tgenerate_graph6t write_graph6cs>‡fd†}|jdƒr+|d}nt|ƒ‰tˆƒ\}‰||dddd}tˆƒ|kr¤td||ddtˆƒdfƒ‚ntjƒ}|jt|ƒƒxtt gtd|ƒD]%}t|ƒD]}||f^qéqÙ|ƒƒD]+\\}}}|r |j ||ƒq q W|S( sNRead a simple undirected graph in graph6 format from string. Parameters ---------- string : string Data in graph6 format Returns ------- G : Graph Raises ------ NetworkXError If the string is unable to be parsed in graph6 format Examples -------- >>> G = nx.parse_graph6('A_') >>> sorted(G.edges()) [(0, 1)] See Also -------- generate_graph6, read_graph6, write_graph6 References ---------- .. [1] Graph6 specification c3sEx>ˆD]6}x-ddddddgD]}||?d@Vq&WqWdS(sTReturn sequence of individual bits from 6-bit-per-value list of data values.iiiiiiN((tdti(tdata(so/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/readwrite/graph6.pytbits?s s >>graph6<>> nx.write_graph6(nx.Graph([(0,1)]), 'test.g6') >>> G = nx.read_graph6('test.g6') >>> sorted(G.edges()) [(0, 1)] See Also -------- generate_graph6, parse_graph6, write_graph6 References ---------- .. [1] Graph6 specification iiN(tstripRtappendR(tpathtglisttline((so/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/readwrite/graph6.pyRWs$   tdirectedt multigraphc s&|dk rˆj|ƒ‰ntjˆƒ}t|jƒƒ‰‡‡‡fd†}ˆjƒ‰tˆƒ}d}t}xrt t ˆˆƒ|ƒƒD]T\}} || d|d>O}t }|ddkr•|j |ƒd}t}q•q•W|r|j |ƒnt |ƒ} |r"d| } n| S(sÏGenerate graph6 format string from a simple 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 '>>graph6<<' string to head of data Returns ------- s : string String in graph6 format Raises ------ NetworkXError If the graph is directed or has parallel edges Examples -------- >>> G = nx.Graph([(0, 1)]) >>> nx.generate_graph6(G) '>>graph6< c3sixbgtdˆƒD]%}t|ƒD]}||f^q#qD]%\}}ˆjˆ|ˆ|ƒVq<WdS(Ni(Rthas_edge(RR(RRtns(so/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/readwrite/graph6.pyR ¸sHiiis >>graph6<>graph6<<' string to head of data Raises ------ NetworkXError If the graph is directed or has parallel edges Examples -------- >>> G = nx.Graph([(0, 1)]) >>> nx.write_graph6(G, 'test.g6') See Also -------- generate_graph6, parse_graph6, read_graph6 Notes ----- The format does not support edge or node labels, parallel edges or self loops. If self loops are present they are silently ignored. References ---------- .. [1] Graph6 specification R*R0s N(twriteR(RRR*R0((so/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/readwrite/graph6.pyRÐs+cCsag|D]}t|ƒd^q}t|ƒdkr]t|ƒdksYt|ƒdkr]dS|S(s4Convert graph6 character sequence to 6-bit integers.i?iN(tordRtmintmaxR&(Rtctv((so/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/readwrite/graph6.pyR s#6cCsot|ƒdkrEt|ƒdks6t|ƒdkrEtdƒ‚ndjg|D]}t|dƒ^qRƒS(s<Convert 6-bit integer sequence to graph6 character sequence.ii?s&graph6 data units must be within 0..63t(RR7R8Rtjointchr(R R((so/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/readwrite/graph6.pyR/s6cCsª|ddkr"|d|dfS|ddkr\|dd>|dd>|d|dfS|dd >|dd >|dd >|d d>|dd>|d |dfS(spRead initial one-, four- or eight-unit value from graph6 integer sequence. Return (value, rest of seq.)ii>ii iiiiiiiiii((R ((so/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/readwrite/graph6.pyR s *c CsÂ|dkrtdƒ‚n|dkr.|gS|dkr^d|d?d@|d?d@|d@gS|dkr²dd|d ?d@|d ?d@|d ?d@|d?d@|d?d@|d@gStd ƒ‚d S(s@Convert an integer to one-, four- or eight-unit graph6 sequence.is.Numbers in graph6 format must be non-negative.i>iÿïi?i iIÿÿÿÿiiis5Numbers above 68719476735 are not supported by graph6N(R(R((so/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/readwrite/graph6.pyR,s   $ !!cCs2ddl}|jjdƒr.|jdƒndS(Niÿÿÿÿstest.g6(tosRtisfiletunlink(tmoduleR>((so/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/readwrite/graph6.pytteardown_module(s (t__doc__tnetworkxRtnetworkx.exceptionRtnetworkx.utilsRRt__all__RRR&R.RRR R/R R,RB(((so/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/readwrite/graph6.pyts  9/ I/