Skip to content

Commit 0f9a516

Browse files
author
Anton Eriksson
committed
feat(python): Add effective number of modules
1 parent d74a773 commit 0f9a516

File tree

1 file changed

+44
-0
lines changed

1 file changed

+44
-0
lines changed

interfaces/python/infomap.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,31 @@
11
from collections import namedtuple
22
from contextlib import contextmanager
33

4+
try:
5+
from math import log2
6+
except ImportError:
7+
# Python < 3.3
8+
from math import log
9+
10+
def log2(p):
11+
return log(p, 2.0)
12+
13+
414
MultilayerNode = namedtuple("MultilayerNode", "layer_id, node_id")
515

616

17+
def plogp(p):
18+
return (x * log2(x) if x > 0 else 0 for x in p)
19+
20+
21+
def entropy(p):
22+
return -sum(plogp(p))
23+
24+
25+
def perplexity(p):
26+
return 2 ** entropy(p)
27+
28+
729
class Infomap(InfomapWrapper):
830
"""Infomap
931
@@ -1098,3 +1120,25 @@ def write_flow_tree(self, filename, states=False):
10981120
If the state nodes should be included (default False).
10991121
"""
11001122
return self.writeFlowTree(filename, states)
1123+
1124+
@property
1125+
def effective_num_modules(self, depth_level=1):
1126+
"""The flow weighted effective number of modules.
1127+
1128+
Measured as the perplexity of the module flow distribution.
1129+
1130+
Parameters
1131+
----------
1132+
depth_level : int, optional
1133+
The module level returned by ``iterator.module_id``. Set to 1 (default) to
1134+
return the top modules (coarsest level), set to 2 for second coarsest level
1135+
etc. Set to -1 to return the bottom level modules (finest level).
1136+
1137+
Returns
1138+
-------
1139+
float
1140+
The effective number of modules
1141+
"""
1142+
1143+
return perplexity([module.data.flow for module in self.get_tree(depth_level=depth_level)
1144+
if module.depth == depth_level])

0 commit comments

Comments
 (0)