forEdges迭代器在networkit(python)中的使用

forEdges迭代器在networkit(python)中的使用,python,graph,network-analysis,networkit,Python,Graph,Network Analysis,Networkit,我仔细阅读了文档,但我仍然不清楚如何使用G.forEdges,它被描述为一个实验性的边缘迭代器接口 假设我想降低图形的密度。我有一个排序的权重列表,我想根据它们的权重删除边,直到图形拆分为两个连接的组件。然后,我将选择保持图形连接的最小链接数。我会这样做: cc = components.ConnectedComponents(G).run() while cc.numberOfComponents()==1: for weight in weightlist: for

我仔细阅读了文档,但我仍然不清楚如何使用G.forEdges,它被描述为一个实验性的边缘迭代器接口

假设我想降低图形的密度。我有一个排序的权重列表,我想根据它们的权重删除边,直到图形拆分为两个连接的组件。然后,我将选择保持图形连接的最小链接数。我会这样做:

cc = components.ConnectedComponents(G).run()
while cc.numberOfComponents()==1:
    for weight in weightlist:
        for (u,v) in G.edges():
            if G.weight(u,v)==weight:
                G=G.removeEdge(u,v)
顺便说一下,我从中知道有一个边迭代器,它可能以更有效的方式进行迭代。但是从文档中我真的不明白如何正确使用这些forEdges,在互联网上我也找不到一个例子。有什么想法吗


或者,也许是我想做的另一个想法:因为这是一个巨大的图,即使我在集群上工作,迭代也会花费很长时间。

NetworKit迭代器接受回调函数,因此如果你想在边或节点上迭代,你必须定义一个函数,然后将其作为参数传递给迭代器。你可以找到更多的信息。例如,仅打印所有边的简单函数是:

# Callback function.
# To iterate over edges it must accept 4 parameters
def myFunction(u, v, weight, edgeId):
    print("Edge from {} to {} has weight {} and id {}".format(u, v, weight, edgeId))

# Using iterator with callback function
G.forEdges(myFunction)
现在,如果您想继续删除权重在权重列表中的边,直到图形拆分为两个连接的组件,那么您还必须更新图形的连接组件,因为连接组件不会自动为您执行此操作,这可能也是迭代永远耗时的原因之一。为了有效地执行此操作,您可以使用DynConnectedComponents类,请参见下面的示例。在这种情况下,我认为边缘迭代器对您帮助不大,所以我建议您继续使用for循环

from networkit import *

# Efficiently updates connected components after edge updates
cc = components.DynConnectedComponents(G).run()

# Removes edges with weight equals to w until components split
def removeEdges(w):
    for (u, v) in G.edges():
        if G.weight(u, v) == weight:
            G.removeEdge(u, v)
            # Updating connected components
            event = dynamic.GraphEvent(dynamic.GraphEvent.EDGE_REMOVAL, u, v, weight)
            cc.update(event)
            if cc.numberOfComponents() > 1:
                # Components did split
                return True
    # Components did not split
    return False

if cc.numberOfComponents() == 1:
    for weight in weights:
        if removeEdges(weight):
            break

这将使原始代码的速度提高一点。但是,它仍然是顺序代码,因此即使您在多核机器上运行它,它也只会使用一个核。

非常好的解释,我非常感谢!特别是对于graphEvent部分:这是另一件我完全不清楚的事情,因为我在文档中找不到任何东西。事实上,networkit.dynamic下没有关于它的内容。再次感谢!