Fix devide by zero when updating speeds

This commit is contained in:
Patrick Niklaus 2016-07-21 18:57:21 +02:00
parent 3601d1d262
commit 060ec99678
No known key found for this signature in database
GPG Key ID: E426891B5F978B1B

View File

@ -72,6 +72,15 @@ namespace osrm
namespace contractor namespace contractor
{ {
// Returns duration in deci-seconds
inline EdgeWeight distanceAndSpeedToWeight(double distance_in_meters, double speed_in_kmh)
{
BOOST_ASSERT(speed_in_kmh > 0);
const double speed_in_ms = speed_in_kmh / 3.6;
const double duration = distance_in_meters / speed_in_ms;
return std::max<EdgeWeight>(1, static_cast<EdgeWeight>(std::round(duration * 10)));
}
int Contractor::Run() int Contractor::Run()
{ {
#ifdef WIN32 #ifdef WIN32
@ -573,12 +582,11 @@ EdgeID Contractor::LoadEdgeExpandedGraph(
find(segment_speed_lookup, Segment{u->node_id, v->node_id}); find(segment_speed_lookup, Segment{u->node_id, v->node_id});
if (forward_speed_iter != segment_speed_lookup.end()) if (forward_speed_iter != segment_speed_lookup.end())
{ {
int new_segment_weight = auto new_segment_weight =
std::max(1, (forward_speed_iter->speed_source.speed > 0)
static_cast<int>(std::floor( ? distanceAndSpeedToWeight(segment_length,
(segment_length * 10.) / forward_speed_iter->speed_source.speed)
(forward_speed_iter->speed_source.speed / 3.6) + : INVALID_EDGE_WEIGHT;
.5)));
m_geometry_list[forward_begin + leaf_object.fwd_segment_position].weight = m_geometry_list[forward_begin + leaf_object.fwd_segment_position].weight =
new_segment_weight; new_segment_weight;
m_geometry_datasource[forward_begin + leaf_object.fwd_segment_position] = m_geometry_datasource[forward_begin + leaf_object.fwd_segment_position] =
@ -624,12 +632,11 @@ EdgeID Contractor::LoadEdgeExpandedGraph(
find(segment_speed_lookup, Segment{u->node_id, v->node_id}); find(segment_speed_lookup, Segment{u->node_id, v->node_id});
if (reverse_speed_iter != segment_speed_lookup.end()) if (reverse_speed_iter != segment_speed_lookup.end())
{ {
int new_segment_weight = auto new_segment_weight =
std::max(1, (reverse_speed_iter->speed_source.speed > 0)
static_cast<int>(std::floor( ? distanceAndSpeedToWeight(segment_length,
(segment_length * 10.) / reverse_speed_iter->speed_source.speed)
(reverse_speed_iter->speed_source.speed / 3.6) + : INVALID_EDGE_WEIGHT;
.5)));
m_geometry_list[reverse_begin + rev_segment_position].weight = m_geometry_list[reverse_begin + rev_segment_position].weight =
new_segment_weight; new_segment_weight;
m_geometry_datasource[reverse_begin + rev_segment_position] = m_geometry_datasource[reverse_begin + rev_segment_position] =
@ -763,21 +770,22 @@ EdgeID Contractor::LoadEdgeExpandedGraph(
const auto num_segments = header->num_osm_nodes - 1; const auto num_segments = header->num_osm_nodes - 1;
for (auto i : util::irange<std::size_t>(0, num_segments)) for (auto i : util::irange<std::size_t>(0, num_segments))
{ {
auto speed_iter = auto speed_iter =
find(segment_speed_lookup, find(segment_speed_lookup,
Segment{previous_osm_node_id, segmentblocks[i].this_osm_node_id}); Segment{previous_osm_node_id, segmentblocks[i].this_osm_node_id});
if (speed_iter != segment_speed_lookup.end()) if (speed_iter != segment_speed_lookup.end())
{ {
// This sets the segment weight using the same formula as the if (speed_iter->speed_source.speed > 0)
// EdgeBasedGraphFactory for consistency. The *why* of this formula {
// is lost in the annals of time. auto new_segment_weight = distanceAndSpeedToWeight(segmentblocks[i].segment_length, speed_iter->speed_source.speed);
int new_segment_weight = std::max( new_weight += new_segment_weight;
1, }
static_cast<int>(std::floor((segmentblocks[i].segment_length * 10.) / else
(speed_iter->speed_source.speed / 3.6) + {
.5))); // This edge is blocked, we don't need to continue updating
new_weight += new_segment_weight; new_weight = INVALID_EDGE_WEIGHT;
break;
}
} }
else else
{ {