Mercurial > repos > guerler > springsuite
comparison planemo/lib/python3.7/site-packages/networkx/generators/mycielski.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) 2010-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 """Functions related to the Mycielski Operation and the Mycielskian family | |
| 9 of graphs. | |
| 10 | |
| 11 """ | |
| 12 | |
| 13 import networkx as nx | |
| 14 from networkx.utils import not_implemented_for | |
| 15 | |
| 16 __all__ = ['mycielskian', 'mycielski_graph'] | |
| 17 | |
| 18 | |
| 19 @not_implemented_for('directed') | |
| 20 @not_implemented_for('multigraph') | |
| 21 def mycielskian(G, iterations=1): | |
| 22 r"""Returns the Mycielskian of a simple, undirected graph G | |
| 23 | |
| 24 The Mycielskian of graph preserves a graph's triangle free | |
| 25 property while increasing the chromatic number by 1. | |
| 26 | |
| 27 The Mycielski Operation on a graph, :math:`G=(V, E)`, constructs a new | |
| 28 graph with :math:`2|V| + 1` nodes and :math:`3|E| + |V|` edges. | |
| 29 | |
| 30 The construction is as follows: | |
| 31 | |
| 32 Let :math:`V = {0, ..., n-1}`. Construct another vertex set | |
| 33 :math:`U = {n, ..., 2n}` and a vertex, `w`. | |
| 34 Construct a new graph, `M`, with vertices :math:`U \bigcup V \bigcup w`. | |
| 35 For edges, :math:`(u, v) \in E` add edges :math:`(u, v), (u, v + n)`, and | |
| 36 :math:`(u + n, v)` to M. Finally, for all vertices :math:`u \in U`, add | |
| 37 edge :math:`(u, w)` to M. | |
| 38 | |
| 39 The Mycielski Operation can be done multiple times by repeating the above | |
| 40 process iteratively. | |
| 41 | |
| 42 More information can be found at https://en.wikipedia.org/wiki/Mycielskian | |
| 43 | |
| 44 Parameters | |
| 45 ---------- | |
| 46 G : graph | |
| 47 A simple, undirected NetworkX graph | |
| 48 iterations : int | |
| 49 The number of iterations of the Mycielski operation to | |
| 50 perform on G. Defaults to 1. Must be a non-negative integer. | |
| 51 | |
| 52 Returns | |
| 53 ------- | |
| 54 M : graph | |
| 55 The Mycielskian of G after the specified number of iterations. | |
| 56 | |
| 57 Notes | |
| 58 ------ | |
| 59 Graph, node, and edge data are not necessarily propagated to the new graph. | |
| 60 | |
| 61 """ | |
| 62 | |
| 63 n = G.number_of_nodes() | |
| 64 M = nx.convert_node_labels_to_integers(G) | |
| 65 | |
| 66 for i in range(iterations): | |
| 67 n = M.number_of_nodes() | |
| 68 M.add_nodes_from(range(n, 2 * n)) | |
| 69 old_edges = list(M.edges()) | |
| 70 M.add_edges_from((u, v + n) for u, v in old_edges) | |
| 71 M.add_edges_from((u + n, v) for u, v in old_edges) | |
| 72 M.add_node(2 * n) | |
| 73 M.add_edges_from((u + n, 2 * n) for u in range(n)) | |
| 74 | |
| 75 return M | |
| 76 | |
| 77 | |
| 78 def mycielski_graph(n): | |
| 79 """Generator for the n_th Mycielski Graph. | |
| 80 | |
| 81 The Mycielski family of graphs is an infinite set of graphs. | |
| 82 :math:`M_1` is the singleton graph, :math:`M_2` is two vertices with an | |
| 83 edge, and, for :math:`i > 2`, :math:`M_i` is the Mycielskian of | |
| 84 :math:`M_{i-1}`. | |
| 85 | |
| 86 More information can be found at | |
| 87 http://mathworld.wolfram.com/MycielskiGraph.html | |
| 88 | |
| 89 Parameters | |
| 90 ---------- | |
| 91 n : int | |
| 92 The desired Mycielski Graph. | |
| 93 | |
| 94 Returns | |
| 95 ------- | |
| 96 M : graph | |
| 97 The n_th Mycielski Graph | |
| 98 | |
| 99 Notes | |
| 100 ----- | |
| 101 The first graph in the Mycielski sequence is the singleton graph. | |
| 102 The Mycielskian of this graph is not the :math:`P_2` graph, but rather the | |
| 103 :math:`P_2` graph with an extra, isolated vertex. The second Mycielski | |
| 104 graph is the :math:`P_2` graph, so the first two are hard coded. | |
| 105 The remaining graphs are generated using the Mycielski operation. | |
| 106 | |
| 107 """ | |
| 108 | |
| 109 if n < 1: | |
| 110 raise nx.NetworkXError("must satisfy n >= 0") | |
| 111 | |
| 112 if n == 1: | |
| 113 return nx.empty_graph(1) | |
| 114 | |
| 115 else: | |
| 116 return mycielskian(nx.path_graph(2), n - 2) |
