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:
committed by
Michael Krasnyk
parent
9b044aaa42
commit
2ddd98ee6d
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user