Mercurial > repos > shellac > guppy_basecaller
diff env/lib/python3.7/site-packages/networkx/readwrite/graph6.py @ 5:9b1c78e6ba9c draft default tip
"planemo upload commit 6c0a8142489327ece472c84e558c47da711a9142"
| author | shellac |
|---|---|
| date | Mon, 01 Jun 2020 08:59:25 -0400 |
| parents | 79f47841a781 |
| children |
line wrap: on
line diff
--- a/env/lib/python3.7/site-packages/networkx/readwrite/graph6.py Thu May 14 16:47:39 2020 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,410 +0,0 @@ -# Original author: D. Eppstein, UC Irvine, August 12, 2003. -# The original code at http://www.ics.uci.edu/~eppstein/PADS/ is public domain. -# Copyright (C) 2004-2019 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# Tomas Gavenciak <gavento@ucw.cz> -# All rights reserved. -# BSD license. -# -# Authors: Tomas Gavenciak <gavento@ucw.cz> -# Aric Hagberg <aric.hagberg@lanl.gov> -"""Functions 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 - -""" -from itertools import islice -import sys - -import networkx as nx -from networkx.exception import NetworkXError -from networkx.utils import open_file, not_implemented_for - -__all__ = ['from_graph6_bytes', 'read_graph6', 'to_graph6_bytes', - 'write_graph6'] - - -def _generate_graph6_bytes(G, nodes, header): - """Yield bytes in the graph6 encoding of a graph. - - `G` is an undirected simple graph. `nodes` is the list of nodes for - which the node-induced subgraph will be encoded; if `nodes` is the - list of all nodes in the graph, the entire graph will be - encoded. `header` is a Boolean that specifies whether to generate - the header ``b'>>graph6<<'`` before the remaining data. - - This function generates `bytes` objects in the following order: - - 1. the header (if requested), - 2. the encoding of the number of nodes, - 3. each character, one-at-a-time, in the encoding of the requested - node-induced subgraph, - 4. a newline character. - - This function raises :exc:`ValueError` if the graph is too large for - the graph6 format (that is, greater than ``2 ** 36`` nodes). - - """ - n = len(G) - if n >= 2 ** 36: - raise ValueError('graph6 is only defined if number of nodes is less ' - 'than 2 ** 36') - if header: - yield b'>>graph6<<' - for d in n_to_data(n): - yield str.encode(chr(d + 63)) - # This generates the same as `(v in G[u] for u, v in combinations(G, 2))`, - # but in "column-major" order instead of "row-major" order. - bits = (nodes[j] in G[nodes[i]] for j in range(1, n) for i in range(j)) - chunk = list(islice(bits, 6)) - while chunk: - d = sum(b << 5 - i for i, b in enumerate(chunk)) - yield str.encode(chr(d + 63)) - chunk = list(islice(bits, 6)) - yield b'\n' - - -def from_graph6_bytes(string): - """Read a simple undirected graph in graph6 format from string. - - Parameters - ---------- - string : string - Data in graph6 format, without a trailing newline. - - Returns - ------- - G : Graph - - Raises - ------ - NetworkXError - If the string is unable to be parsed in graph6 format - - ValueError - If any character ``c`` in the input string does not satisfy - ``63 <= ord(c) < 127``. - - Examples - -------- - >>> G = nx.from_graph6_bytes(b'A_') - >>> sorted(G.edges()) - [(0, 1)] - - See Also - -------- - read_graph6, write_graph6 - - References - ---------- - .. [1] Graph6 specification - <http://users.cecs.anu.edu.au/~bdm/data/formats.html> - - """ - def bits(): - """Returns sequence of individual bits from 6-bit-per-value - list of data values.""" - for d in data: - for i in [5, 4, 3, 2, 1, 0]: - yield (d >> i) & 1 - - if string.startswith(b'>>graph6<<'): - string = string[10:] - - if sys.version_info < (3, ): - data = [ord(c) - 63 for c in string] - else: - data = [c - 63 for c in string] - if any(c > 63 for c in data): - raise ValueError('each input character must be in range(63, 127)') - - n, data = data_to_n(data) - nd = (n * (n - 1) // 2 + 5) // 6 - if len(data) != nd: - raise NetworkXError( - 'Expected %d bits but got %d in graph6' % (n * (n - 1) // 2, len(data) * 6)) - - G = nx.Graph() - G.add_nodes_from(range(n)) - for (i, j), b in zip([(i, j) for j in range(1, n) for i in range(j)], bits()): - if b: - G.add_edge(i, j) - - return G - - -def to_graph6_bytes(G, nodes=None, header=True): - """Convert a simple undirected graph to bytes in graph6 format. - - 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<<' bytes to head of data. - - Raises - ------ - NetworkXNotImplemented - If the graph is directed or is a multigraph. - - ValueError - If the graph has at least ``2 ** 36`` nodes; the graph6 format - is only defined for graphs of order less than ``2 ** 36``. - - Examples - -------- - >>> nx.to_graph6_bytes(nx.path_graph(2)) # doctest: +SKIP - b'>>graph6<<A_\\n' - - See Also - -------- - from_graph6_bytes, read_graph6, write_graph6_bytes - - Notes - ----- - The returned bytes end with a newline character. - - 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 - <http://users.cecs.anu.edu.au/~bdm/data/formats.html> - - """ - if nodes is not None: - G = G.subgraph(nodes) - H = nx.convert_node_labels_to_integers(G) - nodes = sorted(H.nodes()) - return b''.join(_generate_graph6_bytes(H, nodes, header)) - - -@open_file(0, mode='rb') -def read_graph6(path): - """Read simple undirected graphs in graph6 format from path. - - Parameters - ---------- - path : file or string - File or filename to write. - - Returns - ------- - G : Graph or list of Graphs - If the file contains multiple lines then a list of graphs is returned - - Raises - ------ - NetworkXError - If the string is unable to be parsed in graph6 format - - Examples - -------- - You can read a graph6 file by giving the path to the file:: - - >>> import tempfile - >>> with tempfile.NamedTemporaryFile() as f: - ... _ = f.write(b'>>graph6<<A_\\n') - ... _ = f.seek(0) - ... G = nx.read_graph6(f.name) - >>> list(G.edges()) - [(0, 1)] - - You can also read a graph6 file by giving an open file-like object:: - - >>> import tempfile - >>> with tempfile.NamedTemporaryFile() as f: - ... _ = f.write(b'>>graph6<<A_\\n') - ... _ = f.seek(0) - ... G = nx.read_graph6(f) - >>> list(G.edges()) - [(0, 1)] - - See Also - -------- - from_graph6_bytes, write_graph6 - - References - ---------- - .. [1] Graph6 specification - <http://users.cecs.anu.edu.au/~bdm/data/formats.html> - - """ - glist = [] - for line in path: - line = line.strip() - if not len(line): - continue - glist.append(from_graph6_bytes(line)) - if len(glist) == 1: - return glist[0] - else: - return glist - - -@not_implemented_for('directed') -@not_implemented_for('multigraph') -@open_file(1, mode='wb') -def write_graph6(G, path, nodes=None, header=True): - """Write a simple undirected graph to a path in graph6 format. - - Parameters - ---------- - G : Graph (undirected) - - path : str - The path naming the file to which to write the graph. - - 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 - - Raises - ------ - NetworkXNotImplemented - If the graph is directed or is a multigraph. - - ValueError - If the graph has at least ``2 ** 36`` nodes; the graph6 format - is only defined for graphs of order less than ``2 ** 36``. - - Examples - -------- - You can write a graph6 file by giving the path to a file:: - - >>> import tempfile - >>> with tempfile.NamedTemporaryFile() as f: - ... nx.write_graph6(nx.path_graph(2), f.name) - ... _ = f.seek(0) - ... print(f.read()) # doctest: +SKIP - b'>>graph6<<A_\\n' - - See Also - -------- - from_graph6_bytes, read_graph6 - - Notes - ----- - The function writes a newline character after writing the encoding - of the graph. - - 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 - <http://users.cecs.anu.edu.au/~bdm/data/formats.html> - - """ - return write_graph6_file(G, path, nodes=nodes, header=header) - - -@not_implemented_for('directed') -@not_implemented_for('multigraph') -def write_graph6_file(G, f, nodes=None, header=True): - """Write a simple undirected graph to a file-like object in graph6 format. - - Parameters - ---------- - G : Graph (undirected) - - f : file-like object - The file 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 '>>graph6<<' string to head of data - - Raises - ------ - NetworkXNotImplemented - If the graph is directed or is a multigraph. - - ValueError - If the graph has at least ``2 ** 36`` nodes; the graph6 format - is only defined for graphs of order less than ``2 ** 36``. - - Examples - -------- - You can write a graph6 file by giving an open file-like object:: - - >>> import tempfile - >>> with tempfile.NamedTemporaryFile() as f: - ... nx.write_graph6(nx.path_graph(2), f) - ... _ = f.seek(0) - ... print(f.read()) # doctest: +SKIP - b'>>graph6<<A_\\n' - - See Also - -------- - from_graph6_bytes, read_graph6 - - Notes - ----- - The function writes a newline character after writing the encoding - of the graph. - - 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 - <http://users.cecs.anu.edu.au/~bdm/data/formats.html> - - """ - if nodes is not None: - G = G.subgraph(nodes) - H = nx.convert_node_labels_to_integers(G) - nodes = sorted(H.nodes()) - for b in _generate_graph6_bytes(H, nodes, header): - f.write(b) - - -def data_to_n(data): - """Read initial one-, four- or eight-unit value from graph6 - integer sequence. - - Return (value, rest of seq.)""" - if data[0] <= 62: - return data[0], data[1:] - if data[1] <= 62: - return (data[1] << 12) + (data[2] << 6) + data[3], data[4:] - return ((data[2] << 30) + (data[3] << 24) + (data[4] << 18) + - (data[5] << 12) + (data[6] << 6) + data[7], data[8:]) - - -def n_to_data(n): - """Convert an integer to one-, four- or eight-unit graph6 sequence. - - This function is undefined if `n` is not in ``range(2 ** 36)``. - - """ - if n <= 62: - return [n] - elif n <= 258047: - return [63, (n >> 12) & 0x3f, (n >> 6) & 0x3f, n & 0x3f] - else: # if n <= 68719476735: - return [63, 63, - (n >> 30) & 0x3f, (n >> 24) & 0x3f, (n >> 18) & 0x3f, - (n >> 12) & 0x3f, (n >> 6) & 0x3f, n & 0x3f]
