use networkx exclusively to maintain the graph structure

This commit is contained in:
Paul Gauthier 2023-05-31 16:53:42 -07:00
parent b88dc7828c
commit c46e8daa32

View file

@ -312,31 +312,20 @@ def call_map():
idents = set(defines.keys()).intersection(set(references.keys())) idents = set(defines.keys()).intersection(set(references.keys()))
dot = graphviz.Digraph(graph_attr={"ratio": ".5"}) G = nx.MultiDiGraph()
labels = defaultdict(list)
edges = defaultdict(float)
for ident in idents: for ident in idents:
defs = defines[ident] definers = defines[ident]
num_defs = len(defs) num_defs = len(definers)
if num_defs > 3: if num_defs > 3:
continue continue
for referencer, num_refs in Counter(references[ident]).items(): for referencer, num_refs in Counter(references[ident]).items():
for definer in defines[ident]: for definer in definers:
if referencer == definer: if referencer == definer:
continue continue
# tuple(sorted([referencer, definer])) weight = num_refs / num_defs
name = referencer, definer G.add_edge(referencer, definer, weight=num_refs, label=ident)
edges[name] += num_refs
labels[name].append((num_refs, ident))
G = nx.DiGraph()
for edge, weight in edges.items():
refs, defs = edge
G.add_edge(refs, defs, weight=weight)
G.add_edge(defs, refs, weight=weight)
# personalization = dict() # personalization = dict()
# personalization["utils.py"] = 1.0 # personalization["utils.py"] = 1.0
@ -364,6 +353,8 @@ def call_map():
G.remove_nodes_from(list(nx.isolates(G))) G.remove_nodes_from(list(nx.isolates(G)))
""" """
dot = graphviz.Digraph(graph_attr={"ratio": ".5"})
max_rank = max(ranked.values()) max_rank = max(ranked.values())
min_rank = min(ranked.values()) min_rank = min(ranked.values())
for fname in G.nodes(): for fname in G.nodes():
@ -377,19 +368,16 @@ def call_map():
fname, penwidth=str(pen), width=str(size), height=str(size), fontsize=str(fontsize) fname, penwidth=str(pen), width=str(size), height=str(size), fontsize=str(fontsize)
) )
max_w = max(edges.values())
for refs, defs, data in G.edges(data=True): for refs, defs, data in G.edges(data=True):
weight = data["weight"] weight = data["weight"]
label = data["label"]
r = random.randint(0, 128) r = random.randint(0, 128)
g = random.randint(0, 128) g = random.randint(0, 128)
b = random.randint(0, 128) b = random.randint(0, 128)
color = f"#{r:02x}{g:02x}{b:02x}80" color = f"#{r:02x}{g:02x}{b:02x}80"
weight = weight * 10 / max_w weight = weight * 2
label = labels[(refs, defs)] dot.edge(refs, defs, penwidth=str(weight), color=color, fontcolor=color, label=label)
label = sorted(label, reverse=True)
label = " ".join(ident for cnt, ident in label[:5])
dot.edge(refs, defs, penwidth=str(weight), color=color, label=label, fontcolor=color)
top_rank = sorted([(rank, node) for (node, rank) in ranked.items()], reverse=True) top_rank = sorted([(rank, node) for (node, rank) in ranked.items()], reverse=True)
# Print the PageRank of each node # Print the PageRank of each node