Return sorted list of updated segments and segment_data

This commit is contained in:
Patrick Niklaus 2017-03-14 16:04:38 +00:00 committed by Patrick Niklaus
parent 4e2b157db3
commit 5828f4400d

View File

@ -139,9 +139,11 @@ auto mmapFile(const std::string &filename, boost::interprocess::mode_t mode)
} }
} }
void updaterSegmentData(const UpdaterConfig &config, using UpdatedListAndSegmentData =
const extractor::ProfileProperties &profile_properties, std::tuple<tbb::concurrent_vector<GeometryID>, extractor::SegmentDataContainer>;
const SegmentLookupTable &segment_speed_lookup) UpdatedListAndSegmentData updaterSegmentData(const UpdaterConfig &config,
const extractor::ProfileProperties &profile_properties,
const SegmentLookupTable &segment_speed_lookup)
{ {
auto weight_multiplier = profile_properties.GetWeightMultiplier(); auto weight_multiplier = profile_properties.GetWeightMultiplier();
std::vector<extractor::QueryNode> internal_to_external_node_map; std::vector<extractor::QueryNode> internal_to_external_node_map;
@ -176,6 +178,8 @@ void updaterSegmentData(const UpdaterConfig &config,
segment_data_backup = std::make_unique<extractor::SegmentDataContainer>(segment_data); segment_data_backup = std::make_unique<extractor::SegmentDataContainer>(segment_data);
} }
tbb::concurrent_vector<GeometryID> updated_segments;
using DirectionalGeometryID = extractor::SegmentDataContainer::DirectionalGeometryID; using DirectionalGeometryID = extractor::SegmentDataContainer::DirectionalGeometryID;
auto range = tbb::blocked_range<DirectionalGeometryID>(0, segment_data.GetNumberOfGeometries()); auto range = tbb::blocked_range<DirectionalGeometryID>(0, segment_data.GetNumberOfGeometries());
tbb::parallel_for(range, [&, LUA_SOURCE](const auto &range) { tbb::parallel_for(range, [&, LUA_SOURCE](const auto &range) {
@ -196,6 +200,7 @@ void updaterSegmentData(const UpdaterConfig &config,
auto fwd_weights_range = segment_data.GetForwardWeights(geometry_id); auto fwd_weights_range = segment_data.GetForwardWeights(geometry_id);
auto fwd_durations_range = segment_data.GetForwardDurations(geometry_id); auto fwd_durations_range = segment_data.GetForwardDurations(geometry_id);
auto fwd_datasources_range = segment_data.GetForwardDatasources(geometry_id); auto fwd_datasources_range = segment_data.GetForwardDatasources(geometry_id);
bool fwd_was_updated = false;
for (auto segment_offset = 0UL; segment_offset < fwd_weights_range.size(); for (auto segment_offset = 0UL; segment_offset < fwd_weights_range.size();
++segment_offset) ++segment_offset)
{ {
@ -203,8 +208,11 @@ void updaterSegmentData(const UpdaterConfig &config,
auto v = internal_to_external_node_map[nodes_range[segment_offset + 1]].node_id; auto v = internal_to_external_node_map[nodes_range[segment_offset + 1]].node_id;
if (auto value = segment_speed_lookup({u, v})) if (auto value = segment_speed_lookup({u, v}))
{ {
auto new_duration = convertToDuration(value->speed, segment_lengths[segment_offset]); auto new_duration =
auto new_weight = convertToWeight(value->weight, weight_multiplier, new_duration); convertToDuration(value->speed, segment_lengths[segment_offset]);
auto new_weight =
convertToWeight(value->weight, weight_multiplier, new_duration);
fwd_was_updated = true;
fwd_weights_range[segment_offset] = new_weight; fwd_weights_range[segment_offset] = new_weight;
fwd_durations_range[segment_offset] = new_duration; fwd_durations_range[segment_offset] = new_duration;
@ -216,6 +224,8 @@ void updaterSegmentData(const UpdaterConfig &config,
counters[LUA_SOURCE] += 1; counters[LUA_SOURCE] += 1;
} }
} }
if (fwd_was_updated)
updated_segments.push_back(GeometryID{true, geometry_id});
// In this case we want it oriented from in forward directions // In this case we want it oriented from in forward directions
auto rev_weights_range = auto rev_weights_range =
@ -224,6 +234,7 @@ void updaterSegmentData(const UpdaterConfig &config,
boost::adaptors::reverse(segment_data.GetReverseDurations(geometry_id)); boost::adaptors::reverse(segment_data.GetReverseDurations(geometry_id));
auto rev_datasources_range = auto rev_datasources_range =
boost::adaptors::reverse(segment_data.GetReverseDatasources(geometry_id)); boost::adaptors::reverse(segment_data.GetReverseDatasources(geometry_id));
bool rev_was_updated = false;
for (auto segment_offset = 0UL; segment_offset < fwd_weights_range.size(); for (auto segment_offset = 0UL; segment_offset < fwd_weights_range.size();
++segment_offset) ++segment_offset)
@ -232,8 +243,11 @@ void updaterSegmentData(const UpdaterConfig &config,
auto v = internal_to_external_node_map[nodes_range[segment_offset + 1]].node_id; auto v = internal_to_external_node_map[nodes_range[segment_offset + 1]].node_id;
if (auto value = segment_speed_lookup({v, u})) if (auto value = segment_speed_lookup({v, u}))
{ {
auto new_duration = convertToDuration(value->speed, segment_lengths[segment_offset]); auto new_duration =
auto new_weight = convertToWeight(value->weight, weight_multiplier, new_duration); convertToDuration(value->speed, segment_lengths[segment_offset]);
auto new_weight =
convertToWeight(value->weight, weight_multiplier, new_duration);
rev_was_updated = true;
rev_weights_range[segment_offset] = new_weight; rev_weights_range[segment_offset] = new_weight;
rev_durations_range[segment_offset] = new_duration; rev_durations_range[segment_offset] = new_duration;
@ -245,6 +259,8 @@ void updaterSegmentData(const UpdaterConfig &config,
counters[LUA_SOURCE] += 1; counters[LUA_SOURCE] += 1;
} }
} }
if (rev_was_updated)
updated_segments.push_back(GeometryID{false, geometry_id});
} }
}); // parallel_for }); // parallel_for
@ -338,8 +354,13 @@ void updaterSegmentData(const UpdaterConfig &config,
} }
} }
// Now save out the updated compressed geometries tbb::parallel_sort(updated_segments.begin(),
extractor::io::write(config.geometry_path, segment_data); updated_segments.end(),
[](const GeometryID lhs, const GeometryID rhs) {
return std::tie(lhs.id, lhs.forward) < std::tie(rhs.id, rhs.forward);
});
return std::make_tuple(std::move(updated_segments), std::move(segment_data));
} }
void saveDatasourcesNames(const UpdaterConfig &config) void saveDatasourcesNames(const UpdaterConfig &config)
@ -452,10 +473,15 @@ Updater::LoadAndUpdateEdgeExpandedGraph(std::vector<extractor::EdgeBasedEdge> &e
auto segment_speed_lookup = csv::readSegmentValues(config.segment_speed_lookup_paths); auto segment_speed_lookup = csv::readSegmentValues(config.segment_speed_lookup_paths);
auto turn_penalty_lookup = csv::readTurnValues(config.turn_penalty_lookup_paths); auto turn_penalty_lookup = csv::readTurnValues(config.turn_penalty_lookup_paths);
tbb::concurrent_vector<GeometryID> updated_segments;
extractor::SegmentDataContainer segment_data;
if (update_edge_weights) if (update_edge_weights)
{ {
TIMER_START(segment); TIMER_START(segment);
updaterSegmentData(config, profile_properties, segment_speed_lookup); std::tie(updated_segments, segment_data) =
updaterSegmentData(config, profile_properties, segment_speed_lookup);
// Now save out the updated compressed geometries
extractor::io::write(config.geometry_path, segment_data);
TIMER_STOP(segment); TIMER_STOP(segment);
util::Log() << "Updating segment data took " << TIMER_MSEC(segment) << "ms."; util::Log() << "Updating segment data took " << TIMER_MSEC(segment) << "ms.";
} }