def get_infomap_communities(graph: nx.Graph, reddit_edge_weight=None): im = Infomap("--flow-model undirected -N 10 --prefer-modular-solution") ## im only works with numerical ids, so we need to save a mapping ids_to_names = {} names_to_ids = {} for index, node in enumerate(graph.nodes): ids_to_names[index] = node names_to_ids[node] = index im.add_node(index, name=node) # iterate over edges and add them to the im tree, optionally adding the weight for e1, e2, data in graph.edges(data=True): e1_id = names_to_ids[e1] e2_id = names_to_ids[e2] weight = data[reddit_edge_weight] if reddit_edge_weight else None link = (e1_id, e2_id, weight) if weight else (e1_id, e2_id) im.add_link(*link) im.run() for node in im.tree: if node.is_leaf: graph.nodes[ids_to_names[node.node_id]][ "infomap_community" ] = node.module_id return graph
def get_benchmark_amis(G,gt): # Louvain louv = community.best_partition(G) louvc = [] for idx,val in louv.items(): louvc.append(val) louv_ami = metrics.adjusted_mutual_info_score(gt,louvc) # Fluid communities fluid = asyn_fluidc(G,2) list_nodes = [set(c) for c in fluid] est_idx = np.zeros((nx.number_of_nodes(G),)) for i in range(len(list_nodes)): for idx in list_nodes[i]: est_idx[idx] = i fluid_ami = metrics.adjusted_mutual_info_score(gt,est_idx) # FastGreedy list_nodes = list(greedy_modularity_communities(G)) est_idx = np.zeros((nx.number_of_nodes(G),)) for i in range(len(list_nodes)): for idx in list_nodes[i]: est_idx[idx] = i fg_ami = metrics.adjusted_mutual_info_score(gt,est_idx) # Infomap im = Infomap() for node in G.nodes: im.add_node(node) for edge in G.edges: im.add_link(edge[0], edge[1]) im.add_link(edge[1],edge[0]) # Run the Infomap search algorithm to find optimal modules im.run() # print(f"Found {im.num_top_modules} modules with Infomap") est_idx = np.zeros((nx.number_of_nodes(G),)) for node in im.tree: if node.is_leaf: est_idx[node.node_id] = node.module_id im_ami = metrics.adjusted_mutual_info_score(gt,est_idx) benchmark = {'Louvain':louv_ami, 'Fluid':fluid_ami, 'FastGreedy':fg_ami, 'Infomap':im_ami} return benchmark
for idx in list_nodes: est_idx[idx] = com runtime = time.time() - time_s mutual_info = metrics.adjusted_mutual_info_score(database['labels'], est_idx) scores['louvain-noisy'] = mutual_info runtimes['louvain-noisy'] = runtime ########################################################### ########################################################### # Method: Infomap ########################################################### # Raw time_s = time.time() im = Infomap() for node in G.nodes: im.add_node(node) for edge in G.edges: im.add_link(edge[0], edge[1]) im.add_link(edge[1], edge[0]) # Run the Infomap search algorithm to find optimal modules im.run() # print(f"Found {im.num_top_modules} modules with Infomap") est_idx = np.zeros((num_nodes, )) for node in im.tree: if node.is_leaf: est_idx[node.node_id] = node.module_id runtime = time.time() - time_s mutual_info = metrics.adjusted_mutual_info_score(database['labels'], est_idx) scores['infomap-raw'] = mutual_info runtimes['infomap-raw'] = runtime
from infomap import Infomap im = Infomap(two_level=True, silent=True) # Optionally add nodes with names im.add_node(0, "Node 0") im.add_node(1, "Node 1") # Adding links automatically create nodes if not exist. # Optionally add weight as third argument im.add_link(0, 1) im.add_link(0, 2) im.add_link(0, 3) im.add_link(1, 0) im.add_link(1, 2) im.add_link(2, 1) im.add_link(2, 0) im.add_link(3, 0) im.add_link(3, 4) im.add_link(3, 5) im.add_link(4, 3) im.add_link(4, 5) im.add_link(5, 4) im.add_link(5, 3) print("Run Infomap...") im.run() print( f"Found {im.num_top_modules} modules with codelength {im.codelength:.8f} bits"