Mercurial > repos > shellac > guppy_basecaller
comparison env/lib/python3.7/site-packages/networkx/linalg/graphmatrix.py @ 5:9b1c78e6ba9c draft default tip
"planemo upload commit 6c0a8142489327ece472c84e558c47da711a9142"
| author | shellac |
|---|---|
| date | Mon, 01 Jun 2020 08:59:25 -0400 |
| parents | 79f47841a781 |
| children |
comparison
equal
deleted
inserted
replaced
| 4:79f47841a781 | 5:9b1c78e6ba9c |
|---|---|
| 1 """ | |
| 2 Adjacency matrix and incidence matrix of graphs. | |
| 3 """ | |
| 4 # Copyright (C) 2004-2019 by | |
| 5 # Aric Hagberg <hagberg@lanl.gov> | |
| 6 # Dan Schult <dschult@colgate.edu> | |
| 7 # Pieter Swart <swart@lanl.gov> | |
| 8 # All rights reserved. | |
| 9 # BSD license. | |
| 10 import networkx as nx | |
| 11 __author__ = "\n".join(['Aric Hagberg (hagberg@lanl.gov)', | |
| 12 'Pieter Swart (swart@lanl.gov)', | |
| 13 'Dan Schult(dschult@colgate.edu)']) | |
| 14 | |
| 15 __all__ = ['incidence_matrix', | |
| 16 'adj_matrix', 'adjacency_matrix', | |
| 17 ] | |
| 18 | |
| 19 | |
| 20 def incidence_matrix(G, nodelist=None, edgelist=None, | |
| 21 oriented=False, weight=None): | |
| 22 """Returns incidence matrix of G. | |
| 23 | |
| 24 The incidence matrix assigns each row to a node and each column to an edge. | |
| 25 For a standard incidence matrix a 1 appears wherever a row's node is | |
| 26 incident on the column's edge. For an oriented incidence matrix each | |
| 27 edge is assigned an orientation (arbitrarily for undirected and aligning to | |
| 28 direction for directed). A -1 appears for the tail of an edge and 1 | |
| 29 for the head of the edge. The elements are zero otherwise. | |
| 30 | |
| 31 Parameters | |
| 32 ---------- | |
| 33 G : graph | |
| 34 A NetworkX graph | |
| 35 | |
| 36 nodelist : list, optional (default= all nodes in G) | |
| 37 The rows are ordered according to the nodes in nodelist. | |
| 38 If nodelist is None, then the ordering is produced by G.nodes(). | |
| 39 | |
| 40 edgelist : list, optional (default= all edges in G) | |
| 41 The columns are ordered according to the edges in edgelist. | |
| 42 If edgelist is None, then the ordering is produced by G.edges(). | |
| 43 | |
| 44 oriented: bool, optional (default=False) | |
| 45 If True, matrix elements are +1 or -1 for the head or tail node | |
| 46 respectively of each edge. If False, +1 occurs at both nodes. | |
| 47 | |
| 48 weight : string or None, optional (default=None) | |
| 49 The edge data key used to provide each value in the matrix. | |
| 50 If None, then each edge has weight 1. Edge weights, if used, | |
| 51 should be positive so that the orientation can provide the sign. | |
| 52 | |
| 53 Returns | |
| 54 ------- | |
| 55 A : SciPy sparse matrix | |
| 56 The incidence matrix of G. | |
| 57 | |
| 58 Notes | |
| 59 ----- | |
| 60 For MultiGraph/MultiDiGraph, the edges in edgelist should be | |
| 61 (u,v,key) 3-tuples. | |
| 62 | |
| 63 "Networks are the best discrete model for so many problems in | |
| 64 applied mathematics" [1]_. | |
| 65 | |
| 66 References | |
| 67 ---------- | |
| 68 .. [1] Gil Strang, Network applications: A = incidence matrix, | |
| 69 http://academicearth.org/lectures/network-applications-incidence-matrix | |
| 70 """ | |
| 71 import scipy.sparse | |
| 72 if nodelist is None: | |
| 73 nodelist = list(G) | |
| 74 if edgelist is None: | |
| 75 if G.is_multigraph(): | |
| 76 edgelist = list(G.edges(keys=True)) | |
| 77 else: | |
| 78 edgelist = list(G.edges()) | |
| 79 A = scipy.sparse.lil_matrix((len(nodelist), len(edgelist))) | |
| 80 node_index = dict((node, i) for i, node in enumerate(nodelist)) | |
| 81 for ei, e in enumerate(edgelist): | |
| 82 (u, v) = e[:2] | |
| 83 if u == v: | |
| 84 continue # self loops give zero column | |
| 85 try: | |
| 86 ui = node_index[u] | |
| 87 vi = node_index[v] | |
| 88 except KeyError: | |
| 89 raise nx.NetworkXError('node %s or %s in edgelist ' | |
| 90 'but not in nodelist' % (u, v)) | |
| 91 if weight is None: | |
| 92 wt = 1 | |
| 93 else: | |
| 94 if G.is_multigraph(): | |
| 95 ekey = e[2] | |
| 96 wt = G[u][v][ekey].get(weight, 1) | |
| 97 else: | |
| 98 wt = G[u][v].get(weight, 1) | |
| 99 if oriented: | |
| 100 A[ui, ei] = -wt | |
| 101 A[vi, ei] = wt | |
| 102 else: | |
| 103 A[ui, ei] = wt | |
| 104 A[vi, ei] = wt | |
| 105 return A.asformat('csc') | |
| 106 | |
| 107 | |
| 108 def adjacency_matrix(G, nodelist=None, weight='weight'): | |
| 109 """Returns adjacency matrix of G. | |
| 110 | |
| 111 Parameters | |
| 112 ---------- | |
| 113 G : graph | |
| 114 A NetworkX graph | |
| 115 | |
| 116 nodelist : list, optional | |
| 117 The rows and columns are ordered according to the nodes in nodelist. | |
| 118 If nodelist is None, then the ordering is produced by G.nodes(). | |
| 119 | |
| 120 weight : string or None, optional (default='weight') | |
| 121 The edge data key used to provide each value in the matrix. | |
| 122 If None, then each edge has weight 1. | |
| 123 | |
| 124 Returns | |
| 125 ------- | |
| 126 A : SciPy sparse matrix | |
| 127 Adjacency matrix representation of G. | |
| 128 | |
| 129 Notes | |
| 130 ----- | |
| 131 For directed graphs, entry i,j corresponds to an edge from i to j. | |
| 132 | |
| 133 If you want a pure Python adjacency matrix representation try | |
| 134 networkx.convert.to_dict_of_dicts which will return a | |
| 135 dictionary-of-dictionaries format that can be addressed as a | |
| 136 sparse matrix. | |
| 137 | |
| 138 For MultiGraph/MultiDiGraph with parallel edges the weights are summed. | |
| 139 See to_numpy_matrix for other options. | |
| 140 | |
| 141 The convention used for self-loop edges in graphs is to assign the | |
| 142 diagonal matrix entry value to the edge weight attribute | |
| 143 (or the number 1 if the edge has no weight attribute). If the | |
| 144 alternate convention of doubling the edge weight is desired the | |
| 145 resulting Scipy sparse matrix can be modified as follows: | |
| 146 | |
| 147 >>> import scipy as sp | |
| 148 >>> G = nx.Graph([(1,1)]) | |
| 149 >>> A = nx.adjacency_matrix(G) | |
| 150 >>> print(A.todense()) | |
| 151 [[1]] | |
| 152 >>> A.setdiag(A.diagonal()*2) | |
| 153 >>> print(A.todense()) | |
| 154 [[2]] | |
| 155 | |
| 156 See Also | |
| 157 -------- | |
| 158 to_numpy_matrix | |
| 159 to_scipy_sparse_matrix | |
| 160 to_dict_of_dicts | |
| 161 adjacency_spectrum | |
| 162 """ | |
| 163 return nx.to_scipy_sparse_matrix(G, nodelist=nodelist, weight=weight) | |
| 164 | |
| 165 | |
| 166 adj_matrix = adjacency_matrix | |
| 167 | |
| 168 | |
| 169 # fixture for pytest | |
| 170 def setup_module(module): | |
| 171 import pytest | |
| 172 scipy = pytest.importorskip('scipy') |
