Commit 90276b3f authored by Yoann Dufresne's avatar Yoann Dufresne
Browse files

add some verbose

parent 66948796
......@@ -7,22 +7,25 @@ import itertools
def deconvolve(G,node, verbose=0):
def local_deconvolve(G,node, verbose=0):
neighbors = list(G.neighbors(node))
nei_len = len(neighbors)
# Extract neighbors from the graph
G_neighbors = nx.Graph(G.subgraph(neighbors))
communities = get_communities(G_neighbors, verbose=verbose-1)
communities = get_communities(G_neighbors, max_overlap=0, verbose=verbose-1)
# Continue only if something need to be splited.
if len(communities) == 1:
if verbose > 0:
print("node",node,nei_len,"neighbors")
print("No split\n")
return
# Split communities
for idx, community in enumerate(communities):
# Add community center
node_name = f"{node}_{idx}"
node_name = f"{node}.{idx}"
G.add_node(node_name)
# Add links from the center to the community
......@@ -36,7 +39,7 @@ def deconvolve(G,node, verbose=0):
print("splitted into", len(communities), "parts\n")
def get_communities(G, max_overlap=1, verbose=0):
def get_communities(G, max_overlap=1, strict=True, verbose=0):
# Half d-graphs are cliques. So compute max cliques
cliques = list(nx.find_cliques(G))
......@@ -65,20 +68,44 @@ def get_communities(G, max_overlap=1, verbose=0):
continue
# Check for d-graph candidates
d_graph = compute_d_graph(clq1, clq2, G, verbose=verbose-1)
d_graph = compute_d_graph(clq1, clq2, G, verbose=verbose-1, max_diff_size=0)
if d_graph != None:
candidate_d_graphs.append(d_graph)
# Extract communites from all the possible d-graphes in the neighborood.
# Extract communities from all the possible d-graphes in the neighborood.
# This is a minimal covering d_graph algorithm.
minimal_d_graphes = filter_d_graphs(candidate_d_graphs, max_overlap=max_overlap)
minimal_d_graphes, unpartitionned = filter_d_graphs(candidate_d_graphs, max_overlap=max_overlap)
if strict and len(unpartitionned) > 0:
if verbose > 0:
print("Partialy unpartionned. Aborted")
return [list(G.nodes())]
communities = [list(set(d_graph[0]+d_graph[1])) for d_graph in minimal_d_graphes]
# complete unpartitionned nodes
to_add = []
for idx, d_graph in enumerate(communities):
for node in d_graph:
neighbors = G.neighbors(node)
for nei in neighbors:
if nei in unpartitionned:
to_add.append(node)
break
unpartitionned.extend(list(set(to_add)))
# If no community detected, return one big.
if len(minimal_d_graphes) == 0:
if len(unpartitionned) == len(list(G.nodes())):
return [list(G.nodes())]
# add unpartitionned if not empty
elif len(unpartitionned) > 0:
communities.append(unpartitionned)
if verbose > 0:
for community in communities:
print(community)
communites = [list(set(d_graph[0]+d_graph[1])) for d_graph in minimal_d_graphes]
return communites
return communities
""" This function take two cliques in the graph G and try to find if they are 2 halfes
......@@ -180,6 +207,7 @@ def filter_d_graphs(candidates, max_overlap=0):
# take d_graphes with nodes that appears only once
filtered = []
partitionned = False
for overlap_size in range(max_overlap+1):
# Look for d_graphs with overlapping halves first, then 1 node, ...
for d_graph in sorted_d_graphs[overlap_size]:
......@@ -207,16 +235,17 @@ def filter_d_graphs(candidates, max_overlap=0):
if not val:
over = False
break
if over: break
# TODO : improve performances when there are no uniq solution
for val in selected.values():
if not val:
# print(min(counts.values()), counts)
return []
if over:
partitionned = True
break
# print(len(filtered))
return filtered
# If the partionning is not complete, try to subdivise the node anyway.
# Split the node in n d_graph partitions + 1 unpartitionned set of nodes
unpartitionned = [node for node in selected if not selected[node]]
if len(unpartitionned) == len(selected):
return [], unpartitionned
else:
return filtered, unpartitionned
def main():
......@@ -231,7 +260,7 @@ def main():
# Deconvolve
g_nodes = list(G.nodes())
for node in g_nodes:
deconvolve(G,node, verbose=1)# if (node=="273:597_148") else 0)
local_deconvolve(G,node, verbose=2 if (node.startswith("0:")) else 0)
# exit()
print(len(g_nodes), "->", len(list(G.nodes())))
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment