NetworkXグラフがあります。複数のノード間でエッジ収縮を行う方法を知りたいのですが。
たとえば、X、Y、Zを契約したい場合:
_ node A _
_/ | \_
node X --- node Y --- node Z
になります
node A
|
node XYZ (or whatever X/Y/Z)
グラフの作成は問題ではありません。できます。同じ「意味」を持つノードをマージしてグラフを縮小したいと思います。「endlvl」(ノード名の長さは7に等しい)と呼び、互いにリンクされているノードです。
NetworkXで凝縮関数を見つけたので、それを使用してみました。
# edge contraction for same nodes
# for each node, get the links to other nodes "end lvl"
# if there is such a link, it means that these node are
# the sames
#
# copy graph
I = G
for n,d in G.nodes(data=True):
if n in I.nodes():
if len(n) == 7:
# list of nodes adjacent to n : filter only "end lvl" nodes
neighbors = [ node for node in I.neighbors(n) if len(node) == 7 ]
nodes_to_merges = neighbors.append(n)
I = nx.condensation(I,scc=nodes_to_merges)
JSONに変換したときに得たものは次のとおりです。
{"directed": true, "graph": [], "nodes": [{"id": 0}], "links": [], "multigraph": false}
ご覧のとおり問題があります...
関数への参照はここにあります。