2014-09-26 19 views
1

我正在使用Metis for Python,这是Metis(一种图形分区软件)的Python包装程序。我已经安装了一切,它似乎工作正常,但我不明白如何构建图形输入。如何在Metis for Python中构建图形

有在网上例如:http://metis.readthedocs.org/en/latest/#example

>>> import networkx as nx 
>>> import metis 
>>> G = metis.example_networkx() 
>>> (edgecuts, parts) = metis.part_graph(G, 3) 
>>> colors = ['red','blue','green'] 
>>> for i, p in enumerate(parts): 
...  G.node[i]['color'] = colors[p] 
... 
>>> nx.write_dot(G, 'example.dot') # Requires pydot or pygraphviz 

我跑这个例子中,它工作正常。然而在这个例子中,他们从未指定如何构建图形“example_networkx()”。 我试图通过networkx构建图:http://metis.readthedocs.org/en/latest/#metis.networkx_to_metis

我的代码是:

>>> A=nx.Graph() 
>>> A.add_edges_from([(3,1),(2,3),(1,2),(3,4),(4,5),(5,6),(5,7),(7,6),(4,10),(10,8),(10,9),(8,9)]) 
>>> G = metis.networkx_to_metis(A) 
>>> (edgecuts, parts) = metis.part_graph(G, 3) 

我在上线得到一个错误。该错误是追溯到梅蒂斯这些线路内置代码:

in part_graph(graph, nparts, tpwgts, ubvec, recursive, **opts) 
    graph = adjlist_to_metis(graph, nodew, nodesz) 
in adjlist_to_metis(adjlist, nodew, nodesz) 
    m2 = sum(map(len, adjlist)) 
TypeError: object of type 'c_long' has no len() 

我也试图通过邻接表来构造图:http://metis.readthedocs.org/en/latest/#metis.adjlist_to_metis 但是这给了同样的错误了。

我想知道如果有人有这个问题,或有任何想法我做错了什么。

我使用python 2.7在CentOS 6.5

回答

3

的metis.part_graph接受的图表都networkx和邻接表表示。 当你构造一个networkx图时,你几乎是正确的。但是,您应该直接将此图传递给part_graph函数,而不是先将其转换为metis对象,因为part_graph函数不直接接受metis类型图。 鉴于numpy的一个adjajancy矩阵A,一个例子可以是:

# since weights should all be integers 
G = networkx.from_numpy_matrix(np.int32(A)) 
# otherwise metis will not recognize you have a weighted graph 
G.graph['edge_weight_attr']='weight'   
[cost, parts] = metis.part_graph(G, nparts=30, recursive=True)