import networkx as nx
import numpy as np
def merge_node(G, nodeA, nodeB):
"""
G의 nodeA를 nodeB로 변환해준다.
G를 shallow copy로 가져왔으며, call by reference의 형태로 바로 바꿔줌.
그리고, 이 과정에서 nodeA와 nodeB사이에 edge가 있었다면 이 edge는 삭제된다.
"""
# UPDATE Node weight
G.nodes[nodeB]['weight'] += G.nodes[nodeA]['weight']
# UPDATE Edge weight
for A_nbr in G[nodeA]:
if G.has_edge(A_nbr, nodeB):
# 이미 A_nbr이 nodeB와 연결되어 있다면, edge의 weight만 update하면 됨.
G[nodeB][A_nbr]['weight'] += G[nodeA][A_nbr]['weight']
else:
# 연결되어 있지 않으므로 새로운 edge를 만들어주어야 함.
if A_nbr is not nodeB:
# self-loop가 아닌지 확인
G.add_edge(nodeB, A_nbr, weight=G[nodeA][A_nbr]['weight'])
else:
# self-loop
continue
G.remove_node(nodeA)
RG = np.random.RandomState(seed=0)
G = nx.complete_graph(4)
nx.set_node_attributes(
G, dict(zip(G, RG.randint(1, 10, len(G)))), 'weight')
nx.set_edge_attributes(
G, dict(zip(G.edges(), RG.randint(1, 10, len(G.edges())))), 'weight')
print(f"== BEFORE")
print(f"---- NODE attr")
for n in G.nodes(data=True):
print(n)
print(f"---- EDGE attr")
for e in G.edges(data=True):
print(e)
print("=="*20)
merge_node(G, 0, 1)
print(f"== AFTER")
print(f"---- NODE attr")
for n in G.nodes(data=True):
print(n)
print(f"---- EDGE attr")
for e in G.edges(data=True):
print(e)
print("=="*20)
== BEFORE
---- NODE attr
(0, {'weight': 6})
(1, {'weight': 1})
(2, {'weight': 4})
(3, {'weight': 4})
---- EDGE attr
(0, 1, {'weight': 8})
(0, 2, {'weight': 4})
(0, 3, {'weight': 6})
(1, 2, {'weight': 3})
(1, 3, {'weight': 5})
(2, 3, {'weight': 8})
========================================
== AFTER
---- NODE attr
(1, {'weight': 7})
(2, {'weight': 4})
(3, {'weight': 4})
---- EDGE attr
(1, 2, {'weight': 7})
(1, 3, {'weight': 11})
(2, 3, {'weight': 8})
========================================
댓글남기기