Mercurial > repos > guerler > springsuite
comparison planemo/lib/python3.7/site-packages/networkx/generators/atlas.py @ 1:56ad4e20f292 draft
"planemo upload commit 6eee67778febed82ddd413c3ca40b3183a3898f1"
author | guerler |
---|---|
date | Fri, 31 Jul 2020 00:32:28 -0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
0:d30785e31577 | 1:56ad4e20f292 |
---|---|
1 # Copyright (C) 2004-2019 by | |
2 # Aric Hagberg <hagberg@lanl.gov> | |
3 # Dan Schult <dschult@colgate.edu> | |
4 # Pieter Swart <swart@lanl.gov> | |
5 # All rights reserved. | |
6 # BSD license. | |
7 # | |
8 # Author: | |
9 # Pieter Swart <swart@lanl.gov> | |
10 """ | |
11 Generators for the small graph atlas. | |
12 """ | |
13 import gzip | |
14 from itertools import islice | |
15 import os | |
16 import os.path | |
17 | |
18 import networkx as nx | |
19 | |
20 __all__ = ['graph_atlas', 'graph_atlas_g'] | |
21 | |
22 #: The total number of graphs in the atlas. | |
23 #: | |
24 #: The graphs are labeled starting from 0 and extending to (but not | |
25 #: including) this number. | |
26 NUM_GRAPHS = 1253 | |
27 | |
28 #: The absolute path representing the directory containing this file. | |
29 THIS_DIR = os.path.dirname(os.path.abspath(__file__)) | |
30 | |
31 #: The path to the data file containing the graph edge lists. | |
32 #: | |
33 #: This is the absolute filename of the gzipped text file containing the | |
34 #: edge list for each graph in the atlas. The file contains one entry | |
35 #: per graph in the atlas, in sequential order, starting from graph | |
36 #: number 0 and extending through graph number 1252 (see | |
37 #: :data:`NUM_GRAPHS`). Each entry looks like | |
38 #: | |
39 #: .. sourcecode:: text | |
40 #: | |
41 #: GRAPH 6 | |
42 #: NODES 3 | |
43 #: 0 1 | |
44 #: 0 2 | |
45 #: | |
46 #: where the first two lines are the graph's index in the atlas and the | |
47 #: number of nodes in the graph, and the remaining lines are the edge | |
48 #: list. | |
49 #: | |
50 #: This file was generated from a Python list of graphs via code like | |
51 #: the following:: | |
52 #: | |
53 #: import gzip | |
54 #: from networkx.generators.atlas import graph_atlas_g | |
55 #: from networkx.readwrite.edgelist import write_edgelist | |
56 #: | |
57 #: with gzip.open('atlas.dat.gz', 'wb') as f: | |
58 #: for i, G in enumerate(graph_atlas_g()): | |
59 #: f.write(bytes('GRAPH {}\n'.format(i), encoding='utf-8')) | |
60 #: f.write(bytes('NODES {}\n'.format(len(G)), encoding='utf-8')) | |
61 #: write_edgelist(G, f, data=False) | |
62 #: | |
63 ATLAS_FILE = os.path.join(THIS_DIR, 'atlas.dat.gz') | |
64 | |
65 | |
66 def _generate_graphs(): | |
67 """Sequentially read the file containing the edge list data for the | |
68 graphs in the atlas and generate the graphs one at a time. | |
69 | |
70 This function reads the file given in :data:`.ATLAS_FILE`. | |
71 | |
72 """ | |
73 with gzip.open(ATLAS_FILE, 'rb') as f: | |
74 line = f.readline() | |
75 while line and line.startswith(b'GRAPH'): | |
76 # The first two lines of each entry tell us the index of the | |
77 # graph in the list and the number of nodes in the graph. | |
78 # They look like this: | |
79 # | |
80 # GRAPH 3 | |
81 # NODES 2 | |
82 # | |
83 graph_index = int(line[6:].rstrip()) | |
84 line = f.readline() | |
85 num_nodes = int(line[6:].rstrip()) | |
86 # The remaining lines contain the edge list, until the next | |
87 # GRAPH line (or until the end of the file). | |
88 edgelist = [] | |
89 line = f.readline() | |
90 while line and not line.startswith(b'GRAPH'): | |
91 edgelist.append(line.rstrip()) | |
92 line = f.readline() | |
93 G = nx.Graph() | |
94 G.name = 'G{}'.format(graph_index) | |
95 G.add_nodes_from(range(num_nodes)) | |
96 G.add_edges_from(tuple(map(int, e.split())) for e in edgelist) | |
97 yield G | |
98 | |
99 | |
100 def graph_atlas(i): | |
101 """Returns graph number `i` from the Graph Atlas. | |
102 | |
103 For more information, see :func:`.graph_atlas_g`. | |
104 | |
105 Parameters | |
106 ---------- | |
107 i : int | |
108 The index of the graph from the atlas to get. The graph at index | |
109 0 is assumed to be the null graph. | |
110 | |
111 Returns | |
112 ------- | |
113 list | |
114 A list of :class:`~networkx.Graph` objects, the one at index *i* | |
115 corresponding to the graph *i* in the Graph Atlas. | |
116 | |
117 See also | |
118 -------- | |
119 graph_atlas_g | |
120 | |
121 Notes | |
122 ----- | |
123 The time required by this function increases linearly with the | |
124 argument `i`, since it reads a large file sequentially in order to | |
125 generate the graph [1]_. | |
126 | |
127 References | |
128 ---------- | |
129 .. [1] Ronald C. Read and Robin J. Wilson, *An Atlas of Graphs*. | |
130 Oxford University Press, 1998. | |
131 | |
132 """ | |
133 if not (0 <= i < NUM_GRAPHS): | |
134 raise ValueError('index must be between 0 and {}'.format(NUM_GRAPHS)) | |
135 return next(islice(_generate_graphs(), i, None)) | |
136 | |
137 | |
138 def graph_atlas_g(): | |
139 """Returns the list of all graphs with up to seven nodes named in the | |
140 Graph Atlas. | |
141 | |
142 The graphs are listed in increasing order by | |
143 | |
144 1. number of nodes, | |
145 2. number of edges, | |
146 3. degree sequence (for example 111223 < 112222), | |
147 4. number of automorphisms, | |
148 | |
149 in that order, with three exceptions as described in the *Notes* | |
150 section below. This causes the list to correspond with the index of | |
151 the graphs in the Graph Atlas [atlas]_, with the first graph, | |
152 ``G[0]``, being the null graph. | |
153 | |
154 Returns | |
155 ------- | |
156 list | |
157 A list of :class:`~networkx.Graph` objects, the one at index *i* | |
158 corresponding to the graph *i* in the Graph Atlas. | |
159 | |
160 See also | |
161 -------- | |
162 graph_atlas | |
163 | |
164 Notes | |
165 ----- | |
166 This function may be expensive in both time and space, since it | |
167 reads a large file sequentially in order to populate the list. | |
168 | |
169 Although the NetworkX atlas functions match the order of graphs | |
170 given in the "Atlas of Graphs" book, there are (at least) three | |
171 errors in the ordering described in the book. The following three | |
172 pairs of nodes violate the lexicographically nondecreasing sorted | |
173 degree sequence rule: | |
174 | |
175 - graphs 55 and 56 with degree sequences 001111 and 000112, | |
176 - graphs 1007 and 1008 with degree sequences 3333444 and 3333336, | |
177 - graphs 1012 and 1213 with degree sequences 1244555 and 1244456. | |
178 | |
179 References | |
180 ---------- | |
181 .. [atlas] Ronald C. Read and Robin J. Wilson, | |
182 *An Atlas of Graphs*. | |
183 Oxford University Press, 1998. | |
184 | |
185 """ | |
186 return list(_generate_graphs()) |