comparison env/lib/python3.9/site-packages/networkx/generators/stochastic.py @ 0:4f3585e2f14b draft default tip

"planemo upload commit 60cee0fc7c0cda8592644e1aad72851dec82c959"
author shellac
date Mon, 22 Mar 2021 18:12:50 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:4f3585e2f14b
1 """Functions for generating stochastic graphs from a given weighted directed
2 graph.
3
4 """
5
6 from networkx.classes import DiGraph
7 from networkx.classes import MultiDiGraph
8 from networkx.utils import not_implemented_for
9
10 __all__ = ["stochastic_graph"]
11
12
13 @not_implemented_for("undirected")
14 def stochastic_graph(G, copy=True, weight="weight"):
15 """Returns a right-stochastic representation of directed graph `G`.
16
17 A right-stochastic graph is a weighted digraph in which for each
18 node, the sum of the weights of all the out-edges of that node is
19 1. If the graph is already weighted (for example, via a 'weight'
20 edge attribute), the reweighting takes that into account.
21
22 Parameters
23 ----------
24 G : directed graph
25 A :class:`~networkx.DiGraph` or :class:`~networkx.MultiDiGraph`.
26
27 copy : boolean, optional
28 If this is True, then this function returns a new graph with
29 the stochastic reweighting. Otherwise, the original graph is
30 modified in-place (and also returned, for convenience).
31
32 weight : edge attribute key (optional, default='weight')
33 Edge attribute key used for reading the existing weight and
34 setting the new weight. If no attribute with this key is found
35 for an edge, then the edge weight is assumed to be 1. If an edge
36 has a weight, it must be a a positive number.
37
38 """
39 if copy:
40 G = MultiDiGraph(G) if G.is_multigraph() else DiGraph(G)
41 # There is a tradeoff here: the dictionary of node degrees may
42 # require a lot of memory, whereas making a call to `G.out_degree`
43 # inside the loop may be costly in computation time.
44 degree = dict(G.out_degree(weight=weight))
45 for u, v, d in G.edges(data=True):
46 if degree[u] == 0:
47 d[weight] = 0
48 else:
49 d[weight] = d.get(weight, 1) / degree[u]
50 return G