From fd9bebbfa720dfda8f62cec9d354df3e78006ea1 Mon Sep 17 00:00:00 2001 From: Michael Krasnyk Date: Sun, 22 Apr 2018 20:05:11 +0200 Subject: [PATCH] Add EBG node durations --- include/customizer/edge_based_graph.hpp | 2 ++ .../contiguous_internalmem_datafacade.hpp | 4 ++-- .../extractor/edge_based_graph_factory.hpp | 2 ++ include/extractor/extractor.hpp | 1 + include/extractor/files.hpp | 20 +++++++++++++--- include/updater/updater.hpp | 8 ++++--- src/customize/customizer.cpp | 8 ++++--- .../routing_algorithms/many_to_many_mld.cpp | 23 ++++++++++++++----- src/extractor/edge_based_graph_factory.cpp | 12 ++++++++++ src/extractor/extractor.cpp | 8 +++++-- src/partitioner/partitioner.cpp | 8 +++++-- src/updater/updater.cpp | 15 +++++++++++- 12 files changed, 89 insertions(+), 22 deletions(-) diff --git a/include/customizer/edge_based_graph.hpp b/include/customizer/edge_based_graph.hpp index d35b3976d..075e69277 100644 --- a/include/customizer/edge_based_graph.hpp +++ b/include/customizer/edge_based_graph.hpp @@ -76,6 +76,8 @@ class MultiLevelGraph : public partitioner::MultiLevelGraph(storage::tar::FileReader &reader, const std::string &name, diff --git a/include/engine/datafacade/contiguous_internalmem_datafacade.hpp b/include/engine/datafacade/contiguous_internalmem_datafacade.hpp index 33de22b60..c5549c285 100644 --- a/include/engine/datafacade/contiguous_internalmem_datafacade.hpp +++ b/include/engine/datafacade/contiguous_internalmem_datafacade.hpp @@ -692,9 +692,9 @@ template <> class ContiguousInternalMemoryAlgorithmDataFacade : public Algo return query_graph.GetNodeWeight(node); } - EdgeDuration GetNodeDuration(const NodeID) const override final + EdgeDuration GetNodeDuration(const NodeID node) const override final { - return 0; // TODO: query_graph.GetNodeduration(node); + return query_graph.GetNodeDuration(node); } NodeID GetTarget(const EdgeID e) const override final { return query_graph.GetTarget(e); } diff --git a/include/extractor/edge_based_graph_factory.hpp b/include/extractor/edge_based_graph_factory.hpp index 61e2f1cbf..d8e8aeedc 100644 --- a/include/extractor/edge_based_graph_factory.hpp +++ b/include/extractor/edge_based_graph_factory.hpp @@ -91,6 +91,7 @@ class EdgeBasedGraphFactory void GetEdgeBasedNodeSegments(std::vector &nodes); void GetStartPointMarkers(std::vector &node_is_startpoint); void GetEdgeBasedNodeWeights(std::vector &output_node_weights); + void GetEdgeBasedNodeDurations(std::vector &output_node_durations); std::uint32_t GetConnectivityChecksum() const; std::uint64_t GetNumberOfEdgeBasedNodes() const; @@ -117,6 +118,7 @@ class EdgeBasedGraphFactory //! node weights that indicate the length of the segment (node based) represented by the //! edge-based node std::vector m_edge_based_node_weights; + std::vector m_edge_based_node_durations; //! list of edge based nodes (compressed segments) std::vector m_edge_based_node_segments; diff --git a/include/extractor/extractor.hpp b/include/extractor/extractor.hpp index 0427cfaba..31b157658 100644 --- a/include/extractor/extractor.hpp +++ b/include/extractor/extractor.hpp @@ -87,6 +87,7 @@ class Extractor std::vector &edge_based_node_segments, std::vector &node_is_startpoint, std::vector &edge_based_node_weights, + std::vector &edge_based_node_durations, util::DeallocatingVector &edge_based_edge_list, std::uint32_t &connectivity_checksum); diff --git a/include/extractor/files.hpp b/include/extractor/files.hpp index 34ac91c62..91f98825a 100644 --- a/include/extractor/files.hpp +++ b/include/extractor/files.hpp @@ -462,14 +462,28 @@ void readEdgeBasedNodeWeights(const boost::filesystem::path &path, NodeWeigtsVec storage::serialization::read(reader, "/extractor/edge_based_node_weights", weights); } -template -void writeEdgeBasedNodeWeights(const boost::filesystem::path &path, - const NodeWeigtsVectorT &weights) +template +void readEdgeBasedNodeWeightsDurations(const boost::filesystem::path &path, + NodeWeigtsVectorT &weights, + NodeDurationsVectorT &durations) +{ + const auto fingerprint = storage::tar::FileReader::VerifyFingerprint; + storage::tar::FileReader reader{path, fingerprint}; + + storage::serialization::read(reader, "/extractor/edge_based_node_weights", weights); + storage::serialization::read(reader, "/extractor/edge_based_node_durations", durations); +} + +template +void writeEdgeBasedNodeWeightsDurations(const boost::filesystem::path &path, + const NodeWeigtsVectorT &weights, + const NodeDurationsVectorT &durations) { const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint; storage::tar::FileWriter writer{path, fingerprint}; storage::serialization::write(writer, "/extractor/edge_based_node_weights", weights); + storage::serialization::write(writer, "/extractor/edge_based_node_durations", durations); } template diff --git a/include/updater/updater.hpp b/include/updater/updater.hpp index 08b451f0c..dcaf5f638 100644 --- a/include/updater/updater.hpp +++ b/include/updater/updater.hpp @@ -17,13 +17,15 @@ class Updater public: Updater(UpdaterConfig config_) : config(std::move(config_)) {} - using NumNodesAndEdges = - std::tuple, std::uint32_t>; - NumNodesAndEdges LoadAndUpdateEdgeExpandedGraph() const; + EdgeID + LoadAndUpdateEdgeExpandedGraph(std::vector &edge_based_edge_list, + std::vector &node_weights, + std::uint32_t &connectivity_checksum) const; EdgeID LoadAndUpdateEdgeExpandedGraph(std::vector &edge_based_edge_list, std::vector &node_weights, + std::vector &node_durations, // TODO: to be deleted std::uint32_t &connectivity_checksum) const; private: diff --git a/src/customize/customizer.cpp b/src/customize/customizer.cpp index 9890b0a8f..2c4f57ab8 100644 --- a/src/customize/customizer.cpp +++ b/src/customize/customizer.cpp @@ -75,13 +75,14 @@ void printUnreachableStatistics(const Partition &partition, auto LoadAndUpdateEdgeExpandedGraph(const CustomizationConfig &config, const partitioner::MultiLevelPartition &mlp, std::vector &node_weights, + std::vector &node_durations, std::uint32_t &connectivity_checksum) { updater::Updater updater(config.updater_config); std::vector edge_based_edge_list; EdgeID num_nodes = updater.LoadAndUpdateEdgeExpandedGraph( - edge_based_edge_list, node_weights, connectivity_checksum); + edge_based_edge_list, node_weights, node_durations, connectivity_checksum); auto directed = partitioner::splitBidirectionalEdges(edge_based_edge_list); @@ -123,8 +124,10 @@ int Customizer::Run(const CustomizationConfig &config) partitioner::files::readPartition(config.GetPath(".osrm.partition"), mlp); std::vector node_weights; + std::vector node_durations; // TODO: to be removed later std::uint32_t connectivity_checksum = 0; - auto graph = LoadAndUpdateEdgeExpandedGraph(config, mlp, node_weights, connectivity_checksum); + auto graph = LoadAndUpdateEdgeExpandedGraph( + config, mlp, node_weights, node_durations, connectivity_checksum); BOOST_ASSERT(graph.GetNumberOfNodes() == node_weights.size()); std::for_each(node_weights.begin(), node_weights.end(), [](auto &w) { w &= 0x7fffffff; }); util::Log() << "Loaded edge based graph: " << graph.GetNumberOfEdges() << " edges, " @@ -163,7 +166,6 @@ int Customizer::Run(const CustomizationConfig &config) util::Log() << "MLD customization writing took " << TIMER_SEC(writing_mld_data) << " seconds"; TIMER_START(writing_graph); - std::vector node_durations; // TODO: save an empty vector, to be removed later MultiLevelEdgeBasedGraph shaved_graph{ std::move(graph), std::move(node_weights), std::move(node_durations)}; customizer::files::writeGraph( diff --git a/src/engine/routing_algorithms/many_to_many_mld.cpp b/src/engine/routing_algorithms/many_to_many_mld.cpp index ba58e7ce3..b92200336 100644 --- a/src/engine/routing_algorithms/many_to_many_mld.cpp +++ b/src/engine/routing_algorithms/many_to_many_mld.cpp @@ -169,8 +169,6 @@ void relaxOutgoingEdges(const DataFacade &facade, } } - const auto node_weight = facade.GetNodeWeight(node); - const auto node_duration = facade.GetNodeDuration(node); // TODO: remove later for (const auto edge : facade.GetBorderEdgeRange(level, node)) { const auto &data = facade.GetEdgeData(edge); @@ -183,6 +181,10 @@ void relaxOutgoingEdges(const DataFacade &facade, } const auto turn_id = data.turn_id; + const auto node_weight = + facade.GetNodeWeight(DIRECTION == FORWARD_DIRECTION ? node : to); + const auto node_duration = facade.GetNodeDuration( + DIRECTION == FORWARD_DIRECTION ? node : to); // TODO: remove later const auto edge_weight = node_weight + facade.GetWeightPenaltyForEdgeID(turn_id); const auto edge_duration = node_duration + facade.GetDurationPenaltyForEdgeID(turn_id); @@ -299,7 +301,6 @@ oneToManySearch(SearchEngineData &engine_working_data, } }; - // Check a single path result and insert adjacent nodes into heap auto insert_node = [&](NodeID node, EdgeWeight initial_weight, EdgeDuration initial_duration) { // Update single node paths @@ -311,9 +312,19 @@ oneToManySearch(SearchEngineData &engine_working_data, const auto &data = facade.GetEdgeData(edge); if (DIRECTION == FORWARD_DIRECTION ? data.forward : data.backward) { - query_heap.Insert(facade.GetTarget(edge), - data.weight + initial_weight, - {node, data.duration + initial_duration}); + const auto turn_id = data.turn_id; + const auto edge_weight = + initial_weight + + facade.GetNodeWeight(DIRECTION == FORWARD_DIRECTION ? node + : facade.GetTarget(edge)) + + facade.GetWeightPenaltyForEdgeID(turn_id); + const auto edge_duration = initial_duration + + +facade.GetNodeDuration(DIRECTION == FORWARD_DIRECTION + ? node + : facade.GetTarget(edge)) + + facade.GetDurationPenaltyForEdgeID(turn_id); + + query_heap.Insert(facade.GetTarget(edge), edge_weight, {node, edge_duration}); } } }; diff --git a/src/extractor/edge_based_graph_factory.cpp b/src/extractor/edge_based_graph_factory.cpp index 931a96876..55fd5c9c2 100644 --- a/src/extractor/edge_based_graph_factory.cpp +++ b/src/extractor/edge_based_graph_factory.cpp @@ -107,6 +107,13 @@ void EdgeBasedGraphFactory::GetEdgeBasedNodeWeights(std::vector &out swap(m_edge_based_node_weights, output_node_weights); } +void EdgeBasedGraphFactory::GetEdgeBasedNodeDurations( + std::vector &output_node_durations) +{ + using std::swap; // Koenig swap + swap(m_edge_based_node_durations, output_node_durations); +} + std::uint32_t EdgeBasedGraphFactory::GetConnectivityChecksum() const { return m_connectivity_checksum; @@ -281,6 +288,7 @@ unsigned EdgeBasedGraphFactory::LabelEdgeBasedNodes() // heuristic: node-based graph node is a simple intersection with four edges // (edge-based nodes) m_edge_based_node_weights.reserve(4 * m_node_based_graph.GetNumberOfNodes()); + m_edge_based_node_durations.reserve(4 * m_node_based_graph.GetNumberOfNodes()); nbe_to_ebn_mapping.resize(m_node_based_graph.GetEdgeCapacity(), SPECIAL_NODEID); // renumber edge based node of outgoing edges @@ -297,6 +305,7 @@ unsigned EdgeBasedGraphFactory::LabelEdgeBasedNodes() } m_edge_based_node_weights.push_back(edge_data.weight); + m_edge_based_node_durations.push_back(edge_data.duration); BOOST_ASSERT(numbered_edges_count < m_node_based_graph.GetNumberOfEdges()); nbe_to_ebn_mapping[current_edge] = numbered_edges_count; @@ -392,6 +401,8 @@ EdgeBasedGraphFactory::GenerateEdgeExpandedNodes(const WayRestrictionMap &way_re const auto ebn_weight = m_edge_based_node_weights[nbe_to_ebn_mapping[eid]]; BOOST_ASSERT(ebn_weight == INVALID_EDGE_WEIGHT || ebn_weight == edge_data.weight); m_edge_based_node_weights.push_back(ebn_weight); + m_edge_based_node_durations.push_back( + m_edge_based_node_durations[nbe_to_ebn_mapping[eid]]); edge_based_node_id++; progress.PrintStatus(progress_counter++); @@ -400,6 +411,7 @@ EdgeBasedGraphFactory::GenerateEdgeExpandedNodes(const WayRestrictionMap &way_re BOOST_ASSERT(m_edge_based_node_segments.size() == m_edge_based_node_is_startpoint.size()); BOOST_ASSERT(m_number_of_edge_based_nodes == m_edge_based_node_weights.size()); + BOOST_ASSERT(m_number_of_edge_based_nodes == m_edge_based_node_durations.size()); util::Log() << "Generated " << m_number_of_edge_based_nodes << " nodes (" << way_restriction_map.NumberOfDuplicatedNodes() diff --git a/src/extractor/extractor.cpp b/src/extractor/extractor.cpp index 064fc59d0..f62bb1b39 100644 --- a/src/extractor/extractor.cpp +++ b/src/extractor/extractor.cpp @@ -241,6 +241,7 @@ int Extractor::run(ScriptingEnvironment &scripting_environment) util::DeallocatingVector edge_based_edge_list; std::vector node_is_startpoint; std::vector edge_based_node_weights; + std::vector edge_based_node_durations; std::uint32_t ebg_connectivity_checksum = 0; // Create a node-based graph from the OSRM file @@ -320,6 +321,7 @@ int Extractor::run(ScriptingEnvironment &scripting_environment) edge_based_node_segments, node_is_startpoint, edge_based_node_weights, + edge_based_node_durations, edge_based_edge_list, ebg_connectivity_checksum); @@ -343,8 +345,8 @@ int Extractor::run(ScriptingEnvironment &scripting_environment) util::Log() << "Saving edge-based node weights to file."; TIMER_START(timer_write_node_weights); - extractor::files::writeEdgeBasedNodeWeights(config.GetPath(".osrm.enw"), - edge_based_node_weights); + extractor::files::writeEdgeBasedNodeWeightsDurations( + config.GetPath(".osrm.enw"), edge_based_node_weights, edge_based_node_durations); TIMER_STOP(timer_write_node_weights); util::Log() << "Done writing. (" << TIMER_SEC(timer_write_node_weights) << ")"; @@ -733,6 +735,7 @@ EdgeID Extractor::BuildEdgeExpandedGraph( std::vector &edge_based_node_segments, std::vector &node_is_startpoint, std::vector &edge_based_node_weights, + std::vector &edge_based_node_durations, util::DeallocatingVector &edge_based_edge_list, std::uint32_t &connectivity_checksum) { @@ -782,6 +785,7 @@ EdgeID Extractor::BuildEdgeExpandedGraph( edge_based_graph_factory.GetEdgeBasedNodeSegments(edge_based_node_segments); edge_based_graph_factory.GetStartPointMarkers(node_is_startpoint); edge_based_graph_factory.GetEdgeBasedNodeWeights(edge_based_node_weights); + edge_based_graph_factory.GetEdgeBasedNodeDurations(edge_based_node_durations); connectivity_checksum = edge_based_graph_factory.GetConnectivityChecksum(); return number_of_edge_based_nodes; diff --git a/src/partitioner/partitioner.cpp b/src/partitioner/partitioner.cpp index 2bf783955..c18089386 100644 --- a/src/partitioner/partitioner.cpp +++ b/src/partitioner/partitioner.cpp @@ -146,9 +146,13 @@ int Partitioner::Run(const PartitionerConfig &config) } { std::vector node_weights; - extractor::files::readEdgeBasedNodeWeights(config.GetPath(".osrm.enw"), node_weights); + std::vector node_durations; + extractor::files::readEdgeBasedNodeWeightsDurations( + config.GetPath(".osrm.enw"), node_weights, node_durations); util::inplacePermutation(node_weights.begin(), node_weights.end(), permutation); - extractor::files::writeEdgeBasedNodeWeights(config.GetPath(".osrm.enw"), node_weights); + util::inplacePermutation(node_durations.begin(), node_durations.end(), permutation); + extractor::files::writeEdgeBasedNodeWeightsDurations( + config.GetPath(".osrm.enw"), node_weights, node_durations); } { const auto &filename = config.GetPath(".osrm.maneuver_overrides"); diff --git a/src/updater/updater.cpp b/src/updater/updater.cpp index 480f9308e..f4dc902a3 100644 --- a/src/updater/updater.cpp +++ b/src/updater/updater.cpp @@ -529,6 +529,17 @@ EdgeID Updater::LoadAndUpdateEdgeExpandedGraph(std::vector &edge_based_edge_list, std::vector &node_weights, std::uint32_t &connectivity_checksum) const +{ + std::vector node_durations(node_weights.size()); + return LoadAndUpdateEdgeExpandedGraph( + edge_based_edge_list, node_weights, node_durations, connectivity_checksum); +} + +EdgeID +Updater::LoadAndUpdateEdgeExpandedGraph(std::vector &edge_based_edge_list, + std::vector &node_weights, + std::vector &node_durations, + std::uint32_t &connectivity_checksum) const { TIMER_START(load_edges); @@ -536,7 +547,8 @@ Updater::LoadAndUpdateEdgeExpandedGraph(std::vector &e std::vector coordinates; extractor::PackedOSMIDs osm_node_ids; - extractor::files::readEdgeBasedNodeWeights(config.GetPath(".osrm.enw"), node_weights); + extractor::files::readEdgeBasedNodeWeightsDurations( + config.GetPath(".osrm.enw"), node_weights, node_durations); extractor::files::readEdgeBasedGraph(config.GetPath(".osrm.ebg"), number_of_edge_based_nodes, @@ -738,6 +750,7 @@ Updater::LoadAndUpdateEdgeExpandedGraph(std::vector &e BOOST_ASSERT(edge.source < node_weights.size()); node_weights[edge.source] = node_weights[edge.source] & 0x80000000 ? new_weight | 0x80000000 : new_weight; + node_durations[edge.source] = new_duration; // We found a zero-speed edge, so we'll skip this whole edge-based-edge // which