Как получить доступ к краям графического инструмента? Почему ребра графического инструмента не имеют идентификаторов?

Я пытаюсь получить доступ к краям графического инструмента. Пример: предположим следующий график.

from graph_tool.all import *

g = Graph()

eprop = g.new_edge_property("int")
g.edge_properties["distance"] = eprop

v0 = g.add_vertex()
v1 = g.add_vertex()
v2 = g.add_vertex()
v3 = g.add_vertex()
v4 = g.add_vertex()

e0 = g.add_edge(v0, v1) 
g.ep.distance[e0] = 1
e1 = g.add_edge(v1, v2)
g.ep.distance[e1] = 1
e2 = g.add_edge(v2, v3)
g.ep.distance[e2] = 1
e3 = g.add_edge(v3, v4)
g.ep.distance[e3] = 1
e4 = g.add_edge(v0, v4)
g.ep.distance[e4] = 1
e5 = g.add_edge(v0, v4)
g.ep.distance[e5] = 2

graph_draw(g, vertex_text=g.vertex_index, vertex_font_size=18, output_size=(200, 200), output="Test.png")

Изображение

Из вершины 0 в вершину 4 ведут два ребра, одно длиной 1, другое длиной 2.

Теперь мой вопрос заключается в том, как выбрать конкретное ребро, зная индекс ребра. К сожалению, документация графического инструмента теперь гласит: «... Ребра не могут быть получены напрямую по их индексу, но если исходная и целевая вершины данного ребра известны, их можно получить с помощью метода edge () ...»

Но после сохранения и загрузки графика переменные v0,v1,... а также e0,e1,... больше не доступны. Попытка получить доступ к ребрам в графе, как указано в документации:

e = g.edge(0,4)
print(g.edge_index[e])
# > Returns 4

Просто возвращает одно из ребер из вершины 0 в вершину 4. Как получить доступ к другому? Зная, что индексы ребер равны 4 и 5.

Спасибо за помощь заранее!


person JustSomeone    schedule 02.08.2017    source источник
comment
Ваш g — это граф, а не мультиграф. Только мультиграфы могут иметь параллельные ребра.   -  person DYZ    schedule 02.08.2017
comment
Мой график мультиграф - правда. graph-tool.skewed.de/static/doc/ Но проблема не в этом. Проблема в том, как получить доступ к краям!   -  person JustSomeone    schedule 02.08.2017


Ответы (1)


Вы можете получить все параллельные ребра между узлами u и v с помощью:

g.edge(u, v, all_edges=True)

Вы можете перебрать все ребра с помощью:

for e in g.edges():
    print(e)

И вы можете искать ребро с определенным индексом с помощью:

find_edge(g, g.edge_index, 33)
person Tiago Peixoto    schedule 02.08.2017
comment
Большое спасибо! Но в чем причина того, что нельзя получить доступ к краям по индексу края? (например, g.edge(4)) - person JustSomeone; 02.08.2017
comment
Поскольку ребра не хранятся в векторе, используемая структура данных графа представляет собой список смежности. - person Tiago Peixoto; 02.08.2017