comparison env/lib/python3.7/site-packages/networkx/utils/rcm.py @ 0:26e78fe6e8c4 draft

"planemo upload commit c699937486c35866861690329de38ec1a5d9f783"
author shellac
date Sat, 02 May 2020 07:14:21 -0400
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:26e78fe6e8c4
1 """
2 Cuthill-McKee ordering of graph nodes to produce sparse matrices
3 """
4 # Copyright (C) 2011-2014 by
5 # Aric Hagberg <aric.hagberg@gmail.com>
6 # All rights reserved.
7 # BSD license.
8 from collections import deque
9 from operator import itemgetter
10
11 import networkx as nx
12 from ..utils import arbitrary_element
13
14 __author__ = """\n""".join(['Aric Hagberg <aric.hagberg@gmail.com>'])
15 __all__ = ['cuthill_mckee_ordering',
16 'reverse_cuthill_mckee_ordering']
17
18
19 def cuthill_mckee_ordering(G, heuristic=None):
20 """Generate an ordering (permutation) of the graph nodes to make
21 a sparse matrix.
22
23 Uses the Cuthill-McKee heuristic (based on breadth-first search) [1]_.
24
25 Parameters
26 ----------
27 G : graph
28 A NetworkX graph
29
30 heuristic : function, optional
31 Function to choose starting node for RCM algorithm. If None
32 a node from a pseudo-peripheral pair is used. A user-defined function
33 can be supplied that takes a graph object and returns a single node.
34
35 Returns
36 -------
37 nodes : generator
38 Generator of nodes in Cuthill-McKee ordering.
39
40 Examples
41 --------
42 >>> from networkx.utils import cuthill_mckee_ordering
43 >>> G = nx.path_graph(4)
44 >>> rcm = list(cuthill_mckee_ordering(G))
45 >>> A = nx.adjacency_matrix(G, nodelist=rcm) # doctest: +SKIP
46
47 Smallest degree node as heuristic function:
48
49 >>> def smallest_degree(G):
50 ... return min(G, key=G.degree)
51 >>> rcm = list(cuthill_mckee_ordering(G, heuristic=smallest_degree))
52
53
54 See Also
55 --------
56 reverse_cuthill_mckee_ordering
57
58 Notes
59 -----
60 The optimal solution the the bandwidth reduction is NP-complete [2]_.
61
62
63 References
64 ----------
65 .. [1] E. Cuthill and J. McKee.
66 Reducing the bandwidth of sparse symmetric matrices,
67 In Proc. 24th Nat. Conf. ACM, pages 157-172, 1969.
68 http://doi.acm.org/10.1145/800195.805928
69 .. [2] Steven S. Skiena. 1997. The Algorithm Design Manual.
70 Springer-Verlag New York, Inc., New York, NY, USA.
71 """
72 for c in nx.connected_components(G):
73 for n in connected_cuthill_mckee_ordering(G.subgraph(c), heuristic):
74 yield n
75
76
77 def reverse_cuthill_mckee_ordering(G, heuristic=None):
78 """Generate an ordering (permutation) of the graph nodes to make
79 a sparse matrix.
80
81 Uses the reverse Cuthill-McKee heuristic (based on breadth-first search)
82 [1]_.
83
84 Parameters
85 ----------
86 G : graph
87 A NetworkX graph
88
89 heuristic : function, optional
90 Function to choose starting node for RCM algorithm. If None
91 a node from a pseudo-peripheral pair is used. A user-defined function
92 can be supplied that takes a graph object and returns a single node.
93
94 Returns
95 -------
96 nodes : generator
97 Generator of nodes in reverse Cuthill-McKee ordering.
98
99 Examples
100 --------
101 >>> from networkx.utils import reverse_cuthill_mckee_ordering
102 >>> G = nx.path_graph(4)
103 >>> rcm = list(reverse_cuthill_mckee_ordering(G))
104 >>> A = nx.adjacency_matrix(G, nodelist=rcm) # doctest: +SKIP
105
106 Smallest degree node as heuristic function:
107
108 >>> def smallest_degree(G):
109 ... return min(G, key=G.degree)
110 >>> rcm = list(reverse_cuthill_mckee_ordering(G, heuristic=smallest_degree))
111
112
113 See Also
114 --------
115 cuthill_mckee_ordering
116
117 Notes
118 -----
119 The optimal solution the the bandwidth reduction is NP-complete [2]_.
120
121 References
122 ----------
123 .. [1] E. Cuthill and J. McKee.
124 Reducing the bandwidth of sparse symmetric matrices,
125 In Proc. 24th Nat. Conf. ACM, pages 157-72, 1969.
126 http://doi.acm.org/10.1145/800195.805928
127 .. [2] Steven S. Skiena. 1997. The Algorithm Design Manual.
128 Springer-Verlag New York, Inc., New York, NY, USA.
129 """
130 return reversed(list(cuthill_mckee_ordering(G, heuristic=heuristic)))
131
132
133 def connected_cuthill_mckee_ordering(G, heuristic=None):
134 # the cuthill mckee algorithm for connected graphs
135 if heuristic is None:
136 start = pseudo_peripheral_node(G)
137 else:
138 start = heuristic(G)
139 visited = {start}
140 queue = deque([start])
141 while queue:
142 parent = queue.popleft()
143 yield parent
144 nd = sorted(list(G.degree(set(G[parent]) - visited)),
145 key=itemgetter(1))
146 children = [n for n, d in nd]
147 visited.update(children)
148 queue.extend(children)
149
150
151 def pseudo_peripheral_node(G):
152 # helper for cuthill-mckee to find a node in a "pseudo peripheral pair"
153 # to use as good starting node
154 u = arbitrary_element(G)
155 lp = 0
156 v = u
157 while True:
158 spl = dict(nx.shortest_path_length(G, v))
159 l = max(spl.values())
160 if l <= lp:
161 break
162 lp = l
163 farthest = (n for n, dist in spl.items() if dist == l)
164 v, deg = min(G.degree(farthest), key=itemgetter(1))
165 return v