python-igraph:无法分解有向图(既不强也不弱)

时间:2017-01-25 16:04:49

标签: python python-3.x igraph

使用python-igraph 0.7.1(Python 3.4.8),我想将有向图分解为所有未连接的子图。但是,g.decompose(mode=WEAK)失败了:

igraph._igraph.InternalError: Error at components.c:469: only 'IGRAPH_WEAK' is implemented, Invalid value

由于错误消息和Google(例如click)告诉我,STRONG分解未实现,因此预计会失败,但 WEAK分解应该工作。好吧,它不适合我!

这是一个最小的例子:

from igraph import Graph, WEAK
g = Graph(directed=True)
g.add_vertices(4)
g.add_edges([(0, 1), (2, 3)])
g.decompose(mode=WEAK) # <= FAILS!

我已尝试mode="weak"mode="WEAK"mode=WEAKmode=1,并且始终遇到同样的错误。

是否有解决方法,即一些导致相同结果的其他命令?(请注意,我并不熟悉图论,所以我可能会错过这方面的一些明显的东西。)

1 个答案:

答案 0 :(得分:0)

  

是否可能有一种解决方法,即一组导致相同结果的其他一些命令?

事实上,我找到了似乎有效的解决方法:

from igraph import graph, WEAK
g = Graph(directed=True)
g.add_vertices(6)
g.vs["ts"] = [0, 1, 2, 3, 1, 2] # timesteps
g.add_edges([(0, 1), (1, 2), (2, 3), (4, 5)])

# sgs = g.decompose(mode=WEAK) # fails!
#< workaround
g.to_undirected() # we won't need 'g' anymore afterwards
sgs = g.decompose(mode=WEAK)
for sg in sgs:
    sg.to_directed(mutual=True)
    es_del = sg.es.select(lambda e: e.graph.vs[e.source]["ts"] > e.graph.vs[e.target]["ts"])
    sg.delete_edges(es_del)
#>

我将原始有向图转换为单向图,将其分解为子图,将所有子图转换回两个方向都有边缘的有向图,并删除指向错误方向的所有边。当然,如果原始图形应该保留,我们应该首先复制它(或者在分解后将其转换回有向图)。

警告:请注意,在将有向图转换为无向图时,边缘属性似乎已丢失!据我所知,他们需要手动恢复(至少我正在做的事情)。