| | """ |
| | Read graphs in LEDA format. |
| | |
| | LEDA is a C++ class library for efficient data types and algorithms. |
| | |
| | Format |
| | ------ |
| | See http://www.algorithmic-solutions.info/leda_guide/graphs/leda_native_graph_fileformat.html |
| | |
| | """ |
| | |
| | |
| |
|
| | __all__ = ["read_leda", "parse_leda"] |
| |
|
| | import networkx as nx |
| | from networkx.exception import NetworkXError |
| | from networkx.utils import open_file |
| |
|
| |
|
| | @open_file(0, mode="rb") |
| | @nx._dispatchable(graphs=None, returns_graph=True) |
| | def read_leda(path, encoding="UTF-8"): |
| | """Read graph in LEDA format from path. |
| | |
| | Parameters |
| | ---------- |
| | path : file or string |
| | Filename or file handle to read. |
| | Filenames ending in .gz or .bz2 will be decompressed. |
| | |
| | Returns |
| | ------- |
| | G : NetworkX graph |
| | |
| | Examples |
| | -------- |
| | >>> G = nx.read_leda("file.leda") # doctest: +SKIP |
| | |
| | References |
| | ---------- |
| | .. [1] http://www.algorithmic-solutions.info/leda_guide/graphs/leda_native_graph_fileformat.html |
| | """ |
| | lines = (line.decode(encoding) for line in path) |
| | G = parse_leda(lines) |
| | return G |
| |
|
| |
|
| | @nx._dispatchable(graphs=None, returns_graph=True) |
| | def parse_leda(lines): |
| | """Read graph in LEDA format from string or iterable. |
| | |
| | Parameters |
| | ---------- |
| | lines : string or iterable |
| | Data in LEDA format. |
| | |
| | Returns |
| | ------- |
| | G : NetworkX graph |
| | |
| | Examples |
| | -------- |
| | >>> G = nx.parse_leda(string) # doctest: +SKIP |
| | |
| | References |
| | ---------- |
| | .. [1] http://www.algorithmic-solutions.info/leda_guide/graphs/leda_native_graph_fileformat.html |
| | """ |
| | if isinstance(lines, str): |
| | lines = iter(lines.split("\n")) |
| | lines = iter( |
| | [ |
| | line.rstrip("\n") |
| | for line in lines |
| | if not (line.startswith(("#", "\n")) or line == "") |
| | ] |
| | ) |
| | for i in range(3): |
| | next(lines) |
| | |
| | du = int(next(lines)) |
| | if du == -1: |
| | G = nx.DiGraph() |
| | else: |
| | G = nx.Graph() |
| |
|
| | |
| | n = int(next(lines)) |
| | node = {} |
| | for i in range(1, n + 1): |
| | symbol = next(lines).rstrip().strip("|{}| ") |
| | if symbol == "": |
| | symbol = str(i) |
| | node[i] = symbol |
| |
|
| | G.add_nodes_from([s for i, s in node.items()]) |
| |
|
| | |
| | m = int(next(lines)) |
| | for i in range(m): |
| | try: |
| | s, t, reversal, label = next(lines).split() |
| | except BaseException as err: |
| | raise NetworkXError(f"Too few fields in LEDA.GRAPH edge {i + 1}") from err |
| | |
| | G.add_edge(node[int(s)], node[int(t)], label=label[2:-2]) |
| | return G |
| |
|