Fix devide by zero when updating speeds
This commit is contained in:
parent
3601d1d262
commit
060ec99678
@ -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
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user