(G, filter_node=no_filter, filter_edge=no_filter)
| 66 | |
| 67 | |
| 68 | def subgraph_view(G, filter_node=no_filter, filter_edge=no_filter): |
| 69 | newG = nx.freeze(G.__class__()) |
| 70 | newG._NODE_OK = filter_node |
| 71 | newG._EDGE_OK = filter_edge |
| 72 | |
| 73 | # create view by assigning attributes from G |
| 74 | newG._graph = G |
| 75 | newG.graph = G.graph |
| 76 | |
| 77 | newG._node = FilterAtlas(G._node, filter_node) |
| 78 | if G.is_multigraph(): |
| 79 | Adj = FilterMultiAdjacency |
| 80 | |
| 81 | def reverse_edge(u, v, k): |
| 82 | return filter_edge(v, u, k) |
| 83 | |
| 84 | else: |
| 85 | Adj = FilterAdjacency |
| 86 | |
| 87 | def reverse_edge(u, v): |
| 88 | return filter_edge(v, u) |
| 89 | |
| 90 | if G.is_directed(): |
| 91 | newG._succ = Adj(G._succ, filter_node, filter_edge) |
| 92 | newG._pred = Adj(G._pred, filter_node, reverse_edge) |
| 93 | newG._adj = newG._succ |
| 94 | else: |
| 95 | newG._adj = Adj(G._adj, filter_node, filter_edge) |
| 96 | return newG |
| 97 | |
| 98 | |
| 99 | @not_implemented_for("undirected") |
nothing calls this directly
no test coverage detected