2017-09-29 17 views
0

GraphViewオブジェクトのpython graph_toolパッケージは、基本グラフ自体がGraphViewオブジェクトの場合は期待どおりに動作していないようです。問題を示すコードを次に示します。graph_toolのプロパティマップはGraphWiewsで動作しますか?

from graph_tool import * 
import numpy as np 

g = Graph() 
p1 = g.new_vertex_property("bool") 
gv1 = GraphView(g, p1) 
p2 = gv1.new_vertex_property("bool") 
gv2 = GraphView(gv1, p2) 

print gv1.num_vertices() 

これは期待通りに0を出力します。頂点を追加していません。

v = g.add_vertex() 
p1[v] = True 
print gv1.num_vertices() 

これは、期待どおりに1を出力します。プロパティマップを変更すると、ビューが更新されます。

for w in gv1.vertices(): 
    p2[w] = True 
print gv2.num_vertices() 

これは、私が期待していなかった0を出力します。プロパティマップを変更しても、ビューは更新されないようです。

p2[v] = True 
print gv2.num_vertices() 

助けていないようg代わりのgv1から頂点オブジェクトを使用しました。 0が再び印刷されます。

gv2 = GraphView(gv1, p2) 
print gv2.num_vertices() 

これは、何らかの形で、ビューを問題は、プロパティマップではないことを示唆しているものの、1を出力します。

私には何が欠けていますか? GraphViewのオブジェは、、すなわち別のGraphViewオブジェクトから生成され、に構成されている

答えて

1

、下層のプロパティマップは、をコピーする必要があることを意味する、numpy.logical_and()を用いて、合成する必要があります。あなたがp1p2のいずれかを変更した場合、それが作成後、それはもはや、gv2に影響を与えるように、だから、あなたの例では、gv2が使用する内部プロパティマップは、p1と組み合わせp2コピーできなくなります。

gv2で使用されている地図を変更する場合は、gv2.get_edge_filter()で取得できます。

+0

ありがとうございます!私のアプリケーションでは、gv1と新しい近隣ノードを「作成」するためのヘルパー関数が渡されています。ヘルパー関数がノードを作成しているのか、それともGraphView経由で公開しているのか不自然でなければなりません。この不可知論を維持することは可能だが、ちょっとした注意が必要だと思われる。 –

関連する問題