Уменьшите количество операций над краями в графическом инструменте с помощью настраиваемой функции - PullRequest
0 голосов
/ 06 мая 2020

У меня есть граф в графическом инструменте с параллельными ребрами. Всем параллельным ребрам присваивается EdgePropertyMap, представляющий их вес с помощью double. Я хотел бы вернуть граф, в котором ребра сжаты в одно ребро, где выполняется настраиваемая операция уменьшения этих весов. Например:

H = gt.Graph(directed=True)
H.add_edge(0,1) # edge 0
H.add_edge(0,1) # edge 1
H.add_edge(0,1) # edge 2
H.add_edge(1,0) # edge 3 
H.add_edge(0,2) # edge 4

ew = H.new_edge_property("double")

ew[list(H.edges())[0]]=1.2
ew[list(H.edges())[1]]=2.3
ew[list(H.edges())[2]]=-4.2
ew[list(H.edges())[3]]=5.8
ew[list(H.edges())[3]]=1.0
H.ep['weights'] = ew

В этом случае край (0,1) с функцией сокращения «сумма» должен иметь общий вес 1.2+2.3-4.2= -0.7, в то время как остальные края должны иметь тот же вес (т. Е. Край 3 должен выдерживать вес 5,8, а край 4 - 1,0). Использование gt.condensation_graph, похоже, помогает, но можно выполнить только операцию sum. Для этого нам нужно добавить уникальное свойство вершины к каждому узлу:

H.vp['index'] = H.new_vertex_property("int")
H.vp['index'][0]=0
H.vp['index'][1]=1
H.vp['index'][2]=2
H.vp['index'][3]=3
H.vp['index'][4]=4

, а затем использовать его как «prop»:

Hcond, prop, vcount, ecount, v_avg, edge_avg = gt.condensation_graph(H,prop=H.vp['index'], aeprops=[H.ep['weights']])

К сожалению, эта функция позволяет выполнять только операцию суммирования. быть исполненным. А как насчет использования другой функции "уменьшения", например max? А как насчет операций с нечисловыми c типами ребер? Это очень поможет выполнять сложные операции непосредственно в Graph-tool, даже если тип значения свойства edge отличается от numeri c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...