import networkx as nx
G1 = nx.Graph()
G1.add_nodes_from([('a', {'type':1}), ('b', {'type':1}), ('c', {'type':1})])
G1.add_edges_from([('a', 'b'), ('b', 'c')])
G2 = nx.Graph()
G2.add_nodes_from([('a', {'type':1}), ('b', {'type':1}), ('c', {'type':2})])
G2.add_edges_from([('b', 'c'), ('a', 'b')])
G3 = nx.Graph()
G3.add_nodes_from([('a', {'type':1}), ('b', {'type':1}), ('c', {'type':2})])
G3.add_edges_from([('b', 'c'), ('a', 'b')])
def try_convert(input_func):
# input_func에서 exception이 발생할 때의 기능을 추가해준다.
# 특히, lambda 펑션과 같이 쓸때 편해짐.
def temp_function(*args, **kwargs):
try:
return input_func(*args, **kwargs)
except:
return False
return temp_function
print(f"G1==G2: {G1==G2}")
# node의 attr이 다른데도 True가 출력됨.
print(f"isomorphic without attr: {nx.is_isomorphic(G1, G2)}")
# node match function은 x, y를 인풋으로 받아서, True, False를 리턴해주는 함수
# 여기서, x, y는 각각 노드의 attr dict임.
node_match_func = lambda x, y: True if x['type']==y['type'] else False
node_match_func = try_convert(node_match_func)
# G1, G2의 경우 node와 edge는 같지만, node의 attr이 다름.
print(f"isomorphic with attr: {nx.is_isomorphic(G1, G2, node_match=node_match_func)}")
# G2, G3의 경우 node와 edge, node의 attr도 같음
print(f"isomorphic with attr: {nx.is_isomorphic(G2, G3, node_match=node_match_func)}")
댓글남기기