comparison planemo/lib/python3.7/site-packages/networkx/algorithms/reciprocity.py @ 1:56ad4e20f292 draft

"planemo upload commit 6eee67778febed82ddd413c3ca40b3183a3898f1"
author guerler
date Fri, 31 Jul 2020 00:32:28 -0400
parents
children
comparison
equal deleted inserted replaced
0:d30785e31577 1:56ad4e20f292
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2015-2019 by
3 # Aric Hagberg <hagberg@lanl.gov>
4 # Dan Schult <dschult@colgate.edu>
5 # Pieter Swart <swart@lanl.gov>
6 # All rights reserved.
7 # BSD license.
8 #
9 # Authors: Haochen Wu (wuhaochen42@gmail.com)
10 """Algorithms to calculate reciprocity in a directed graph."""
11 from networkx import NetworkXError
12 from ..utils import not_implemented_for
13
14 __all__ = ['reciprocity', 'overall_reciprocity']
15
16
17 @not_implemented_for('undirected', 'multigraph')
18 def reciprocity(G, nodes=None):
19 r"""Compute the reciprocity in a directed graph.
20
21 The reciprocity of a directed graph is defined as the ratio
22 of the number of edges pointing in both directions to the total
23 number of edges in the graph.
24 Formally, $r = |{(u,v) \in G|(v,u) \in G}| / |{(u,v) \in G}|$.
25
26 The reciprocity of a single node u is defined similarly,
27 it is the ratio of the number of edges in both directions to
28 the total number of edges attached to node u.
29
30 Parameters
31 ----------
32 G : graph
33 A networkx directed graph
34 nodes : container of nodes, optional (default=whole graph)
35 Compute reciprocity for nodes in this container.
36
37 Returns
38 -------
39 out : dictionary
40 Reciprocity keyed by node label.
41
42 Notes
43 -----
44 The reciprocity is not defined for isolated nodes.
45 In such cases this function will return None.
46
47 """
48 # If `nodes` is not specified, calculate the reciprocity of the graph.
49 if nodes is None:
50 return overall_reciprocity(G)
51
52 # If `nodes` represents a single node in the graph, return only its
53 # reciprocity.
54 if nodes in G:
55 reciprocity = next(_reciprocity_iter(G, nodes))[1]
56 if reciprocity is None:
57 raise NetworkXError('Not defined for isolated nodes.')
58 else:
59 return reciprocity
60
61 # Otherwise, `nodes` represents an iterable of nodes, so return a
62 # dictionary mapping node to its reciprocity.
63 return dict(_reciprocity_iter(G, nodes))
64
65
66 def _reciprocity_iter(G, nodes):
67 """ Return an iterator of (node, reciprocity).
68 """
69 n = G.nbunch_iter(nodes)
70 for node in n:
71 pred = set(G.predecessors(node))
72 succ = set(G.successors(node))
73 overlap = pred & succ
74 n_total = len(pred) + len(succ)
75
76 # Reciprocity is not defined for isolated nodes.
77 # Return None.
78 if n_total == 0:
79 yield (node, None)
80 else:
81 reciprocity = 2.0 * float(len(overlap)) / float(n_total)
82 yield (node, reciprocity)
83
84
85 @not_implemented_for('undirected', 'multigraph')
86 def overall_reciprocity(G):
87 """Compute the reciprocity for the whole graph.
88
89 See the doc of reciprocity for the definition.
90
91 Parameters
92 ----------
93 G : graph
94 A networkx graph
95
96 """
97 n_all_edge = G.number_of_edges()
98 n_overlap_edge = (n_all_edge - G.to_undirected().number_of_edges()) * 2
99
100 if n_all_edge == 0:
101 raise NetworkXError("Not defined for empty graphs")
102
103 return float(n_overlap_edge) / float(n_all_edge)