Mercurial > repos > guerler > springsuite
comparison planemo/lib/python3.7/site-packages/networkx/algorithms/mis.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 # -*- coding: utf-8 -*- | |
2 # $Id: maximalIndependentSet.py 576 2011-03-01 05:50:34Z lleeoo $ | |
3 # Leo Lopes <leo.lopes@monash.edu> | |
4 # Aric Hagberg <hagberg@lanl.gov> | |
5 # Dan Schult <dschult@colgate.edu> | |
6 # Pieter Swart <swart@lanl.gov> | |
7 # All rights reserved. | |
8 # BSD license. | |
9 # | |
10 # Authors: Leo Lopes <leo.lopes@monash.edu> | |
11 # Loïc Séguin-C. <loicseguin@gmail.com> | |
12 """ | |
13 Algorithm to find a maximal (not maximum) independent set. | |
14 | |
15 """ | |
16 import networkx as nx | |
17 from networkx.utils import not_implemented_for | |
18 from networkx.utils import py_random_state | |
19 | |
20 __all__ = ['maximal_independent_set'] | |
21 | |
22 | |
23 @py_random_state(2) | |
24 @not_implemented_for('directed') | |
25 def maximal_independent_set(G, nodes=None, seed=None): | |
26 """Returns a random maximal independent set guaranteed to contain | |
27 a given set of nodes. | |
28 | |
29 An independent set is a set of nodes such that the subgraph | |
30 of G induced by these nodes contains no edges. A maximal | |
31 independent set is an independent set such that it is not possible | |
32 to add a new node and still get an independent set. | |
33 | |
34 Parameters | |
35 ---------- | |
36 G : NetworkX graph | |
37 | |
38 nodes : list or iterable | |
39 Nodes that must be part of the independent set. This set of nodes | |
40 must be independent. | |
41 | |
42 seed : integer, random_state, or None (default) | |
43 Indicator of random number generation state. | |
44 See :ref:`Randomness<randomness>`. | |
45 | |
46 Returns | |
47 ------- | |
48 indep_nodes : list | |
49 List of nodes that are part of a maximal independent set. | |
50 | |
51 Raises | |
52 ------ | |
53 NetworkXUnfeasible | |
54 If the nodes in the provided list are not part of the graph or | |
55 do not form an independent set, an exception is raised. | |
56 | |
57 NetworkXNotImplemented | |
58 If `G` is directed. | |
59 | |
60 Examples | |
61 -------- | |
62 >>> G = nx.path_graph(5) | |
63 >>> nx.maximal_independent_set(G) # doctest: +SKIP | |
64 [4, 0, 2] | |
65 >>> nx.maximal_independent_set(G, [1]) # doctest: +SKIP | |
66 [1, 3] | |
67 | |
68 Notes | |
69 ----- | |
70 This algorithm does not solve the maximum independent set problem. | |
71 | |
72 """ | |
73 if not nodes: | |
74 nodes = set([seed.choice(list(G))]) | |
75 else: | |
76 nodes = set(nodes) | |
77 if not nodes.issubset(G): | |
78 raise nx.NetworkXUnfeasible( | |
79 "%s is not a subset of the nodes of G" % nodes) | |
80 neighbors = set.union(*[set(G.adj[v]) for v in nodes]) | |
81 if set.intersection(neighbors, nodes): | |
82 raise nx.NetworkXUnfeasible( | |
83 "%s is not an independent set of G" % nodes) | |
84 indep_nodes = list(nodes) | |
85 available_nodes = set(G.nodes()).difference(neighbors.union(nodes)) | |
86 while available_nodes: | |
87 node = seed.choice(list(available_nodes)) | |
88 indep_nodes.append(node) | |
89 available_nodes.difference_update(list(G.adj[node]) + [node]) | |
90 return indep_nodes |