ubuntuシステムでgraph-tools BFS検索をセットアップしようとしました。バグのため、 のgraph_tools.bfs_search()
代わりにを使用せざるを得なくなりgraph_tools.bfs_iterator
ました。
から継承する例で述べたように、最小限のクラスを設定しましたgraph_tools.BFSVisitor
。
(num_nodes, num_actions)
これの目的は、グラフ内の特定のノードから到達可能なすべてのエッジ ソース ノードとエッジ アクション値のペアを追跡し、それらを numpy 配列に格納して、配列が次の次元を持つようにすることですnum_actions
。グラフの出次数。
関数はその役割を果たしますが、エッジ アクションを取得するためにグラフのエッジ PropertyMapself.edge_action[edge]
にアクセスすることは大きなボトルネックであり、コードの速度が大幅に低下します。しかし、そもそもグラフツールを速度のためだけに使用しようとしたので、今は少し行き詰まっています。
グラフツールライブラリについて何か不足していますか、それともこれを高速化する方法はありませんか? それ以外の場合は、networkx に戻って、そこで最速の方法を見つけようとすることもできます。グラフ ツールの C++ パワーを使用するために、この pythonic ループを使用してエッジ アクションにアクセスすることを避ける方法は考えられません。
ここで私の単純なクラス:
class SetIterator(gt.BFSVisitor):
def __init__(self, action, safe_set):
"""
action: gt.PropertyMap
edge property representing edge action
safe_set: np.array
array used to store safe node, action pairs
"""
self.edge_action = action
self.ea = self.edge_action
self.safe_set = safe_set
def discover_vertex(self, u):
"""
Invoked on first encounter of vertex.
Parameters
----------
u: gt.Vertex
"""
self.safe_set[int(u), 0] = True
def examine_edge(self, e):
"""
Called when edge is checked
Parameters
----------
e: gt.Edge
"""
# TODO This one line is bottleneck of code
self.safe_set[int(e.source()), self.ea[e]] = True