Mercurial > repos > shellac > guppy_basecaller
diff env/lib/python3.7/site-packages/networkx/utils/rcm.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/utils/rcm.py Thu May 14 16:47:39 2020 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,165 +0,0 @@ -""" -Cuthill-McKee ordering of graph nodes to produce sparse matrices -""" -# Copyright (C) 2011-2014 by -# Aric Hagberg <aric.hagberg@gmail.com> -# All rights reserved. -# BSD license. -from collections import deque -from operator import itemgetter - -import networkx as nx -from ..utils import arbitrary_element - -__author__ = """\n""".join(['Aric Hagberg <aric.hagberg@gmail.com>']) -__all__ = ['cuthill_mckee_ordering', - 'reverse_cuthill_mckee_ordering'] - - -def cuthill_mckee_ordering(G, heuristic=None): - """Generate an ordering (permutation) of the graph nodes to make - a sparse matrix. - - Uses the Cuthill-McKee heuristic (based on breadth-first search) [1]_. - - Parameters - ---------- - G : graph - A NetworkX graph - - heuristic : function, optional - Function to choose starting node for RCM algorithm. If None - a node from a pseudo-peripheral pair is used. A user-defined function - can be supplied that takes a graph object and returns a single node. - - Returns - ------- - nodes : generator - Generator of nodes in Cuthill-McKee ordering. - - Examples - -------- - >>> from networkx.utils import cuthill_mckee_ordering - >>> G = nx.path_graph(4) - >>> rcm = list(cuthill_mckee_ordering(G)) - >>> A = nx.adjacency_matrix(G, nodelist=rcm) # doctest: +SKIP - - Smallest degree node as heuristic function: - - >>> def smallest_degree(G): - ... return min(G, key=G.degree) - >>> rcm = list(cuthill_mckee_ordering(G, heuristic=smallest_degree)) - - - See Also - -------- - reverse_cuthill_mckee_ordering - - Notes - ----- - The optimal solution the the bandwidth reduction is NP-complete [2]_. - - - References - ---------- - .. [1] E. Cuthill and J. McKee. - Reducing the bandwidth of sparse symmetric matrices, - In Proc. 24th Nat. Conf. ACM, pages 157-172, 1969. - http://doi.acm.org/10.1145/800195.805928 - .. [2] Steven S. Skiena. 1997. The Algorithm Design Manual. - Springer-Verlag New York, Inc., New York, NY, USA. - """ - for c in nx.connected_components(G): - for n in connected_cuthill_mckee_ordering(G.subgraph(c), heuristic): - yield n - - -def reverse_cuthill_mckee_ordering(G, heuristic=None): - """Generate an ordering (permutation) of the graph nodes to make - a sparse matrix. - - Uses the reverse Cuthill-McKee heuristic (based on breadth-first search) - [1]_. - - Parameters - ---------- - G : graph - A NetworkX graph - - heuristic : function, optional - Function to choose starting node for RCM algorithm. If None - a node from a pseudo-peripheral pair is used. A user-defined function - can be supplied that takes a graph object and returns a single node. - - Returns - ------- - nodes : generator - Generator of nodes in reverse Cuthill-McKee ordering. - - Examples - -------- - >>> from networkx.utils import reverse_cuthill_mckee_ordering - >>> G = nx.path_graph(4) - >>> rcm = list(reverse_cuthill_mckee_ordering(G)) - >>> A = nx.adjacency_matrix(G, nodelist=rcm) # doctest: +SKIP - - Smallest degree node as heuristic function: - - >>> def smallest_degree(G): - ... return min(G, key=G.degree) - >>> rcm = list(reverse_cuthill_mckee_ordering(G, heuristic=smallest_degree)) - - - See Also - -------- - cuthill_mckee_ordering - - Notes - ----- - The optimal solution the the bandwidth reduction is NP-complete [2]_. - - References - ---------- - .. [1] E. Cuthill and J. McKee. - Reducing the bandwidth of sparse symmetric matrices, - In Proc. 24th Nat. Conf. ACM, pages 157-72, 1969. - http://doi.acm.org/10.1145/800195.805928 - .. [2] Steven S. Skiena. 1997. The Algorithm Design Manual. - Springer-Verlag New York, Inc., New York, NY, USA. - """ - return reversed(list(cuthill_mckee_ordering(G, heuristic=heuristic))) - - -def connected_cuthill_mckee_ordering(G, heuristic=None): - # the cuthill mckee algorithm for connected graphs - if heuristic is None: - start = pseudo_peripheral_node(G) - else: - start = heuristic(G) - visited = {start} - queue = deque([start]) - while queue: - parent = queue.popleft() - yield parent - nd = sorted(list(G.degree(set(G[parent]) - visited)), - key=itemgetter(1)) - children = [n for n, d in nd] - visited.update(children) - queue.extend(children) - - -def pseudo_peripheral_node(G): - # helper for cuthill-mckee to find a node in a "pseudo peripheral pair" - # to use as good starting node - u = arbitrary_element(G) - lp = 0 - v = u - while True: - spl = dict(nx.shortest_path_length(G, v)) - l = max(spl.values()) - if l <= lp: - break - lp = l - farthest = (n for n, dist in spl.items() if dist == l) - v, deg = min(G.degree(farthest), key=itemgetter(1)) - return v
