Hi,
It is indeed safe up to a certain point. But one needs to be careful when
using an algorithm like dijkstra_search, as the result might be unexpected.
But there is a work-around...
dijkstra_search: when specifying the weights as small integer values stored
in a "bool", the result dist_map has only 0 or 1 values for the distance
from a source vertex. There is a work-around as one can give the dist_map
as argument, and declare dist_map to have a value type of 'int16_t or
higher'.
It works as expected, but one needs to be aware that the result map should
be given as argument to dijkstra_search().
Thanks for the great package...
Didier
import graph_tool.all as gt
import numpy as np
g = gt.Graph()
g.add_vertex(10)
for i in range(9): g.add_edge(i, i+1)
# 'bool' edge_property: dijkstra_search() assumes the edge values to be
boolean
g.edge_properties['weight'] = g.new_edge_property('bool')
for e in g.edges(): g.edge_properties['weight'][e] = np.random.randint(1,
10)
dist_map, pred_map = gt.dijkstra_search(g, source=g.vertex(0),
weight=g.edge_properties['weight'])
print dist_map.value_type()
print dist_map.a
bool
[0 1 1 1 1 1 1 1 1 1] # NOT the expected value...
# 'int16_t' edge_property: dijkstra_search() saves the path distances in
int16_t
g.edge_properties['weight'] = g.new_edge_property('int16_t')
for e in g.edges(): g.edge_properties['weight'][e] = np.random.randint(1,
100)
dist_map, pred_map = gt.dijkstra_search(g, source=g.vertex(0),
weight=g.edge_properties['weight'])
print dist_map.value_type()
print dist_map.a
int16_t
[ 0 85 164 186 217 239 298 374 439 457]
# workaround: provide dist_map with desired value_type to algorithm
# Note that the value type needs to be able to contain a **sum** of edge
weights.
# For large graphs, thos might not fit in an int16_t if the edge weights
are
# themselves int16_t.
g.edge_properties['weight'] = g.new_edge_property('bool')
for e in g.edges(): g.edge_properties['weight'][e] = np.random.randint(1,
100)
dist_map = g.new_vertex_property('int32_t')
dist_map, pred_map = gt.dijkstra_search(g, source=g.vertex(0),
weight=g.edge_properties['weight'], dist_map = dist_map)
print dist_map.value_type()
print dist_map.a
int32_t
[ 0 65 140 206 237 330 374 431 501 583]
# 'int16_t' edge_property: ensure that the **sum** of several int16_t
fits in a int16_t
g.edge_properties['weight'] = g.new_edge_property('int16_t')
for e in g.edges(): g.edge_properties['weight'][e] = np.random.randint(1,
32000)
dist_map, pred_map = gt.dijkstra_search(g, source=g.vertex(0),
weight=g.edge_properties['weight'])
print dist_map.value_type()
print dist_map.a
OverflowError: bad numeric conversion: positive overflow