diff env/lib/python3.7/site-packages/networkx/classes/graphviews.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/classes/graphviews.py	Thu May 14 16:47:39 2020 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,217 +0,0 @@
-#    Copyright (C) 2004-2019 by
-#    Aric Hagberg <hagberg@lanl.gov>
-#    Dan Schult <dschult@colgate.edu>
-#    Pieter Swart <swart@lanl.gov>
-#    All rights reserved.
-#    BSD license.
-#
-# Author:  Aric Hagberg (hagberg@lanl.gov),
-#          Pieter Swart (swart@lanl.gov),
-#          Dan Schult(dschult@colgate.edu)
-"""View of Graphs as SubGraph, Reverse, Directed, Undirected.
-
-In some algorithms it is convenient to temporarily morph
-a graph to exclude some nodes or edges. It should be better
-to do that via a view than to remove and then re-add.
-In other algorithms it is convenient to temporarily morph
-a graph to reverse directed edges, or treat a directed graph
-as undirected, etc. This module provides those graph views.
-
-The resulting views are essentially read-only graphs that
-report data from the orignal graph object. We provide an
-attribute G._graph which points to the underlying graph object.
-
-Note: Since graphviews look like graphs, one can end up with
-view-of-view-of-view chains. Be careful with chains because
-they become very slow with about 15 nested views.
-For the common simple case of node induced subgraphs created
-from the graph class, we short-cut the chain by returning a
-subgraph of the original graph directly rather than a subgraph
-of a subgraph. We are careful not to disrupt any edge filter in
-the middle subgraph. In general, determining how to short-cut
-the chain is tricky and much harder with restricted_views than
-with induced subgraphs.
-Often it is easiest to use .copy() to avoid chains.
-"""
-from networkx.classes.coreviews import UnionAdjacency, UnionMultiAdjacency, \
-    FilterAtlas, FilterAdjacency, FilterMultiAdjacency
-from networkx.classes.filters import no_filter
-from networkx.exception import NetworkXError
-from networkx.utils import not_implemented_for
-
-import networkx as nx
-
-__all__ = ['generic_graph_view', 'subgraph_view', 'reverse_view']
-
-
-def generic_graph_view(G, create_using=None):
-    if create_using is None:
-        newG = G.__class__()
-    else:
-        newG = nx.empty_graph(0, create_using)
-    if G.is_multigraph() != newG.is_multigraph():
-        raise NetworkXError("Multigraph for G must agree with create_using")
-    newG = nx.freeze(newG)
-
-    # create view by assigning attributes from G
-    newG._graph = G
-    newG.graph = G.graph
-
-    newG._node = G._node
-    if newG.is_directed():
-        if G.is_directed():
-            newG._succ = G._succ
-            newG._pred = G._pred
-            newG._adj = G._succ
-        else:
-            newG._succ = G._adj
-            newG._pred = G._adj
-            newG._adj = G._adj
-    elif G.is_directed():
-        if G.is_multigraph():
-            newG._adj = UnionMultiAdjacency(G._succ, G._pred)
-        else:
-            newG._adj = UnionAdjacency(G._succ, G._pred)
-    else:
-        newG._adj = G._adj
-    return newG
-
-
-def subgraph_view(G, filter_node=no_filter, filter_edge=no_filter):
-    """ View of `G` applying a filter on nodes and edges.
-
-    `subgraph_view` provides a read-only view of the input graph that excludes
-    nodes and edges based on the outcome of two filter functions `filter_node`
-    and `filter_edge`.
-
-    The `filter_node` function takes one argument --- the node --- and returns
-    `True` if the node should be included in the subgraph, and `False` if it
-    should not be included.
-
-    The `filter_edge` function takes two arguments --- the nodes describing an
-    edge --- and returns `True` if the edge should be included in the subgraph,
-    and `False` if it should not be included.
-
-    Both node and edge filter functions are called on graph elements as they
-    are queried, meaning there is no up-front cost to creating the view.
-
-    Parameters
-    ----------
-    G : networkx.Graph
-        A directed/undirected graph/multigraph
-
-    filter_node : callable, optional
-        A function taking a node as input, which returns `True` if the node
-        should appear in the view.
-
-    filter_edge : callable, optional
-        A function taking as input the two nodes describing an edge, which
-        returns `True` if the edge should appear in the view.
-
-    Returns
-    -------
-    graph : networkx.Graph
-        A read-only graph view of the input graph.
-
-    Examples
-    --------
-    >>> import networkx as nx
-    >>> G = nx.path_graph(6)
-
-    Filter functions operate on the node, and return `True` if the node should
-    appear in the view:
-
-    >>> def filter_node(n1):
-    ...     return n1 != 5
-    ...
-    >>> view = nx.subgraph_view(
-    ...     G,
-    ...     filter_node=filter_node
-    ... )
-    >>> view.nodes()
-    NodeView((0, 1, 2, 3, 4))
-
-    We can use a closure pattern to filter graph elements based on additional
-    data --- for example, filtering on edge data attached to the graph:
-
-    >>> G[3][4]['cross_me'] = False
-    >>> def filter_edge(n1, n2):
-    ...     return G[n1][n2].get('cross_me', True)
-    ...
-    >>> view = nx.subgraph_view(
-    ...     G,
-    ...     filter_edge=filter_edge
-    ... )
-    >>> view.edges()
-    EdgeView([(0, 1), (1, 2), (2, 3), (4, 5)])
-
-    >>> view = nx.subgraph_view(
-    ...     G,
-    ...     filter_node=filter_node,
-    ...     filter_edge=filter_edge,
-    ... )
-    >>> view.nodes()
-    NodeView((0, 1, 2, 3, 4))
-    >>> view.edges()
-    EdgeView([(0, 1), (1, 2), (2, 3)])
-    """
-    newG = nx.freeze(G.__class__())
-    newG._NODE_OK = filter_node
-    newG._EDGE_OK = filter_edge
-
-    # create view by assigning attributes from G
-    newG._graph = G
-    newG.graph = G.graph
-
-    newG._node = FilterAtlas(G._node, filter_node)
-    if G.is_multigraph():
-        Adj = FilterMultiAdjacency
-
-        def reverse_edge(u, v, k): return filter_edge(v, u, k)
-    else:
-        Adj = FilterAdjacency
-
-        def reverse_edge(u, v): return filter_edge(v, u)
-    if G.is_directed():
-        newG._succ = Adj(G._succ, filter_node, filter_edge)
-        newG._pred = Adj(G._pred, filter_node, reverse_edge)
-        newG._adj = newG._succ
-    else:
-        newG._adj = Adj(G._adj, filter_node, filter_edge)
-    return newG
-
-
-@not_implemented_for('undirected')
-def reverse_view(G):
-    """ View of `G` with edge directions reversed
-
-    `reverse_view` returns a read-only view of the input graph where
-    edge directions are reversed.
-
-    Identical to digraph.reverse(copy=False)
-
-    Parameters
-    ----------
-    G : networkx.DiGraph
-
-    Returns
-    -------
-    graph : networkx.DiGraph
-
-    Examples
-    --------
-    >>> import networkx as nx
-    >>> G = nx.DiGraph()
-    >>> G.add_edge(1, 2)
-    >>> G.add_edge(2, 3)
-    >>> G.edges()
-    OutEdgeView([(1, 2), (2, 3)])
-
-    >>> view = nx.reverse_view(G)
-    >>> view.edges()
-    OutEdgeView([(2, 1), (3, 2)])
-    """
-    newG = generic_graph_view(G)
-    newG._succ, newG._pred = G._pred, G._succ
-    newG._adj = newG._succ
-    return newG