From 83588fd00f2897c8683b862500da8b0b727e2027 Mon Sep 17 00:00:00 2001 From: Michael Krasnyk Date: Thu, 22 Feb 2018 10:49:01 +0100 Subject: [PATCH] Renumber node IDs in .osrm.maneuver_overrides --- include/extractor/files.hpp | 23 ++++++++++++++++++++++ include/extractor/serialization.hpp | 15 ++++++++++---- include/partitioner/partitioner_config.hpp | 12 +++++++---- include/partitioner/renumber.hpp | 20 +++++++++++++++++++ src/extractor/edge_based_graph_factory.cpp | 8 +++----- src/partitioner/partitioner.cpp | 9 +++++++++ src/storage/storage.cpp | 22 ++++++++++++--------- 7 files changed, 87 insertions(+), 22 deletions(-) diff --git a/include/extractor/files.hpp b/include/extractor/files.hpp index f01ed9f22..bc5e32c51 100644 --- a/include/extractor/files.hpp +++ b/include/extractor/files.hpp @@ -261,6 +261,29 @@ inline void writeTurnLaneDescriptions(const boost::filesystem::path &path, storage::serialization::write(writer, turn_offsets); storage::serialization::write(writer, turn_masks); } + +// reads .osrm.maneuver_overrides +template +inline void readManeuverOverrides(const boost::filesystem::path &path, + StorageManeuverOverrideT &maneuver_overrides, + NodeSequencesT &node_sequences) +{ + const auto fingerprint = storage::io::FileReader::VerifyFingerprint; + storage::io::FileReader reader{path, fingerprint}; + + serialization::read(reader, maneuver_overrides, node_sequences); +} + +// writes .osrm.maneuver_overrides +inline void writeManeuverOverrides(const boost::filesystem::path &path, + const std::vector &maneuver_overrides, + const std::vector &node_sequences) +{ + const auto fingerprint = storage::io::FileWriter::GenerateFingerprint; + storage::io::FileWriter writer{path, fingerprint}; + + serialization::write(writer, maneuver_overrides, node_sequences); +} } } } diff --git a/include/extractor/serialization.hpp b/include/extractor/serialization.hpp index fb05225c2..d5ed0cbc0 100644 --- a/include/extractor/serialization.hpp +++ b/include/extractor/serialization.hpp @@ -304,10 +304,17 @@ inline void write(storage::io::FileWriter &writer, const std::vector &maneuver_overrides, const std::vector &node_sequences) { - writer.WriteElementCount64(maneuver_overrides.size()); - writer.WriteElementCount64(node_sequences.size()); - writer.WriteFrom(maneuver_overrides); - writer.WriteFrom(node_sequences); + storage::serialization::write(writer, maneuver_overrides); + storage::serialization::write(writer, node_sequences); +} + +template +inline void read(storage::io::FileReader &reader, + ManeuverOverridesT &maneuver_overrides, + NodeSequenceT &node_sequences) +{ + storage::serialization::read(reader, maneuver_overrides); + storage::serialization::read(reader, node_sequences); } } } diff --git a/include/partitioner/partitioner_config.hpp b/include/partitioner/partitioner_config.hpp index 4090bc3ae..83b8e7782 100644 --- a/include/partitioner/partitioner_config.hpp +++ b/include/partitioner/partitioner_config.hpp @@ -16,10 +16,14 @@ namespace partitioner struct PartitionerConfig final : storage::IOConfig { PartitionerConfig() - : IOConfig( - {".osrm", ".osrm.fileIndex", ".osrm.ebg_nodes"}, - {".osrm.hsgr", ".osrm.cnbg"}, - {".osrm.ebg", ".osrm.cnbg", ".osrm.cnbg_to_ebg", ".osrm.partition", ".osrm.cells"}), + : IOConfig({".osrm", ".osrm.fileIndex", ".osrm.ebg_nodes"}, + {".osrm.hsgr", ".osrm.cnbg"}, + {".osrm.ebg", + ".osrm.cnbg", + ".osrm.cnbg_to_ebg", + ".osrm.partition", + ".osrm.cells", + ".osrm.maneuver_overrides"}), requested_num_threads(0), balance(1.2), boundary_factor(0.25), num_optimizing_cuts(10), small_component_size(1000), max_cell_sizes({128, 128 * 32, 128 * 32 * 16, 128 * 32 * 16 * 32}) diff --git a/include/partitioner/renumber.hpp b/include/partitioner/renumber.hpp index c5d5bdddd..b29c65c6b 100644 --- a/include/partitioner/renumber.hpp +++ b/include/partitioner/renumber.hpp @@ -2,6 +2,7 @@ #define OSRM_PARTITIONER_RENUMBER_HPP #include "extractor/edge_based_node_segment.hpp" +#include "extractor/maneuver_override.hpp" #include "extractor/nbg_to_ebg.hpp" #include "extractor/node_data_container.hpp" @@ -73,6 +74,25 @@ inline void renumber(std::vector &mapping, } } +inline void renumber(std::vector &node_ids, const std::vector &permutation) +{ + for (auto &node_id : node_ids) + { + if (node_id != SPECIAL_NODEID) + node_id = permutation[node_id]; + } +} + +inline void renumber(std::vector &maneuver_overrides, + const std::vector &permutation) +{ + for (auto &maneuver_override : maneuver_overrides) + { + if (maneuver_override.start_node != SPECIAL_NODEID) + maneuver_override.start_node = permutation[maneuver_override.start_node]; + } +} + } // namespace partitioner } // namespace osrm diff --git a/src/extractor/edge_based_graph_factory.cpp b/src/extractor/edge_based_graph_factory.cpp index 4b54cfefa..10831a8b6 100644 --- a/src/extractor/edge_based_graph_factory.cpp +++ b/src/extractor/edge_based_graph_factory.cpp @@ -1106,11 +1106,9 @@ void EdgeBasedGraphFactory::GenerateEdgeExpandedEdges( std::sort(storage_maneuver_overrides.begin(), storage_maneuver_overrides.end(), [](const auto &a, const auto &b) { return a.start_node < b.start_node; }); - // write conditional turn penalties into the restrictions file - storage::io::FileWriter writer(maneuver_overrides_filename, - storage::io::FileWriter::GenerateFingerprint); - extractor::serialization::write( - writer, storage_maneuver_overrides, maneuver_override_sequences); + + files::writeManeuverOverrides( + maneuver_overrides_filename, storage_maneuver_overrides, maneuver_override_sequences); } util::Log() << "done."; diff --git a/src/partitioner/partitioner.cpp b/src/partitioner/partitioner.cpp index 7afb3cdfa..87294ba6e 100644 --- a/src/partitioner/partitioner.cpp +++ b/src/partitioner/partitioner.cpp @@ -145,6 +145,15 @@ int Partitioner::Run(const PartitionerConfig &config) renumber(node_data, permutation); extractor::files::writeNodeData(config.GetPath(".osrm.ebg_nodes"), node_data); } + { + const auto &filename = config.GetPath(".osrm.maneuver_overrides"); + std::vector maneuver_overrides; + std::vector node_sequences; + extractor::files::readManeuverOverrides(filename, maneuver_overrides, node_sequences); + renumber(maneuver_overrides, permutation); + renumber(node_sequences, permutation); + extractor::files::writeManeuverOverrides(filename, maneuver_overrides, node_sequences); + } if (boost::filesystem::exists(config.GetPath(".osrm.hsgr"))) { util::Log(logWARNING) << "Found existing .osrm.hsgr file, removing. You need to re-run " diff --git a/src/storage/storage.cpp b/src/storage/storage.cpp index 3dde221a7..03a3dd15c 100644 --- a/src/storage/storage.cpp +++ b/src/storage/storage.cpp @@ -445,10 +445,11 @@ void Storage::PopulateLayout(DataLayout &layout) { io::FileReader maneuver_overrides_file(config.GetPath(".osrm.maneuver_overrides"), io::FileReader::VerifyFingerprint); - const auto number_of_overrides = maneuver_overrides_file.ReadElementCount64(); + const auto number_of_overrides = + maneuver_overrides_file.ReadVectorSize(); layout.SetBlockSize(DataLayout::MANEUVER_OVERRIDES, number_of_overrides); - const auto number_of_nodes = maneuver_overrides_file.ReadElementCount64(); + const auto number_of_nodes = maneuver_overrides_file.ReadVectorSize(); layout.SetBlockSize(DataLayout::MANEUVER_OVERRIDE_NODE_SEQUENCES, number_of_nodes); } @@ -1089,18 +1090,21 @@ void Storage::PopulateData(const DataLayout &layout, char *memory_ptr) // load maneuver overrides { - io::FileReader maneuver_overrides_file(config.GetPath(".osrm.maneuver_overrides"), - io::FileReader::VerifyFingerprint); - const auto number_of_overrides = maneuver_overrides_file.ReadElementCount64(); - const auto number_of_nodes = maneuver_overrides_file.ReadElementCount64(); const auto maneuver_overrides_ptr = layout.GetBlockPtr( memory_ptr, DataLayout::MANEUVER_OVERRIDES); - maneuver_overrides_file.ReadInto(maneuver_overrides_ptr, number_of_overrides); - const auto maneuver_override_node_sequences_ptr = layout.GetBlockPtr( memory_ptr, DataLayout::MANEUVER_OVERRIDE_NODE_SEQUENCES); - maneuver_overrides_file.ReadInto(maneuver_override_node_sequences_ptr, number_of_nodes); + + util::vector_view maneuver_overrides( + maneuver_overrides_ptr, layout.num_entries[DataLayout::MANEUVER_OVERRIDES]); + util::vector_view maneuver_override_node_sequences( + maneuver_override_node_sequences_ptr, + layout.num_entries[DataLayout::MANEUVER_OVERRIDE_NODE_SEQUENCES]); + + extractor::files::readManeuverOverrides(config.GetPath(".osrm.maneuver_overrides"), + maneuver_overrides, + maneuver_override_node_sequences); } } }