diff env/lib/python3.7/site-packages/networkx/linalg/attrmatrix.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/linalg/attrmatrix.py	Thu May 14 16:47:39 2020 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,455 +0,0 @@
-"""
-    Functions for constructing matrix-like objects from graph attributes.
-"""
-
-__all__ = ['attr_matrix', 'attr_sparse_matrix']
-
-import networkx as nx
-
-
-def _node_value(G, node_attr):
-    """Returns a function that returns a value from G.nodes[u].
-
-    We return a function expecting a node as its sole argument. Then, in the
-    simplest scenario, the returned function will return G.nodes[u][node_attr].
-    However, we also handle the case when `node_attr` is None or when it is a
-    function itself.
-
-    Parameters
-    ----------
-    G : graph
-        A NetworkX graph
-
-    node_attr : {None, str, callable}
-        Specification of how the value of the node attribute should be obtained
-        from the node attribute dictionary.
-
-    Returns
-    -------
-    value : function
-        A function expecting a node as its sole argument. The function will
-        returns a value from G.nodes[u] that depends on `edge_attr`.
-
-    """
-    if node_attr is None:
-        def value(u): return u
-    elif not hasattr(node_attr, '__call__'):
-        # assume it is a key for the node attribute dictionary
-        def value(u): return G.nodes[u][node_attr]
-    else:
-        # Advanced:  Allow users to specify something else.
-        #
-        # For example,
-        #     node_attr = lambda u: G.nodes[u].get('size', .5) * 3
-        #
-        value = node_attr
-
-    return value
-
-
-def _edge_value(G, edge_attr):
-    """Returns a function that returns a value from G[u][v].
-
-    Suppose there exists an edge between u and v.  Then we return a function
-    expecting u and v as arguments.  For Graph and DiGraph, G[u][v] is
-    the edge attribute dictionary, and the function (essentially) returns
-    G[u][v][edge_attr].  However, we also handle cases when `edge_attr` is None
-    and when it is a function itself. For MultiGraph and MultiDiGraph, G[u][v]
-    is a dictionary of all edges between u and v.  In this case, the returned
-    function sums the value of `edge_attr` for every edge between u and v.
-
-    Parameters
-    ----------
-    G : graph
-       A NetworkX graph
-
-    edge_attr : {None, str, callable}
-        Specification of how the value of the edge attribute should be obtained
-        from the edge attribute dictionary, G[u][v].  For multigraphs, G[u][v]
-        is a dictionary of all the edges between u and v.  This allows for
-        special treatment of multiedges.
-
-    Returns
-    -------
-    value : function
-        A function expecting two nodes as parameters. The nodes should
-        represent the from- and to- node of an edge. The function will
-        return a value from G[u][v] that depends on `edge_attr`.
-
-    """
-
-    if edge_attr is None:
-        # topological count of edges
-
-        if G.is_multigraph():
-            def value(u, v): return len(G[u][v])
-        else:
-            def value(u, v): return 1
-
-    elif not hasattr(edge_attr, '__call__'):
-        # assume it is a key for the edge attribute dictionary
-
-        if edge_attr == 'weight':
-            # provide a default value
-            if G.is_multigraph():
-                def value(u, v): return sum([d.get(edge_attr, 1) for d in G[u][v].values()])
-            else:
-                def value(u, v): return G[u][v].get(edge_attr, 1)
-        else:
-            # otherwise, the edge attribute MUST exist for each edge
-            if G.is_multigraph():
-                def value(u, v): return sum([d[edge_attr] for d in G[u][v].values()])
-            else:
-                def value(u, v): return G[u][v][edge_attr]
-
-    else:
-        # Advanced:  Allow users to specify something else.
-        #
-        # Alternative default value:
-        #     edge_attr = lambda u,v: G[u][v].get('thickness', .5)
-        #
-        # Function on an attribute:
-        #     edge_attr = lambda u,v: abs(G[u][v]['weight'])
-        #
-        # Handle Multi(Di)Graphs differently:
-        #     edge_attr = lambda u,v: numpy.prod([d['size'] for d in G[u][v].values()])
-        #
-        # Ignore multiple edges
-        #     edge_attr = lambda u,v: 1 if len(G[u][v]) else 0
-        #
-        value = edge_attr
-
-    return value
-
-
-def attr_matrix(G, edge_attr=None, node_attr=None, normalized=False,
-                rc_order=None, dtype=None, order=None):
-    """Returns a NumPy matrix using attributes from G.
-
-    If only `G` is passed in, then the adjacency matrix is constructed.
-
-    Let A be a discrete set of values for the node attribute `node_attr`. Then
-    the elements of A represent the rows and columns of the constructed matrix.
-    Now, iterate through every edge e=(u,v) in `G` and consider the value
-    of the edge attribute `edge_attr`.  If ua and va are the values of the
-    node attribute `node_attr` for u and v, respectively, then the value of
-    the edge attribute is added to the matrix element at (ua, va).
-
-    Parameters
-    ----------
-    G : graph
-        The NetworkX graph used to construct the NumPy matrix.
-
-    edge_attr : str, optional
-        Each element of the matrix represents a running total of the
-        specified edge attribute for edges whose node attributes correspond
-        to the rows/cols of the matirx. The attribute must be present for
-        all edges in the graph. If no attribute is specified, then we
-        just count the number of edges whose node attributes correspond
-        to the matrix element.
-
-    node_attr : str, optional
-        Each row and column in the matrix represents a particular value
-        of the node attribute.  The attribute must be present for all nodes
-        in the graph. Note, the values of this attribute should be reliably
-        hashable. So, float values are not recommended. If no attribute is
-        specified, then the rows and columns will be the nodes of the graph.
-
-    normalized : bool, optional
-        If True, then each row is normalized by the summation of its values.
-
-    rc_order : list, optional
-        A list of the node attribute values. This list specifies the ordering
-        of rows and columns of the array. If no ordering is provided, then
-        the ordering will be random (and also, a return value).
-
-    Other Parameters
-    ----------------
-    dtype : NumPy data-type, optional
-        A valid NumPy dtype used to initialize the array. Keep in mind certain
-        dtypes can yield unexpected results if the array is to be normalized.
-        The parameter is passed to numpy.zeros(). If unspecified, the NumPy
-        default is used.
-
-    order : {'C', 'F'}, optional
-        Whether to store multidimensional data in C- or Fortran-contiguous
-        (row- or column-wise) order in memory. This parameter is passed to
-        numpy.zeros(). If unspecified, the NumPy default is used.
-
-    Returns
-    -------
-    M : NumPy matrix
-        The attribute matrix.
-
-    ordering : list
-        If `rc_order` was specified, then only the matrix is returned.
-        However, if `rc_order` was None, then the ordering used to construct
-        the matrix is returned as well.
-
-    Examples
-    --------
-    Construct an adjacency matrix:
-
-    >>> G = nx.Graph()
-    >>> G.add_edge(0, 1, thickness=1, weight=3)
-    >>> G.add_edge(0, 2, thickness=2)
-    >>> G.add_edge(1, 2, thickness=3)
-    >>> nx.attr_matrix(G, rc_order=[0, 1, 2])
-    matrix([[0., 1., 1.],
-            [1., 0., 1.],
-            [1., 1., 0.]])
-
-    Alternatively, we can obtain the matrix describing edge thickness.
-
-    >>> nx.attr_matrix(G, edge_attr='thickness', rc_order=[0, 1, 2])
-    matrix([[0., 1., 2.],
-            [1., 0., 3.],
-            [2., 3., 0.]])
-
-    We can also color the nodes and ask for the probability distribution over
-    all edges (u,v) describing:
-
-        Pr(v has color Y | u has color X)
-
-    >>> G.nodes[0]['color'] = 'red'
-    >>> G.nodes[1]['color'] = 'red'
-    >>> G.nodes[2]['color'] = 'blue'
-    >>> rc = ['red', 'blue']
-    >>> nx.attr_matrix(G, node_attr='color', normalized=True, rc_order=rc)
-    matrix([[0.33333333, 0.66666667],
-            [1.        , 0.        ]])
-
-    For example, the above tells us that for all edges (u,v):
-
-        Pr( v is red  | u is red)  = 1/3
-        Pr( v is blue | u is red)  = 2/3
-
-        Pr( v is red  | u is blue) = 1
-        Pr( v is blue | u is blue) = 0
-
-    Finally, we can obtain the total weights listed by the node colors.
-
-    >>> nx.attr_matrix(G, edge_attr='weight', node_attr='color', rc_order=rc)
-    matrix([[3., 2.],
-            [2., 0.]])
-
-    Thus, the total weight over all edges (u,v) with u and v having colors:
-
-        (red, red)   is 3   # the sole contribution is from edge (0,1)
-        (red, blue)  is 2   # contributions from edges (0,2) and (1,2)
-        (blue, red)  is 2   # same as (red, blue) since graph is undirected
-        (blue, blue) is 0   # there are no edges with blue endpoints
-
-    """
-    try:
-        import numpy as np
-    except ImportError:
-        raise ImportError(
-            "attr_matrix() requires numpy: http://scipy.org/ ")
-
-    edge_value = _edge_value(G, edge_attr)
-    node_value = _node_value(G, node_attr)
-
-    if rc_order is None:
-        ordering = list(set([node_value(n) for n in G]))
-    else:
-        ordering = rc_order
-
-    N = len(ordering)
-    undirected = not G.is_directed()
-    index = dict(zip(ordering, range(N)))
-    M = np.zeros((N, N), dtype=dtype, order=order)
-
-    seen = set([])
-    for u, nbrdict in G.adjacency():
-        for v in nbrdict:
-            # Obtain the node attribute values.
-            i, j = index[node_value(u)], index[node_value(v)]
-            if v not in seen:
-                M[i, j] += edge_value(u, v)
-                if undirected:
-                    M[j, i] = M[i, j]
-
-        if undirected:
-            seen.add(u)
-
-    if normalized:
-        M /= M.sum(axis=1).reshape((N, 1))
-
-    M = np.asmatrix(M)
-
-    if rc_order is None:
-        return M, ordering
-    else:
-        return M
-
-
-def attr_sparse_matrix(G, edge_attr=None, node_attr=None,
-                       normalized=False, rc_order=None, dtype=None):
-    """Returns a SciPy sparse matrix using attributes from G.
-
-    If only `G` is passed in, then the adjacency matrix is constructed.
-
-    Let A be a discrete set of values for the node attribute `node_attr`. Then
-    the elements of A represent the rows and columns of the constructed matrix.
-    Now, iterate through every edge e=(u,v) in `G` and consider the value
-    of the edge attribute `edge_attr`.  If ua and va are the values of the
-    node attribute `node_attr` for u and v, respectively, then the value of
-    the edge attribute is added to the matrix element at (ua, va).
-
-    Parameters
-    ----------
-    G : graph
-        The NetworkX graph used to construct the NumPy matrix.
-
-    edge_attr : str, optional
-        Each element of the matrix represents a running total of the
-        specified edge attribute for edges whose node attributes correspond
-        to the rows/cols of the matirx. The attribute must be present for
-        all edges in the graph. If no attribute is specified, then we
-        just count the number of edges whose node attributes correspond
-        to the matrix element.
-
-    node_attr : str, optional
-        Each row and column in the matrix represents a particular value
-        of the node attribute.  The attribute must be present for all nodes
-        in the graph. Note, the values of this attribute should be reliably
-        hashable. So, float values are not recommended. If no attribute is
-        specified, then the rows and columns will be the nodes of the graph.
-
-    normalized : bool, optional
-        If True, then each row is normalized by the summation of its values.
-
-    rc_order : list, optional
-        A list of the node attribute values. This list specifies the ordering
-        of rows and columns of the array. If no ordering is provided, then
-        the ordering will be random (and also, a return value).
-
-    Other Parameters
-    ----------------
-    dtype : NumPy data-type, optional
-        A valid NumPy dtype used to initialize the array. Keep in mind certain
-        dtypes can yield unexpected results if the array is to be normalized.
-        The parameter is passed to numpy.zeros(). If unspecified, the NumPy
-        default is used.
-
-    Returns
-    -------
-    M : SciPy sparse matrix
-        The attribute matrix.
-
-    ordering : list
-        If `rc_order` was specified, then only the matrix is returned.
-        However, if `rc_order` was None, then the ordering used to construct
-        the matrix is returned as well.
-
-    Examples
-    --------
-    Construct an adjacency matrix:
-
-    >>> G = nx.Graph()
-    >>> G.add_edge(0,1,thickness=1,weight=3)
-    >>> G.add_edge(0,2,thickness=2)
-    >>> G.add_edge(1,2,thickness=3)
-    >>> M = nx.attr_sparse_matrix(G, rc_order=[0,1,2])
-    >>> M.todense()
-    matrix([[0., 1., 1.],
-            [1., 0., 1.],
-            [1., 1., 0.]])
-
-    Alternatively, we can obtain the matrix describing edge thickness.
-
-    >>> M = nx.attr_sparse_matrix(G, edge_attr='thickness', rc_order=[0,1,2])
-    >>> M.todense()
-    matrix([[0., 1., 2.],
-            [1., 0., 3.],
-            [2., 3., 0.]])
-
-    We can also color the nodes and ask for the probability distribution over
-    all edges (u,v) describing:
-
-        Pr(v has color Y | u has color X)
-
-    >>> G.nodes[0]['color'] = 'red'
-    >>> G.nodes[1]['color'] = 'red'
-    >>> G.nodes[2]['color'] = 'blue'
-    >>> rc = ['red', 'blue']
-    >>> M = nx.attr_sparse_matrix(G, node_attr='color', \
-                                  normalized=True, rc_order=rc)
-    >>> M.todense()
-    matrix([[0.33333333, 0.66666667],
-            [1.        , 0.        ]])
-
-    For example, the above tells us that for all edges (u,v):
-
-        Pr( v is red  | u is red)  = 1/3
-        Pr( v is blue | u is red)  = 2/3
-
-        Pr( v is red  | u is blue) = 1
-        Pr( v is blue | u is blue) = 0
-
-    Finally, we can obtain the total weights listed by the node colors.
-
-    >>> M = nx.attr_sparse_matrix(G, edge_attr='weight',\
-                                  node_attr='color', rc_order=rc)
-    >>> M.todense()
-    matrix([[3., 2.],
-            [2., 0.]])
-
-    Thus, the total weight over all edges (u,v) with u and v having colors:
-
-        (red, red)   is 3   # the sole contribution is from edge (0,1)
-        (red, blue)  is 2   # contributions from edges (0,2) and (1,2)
-        (blue, red)  is 2   # same as (red, blue) since graph is undirected
-        (blue, blue) is 0   # there are no edges with blue endpoints
-
-    """
-    try:
-        import numpy as np
-        from scipy import sparse
-    except ImportError:
-        raise ImportError(
-            "attr_sparse_matrix() requires scipy: http://scipy.org/ ")
-
-    edge_value = _edge_value(G, edge_attr)
-    node_value = _node_value(G, node_attr)
-
-    if rc_order is None:
-        ordering = list(set([node_value(n) for n in G]))
-    else:
-        ordering = rc_order
-
-    N = len(ordering)
-    undirected = not G.is_directed()
-    index = dict(zip(ordering, range(N)))
-    M = sparse.lil_matrix((N, N), dtype=dtype)
-
-    seen = set([])
-    for u, nbrdict in G.adjacency():
-        for v in nbrdict:
-            # Obtain the node attribute values.
-            i, j = index[node_value(u)], index[node_value(v)]
-            if v not in seen:
-                M[i, j] += edge_value(u, v)
-                if undirected:
-                    M[j, i] = M[i, j]
-
-        if undirected:
-            seen.add(u)
-
-    if normalized:
-        norms = np.asarray(M.sum(axis=1)).ravel()
-        for i, norm in enumerate(norms):
-            M[i, :] /= norm
-
-    if rc_order is None:
-        return M, ordering
-    else:
-        return M
-
-
-# fixture for pytest
-def setup_module(module):
-    import pytest
-    numpy = pytest.importorskip('numpy')
-    scipy = pytest.importorskip('scipy')