Use immutable node-based-graph for segregated edges.

This commit is contained in:
vng 2017-11-09 16:37:16 +03:00 committed by Michael Krasnyk
parent 32e6ccb037
commit 90e361c3dc
6 changed files with 25 additions and 21 deletions

View File

@ -75,6 +75,7 @@ class EdgeBasedGraphFactory
const std::unordered_set<NodeID> &traffic_lights, const std::unordered_set<NodeID> &traffic_lights,
const std::vector<util::Coordinate> &coordinates, const std::vector<util::Coordinate> &coordinates,
const util::NameTable &name_table, const util::NameTable &name_table,
const std::unordered_set<EdgeID> &segregated_edges,
guidance::LaneDescriptionMap &lane_description_map); guidance::LaneDescriptionMap &lane_description_map);
void Run(ScriptingEnvironment &scripting_environment, void Run(ScriptingEnvironment &scripting_environment,
@ -157,6 +158,7 @@ class EdgeBasedGraphFactory
const CompressedEdgeContainer &m_compressed_edge_container; const CompressedEdgeContainer &m_compressed_edge_container;
const util::NameTable &name_table; const util::NameTable &name_table;
const std::unordered_set<EdgeID> &segregated_edges;
guidance::LaneDescriptionMap &lane_description_map; guidance::LaneDescriptionMap &lane_description_map;
// In the edge based graph, any traversable (non reversed) edge of the node-based graph forms a // In the edge based graph, any traversable (non reversed) edge of the node-based graph forms a

View File

@ -72,6 +72,7 @@ class Extractor
const std::unordered_set<NodeID> &traffic_lights, const std::unordered_set<NodeID> &traffic_lights,
const std::vector<TurnRestriction> &turn_restrictions, const std::vector<TurnRestriction> &turn_restrictions,
const std::vector<ConditionalTurnRestriction> &conditional_turn_restrictions, const std::vector<ConditionalTurnRestriction> &conditional_turn_restrictions,
const std::unordered_set<EdgeID> &segregated_edges,
// might have to be updated to add new lane combinations // might have to be updated to add new lane combinations
guidance::LaneDescriptionMap &turn_lane_map, guidance::LaneDescriptionMap &turn_lane_map,
// for calculating turn penalties // for calculating turn penalties
@ -102,7 +103,7 @@ class Extractor
const std::string &path, const std::string &path,
std::vector<ConditionalTurnRestriction> &conditional_turn_restrictions); std::vector<ConditionalTurnRestriction> &conditional_turn_restrictions);
size_t FindSegregatedNodes(NodeBasedGraphFactory &factory); std::unordered_set<EdgeID> FindSegregatedNodes(NodeBasedGraphFactory &factory);
}; };
} }
} }

View File

@ -41,7 +41,7 @@ class NodeBasedGraphFactory
std::vector<TurnRestriction> &turn_restrictions, std::vector<TurnRestriction> &turn_restrictions,
std::vector<ConditionalTurnRestriction> &conditional_turn_restrictions); std::vector<ConditionalTurnRestriction> &conditional_turn_restrictions);
auto &GetGraph() { return compressed_output_graph; } auto const &GetGraph() { return compressed_output_graph; }
auto const &GetBarriers() const { return barriers; } auto const &GetBarriers() const { return barriers; }
auto const &GetTrafficSignals() const { return traffic_signals; } auto const &GetTrafficSignals() const { return traffic_signals; }
auto &GetCompressedEdges() { return compressed_edge_container; } auto &GetCompressedEdges() { return compressed_edge_container; }

View File

@ -22,7 +22,7 @@ struct NodeBasedEdgeData
{ {
NodeBasedEdgeData() NodeBasedEdgeData()
: weight(INVALID_EDGE_WEIGHT), duration(INVALID_EDGE_WEIGHT), geometry_id({0, false}), : weight(INVALID_EDGE_WEIGHT), duration(INVALID_EDGE_WEIGHT), geometry_id({0, false}),
reversed(false), segregated(false), annotation_data(-1) reversed(false), annotation_data(-1)
{ {
} }
@ -33,7 +33,7 @@ struct NodeBasedEdgeData
extractor::NodeBasedEdgeClassification flags, extractor::NodeBasedEdgeClassification flags,
AnnotationID annotation_data) AnnotationID annotation_data)
: weight(weight), duration(duration), geometry_id(geometry_id), reversed(reversed), : weight(weight), duration(duration), geometry_id(geometry_id), reversed(reversed),
segregated(false), flags(flags), annotation_data(annotation_data) flags(flags), annotation_data(annotation_data)
{ {
} }
@ -41,7 +41,6 @@ struct NodeBasedEdgeData
EdgeWeight duration; EdgeWeight duration;
GeometryID geometry_id; GeometryID geometry_id;
bool reversed : 1; bool reversed : 1;
bool segregated : 1;
extractor::NodeBasedEdgeClassification flags; extractor::NodeBasedEdgeClassification flags;
AnnotationID annotation_data; AnnotationID annotation_data;
}; };

View File

@ -67,12 +67,13 @@ EdgeBasedGraphFactory::EdgeBasedGraphFactory(
const std::unordered_set<NodeID> &traffic_lights, const std::unordered_set<NodeID> &traffic_lights,
const std::vector<util::Coordinate> &coordinates, const std::vector<util::Coordinate> &coordinates,
const util::NameTable &name_table, const util::NameTable &name_table,
const std::unordered_set<EdgeID> &segregated_edges,
guidance::LaneDescriptionMap &lane_description_map) guidance::LaneDescriptionMap &lane_description_map)
: m_edge_based_node_container(node_data_container), m_number_of_edge_based_nodes(0), : m_edge_based_node_container(node_data_container), m_number_of_edge_based_nodes(0),
m_coordinates(coordinates), m_node_based_graph(std::move(node_based_graph)), m_coordinates(coordinates), m_node_based_graph(std::move(node_based_graph)),
m_barrier_nodes(barrier_nodes), m_traffic_lights(traffic_lights), m_barrier_nodes(barrier_nodes), m_traffic_lights(traffic_lights),
m_compressed_edge_container(compressed_edge_container), name_table(name_table), m_compressed_edge_container(compressed_edge_container), name_table(name_table),
lane_description_map(lane_description_map) segregated_edges(segregated_edges), lane_description_map(lane_description_map)
{ {
} }
@ -165,7 +166,7 @@ NBGToEBG EdgeBasedGraphFactory::InsertEdgeBasedNode(const NodeID node_u, const N
m_edge_based_node_container.nodes[nbe_to_ebn_mapping[edge_id_1]].annotation_id = m_edge_based_node_container.nodes[nbe_to_ebn_mapping[edge_id_1]].annotation_id =
forward_data.annotation_data; forward_data.annotation_data;
m_edge_based_node_container.nodes[nbe_to_ebn_mapping[edge_id_1]].segregated = m_edge_based_node_container.nodes[nbe_to_ebn_mapping[edge_id_1]].segregated =
forward_data.segregated; segregated_edges.count(edge_id_1) > 0;
if (nbe_to_ebn_mapping[edge_id_2] != SPECIAL_EDGEID) if (nbe_to_ebn_mapping[edge_id_2] != SPECIAL_EDGEID)
{ {
@ -174,7 +175,7 @@ NBGToEBG EdgeBasedGraphFactory::InsertEdgeBasedNode(const NodeID node_u, const N
m_edge_based_node_container.nodes[nbe_to_ebn_mapping[edge_id_2]].annotation_id = m_edge_based_node_container.nodes[nbe_to_ebn_mapping[edge_id_2]].annotation_id =
reverse_data.annotation_data; reverse_data.annotation_data;
m_edge_based_node_container.nodes[nbe_to_ebn_mapping[edge_id_2]].segregated = m_edge_based_node_container.nodes[nbe_to_ebn_mapping[edge_id_2]].segregated =
reverse_data.segregated; segregated_edges.count(edge_id_2) > 0;
} }
// Add segments of edge-based nodes // Add segments of edge-based nodes
@ -371,7 +372,8 @@ EdgeBasedGraphFactory::GenerateEdgeExpandedNodes(const WayRestrictionMap &way_re
edge_data.geometry_id; edge_data.geometry_id;
m_edge_based_node_container.nodes[edge_based_node_id].annotation_id = m_edge_based_node_container.nodes[edge_based_node_id].annotation_id =
edge_data.annotation_data; edge_data.annotation_data;
m_edge_based_node_container.nodes[edge_based_node_id].segregated = edge_data.segregated; m_edge_based_node_container.nodes[edge_based_node_id].segregated =
segregated_edges.count(eid) > 0;
m_edge_based_node_weights.push_back(m_edge_based_node_weights[eid]); m_edge_based_node_weights.push_back(m_edge_based_node_weights[eid]);

View File

@ -220,11 +220,11 @@ int Extractor::run(ScriptingEnvironment &scripting_environment)
util::Log() << "Find segregated edges in node-based graph ..." << std::flush; util::Log() << "Find segregated edges in node-based graph ..." << std::flush;
TIMER_START(segregated); TIMER_START(segregated);
const size_t segregated_count = FindSegregatedNodes(node_based_graph_factory); auto segregated_edges = FindSegregatedNodes(node_based_graph_factory);
TIMER_STOP(segregated); TIMER_STOP(segregated);
util::Log() << "ok, after " << TIMER_SEC(segregated) << "s"; util::Log() << "ok, after " << TIMER_SEC(segregated) << "s";
util::Log() << "Segregated edges count = " << segregated_count; util::Log() << "Segregated edges count = " << segregated_edges.size();
util::Log() << "Writing nodes for nodes-based and edges-based graphs ..."; util::Log() << "Writing nodes for nodes-based and edges-based graphs ...";
auto const &coordinates = node_based_graph_factory.GetCoordinates(); auto const &coordinates = node_based_graph_factory.GetCoordinates();
@ -277,6 +277,7 @@ int Extractor::run(ScriptingEnvironment &scripting_environment)
traffic_signals, traffic_signals,
turn_restrictions, turn_restrictions,
conditional_turn_restrictions, conditional_turn_restrictions,
segregated_edges,
turn_lane_map, turn_lane_map,
scripting_environment, scripting_environment,
edge_based_nodes_container, edge_based_nodes_container,
@ -664,6 +665,7 @@ EdgeID Extractor::BuildEdgeExpandedGraph(
const std::unordered_set<NodeID> &traffic_signals, const std::unordered_set<NodeID> &traffic_signals,
const std::vector<TurnRestriction> &turn_restrictions, const std::vector<TurnRestriction> &turn_restrictions,
const std::vector<ConditionalTurnRestriction> &conditional_turn_restrictions, const std::vector<ConditionalTurnRestriction> &conditional_turn_restrictions,
const std::unordered_set<EdgeID> &segregated_edges,
// might have to be updated to add new lane combinations // might have to be updated to add new lane combinations
guidance::LaneDescriptionMap &turn_lane_map, guidance::LaneDescriptionMap &turn_lane_map,
// for calculating turn penalties // for calculating turn penalties
@ -685,6 +687,7 @@ EdgeID Extractor::BuildEdgeExpandedGraph(
traffic_signals, traffic_signals,
coordinates, coordinates,
name_table, name_table,
segregated_edges,
turn_lane_map); turn_lane_map);
const auto create_edge_based_edges = [&]() { const auto create_edge_based_edges = [&]() {
@ -949,11 +952,11 @@ bool IsSegregated(std::vector<EdgeInfo> v1,
return edgeLength <= threshold; return edgeLength <= threshold;
} }
size_t Extractor::FindSegregatedNodes(NodeBasedGraphFactory &factory) std::unordered_set<EdgeID> Extractor::FindSegregatedNodes(NodeBasedGraphFactory &factory)
{ {
util::NameTable names(config.GetPath(".osrm.names").string()); util::NameTable names(config.GetPath(".osrm.names").string());
auto &graph = factory.GetGraph(); auto const &graph = factory.GetGraph();
auto const &annotation = factory.GetAnnotationData(); auto const &annotation = factory.GetAnnotationData();
guidance::CoordinateExtractor coordExtractor( guidance::CoordinateExtractor coordExtractor(
@ -1039,16 +1042,16 @@ size_t Extractor::FindSegregatedNodes(NodeBasedGraphFactory &factory)
edgeLength); edgeLength);
}; };
size_t segregated_count = 0; std::unordered_set<EdgeID> segregated_edges;
for (NodeID sourceID = 0; sourceID < graph.GetNumberOfNodes(); ++sourceID) for (NodeID sourceID = 0; sourceID < graph.GetNumberOfNodes(); ++sourceID)
{ {
auto const sourceEdges = graph.GetAdjacentEdgeRange(sourceID); auto const sourceEdges = graph.GetAdjacentEdgeRange(sourceID);
for (EdgeID edgeID : sourceEdges) for (EdgeID edgeID : sourceEdges)
{ {
auto &edgeData = graph.GetEdgeData(edgeID); auto const &edgeData = graph.GetEdgeData(edgeID);
if (edgeData.reversed || edgeData.segregated) if (edgeData.reversed)
continue; continue;
NodeID const targetID = graph.GetTarget(edgeID); NodeID const targetID = graph.GetTarget(edgeID);
@ -1056,14 +1059,11 @@ size_t Extractor::FindSegregatedNodes(NodeBasedGraphFactory &factory)
double const length = get_edge_length(sourceID, edgeID, targetID); double const length = get_edge_length(sourceID, edgeID, targetID);
if (isSegregatedFn(edgeData, sourceEdges, sourceID, targetEdges, targetID, length)) if (isSegregatedFn(edgeData, sourceEdges, sourceID, targetEdges, targetID, length))
{ segregated_edges.insert(edgeID);
++segregated_count;
edgeData.segregated = true;
}
} }
} }
return segregated_count; return segregated_edges;
} }
} // namespace extractor } // namespace extractor