simplify passing annotation data through OSRM pipeline using the node-based datastore

- separates node-based graph creation and compression from edge-based graph creation
 - moves usage of edge-based node data-container to pre-processing as well, unifying access to node-based data
 - single struct instead of separate vectors for annotation data in engine (single place of modification)
This commit is contained in:
Moritz Kobitzsch
2017-09-25 15:37:11 +02:00
committed by Michael Krasnyk
parent 9b044aaa42
commit 2ddd98ee6d
64 changed files with 1610 additions and 1190 deletions
+66 -44
View File
@@ -28,23 +28,33 @@ inline InputEdge MakeUnitEdge(const NodeID from, const NodeID to)
{
// src, tgt, dist, edge_id, name_id, fwd, bkwd, roundabout, circular, startpoint, local access,
// split edge, travel_mode
return {
from, // source
to, // target
1, // weight
1, // duration
SPECIAL_EDGEID, // edge_id
0, // name_id
false, // reversed
false, // roundabout
false, // circular
false, // startpoint
false, // is_left_hand_driving
true, // split edge
TRAVEL_MODE_INACCESSIBLE, // travel_mode
0, // classes
INVALID_LANE_DESCRIPTIONID // lane_description_id
};
return {from,
to,
1, // weight
1, // duration
GeometryID{0, false}, // geometry_id
false, // reversed
NodeBasedEdgeClassification(), // default flags
0}; // AnnotationID
}
bool compatible(Graph const &graph,
const std::vector<NodeBasedEdgeAnnotation> &node_data_container,
EdgeID const first,
EdgeID second)
{
auto const &first_flags = graph.GetEdgeData(first).flags;
auto const &second_flags = graph.GetEdgeData(second).flags;
if (!(first_flags == second_flags))
return false;
if (graph.GetEdgeData(first).reversed != graph.GetEdgeData(second).reversed)
return false;
auto const &first_annotation = node_data_container[graph.GetEdgeData(first).annotation_data];
auto const &second_annotation = node_data_container[graph.GetEdgeData(second).annotation_data];
return first_annotation.CanCombineWith(second_annotation);
}
} // namespace
@@ -60,6 +70,7 @@ BOOST_AUTO_TEST_CASE(long_road_test)
std::unordered_set<NodeID> traffic_lights;
std::vector<TurnRestriction> restrictions;
std::vector<ConditionalTurnRestriction> conditional_restrictions;
std::vector<NodeBasedEdgeAnnotation> annotations(1);
CompressedEdgeContainer container;
test::MockScriptingEnvironment scripting_environment;
@@ -72,19 +83,19 @@ BOOST_AUTO_TEST_CASE(long_road_test)
MakeUnitEdge(3, 4),
MakeUnitEdge(4, 3)};
BOOST_ASSERT(edges[0].data.IsCompatibleTo(edges[2].data));
BOOST_ASSERT(edges[2].data.IsCompatibleTo(edges[4].data));
BOOST_ASSERT(edges[4].data.IsCompatibleTo(edges[6].data));
Graph graph(5, edges);
BOOST_ASSERT(compatible(graph, annotations, 0, 2));
BOOST_ASSERT(compatible(graph, annotations, 2, 4));
BOOST_ASSERT(compatible(graph, annotations, 4, 6));
compressor.Compress(barrier_nodes,
traffic_lights,
scripting_environment,
restrictions,
conditional_restrictions,
graph,
annotations,
container);
BOOST_CHECK_EQUAL(graph.FindEdge(0, 1), SPECIAL_EDGEID);
BOOST_CHECK_EQUAL(graph.FindEdge(1, 2), SPECIAL_EDGEID);
BOOST_CHECK_EQUAL(graph.FindEdge(2, 3), SPECIAL_EDGEID);
@@ -106,6 +117,7 @@ BOOST_AUTO_TEST_CASE(loop_test)
std::vector<TurnRestriction> restrictions;
std::vector<ConditionalTurnRestriction> conditional_restrictions;
CompressedEdgeContainer container;
std::vector<NodeBasedEdgeAnnotation> annotations(1);
test::MockScriptingEnvironment scripting_environment;
std::vector<InputEdge> edges = {MakeUnitEdge(0, 1),
@@ -121,26 +133,28 @@ BOOST_AUTO_TEST_CASE(loop_test)
MakeUnitEdge(5, 0),
MakeUnitEdge(5, 4)};
BOOST_ASSERT(edges.size() == 12);
BOOST_ASSERT(edges[0].data.IsCompatibleTo(edges[1].data));
BOOST_ASSERT(edges[1].data.IsCompatibleTo(edges[2].data));
BOOST_ASSERT(edges[2].data.IsCompatibleTo(edges[3].data));
BOOST_ASSERT(edges[3].data.IsCompatibleTo(edges[4].data));
BOOST_ASSERT(edges[4].data.IsCompatibleTo(edges[5].data));
BOOST_ASSERT(edges[5].data.IsCompatibleTo(edges[6].data));
BOOST_ASSERT(edges[6].data.IsCompatibleTo(edges[7].data));
BOOST_ASSERT(edges[7].data.IsCompatibleTo(edges[8].data));
BOOST_ASSERT(edges[8].data.IsCompatibleTo(edges[9].data));
BOOST_ASSERT(edges[9].data.IsCompatibleTo(edges[10].data));
BOOST_ASSERT(edges[10].data.IsCompatibleTo(edges[11].data));
Graph graph(6, edges);
BOOST_ASSERT(edges.size() == 12);
BOOST_ASSERT(compatible(graph, annotations, 0, 1));
BOOST_ASSERT(compatible(graph, annotations, 1, 2));
BOOST_ASSERT(compatible(graph, annotations, 2, 3));
BOOST_ASSERT(compatible(graph, annotations, 3, 4));
BOOST_ASSERT(compatible(graph, annotations, 4, 5));
BOOST_ASSERT(compatible(graph, annotations, 5, 6));
BOOST_ASSERT(compatible(graph, annotations, 6, 7));
BOOST_ASSERT(compatible(graph, annotations, 7, 8));
BOOST_ASSERT(compatible(graph, annotations, 8, 9));
BOOST_ASSERT(compatible(graph, annotations, 9, 10));
BOOST_ASSERT(compatible(graph, annotations, 10, 11));
BOOST_ASSERT(compatible(graph, annotations, 11, 0));
compressor.Compress(barrier_nodes,
traffic_lights,
scripting_environment,
restrictions,
conditional_restrictions,
graph,
annotations,
container);
BOOST_CHECK_EQUAL(graph.FindEdge(5, 0), SPECIAL_EDGEID);
@@ -163,6 +177,7 @@ BOOST_AUTO_TEST_CASE(t_intersection)
std::unordered_set<NodeID> barrier_nodes;
std::unordered_set<NodeID> traffic_lights;
std::vector<NodeBasedEdgeAnnotation> annotations(1);
std::vector<TurnRestriction> restrictions;
std::vector<ConditionalTurnRestriction> conditional_restrictions;
CompressedEdgeContainer container;
@@ -175,19 +190,20 @@ BOOST_AUTO_TEST_CASE(t_intersection)
MakeUnitEdge(2, 1),
MakeUnitEdge(3, 1)};
BOOST_ASSERT(edges[0].data.IsCompatibleTo(edges[1].data));
BOOST_ASSERT(edges[1].data.IsCompatibleTo(edges[2].data));
BOOST_ASSERT(edges[2].data.IsCompatibleTo(edges[3].data));
BOOST_ASSERT(edges[3].data.IsCompatibleTo(edges[4].data));
BOOST_ASSERT(edges[4].data.IsCompatibleTo(edges[5].data));
Graph graph(4, edges);
BOOST_ASSERT(compatible(graph, annotations, 0, 1));
BOOST_ASSERT(compatible(graph, annotations, 1, 2));
BOOST_ASSERT(compatible(graph, annotations, 2, 3));
BOOST_ASSERT(compatible(graph, annotations, 3, 4));
BOOST_ASSERT(compatible(graph, annotations, 4, 5));
compressor.Compress(barrier_nodes,
traffic_lights,
scripting_environment,
restrictions,
conditional_restrictions,
graph,
annotations,
container);
BOOST_CHECK(graph.FindEdge(0, 1) != SPECIAL_EDGEID);
@@ -204,6 +220,7 @@ BOOST_AUTO_TEST_CASE(street_name_changes)
std::unordered_set<NodeID> barrier_nodes;
std::unordered_set<NodeID> traffic_lights;
std::vector<NodeBasedEdgeAnnotation> annotations(2);
std::vector<TurnRestriction> restrictions;
std::vector<ConditionalTurnRestriction> conditional_restrictions;
CompressedEdgeContainer container;
@@ -211,18 +228,21 @@ BOOST_AUTO_TEST_CASE(street_name_changes)
std::vector<InputEdge> edges = {
MakeUnitEdge(0, 1), MakeUnitEdge(1, 0), MakeUnitEdge(1, 2), MakeUnitEdge(2, 1)};
edges[2].data.name_id = edges[3].data.name_id = 1;
BOOST_ASSERT(edges[0].data.IsCompatibleTo(edges[1].data));
BOOST_ASSERT(edges[2].data.IsCompatibleTo(edges[3].data));
annotations[1].name_id = 1;
edges[2].data.annotation_data = edges[3].data.annotation_data = 1;
Graph graph(5, edges);
BOOST_ASSERT(compatible(graph, annotations, 0, 1));
BOOST_ASSERT(compatible(graph, annotations, 2, 3));
compressor.Compress(barrier_nodes,
traffic_lights,
scripting_environment,
restrictions,
conditional_restrictions,
graph,
annotations,
container);
BOOST_CHECK(graph.FindEdge(0, 1) != SPECIAL_EDGEID);
@@ -238,6 +258,7 @@ BOOST_AUTO_TEST_CASE(direction_changes)
std::unordered_set<NodeID> barrier_nodes;
std::unordered_set<NodeID> traffic_lights;
std::vector<NodeBasedEdgeAnnotation> annotations(1);
std::vector<TurnRestriction> restrictions;
std::vector<ConditionalTurnRestriction> conditional_restrictions;
CompressedEdgeContainer container;
@@ -255,6 +276,7 @@ BOOST_AUTO_TEST_CASE(direction_changes)
restrictions,
conditional_restrictions,
graph,
annotations,
container);
BOOST_CHECK(graph.FindEdge(0, 1) != SPECIAL_EDGEID);