Mercurial > repos > shellac > guppy_basecaller
diff env/lib/python3.7/site-packages/networkx/relabel.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/relabel.py Thu May 14 16:47:39 2020 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,225 +0,0 @@ -# Copyright (C) 2006-2019 by -# Aric Hagberg <hagberg@lanl.gov> -# Dan Schult <dschult@colgate.edu> -# Pieter Swart <swart@lanl.gov> -# All rights reserved. -# BSD license. -import networkx as nx - -__all__ = ['convert_node_labels_to_integers', 'relabel_nodes'] - - -def relabel_nodes(G, mapping, copy=True): - """Relabel the nodes of the graph G. - - Parameters - ---------- - G : graph - A NetworkX graph - - mapping : dictionary - A dictionary with the old labels as keys and new labels as values. - A partial mapping is allowed. - - copy : bool (optional, default=True) - If True return a copy, or if False relabel the nodes in place. - - Examples - -------- - To create a new graph with nodes relabeled according to a given - dictionary: - - >>> G = nx.path_graph(3) - >>> sorted(G) - [0, 1, 2] - >>> mapping = {0: 'a', 1: 'b', 2: 'c'} - >>> H = nx.relabel_nodes(G, mapping) - >>> sorted(H) - ['a', 'b', 'c'] - - Nodes can be relabeled with any hashable object, including numbers - and strings: - - >>> import string - >>> G = nx.path_graph(26) # nodes are integers 0 through 25 - >>> sorted(G)[:3] - [0, 1, 2] - >>> mapping = dict(zip(G, string.ascii_lowercase)) - >>> G = nx.relabel_nodes(G, mapping) # nodes are characters a through z - >>> sorted(G)[:3] - ['a', 'b', 'c'] - >>> mapping = dict(zip(G, range(1, 27))) - >>> G = nx.relabel_nodes(G, mapping) # nodes are integers 1 through 26 - >>> sorted(G)[:3] - [1, 2, 3] - - To perform a partial in-place relabeling, provide a dictionary - mapping only a subset of the nodes, and set the `copy` keyword - argument to False: - - >>> G = nx.path_graph(3) # nodes 0-1-2 - >>> mapping = {0: 'a', 1: 'b'} # 0->'a' and 1->'b' - >>> G = nx.relabel_nodes(G, mapping, copy=False) - >>> sorted(G, key=str) - [2, 'a', 'b'] - - A mapping can also be given as a function: - - >>> G = nx.path_graph(3) - >>> H = nx.relabel_nodes(G, lambda x: x ** 2) - >>> list(H) - [0, 1, 4] - - Notes - ----- - Only the nodes specified in the mapping will be relabeled. - - The keyword setting copy=False modifies the graph in place. - Relabel_nodes avoids naming collisions by building a - directed graph from ``mapping`` which specifies the order of - relabelings. Naming collisions, such as a->b, b->c, are ordered - such that "b" gets renamed to "c" before "a" gets renamed "b". - In cases of circular mappings (e.g. a->b, b->a), modifying the - graph is not possible in-place and an exception is raised. - In that case, use copy=True. - - See Also - -------- - convert_node_labels_to_integers - """ - # you can pass a function f(old_label)->new_label - # but we'll just make a dictionary here regardless - if not hasattr(mapping, "__getitem__"): - m = {n: mapping(n) for n in G} - else: - m = mapping - if copy: - return _relabel_copy(G, m) - else: - return _relabel_inplace(G, m) - - -def _relabel_inplace(G, mapping): - old_labels = set(mapping.keys()) - new_labels = set(mapping.values()) - if len(old_labels & new_labels) > 0: - # labels sets overlap - # can we topological sort and still do the relabeling? - D = nx.DiGraph(list(mapping.items())) - D.remove_edges_from(nx.selfloop_edges(D)) - try: - nodes = reversed(list(nx.topological_sort(D))) - except nx.NetworkXUnfeasible: - raise nx.NetworkXUnfeasible('The node label sets are overlapping ' - 'and no ordering can resolve the ' - 'mapping. Use copy=True.') - else: - # non-overlapping label sets - nodes = old_labels - - multigraph = G.is_multigraph() - directed = G.is_directed() - - for old in nodes: - try: - new = mapping[old] - except KeyError: - continue - if new == old: - continue - try: - G.add_node(new, **G.nodes[old]) - except KeyError: - raise KeyError("Node %s is not in the graph" % old) - if multigraph: - new_edges = [(new, new if old == target else target, key, data) - for (_, target, key, data) - in G.edges(old, data=True, keys=True)] - if directed: - new_edges += [(new if old == source else source, new, key, data) - for (source, _, key, data) - in G.in_edges(old, data=True, keys=True)] - else: - new_edges = [(new, new if old == target else target, data) - for (_, target, data) in G.edges(old, data=True)] - if directed: - new_edges += [(new if old == source else source, new, data) - for (source, _, data) in G.in_edges(old, data=True)] - G.remove_node(old) - G.add_edges_from(new_edges) - return G - - -def _relabel_copy(G, mapping): - H = G.__class__() - H.add_nodes_from(mapping.get(n, n) for n in G) - H._node.update((mapping.get(n, n), d.copy()) for n, d in G.nodes.items()) - if G.is_multigraph(): - H.add_edges_from((mapping.get(n1, n1), mapping.get(n2, n2), k, d.copy()) - for (n1, n2, k, d) in G.edges(keys=True, data=True)) - else: - H.add_edges_from((mapping.get(n1, n1), mapping.get(n2, n2), d.copy()) - for (n1, n2, d) in G.edges(data=True)) - H.graph.update(G.graph) - return H - - -def convert_node_labels_to_integers(G, first_label=0, ordering="default", - label_attribute=None): - """Returns a copy of the graph G with the nodes relabeled using - consecutive integers. - - Parameters - ---------- - G : graph - A NetworkX graph - - first_label : int, optional (default=0) - An integer specifying the starting offset in numbering nodes. - The new integer labels are numbered first_label, ..., n-1+first_label. - - ordering : string - "default" : inherit node ordering from G.nodes() - "sorted" : inherit node ordering from sorted(G.nodes()) - "increasing degree" : nodes are sorted by increasing degree - "decreasing degree" : nodes are sorted by decreasing degree - - label_attribute : string, optional (default=None) - Name of node attribute to store old label. If None no attribute - is created. - - Notes - ----- - Node and edge attribute data are copied to the new (relabeled) graph. - - There is no guarantee that the relabeling of nodes to integers will - give the same two integers for two (even identical graphs). - Use the `ordering` argument to try to preserve the order. - - See Also - -------- - relabel_nodes - """ - N = G.number_of_nodes() + first_label - if ordering == "default": - mapping = dict(zip(G.nodes(), range(first_label, N))) - elif ordering == "sorted": - nlist = sorted(G.nodes()) - mapping = dict(zip(nlist, range(first_label, N))) - elif ordering == "increasing degree": - dv_pairs = [(d, n) for (n, d) in G.degree()] - dv_pairs.sort() # in-place sort from lowest to highest degree - mapping = dict(zip([n for d, n in dv_pairs], range(first_label, N))) - elif ordering == "decreasing degree": - dv_pairs = [(d, n) for (n, d) in G.degree()] - dv_pairs.sort() # in-place sort from lowest to highest degree - dv_pairs.reverse() - mapping = dict(zip([n for d, n in dv_pairs], range(first_label, N))) - else: - raise nx.NetworkXError('Unknown node ordering: %s' % ordering) - H = relabel_nodes(G, mapping) - # create node attribute with the old label - if label_attribute is not None: - nx.set_node_attributes(H, {v: k for k, v in mapping.items()}, - label_attribute) - return H
