2

我尝试使用 copy.deepcopy(graph) 但出现错误:

我的代码:

new_graph = TNEANet.New()
....
# some define for new_graph
....
copy_graph = copy.deepcopy(new_graph)

执行错误:

TypeError: object.__new__(SwigPyObject) is not safe, use SwigPyObject.__new__()

我还发现 API 有一个定义API Document。所以我尝试使用TNEANet(Graph)该任务:

new_graph = TNEANet.New()
....
# some define for new_graph
....
copy_graph = TNEANet(new_graph)

执行错误:

TypeError: in method 'new_TNEANet', argument 1 of type 'TSIn &'
4

2 回答 2

3

您可以使用ConvertGraph方法来复制图形。只需使用与目标类型相同的图形类型即可:

graph = snap.TNEANet.New()

graph.AddNode(1)
graph.AddNode(2)
graph.AddEdge(1,2)

copy_graph = snap.ConvertGraph(type(graph), graph)
于 2017-04-07T00:10:50.587 回答
1

简短的回答

最好的办法是自己复制节点、边和属性。我发现转储到文件并重新加载也运行良好,尽管如果您使用PNEANet. 这是我用来复制图形的一个方便的函数(比迭代更快):

def copy_graph(graph):
    tmpfile = '.copy.bin'

    # Saving to tmp file
    FOut = snap.TFOut(tmpfile)
    graph.Save(FOut)
    FOut.Flush()

    # Loading to new graph
    FIn = snap.TFIn(tmpfile)
    graphtype = type(graph)
    new_graph = graphtype.New()
    new_graph = new_graph.Load(FIn)

    return new_graph

长答案

有一种方法可以对您的图表进行深度复制:

import snap
new_graph = snap.TNEANet.New()
....
# some define for new_graph
....
copy_graph = snap.TNEANet(new_graph())

(这适用于任何类型的图)问题是snap.TNEANet当我们需要 a 时它会返回 a snap.PNEANet。后者只是 C++ 实现中指向前者的指针,但我们无法在 Python 中创建这个指针。因此,copy_graph功能将少于new_graph.

说明

SNAP 正在使用 python 的代理表示,它以某种方式使深拷贝过程复杂化。复制构造函数需要非代理类型,而您给它的是 python 代理类型。引发ATypeError显示第一个构造函数的签名,其中包含它知道的 1 个参数(这在此处完全不相关)。

为了解决这个问题,我们需要为构造函数提供使用该self.__call__()方法获得的底层 C++ 类型。

但是由于 C++(不好?)实现,snap.TNEANet(new_graph())输出一个snap.TNEANet. 这意味着此函数的输出将是非代理类型。因此,它不适用于大多数 SNAP 功能......

于 2014-10-27T05:11:42.577 回答