From 129d9549d3debc95564eaeff1a808236cbe4cebf Mon Sep 17 00:00:00 2001 From: Vsevolod Novikov Date: Wed, 17 Mar 2021 12:03:50 +0300 Subject: [PATCH] #5325 Make osm_ids optional after the revew --- CMakeLists.txt | 2 +- include/engine/api/route_api.hpp | 6 +++-- .../contiguous_internalmem_datafacade.hpp | 4 +++ include/engine/datafacade/datafacade_base.hpp | 1 + include/engine/guidance/assemble_geometry.hpp | 25 +++++++++++-------- .../routing_algorithms/routing_base.hpp | 6 ++--- include/extractor/extractor_config.hpp | 4 ++- include/extractor/files.hpp | 6 +++-- include/extractor/segment_data_container.hpp | 5 ++++ include/extractor/serialization.hpp | 9 ++++++- src/extractor/extractor.cpp | 1 + src/tools/extract.cpp | 7 +++++- src/updater/updater.cpp | 3 ++- unit_tests/engine/offline_facade.cpp | 1 + unit_tests/mocks/mock_datafacade.hpp | 1 + 15 files changed, 58 insertions(+), 23 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e6feb6de9aa..857b77b4ede 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -242,7 +242,7 @@ endif() if(CMAKE_CXX_COMPILER_ID MATCHES "GNU") set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -ggdb") - set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Og -ggdb") + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 -ggdb") endif() diff --git a/include/engine/api/route_api.hpp b/include/engine/api/route_api.hpp index dadc1244249..aa4a7610e11 100644 --- a/include/engine/api/route_api.hpp +++ b/include/engine/api/route_api.hpp @@ -504,7 +504,8 @@ class RouteAPI : public BaseAPI } } std::vector ways; - if (requested_annotations & RouteParameters::AnnotationsType::Ways) + if (requested_annotations & RouteParameters::AnnotationsType::Ways && + leg_geometry.osm_way_ids.size()) { ways.reserve(leg_geometry.osm_way_ids.size()); for (const auto way_id : leg_geometry.osm_way_ids) @@ -843,7 +844,8 @@ class RouteAPI : public BaseAPI } annotation.values["nodes"] = std::move(nodes); } - if (requested_annotations & RouteParameters::AnnotationsType::Ways) + if (requested_annotations & RouteParameters::AnnotationsType::Ways && + leg_geometry.osm_way_ids.size()) { util::json::Array ways; ways.values.reserve(leg_geometry.osm_way_ids.size()); diff --git a/include/engine/datafacade/contiguous_internalmem_datafacade.hpp b/include/engine/datafacade/contiguous_internalmem_datafacade.hpp index 70b6d2d98d0..ee0e7bf4e4b 100644 --- a/include/engine/datafacade/contiguous_internalmem_datafacade.hpp +++ b/include/engine/datafacade/contiguous_internalmem_datafacade.hpp @@ -259,6 +259,10 @@ class ContiguousInternalMemoryDataFacadeBase : public BaseDataFacade { return segment_data.GetReverseOSMWayIDs(id); } + bool GetUncompressedWayIDsSkipped() const override final + { + return segment_data.GetOSMWaysSkipped(); + } DurationForwardRange GetUncompressedForwardDurations(const EdgeID id) const override final { diff --git a/include/engine/datafacade/datafacade_base.hpp b/include/engine/datafacade/datafacade_base.hpp index 3b5a998f3a0..a5199c90154 100644 --- a/include/engine/datafacade/datafacade_base.hpp +++ b/include/engine/datafacade/datafacade_base.hpp @@ -93,6 +93,7 @@ class BaseDataFacade virtual OSMWayForwardRange GetUncompressedForwardWayIDs(const EdgeID id) const = 0; virtual OSMWayReverseRange GetUncompressedReverseWayIDs(const EdgeID id) const = 0; + virtual bool GetUncompressedWayIDsSkipped() const = 0; virtual NodeForwardRange GetUncompressedForwardGeometry(const EdgeID id) const = 0; virtual NodeReverseRange GetUncompressedReverseGeometry(const EdgeID id) const = 0; diff --git a/include/engine/guidance/assemble_geometry.hpp b/include/engine/guidance/assemble_geometry.hpp index 1c0be9502d1..1bc09c5135e 100644 --- a/include/engine/guidance/assemble_geometry.hpp +++ b/include/engine/guidance/assemble_geometry.hpp @@ -100,7 +100,8 @@ inline LegGeometry assembleGeometry(const datafacade::BaseDataFacade &facade, path_point.datasource_id}); geometry.locations.push_back(std::move(coordinate)); geometry.osm_node_ids.push_back(osm_node_id); - geometry.osm_way_ids.push_back(path_point.osm_way_id); + if (!facade.GetUncompressedWayIDsSkipped()) + geometry.osm_way_ids.push_back(path_point.osm_way_id); } } current_distance = @@ -161,18 +162,20 @@ inline LegGeometry assembleGeometry(const datafacade::BaseDataFacade &facade, const auto target_geometry = facade.GetUncompressedForwardGeometry(target_geometry_id); geometry.osm_node_ids.push_back( facade.GetOSMNodeIDOfNode(target_geometry(target_segment_end_coordinate))); - if (reversed_target) + if (!facade.GetUncompressedWayIDsSkipped()) { - const auto target_osm_way_ids = facade.GetUncompressedReverseWayIDs(target_geometry_id); - geometry.osm_way_ids.push_back( - target_osm_way_ids(target_osm_way_ids.size() - target_node.fwd_segment_position - 1)); - } - else - { - const auto target_osm_way_ids = facade.GetUncompressedForwardWayIDs(target_geometry_id); - geometry.osm_way_ids.push_back(target_osm_way_ids(target_node.fwd_segment_position)); + if (reversed_target) + { + const auto target_osm_way_ids = facade.GetUncompressedReverseWayIDs(target_geometry_id); + geometry.osm_way_ids.push_back(target_osm_way_ids( + target_osm_way_ids.size() - target_node.fwd_segment_position - 1)); + } + else + { + const auto target_osm_way_ids = facade.GetUncompressedForwardWayIDs(target_geometry_id); + geometry.osm_way_ids.push_back(target_osm_way_ids(target_node.fwd_segment_position)); + } } - BOOST_ASSERT(geometry.segment_distances.size() == geometry.segment_offsets.size() - 1); BOOST_ASSERT(geometry.locations.size() > geometry.segment_distances.size()); BOOST_ASSERT(geometry.annotations.size() == geometry.locations.size() - 1); diff --git a/include/engine/routing_algorithms/routing_base.hpp b/include/engine/routing_algorithms/routing_base.hpp index 4bd564d2164..e9f57398293 100644 --- a/include/engine/routing_algorithms/routing_base.hpp +++ b/include/engine/routing_algorithms/routing_base.hpp @@ -194,7 +194,7 @@ void annotatePath(const FacadeT &facade, BOOST_ASSERT(datasource_vector.size() > 0); BOOST_ASSERT(weight_vector.size() + 1 == id_vector.size()); BOOST_ASSERT(duration_vector.size() + 1 == id_vector.size()); - BOOST_ASSERT(osm_way_id_vector.size() + 1 == id_vector.size()); + BOOST_ASSERT(!osm_way_id_vector.size() || osm_way_id_vector.size() + 1 == id_vector.size()); const bool is_first_segment = unpacked_path.empty(); @@ -219,7 +219,7 @@ void annotatePath(const FacadeT &facade, { unpacked_path.push_back( PathData{*node_from, - osm_way_id_vector[segment_idx], + osm_way_id_vector.size() ? osm_way_id_vector[segment_idx] : 0, id_vector[segment_idx + 1], name_index, is_segregated, @@ -295,7 +295,7 @@ void annotatePath(const FacadeT &facade, BOOST_ASSERT(facade.GetTravelMode(target_node_id) > 0); unpacked_path.push_back( PathData{target_node_id, - osm_way_id_vector[segment_idx], + osm_way_id_vector.size() ? osm_way_id_vector[segment_idx] : 0, id_vector[start_index < end_index ? segment_idx + 1 : segment_idx - 1], facade.GetNameIndex(target_node_id), facade.IsSegregated(target_node_id), diff --git a/include/extractor/extractor_config.hpp b/include/extractor/extractor_config.hpp index b3822d587ce..da90abdd310 100644 --- a/include/extractor/extractor_config.hpp +++ b/include/extractor/extractor_config.hpp @@ -70,7 +70,8 @@ struct ExtractorConfig final : storage::IOConfig ".osrm.cnbg", ".osrm.cnbg_to_ebg", ".osrm.maneuver_overrides"}), - requested_num_threads(0), parse_conditionals(false), use_locations_cache(true) + requested_num_threads(0), parse_conditionals(false), use_locations_cache(true), + skip_osm_ways(false) { } @@ -92,6 +93,7 @@ struct ExtractorConfig final : storage::IOConfig bool use_metadata; bool parse_conditionals; bool use_locations_cache; + bool skip_osm_ways; }; } // namespace extractor } // namespace osrm diff --git a/include/extractor/files.hpp b/include/extractor/files.hpp index 6c0445e9b45..b71d97edbaa 100644 --- a/include/extractor/files.hpp +++ b/include/extractor/files.hpp @@ -206,7 +206,9 @@ inline void readSegmentData(const boost::filesystem::path &path, SegmentDataT &s // writes .osrm.geometry template -inline void writeSegmentData(const boost::filesystem::path &path, const SegmentDataT &segment_data) +inline void writeSegmentData(const boost::filesystem::path &path, + bool skip_osm_ways, + const SegmentDataT &segment_data) { static_assert(std::is_same::value || std::is_same::value, @@ -214,7 +216,7 @@ inline void writeSegmentData(const boost::filesystem::path &path, const SegmentD const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint; storage::tar::FileWriter writer{path, fingerprint}; - serialization::write(writer, "/common/segment_data", segment_data); + serialization::write(writer, "/common/segment_data", skip_osm_ways, segment_data); } // reads .osrm.ebg_nodes diff --git a/include/extractor/segment_data_container.hpp b/include/extractor/segment_data_container.hpp index 96ff4a22428..e05e9f78e82 100644 --- a/include/extractor/segment_data_container.hpp +++ b/include/extractor/segment_data_container.hpp @@ -40,6 +40,7 @@ inline void read(storage::tar::FileReader &reader, template inline void write(storage::tar::FileWriter &writer, const std::string &name, + const bool skip_osm_ways, const detail::SegmentDataContainerImpl &segment_data); } // namespace serialization @@ -171,6 +172,8 @@ template class SegmentDataContainerImpl auto GetForwardOSMWayIDs(const DirectionalGeometryID id) const { + if (GetOSMWaysSkipped()) + return boost::make_iterator_range(osm_ways.cend(), osm_ways.cend()); const auto begin = osm_ways.cbegin() + index[id]; const auto end = osm_ways.cbegin() + index[id + 1] - 1; @@ -233,6 +236,7 @@ template class SegmentDataContainerImpl auto GetNumberOfGeometries() const { return index.size() - 1; } auto GetNumberOfSegments() const { return fwd_weights.size(); } + auto GetOSMWaysSkipped() const { return osm_ways.size() == 0; } friend void serialization::read(storage::tar::FileReader &reader, @@ -241,6 +245,7 @@ template class SegmentDataContainerImpl friend void serialization::write( storage::tar::FileWriter &writer, const std::string &name, + const bool skip_osm_ways, const detail::SegmentDataContainerImpl &segment_data); private: diff --git a/include/extractor/serialization.hpp b/include/extractor/serialization.hpp index 3ec5ae177e0..ddd3090a3d7 100644 --- a/include/extractor/serialization.hpp +++ b/include/extractor/serialization.hpp @@ -98,11 +98,18 @@ inline void read(storage::tar::FileReader &reader, template inline void write(storage::tar::FileWriter &writer, const std::string &name, + const bool skip_osm_ways, const detail::SegmentDataContainerImpl &segment_data) { storage::serialization::write(writer, name + "/index", segment_data.index); storage::serialization::write(writer, name + "/nodes", segment_data.nodes); - storage::serialization::write(writer, name + "/osm_ways", segment_data.osm_ways); + if (!skip_osm_ways) + storage::serialization::write(writer, name + "/osm_ways", segment_data.osm_ways); + else + storage::serialization::write( + writer, + name + "/osm_ways", + osrm::util::ViewOrVector()); util::serialization::write(writer, name + "/forward_weights", segment_data.fwd_weights); util::serialization::write(writer, name + "/reverse_weights", segment_data.rev_weights); util::serialization::write(writer, name + "/forward_durations", segment_data.fwd_durations); diff --git a/src/extractor/extractor.cpp b/src/extractor/extractor.cpp index 037411ae52b..715b796d278 100644 --- a/src/extractor/extractor.cpp +++ b/src/extractor/extractor.cpp @@ -321,6 +321,7 @@ int Extractor::run(ScriptingEnvironment &scripting_environment) // output the geometry of the node-based graph, needs to be done after the last usage, since it // destroys internal containers files::writeSegmentData(config.GetPath(".osrm.geometry"), + config.skip_osm_ways, *node_based_graph_factory.GetCompressedEdges().ToSegmentData()); util::Log() << "Saving edge-based node weights to file."; diff --git a/src/tools/extract.cpp b/src/tools/extract.cpp index 0cd1c7b4f75..7b3073711bb 100644 --- a/src/tools/extract.cpp +++ b/src/tools/extract.cpp @@ -74,7 +74,12 @@ return_code parseArguments(int argc, boost::program_options::bool_switch(&extractor_config.use_locations_cache) ->implicit_value(false) ->default_value(true), - "Use internal nodes locations cache for location-dependent data lookups"); + "Use internal nodes locations cache for location-dependent data lookups")( + "skip-osm-ways", + boost::program_options::bool_switch(&extractor_config.skip_osm_ways) + ->implicit_value(true) + ->default_value(false), + "Skip OSM Way IDs in annotations"); bool dummy; // hidden options, will be allowed on command line, but will not be diff --git a/src/updater/updater.cpp b/src/updater/updater.cpp index 13f10aa2995..c7491560dc3 100644 --- a/src/updater/updater.cpp +++ b/src/updater/updater.cpp @@ -623,7 +623,8 @@ Updater::LoadAndUpdateEdgeExpandedGraph(std::vector &e coordinates, osm_node_ids); // Now save out the updated compressed geometries - extractor::files::writeSegmentData(config.GetPath(".osrm.geometry"), segment_data); + extractor::files::writeSegmentData( + config.GetPath(".osrm.geometry"), segment_data.GetOSMWaysSkipped(), segment_data); TIMER_STOP(segment); util::Log() << "Updating segment data took " << TIMER_MSEC(segment) << "ms."; } diff --git a/unit_tests/engine/offline_facade.cpp b/unit_tests/engine/offline_facade.cpp index 0fe6c8a4412..394616640e7 100644 --- a/unit_tests/engine/offline_facade.cpp +++ b/unit_tests/engine/offline_facade.cpp @@ -170,6 +170,7 @@ class ContiguousInternalMemoryDataFacade { return {}; } + bool GetUncompressedWayIDsSkipped() const override { return true; } OSMWayReverseRange GetUncompressedReverseWayIDs(const EdgeID id) const override { diff --git a/unit_tests/mocks/mock_datafacade.hpp b/unit_tests/mocks/mock_datafacade.hpp index 3831b3a32a6..1af3876fcca 100644 --- a/unit_tests/mocks/mock_datafacade.hpp +++ b/unit_tests/mocks/mock_datafacade.hpp @@ -70,6 +70,7 @@ class MockBaseDataFacade : public engine::datafacade::BaseDataFacade static extractor::SegmentDataView::SegmentOSMWayVector ways(data, 4); return boost::make_iterator_range(ways.cbegin(), ways.cend()); } + bool GetUncompressedWayIDsSkipped() const override { return false; } OSMWayReverseRange GetUncompressedReverseWayIDs(const EdgeID id) const override { return boost::adaptors::reverse(boost::adaptors::transform(GetUncompressedForwardWayIDs(id),