Skip to content

Commit fd9bebb

Browse files
oxidasePatrick Niklaus
authored andcommitted
Add EBG node durations
1 parent db18e86 commit fd9bebb

File tree

12 files changed

+89
-22
lines changed

12 files changed

+89
-22
lines changed

include/customizer/edge_based_graph.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ class MultiLevelGraph : public partitioner::MultiLevelGraph<EdgeDataT, Ownership
7676

7777
EdgeWeight GetNodeWeight(NodeID node) const { return node_weights[node]; }
7878

79+
EdgeWeight GetNodeDuration(NodeID node) const { return node_durations[node]; }
80+
7981
friend void
8082
serialization::read<EdgeDataT, Ownership>(storage::tar::FileReader &reader,
8183
const std::string &name,

include/engine/datafacade/contiguous_internalmem_datafacade.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -692,9 +692,9 @@ template <> class ContiguousInternalMemoryAlgorithmDataFacade<MLD> : public Algo
692692
return query_graph.GetNodeWeight(node);
693693
}
694694

695-
EdgeDuration GetNodeDuration(const NodeID) const override final
695+
EdgeDuration GetNodeDuration(const NodeID node) const override final
696696
{
697-
return 0; // TODO: query_graph.GetNodeduration(node);
697+
return query_graph.GetNodeDuration(node);
698698
}
699699

700700
NodeID GetTarget(const EdgeID e) const override final { return query_graph.GetTarget(e); }

include/extractor/edge_based_graph_factory.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ class EdgeBasedGraphFactory
9191
void GetEdgeBasedNodeSegments(std::vector<EdgeBasedNodeSegment> &nodes);
9292
void GetStartPointMarkers(std::vector<bool> &node_is_startpoint);
9393
void GetEdgeBasedNodeWeights(std::vector<EdgeWeight> &output_node_weights);
94+
void GetEdgeBasedNodeDurations(std::vector<EdgeWeight> &output_node_durations);
9495
std::uint32_t GetConnectivityChecksum() const;
9596

9697
std::uint64_t GetNumberOfEdgeBasedNodes() const;
@@ -117,6 +118,7 @@ class EdgeBasedGraphFactory
117118
//! node weights that indicate the length of the segment (node based) represented by the
118119
//! edge-based node
119120
std::vector<EdgeWeight> m_edge_based_node_weights;
121+
std::vector<EdgeDuration> m_edge_based_node_durations;
120122

121123
//! list of edge based nodes (compressed segments)
122124
std::vector<EdgeBasedNodeSegment> m_edge_based_node_segments;

include/extractor/extractor.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ class Extractor
8787
std::vector<EdgeBasedNodeSegment> &edge_based_node_segments,
8888
std::vector<bool> &node_is_startpoint,
8989
std::vector<EdgeWeight> &edge_based_node_weights,
90+
std::vector<EdgeDuration> &edge_based_node_durations,
9091
util::DeallocatingVector<EdgeBasedEdge> &edge_based_edge_list,
9192
std::uint32_t &connectivity_checksum);
9293

include/extractor/files.hpp

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -462,14 +462,28 @@ void readEdgeBasedNodeWeights(const boost::filesystem::path &path, NodeWeigtsVec
462462
storage::serialization::read(reader, "/extractor/edge_based_node_weights", weights);
463463
}
464464

465-
template <typename NodeWeigtsVectorT>
466-
void writeEdgeBasedNodeWeights(const boost::filesystem::path &path,
467-
const NodeWeigtsVectorT &weights)
465+
template <typename NodeWeigtsVectorT, typename NodeDurationsVectorT>
466+
void readEdgeBasedNodeWeightsDurations(const boost::filesystem::path &path,
467+
NodeWeigtsVectorT &weights,
468+
NodeDurationsVectorT &durations)
469+
{
470+
const auto fingerprint = storage::tar::FileReader::VerifyFingerprint;
471+
storage::tar::FileReader reader{path, fingerprint};
472+
473+
storage::serialization::read(reader, "/extractor/edge_based_node_weights", weights);
474+
storage::serialization::read(reader, "/extractor/edge_based_node_durations", durations);
475+
}
476+
477+
template <typename NodeWeigtsVectorT, typename NodeDurationsVectorT>
478+
void writeEdgeBasedNodeWeightsDurations(const boost::filesystem::path &path,
479+
const NodeWeigtsVectorT &weights,
480+
const NodeDurationsVectorT &durations)
468481
{
469482
const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint;
470483
storage::tar::FileWriter writer{path, fingerprint};
471484

472485
storage::serialization::write(writer, "/extractor/edge_based_node_weights", weights);
486+
storage::serialization::write(writer, "/extractor/edge_based_node_durations", durations);
473487
}
474488

475489
template <typename RTreeT>

include/updater/updater.hpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,15 @@ class Updater
1717
public:
1818
Updater(UpdaterConfig config_) : config(std::move(config_)) {}
1919

20-
using NumNodesAndEdges =
21-
std::tuple<EdgeID, std::vector<extractor::EdgeBasedEdge>, std::uint32_t>;
22-
NumNodesAndEdges LoadAndUpdateEdgeExpandedGraph() const;
20+
EdgeID
21+
LoadAndUpdateEdgeExpandedGraph(std::vector<extractor::EdgeBasedEdge> &edge_based_edge_list,
22+
std::vector<EdgeWeight> &node_weights,
23+
std::uint32_t &connectivity_checksum) const;
2324

2425
EdgeID
2526
LoadAndUpdateEdgeExpandedGraph(std::vector<extractor::EdgeBasedEdge> &edge_based_edge_list,
2627
std::vector<EdgeWeight> &node_weights,
28+
std::vector<EdgeDuration> &node_durations, // TODO: to be deleted
2729
std::uint32_t &connectivity_checksum) const;
2830

2931
private:

src/customize/customizer.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,13 +75,14 @@ void printUnreachableStatistics(const Partition &partition,
7575
auto LoadAndUpdateEdgeExpandedGraph(const CustomizationConfig &config,
7676
const partitioner::MultiLevelPartition &mlp,
7777
std::vector<EdgeWeight> &node_weights,
78+
std::vector<EdgeDuration> &node_durations,
7879
std::uint32_t &connectivity_checksum)
7980
{
8081
updater::Updater updater(config.updater_config);
8182

8283
std::vector<extractor::EdgeBasedEdge> edge_based_edge_list;
8384
EdgeID num_nodes = updater.LoadAndUpdateEdgeExpandedGraph(
84-
edge_based_edge_list, node_weights, connectivity_checksum);
85+
edge_based_edge_list, node_weights, node_durations, connectivity_checksum);
8586

8687
auto directed = partitioner::splitBidirectionalEdges(edge_based_edge_list);
8788

@@ -123,8 +124,10 @@ int Customizer::Run(const CustomizationConfig &config)
123124
partitioner::files::readPartition(config.GetPath(".osrm.partition"), mlp);
124125

125126
std::vector<EdgeWeight> node_weights;
127+
std::vector<EdgeDuration> node_durations; // TODO: to be removed later
126128
std::uint32_t connectivity_checksum = 0;
127-
auto graph = LoadAndUpdateEdgeExpandedGraph(config, mlp, node_weights, connectivity_checksum);
129+
auto graph = LoadAndUpdateEdgeExpandedGraph(
130+
config, mlp, node_weights, node_durations, connectivity_checksum);
128131
BOOST_ASSERT(graph.GetNumberOfNodes() == node_weights.size());
129132
std::for_each(node_weights.begin(), node_weights.end(), [](auto &w) { w &= 0x7fffffff; });
130133
util::Log() << "Loaded edge based graph: " << graph.GetNumberOfEdges() << " edges, "
@@ -163,7 +166,6 @@ int Customizer::Run(const CustomizationConfig &config)
163166
util::Log() << "MLD customization writing took " << TIMER_SEC(writing_mld_data) << " seconds";
164167

165168
TIMER_START(writing_graph);
166-
std::vector<EdgeDuration> node_durations; // TODO: save an empty vector, to be removed later
167169
MultiLevelEdgeBasedGraph shaved_graph{
168170
std::move(graph), std::move(node_weights), std::move(node_durations)};
169171
customizer::files::writeGraph(

src/engine/routing_algorithms/many_to_many_mld.cpp

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -169,8 +169,6 @@ void relaxOutgoingEdges(const DataFacade<mld::Algorithm> &facade,
169169
}
170170
}
171171

172-
const auto node_weight = facade.GetNodeWeight(node);
173-
const auto node_duration = facade.GetNodeDuration(node); // TODO: remove later
174172
for (const auto edge : facade.GetBorderEdgeRange(level, node))
175173
{
176174
const auto &data = facade.GetEdgeData(edge);
@@ -183,6 +181,10 @@ void relaxOutgoingEdges(const DataFacade<mld::Algorithm> &facade,
183181
}
184182

185183
const auto turn_id = data.turn_id;
184+
const auto node_weight =
185+
facade.GetNodeWeight(DIRECTION == FORWARD_DIRECTION ? node : to);
186+
const auto node_duration = facade.GetNodeDuration(
187+
DIRECTION == FORWARD_DIRECTION ? node : to); // TODO: remove later
186188
const auto edge_weight = node_weight + facade.GetWeightPenaltyForEdgeID(turn_id);
187189
const auto edge_duration = node_duration + facade.GetDurationPenaltyForEdgeID(turn_id);
188190

@@ -299,7 +301,6 @@ oneToManySearch(SearchEngineData<Algorithm> &engine_working_data,
299301
}
300302
};
301303

302-
// Check a single path result and insert adjacent nodes into heap
303304
auto insert_node = [&](NodeID node, EdgeWeight initial_weight, EdgeDuration initial_duration) {
304305

305306
// Update single node paths
@@ -311,9 +312,19 @@ oneToManySearch(SearchEngineData<Algorithm> &engine_working_data,
311312
const auto &data = facade.GetEdgeData(edge);
312313
if (DIRECTION == FORWARD_DIRECTION ? data.forward : data.backward)
313314
{
314-
query_heap.Insert(facade.GetTarget(edge),
315-
data.weight + initial_weight,
316-
{node, data.duration + initial_duration});
315+
const auto turn_id = data.turn_id;
316+
const auto edge_weight =
317+
initial_weight +
318+
facade.GetNodeWeight(DIRECTION == FORWARD_DIRECTION ? node
319+
: facade.GetTarget(edge)) +
320+
facade.GetWeightPenaltyForEdgeID(turn_id);
321+
const auto edge_duration = initial_duration +
322+
+facade.GetNodeDuration(DIRECTION == FORWARD_DIRECTION
323+
? node
324+
: facade.GetTarget(edge)) +
325+
facade.GetDurationPenaltyForEdgeID(turn_id);
326+
327+
query_heap.Insert(facade.GetTarget(edge), edge_weight, {node, edge_duration});
317328
}
318329
}
319330
};

src/extractor/edge_based_graph_factory.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,13 @@ void EdgeBasedGraphFactory::GetEdgeBasedNodeWeights(std::vector<EdgeWeight> &out
107107
swap(m_edge_based_node_weights, output_node_weights);
108108
}
109109

110+
void EdgeBasedGraphFactory::GetEdgeBasedNodeDurations(
111+
std::vector<EdgeWeight> &output_node_durations)
112+
{
113+
using std::swap; // Koenig swap
114+
swap(m_edge_based_node_durations, output_node_durations);
115+
}
116+
110117
std::uint32_t EdgeBasedGraphFactory::GetConnectivityChecksum() const
111118
{
112119
return m_connectivity_checksum;
@@ -281,6 +288,7 @@ unsigned EdgeBasedGraphFactory::LabelEdgeBasedNodes()
281288
// heuristic: node-based graph node is a simple intersection with four edges
282289
// (edge-based nodes)
283290
m_edge_based_node_weights.reserve(4 * m_node_based_graph.GetNumberOfNodes());
291+
m_edge_based_node_durations.reserve(4 * m_node_based_graph.GetNumberOfNodes());
284292
nbe_to_ebn_mapping.resize(m_node_based_graph.GetEdgeCapacity(), SPECIAL_NODEID);
285293

286294
// renumber edge based node of outgoing edges
@@ -297,6 +305,7 @@ unsigned EdgeBasedGraphFactory::LabelEdgeBasedNodes()
297305
}
298306

299307
m_edge_based_node_weights.push_back(edge_data.weight);
308+
m_edge_based_node_durations.push_back(edge_data.duration);
300309

301310
BOOST_ASSERT(numbered_edges_count < m_node_based_graph.GetNumberOfEdges());
302311
nbe_to_ebn_mapping[current_edge] = numbered_edges_count;
@@ -392,6 +401,8 @@ EdgeBasedGraphFactory::GenerateEdgeExpandedNodes(const WayRestrictionMap &way_re
392401
const auto ebn_weight = m_edge_based_node_weights[nbe_to_ebn_mapping[eid]];
393402
BOOST_ASSERT(ebn_weight == INVALID_EDGE_WEIGHT || ebn_weight == edge_data.weight);
394403
m_edge_based_node_weights.push_back(ebn_weight);
404+
m_edge_based_node_durations.push_back(
405+
m_edge_based_node_durations[nbe_to_ebn_mapping[eid]]);
395406

396407
edge_based_node_id++;
397408
progress.PrintStatus(progress_counter++);
@@ -400,6 +411,7 @@ EdgeBasedGraphFactory::GenerateEdgeExpandedNodes(const WayRestrictionMap &way_re
400411

401412
BOOST_ASSERT(m_edge_based_node_segments.size() == m_edge_based_node_is_startpoint.size());
402413
BOOST_ASSERT(m_number_of_edge_based_nodes == m_edge_based_node_weights.size());
414+
BOOST_ASSERT(m_number_of_edge_based_nodes == m_edge_based_node_durations.size());
403415

404416
util::Log() << "Generated " << m_number_of_edge_based_nodes << " nodes ("
405417
<< way_restriction_map.NumberOfDuplicatedNodes()

src/extractor/extractor.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,7 @@ int Extractor::run(ScriptingEnvironment &scripting_environment)
241241
util::DeallocatingVector<EdgeBasedEdge> edge_based_edge_list;
242242
std::vector<bool> node_is_startpoint;
243243
std::vector<EdgeWeight> edge_based_node_weights;
244+
std::vector<EdgeDuration> edge_based_node_durations;
244245
std::uint32_t ebg_connectivity_checksum = 0;
245246

246247
// Create a node-based graph from the OSRM file
@@ -320,6 +321,7 @@ int Extractor::run(ScriptingEnvironment &scripting_environment)
320321
edge_based_node_segments,
321322
node_is_startpoint,
322323
edge_based_node_weights,
324+
edge_based_node_durations,
323325
edge_based_edge_list,
324326
ebg_connectivity_checksum);
325327

@@ -343,8 +345,8 @@ int Extractor::run(ScriptingEnvironment &scripting_environment)
343345

344346
util::Log() << "Saving edge-based node weights to file.";
345347
TIMER_START(timer_write_node_weights);
346-
extractor::files::writeEdgeBasedNodeWeights(config.GetPath(".osrm.enw"),
347-
edge_based_node_weights);
348+
extractor::files::writeEdgeBasedNodeWeightsDurations(
349+
config.GetPath(".osrm.enw"), edge_based_node_weights, edge_based_node_durations);
348350
TIMER_STOP(timer_write_node_weights);
349351
util::Log() << "Done writing. (" << TIMER_SEC(timer_write_node_weights) << ")";
350352

@@ -733,6 +735,7 @@ EdgeID Extractor::BuildEdgeExpandedGraph(
733735
std::vector<EdgeBasedNodeSegment> &edge_based_node_segments,
734736
std::vector<bool> &node_is_startpoint,
735737
std::vector<EdgeWeight> &edge_based_node_weights,
738+
std::vector<EdgeDuration> &edge_based_node_durations,
736739
util::DeallocatingVector<EdgeBasedEdge> &edge_based_edge_list,
737740
std::uint32_t &connectivity_checksum)
738741
{
@@ -782,6 +785,7 @@ EdgeID Extractor::BuildEdgeExpandedGraph(
782785
edge_based_graph_factory.GetEdgeBasedNodeSegments(edge_based_node_segments);
783786
edge_based_graph_factory.GetStartPointMarkers(node_is_startpoint);
784787
edge_based_graph_factory.GetEdgeBasedNodeWeights(edge_based_node_weights);
788+
edge_based_graph_factory.GetEdgeBasedNodeDurations(edge_based_node_durations);
785789
connectivity_checksum = edge_based_graph_factory.GetConnectivityChecksum();
786790

787791
return number_of_edge_based_nodes;

0 commit comments

Comments
 (0)