Mercurial > repos > guerler > springsuite
comparison planemo/lib/python3.7/site-packages/networkx/algorithms/boundary.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) 2004-2019 by | |
| 2 # Aric Hagberg <hagberg@lanl.gov> | |
| 3 # Dan Schult <dschult@colgate.edu> | |
| 4 # Pieter Swart <swart@lanl.gov> | |
| 5 # Copyright 2015 NetworkX developers. | |
| 6 # All rights reserved. | |
| 7 # BSD license. | |
| 8 """Routines to find the boundary of a set of nodes. | |
| 9 | |
| 10 An edge boundary is a set of edges, each of which has exactly one | |
| 11 endpoint in a given set of nodes (or, in the case of directed graphs, | |
| 12 the set of edges whose source node is in the set). | |
| 13 | |
| 14 A node boundary of a set *S* of nodes is the set of (out-)neighbors of | |
| 15 nodes in *S* that are outside *S*. | |
| 16 | |
| 17 """ | |
| 18 from itertools import chain | |
| 19 | |
| 20 __author__ = """Aric Hagberg (hagberg@lanl.gov)\nPieter Swart (swart@lanl.gov)\nDan Schult (dschult@colgate.edu)""" | |
| 21 | |
| 22 __all__ = ['edge_boundary', 'node_boundary'] | |
| 23 | |
| 24 | |
| 25 def edge_boundary(G, nbunch1, nbunch2=None, data=False, keys=False, | |
| 26 default=None): | |
| 27 """Returns the edge boundary of `nbunch1`. | |
| 28 | |
| 29 The *edge boundary* of a set *S* with respect to a set *T* is the | |
| 30 set of edges (*u*, *v*) such that *u* is in *S* and *v* is in *T*. | |
| 31 If *T* is not specified, it is assumed to be the set of all nodes | |
| 32 not in *S*. | |
| 33 | |
| 34 Parameters | |
| 35 ---------- | |
| 36 G : NetworkX graph | |
| 37 | |
| 38 nbunch1 : iterable | |
| 39 Iterable of nodes in the graph representing the set of nodes | |
| 40 whose edge boundary will be returned. (This is the set *S* from | |
| 41 the definition above.) | |
| 42 | |
| 43 nbunch2 : iterable | |
| 44 Iterable of nodes representing the target (or "exterior") set of | |
| 45 nodes. (This is the set *T* from the definition above.) If not | |
| 46 specified, this is assumed to be the set of all nodes in `G` | |
| 47 not in `nbunch1`. | |
| 48 | |
| 49 keys : bool | |
| 50 This parameter has the same meaning as in | |
| 51 :meth:`MultiGraph.edges`. | |
| 52 | |
| 53 data : bool or object | |
| 54 This parameter has the same meaning as in | |
| 55 :meth:`MultiGraph.edges`. | |
| 56 | |
| 57 default : object | |
| 58 This parameter has the same meaning as in | |
| 59 :meth:`MultiGraph.edges`. | |
| 60 | |
| 61 Returns | |
| 62 ------- | |
| 63 iterator | |
| 64 An iterator over the edges in the boundary of `nbunch1` with | |
| 65 respect to `nbunch2`. If `keys`, `data`, or `default` | |
| 66 are specified and `G` is a multigraph, then edges are returned | |
| 67 with keys and/or data, as in :meth:`MultiGraph.edges`. | |
| 68 | |
| 69 Notes | |
| 70 ----- | |
| 71 Any element of `nbunch` that is not in the graph `G` will be | |
| 72 ignored. | |
| 73 | |
| 74 `nbunch1` and `nbunch2` are usually meant to be disjoint, but in | |
| 75 the interest of speed and generality, that is not required here. | |
| 76 | |
| 77 """ | |
| 78 nset1 = {v for v in G if v in nbunch1} | |
| 79 # Here we create an iterator over edges incident to nodes in the set | |
| 80 # `nset1`. The `Graph.edges()` method does not provide a guarantee | |
| 81 # on the orientation of the edges, so our algorithm below must | |
| 82 # handle the case in which exactly one orientation, either (u, v) or | |
| 83 # (v, u), appears in this iterable. | |
| 84 if G.is_multigraph(): | |
| 85 edges = G.edges(nset1, data=data, keys=keys, default=default) | |
| 86 else: | |
| 87 edges = G.edges(nset1, data=data, default=default) | |
| 88 # If `nbunch2` is not provided, then it is assumed to be the set | |
| 89 # complement of `nbunch1`. For the sake of efficiency, this is | |
| 90 # implemented by using the `not in` operator, instead of by creating | |
| 91 # an additional set and using the `in` operator. | |
| 92 if nbunch2 is None: | |
| 93 return (e for e in edges if (e[0] in nset1) ^ (e[1] in nset1)) | |
| 94 nset2 = set(nbunch2) | |
| 95 return (e for e in edges | |
| 96 if (e[0] in nset1 and e[1] in nset2) | |
| 97 or (e[1] in nset1 and e[0] in nset2)) | |
| 98 | |
| 99 | |
| 100 def node_boundary(G, nbunch1, nbunch2=None): | |
| 101 """Returns the node boundary of `nbunch1`. | |
| 102 | |
| 103 The *node boundary* of a set *S* with respect to a set *T* is the | |
| 104 set of nodes *v* in *T* such that for some *u* in *S*, there is an | |
| 105 edge joining *u* to *v*. If *T* is not specified, it is assumed to | |
| 106 be the set of all nodes not in *S*. | |
| 107 | |
| 108 Parameters | |
| 109 ---------- | |
| 110 G : NetworkX graph | |
| 111 | |
| 112 nbunch1 : iterable | |
| 113 Iterable of nodes in the graph representing the set of nodes | |
| 114 whose node boundary will be returned. (This is the set *S* from | |
| 115 the definition above.) | |
| 116 | |
| 117 nbunch2 : iterable | |
| 118 Iterable of nodes representing the target (or "exterior") set of | |
| 119 nodes. (This is the set *T* from the definition above.) If not | |
| 120 specified, this is assumed to be the set of all nodes in `G` | |
| 121 not in `nbunch1`. | |
| 122 | |
| 123 Returns | |
| 124 ------- | |
| 125 set | |
| 126 The node boundary of `nbunch1` with respect to `nbunch2`. | |
| 127 | |
| 128 Notes | |
| 129 ----- | |
| 130 Any element of `nbunch` that is not in the graph `G` will be | |
| 131 ignored. | |
| 132 | |
| 133 `nbunch1` and `nbunch2` are usually meant to be disjoint, but in | |
| 134 the interest of speed and generality, that is not required here. | |
| 135 | |
| 136 """ | |
| 137 nset1 = {n for n in nbunch1 if n in G} | |
| 138 bdy = set(chain.from_iterable(G[v] for v in nset1)) - nset1 | |
| 139 # If `nbunch2` is not specified, it is assumed to be the set | |
| 140 # complement of `nbunch1`. | |
| 141 if nbunch2 is not None: | |
| 142 bdy &= set(nbunch2) | |
| 143 return bdy |
