Move ComponentID to EdgeBasedNodeDataContainer
This commit is contained in:
committed by
Patrick Niklaus
parent
373087d74f
commit
26702920b4
@@ -66,7 +66,14 @@ void EdgeBasedGraphFactory::GetEdgeBasedEdges(
|
||||
swap(m_edge_based_edge_list, output_edge_list);
|
||||
}
|
||||
|
||||
void EdgeBasedGraphFactory::GetEdgeBasedNodes(std::vector<EdgeBasedNode> &nodes)
|
||||
void EdgeBasedGraphFactory::GetEdgeBasedNodes(
|
||||
EdgeBasedNodeDataExternalContainer &ebg_node_data_container)
|
||||
{
|
||||
using std::swap; // Koenig swap
|
||||
swap(ebg_node_data_container, m_ebg_node_data_container);
|
||||
}
|
||||
|
||||
void EdgeBasedGraphFactory::GetNodeBasedEdges(std::vector<EdgeBasedNode> &nodes)
|
||||
{
|
||||
using std::swap; // Koenig swap
|
||||
swap(nodes, m_edge_based_node_list);
|
||||
@@ -163,8 +170,6 @@ NBGToEBG EdgeBasedGraphFactory::InsertEdgeBasedNode(const NodeID node_u, const N
|
||||
edge_id_to_segment_id(reverse_data.edge_id),
|
||||
current_edge_source_coordinate_id,
|
||||
current_edge_target_coordinate_id,
|
||||
false,
|
||||
INVALID_COMPONENTID,
|
||||
i);
|
||||
|
||||
m_edge_based_node_is_startpoint.push_back(forward_data.startpoint ||
|
||||
@@ -178,7 +183,6 @@ NBGToEBG EdgeBasedGraphFactory::InsertEdgeBasedNode(const NodeID node_u, const N
|
||||
}
|
||||
|
||||
void EdgeBasedGraphFactory::Run(ScriptingEnvironment &scripting_environment,
|
||||
const std::string &node_data_filename,
|
||||
const std::string &turn_data_filename,
|
||||
const std::string &turn_lane_data_filename,
|
||||
const std::string &turn_weight_penalties_filename,
|
||||
@@ -192,7 +196,7 @@ void EdgeBasedGraphFactory::Run(ScriptingEnvironment &scripting_environment,
|
||||
|
||||
TIMER_START(generate_nodes);
|
||||
{
|
||||
auto mapping = GenerateEdgeExpandedNodes(node_data_filename);
|
||||
auto mapping = GenerateEdgeExpandedNodes();
|
||||
files::writeNBGMapping(cnbg_ebg_mapping_path, mapping);
|
||||
}
|
||||
TIMER_STOP(generate_nodes);
|
||||
@@ -249,12 +253,11 @@ unsigned EdgeBasedGraphFactory::RenumberEdges()
|
||||
}
|
||||
|
||||
/// Creates the nodes in the edge expanded graph from edges in the node-based graph.
|
||||
std::vector<NBGToEBG>
|
||||
EdgeBasedGraphFactory::GenerateEdgeExpandedNodes(const std::string &node_data_filename)
|
||||
std::vector<NBGToEBG> EdgeBasedGraphFactory::GenerateEdgeExpandedNodes()
|
||||
{
|
||||
std::vector<NBGToEBG> mapping;
|
||||
|
||||
// TODO: make m_ebg_node_data_container local
|
||||
// Allocate memory for edge-based nodes
|
||||
m_ebg_node_data_container = EdgeBasedNodeDataExternalContainer(m_max_edge_id + 1);
|
||||
|
||||
util::Log() << "Generating edge expanded nodes ... ";
|
||||
@@ -301,50 +304,8 @@ EdgeBasedGraphFactory::GenerateEdgeExpandedNodes(const std::string &node_data_fi
|
||||
BOOST_ASSERT(m_edge_based_node_list.size() == m_edge_based_node_is_startpoint.size());
|
||||
BOOST_ASSERT(m_max_edge_id + 1 == m_edge_based_node_weights.size());
|
||||
|
||||
{
|
||||
// TODO: refactor saving edge-based node data with InsertEdgeBasedNode
|
||||
for (const auto nbg_node_id : util::irange(0u, m_node_based_graph->GetNumberOfNodes()))
|
||||
{
|
||||
for (const auto nbg_edge_id : m_node_based_graph->GetAdjacentEdgeRange(nbg_node_id))
|
||||
{
|
||||
const auto &nbg_edge_data = m_node_based_graph->GetEdgeData(nbg_edge_id);
|
||||
|
||||
if (nbg_edge_data.edge_id == SPECIAL_EDGEID)
|
||||
continue;
|
||||
|
||||
const bool is_encoded_forwards =
|
||||
m_compressed_edge_container.HasZippedEntryForForwardID(nbg_edge_id);
|
||||
const bool is_encoded_backwards =
|
||||
m_compressed_edge_container.HasZippedEntryForReverseID(nbg_edge_id);
|
||||
|
||||
BOOST_ASSERT(is_encoded_forwards || is_encoded_backwards);
|
||||
|
||||
// auto geometry_id =
|
||||
// is_encoded_forwards
|
||||
// ? m_compressed_edge_container.GetZippedPositionForForwardID(nbg_edge_id)
|
||||
// : is_encoded_backwards
|
||||
// ? m_compressed_edge_container.GetZippedPositionForReverseID(
|
||||
// nbg_edge_id)
|
||||
// : SPECIAL_GEOMETRYID;
|
||||
|
||||
BOOST_ASSERT(m_ebg_node_data_container.GetNameID(nbg_edge_data.edge_id) ==
|
||||
nbg_edge_data.name_id);
|
||||
BOOST_ASSERT(m_ebg_node_data_container.GetTravelMode(nbg_edge_data.edge_id) ==
|
||||
nbg_edge_data.travel_mode);
|
||||
|
||||
// m_ebg_node_data_container.SetData(nbg_edge_data.edge_id,
|
||||
// GeometryID{geometry_id, is_encoded_forwards},
|
||||
// nbg_edge_data.name_id,
|
||||
// nbg_edge_data.travel_mode);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
util::Log() << "Generated " << m_edge_based_node_list.size() << " nodes in edge-expanded graph";
|
||||
|
||||
files::writeNodeData(node_data_filename, m_ebg_node_data_container);
|
||||
m_ebg_node_data_container = EdgeBasedNodeDataExternalContainer();
|
||||
|
||||
return mapping;
|
||||
}
|
||||
|
||||
|
||||
+29
-39
@@ -130,7 +130,8 @@ int Extractor::run(ScriptingEnvironment &scripting_environment)
|
||||
|
||||
TIMER_START(expansion);
|
||||
|
||||
std::vector<EdgeBasedNode> edge_based_node_list;
|
||||
EdgeBasedNodeDataExternalContainer edge_based_nodes_container;
|
||||
std::vector<EdgeBasedNode> node_based_edges_list;
|
||||
util::DeallocatingVector<EdgeBasedEdge> edge_based_edge_list;
|
||||
std::vector<bool> node_is_startpoint;
|
||||
std::vector<EdgeWeight> edge_based_node_weights;
|
||||
@@ -140,7 +141,8 @@ int Extractor::run(ScriptingEnvironment &scripting_environment)
|
||||
auto graph_size = BuildEdgeExpandedGraph(scripting_environment,
|
||||
coordinates,
|
||||
osm_node_ids,
|
||||
edge_based_node_list,
|
||||
edge_based_nodes_container,
|
||||
node_based_edges_list,
|
||||
node_is_startpoint,
|
||||
edge_based_node_weights,
|
||||
edge_based_edge_list,
|
||||
@@ -163,16 +165,17 @@ int Extractor::run(ScriptingEnvironment &scripting_environment)
|
||||
util::Log() << "Done writing. (" << TIMER_SEC(timer_write_node_weights) << ")";
|
||||
|
||||
util::Log() << "Computing strictly connected components ...";
|
||||
FindComponents(max_edge_id, edge_based_edge_list, edge_based_node_list);
|
||||
FindComponents(max_edge_id, edge_based_edge_list, edge_based_nodes_container);
|
||||
|
||||
util::Log() << "Building r-tree ...";
|
||||
TIMER_START(rtree);
|
||||
BuildRTree(std::move(edge_based_node_list), std::move(node_is_startpoint), coordinates);
|
||||
BuildRTree(std::move(node_based_edges_list), std::move(node_is_startpoint), coordinates);
|
||||
|
||||
TIMER_STOP(rtree);
|
||||
|
||||
util::Log() << "Writing node map ...";
|
||||
util::Log() << "Writing nodes for nodes-based and edges-based graphs ...";
|
||||
files::writeNodes(config.node_output_path, coordinates, osm_node_ids);
|
||||
files::writeNodeData(config.edge_based_nodes_data_path, edge_based_nodes_container);
|
||||
|
||||
WriteEdgeBasedGraph(config.edge_graph_output_path, max_edge_id, edge_based_edge_list);
|
||||
|
||||
@@ -335,7 +338,7 @@ void Extractor::WriteProfileProperties(const std::string &output_path,
|
||||
|
||||
void Extractor::FindComponents(unsigned max_edge_id,
|
||||
const util::DeallocatingVector<EdgeBasedEdge> &input_edge_list,
|
||||
std::vector<EdgeBasedNode> &input_nodes) const
|
||||
EdgeBasedNodeDataExternalContainer &input_nodes) const
|
||||
{
|
||||
using InputEdge = util::static_graph_details::SortableEdgeWithData<void>;
|
||||
using UncontractedGraph = util::StaticGraph<void>;
|
||||
@@ -359,18 +362,6 @@ void Extractor::FindComponents(unsigned max_edge_id,
|
||||
}
|
||||
}
|
||||
|
||||
// connect forward and backward nodes of each edge
|
||||
for (const auto &node : input_nodes)
|
||||
{
|
||||
if (node.reverse_segment_id.enabled)
|
||||
{
|
||||
BOOST_ASSERT(node.forward_segment_id.id <= max_edge_id);
|
||||
BOOST_ASSERT(node.reverse_segment_id.id <= max_edge_id);
|
||||
edges.push_back({node.forward_segment_id.id, node.reverse_segment_id.id});
|
||||
edges.push_back({node.reverse_segment_id.id, node.forward_segment_id.id});
|
||||
}
|
||||
}
|
||||
|
||||
tbb::parallel_sort(edges.begin(), edges.end());
|
||||
edges.erase(std::unique(edges.begin(), edges.end()), edges.end());
|
||||
|
||||
@@ -379,16 +370,14 @@ void Extractor::FindComponents(unsigned max_edge_id,
|
||||
TarjanSCC<UncontractedGraph> component_search(uncontracted_graph);
|
||||
component_search.Run();
|
||||
|
||||
for (auto &node : input_nodes)
|
||||
stxxl::vector<ComponentID> component_ids;
|
||||
component_ids.reserve(max_edge_id + 1);
|
||||
for (NodeID node_id = 0; node_id <= max_edge_id; ++node_id)
|
||||
{
|
||||
auto forward_component = component_search.GetComponentID(node.forward_segment_id.id);
|
||||
BOOST_ASSERT(!node.reverse_segment_id.enabled ||
|
||||
forward_component ==
|
||||
component_search.GetComponentID(node.reverse_segment_id.id));
|
||||
|
||||
const unsigned component_size = component_search.GetComponentSize(forward_component);
|
||||
node.component.is_tiny = component_size < config.small_component_size;
|
||||
node.component.id = 1 + forward_component;
|
||||
const auto forward_component = component_search.GetComponentID(node_id);
|
||||
const auto component_size = component_search.GetComponentSize(forward_component);
|
||||
const auto is_tiny = component_size < config.small_component_size;
|
||||
input_nodes.SetData(node_id, {1 + forward_component, is_tiny});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -432,7 +421,8 @@ std::pair<std::size_t, EdgeID>
|
||||
Extractor::BuildEdgeExpandedGraph(ScriptingEnvironment &scripting_environment,
|
||||
std::vector<util::Coordinate> &coordinates,
|
||||
extractor::PackedOSMIDs &osm_node_ids,
|
||||
std::vector<EdgeBasedNode> &node_based_edge_list,
|
||||
EdgeBasedNodeDataExternalContainer &ebg_node_data_container,
|
||||
std::vector<EdgeBasedNode> &node_based_edges_list,
|
||||
std::vector<bool> &node_is_startpoint,
|
||||
std::vector<EdgeWeight> &edge_based_node_weights,
|
||||
util::DeallocatingVector<EdgeBasedEdge> &edge_based_edge_list,
|
||||
@@ -477,7 +467,6 @@ Extractor::BuildEdgeExpandedGraph(ScriptingEnvironment &scripting_environment,
|
||||
turn_lane_map);
|
||||
|
||||
edge_based_graph_factory.Run(scripting_environment,
|
||||
config.edge_based_nodes_data_path,
|
||||
config.edge_output_path,
|
||||
config.turn_lane_data_file_name,
|
||||
config.turn_weight_penalties_path,
|
||||
@@ -512,7 +501,8 @@ Extractor::BuildEdgeExpandedGraph(ScriptingEnvironment &scripting_environment,
|
||||
*compressed_edge_container.ToSegmentData());
|
||||
|
||||
edge_based_graph_factory.GetEdgeBasedEdges(edge_based_edge_list);
|
||||
edge_based_graph_factory.GetEdgeBasedNodes(node_based_edge_list);
|
||||
edge_based_graph_factory.GetEdgeBasedNodes(ebg_node_data_container);
|
||||
edge_based_graph_factory.GetNodeBasedEdges(node_based_edges_list);
|
||||
edge_based_graph_factory.GetStartPointMarkers(node_is_startpoint);
|
||||
edge_based_graph_factory.GetEdgeBasedNodeWeights(edge_based_node_weights);
|
||||
auto max_edge_id = edge_based_graph_factory.GetHighestEdgeID();
|
||||
@@ -532,21 +522,21 @@ Extractor::BuildEdgeExpandedGraph(ScriptingEnvironment &scripting_environment,
|
||||
|
||||
Saves tree into '.ramIndex' and leaves into '.fileIndex'.
|
||||
*/
|
||||
void Extractor::BuildRTree(std::vector<EdgeBasedNode> node_based_edge_list,
|
||||
void Extractor::BuildRTree(std::vector<EdgeBasedNode> node_based_edges_list,
|
||||
std::vector<bool> node_is_startpoint,
|
||||
const std::vector<util::Coordinate> &coordinates)
|
||||
{
|
||||
util::Log() << "constructing r-tree of " << node_based_edge_list.size()
|
||||
util::Log() << "constructing r-tree of " << node_based_edges_list.size()
|
||||
<< " edge elements build on-top of " << coordinates.size() << " coordinates";
|
||||
|
||||
BOOST_ASSERT(node_is_startpoint.size() == node_based_edge_list.size());
|
||||
BOOST_ASSERT(node_is_startpoint.size() == node_based_edges_list.size());
|
||||
|
||||
// Filter node based edges based on startpoint
|
||||
auto out_iter = node_based_edge_list.begin();
|
||||
auto in_iter = node_based_edge_list.begin();
|
||||
auto out_iter = node_based_edges_list.begin();
|
||||
auto in_iter = node_based_edges_list.begin();
|
||||
for (auto index : util::irange<std::size_t>(0UL, node_is_startpoint.size()))
|
||||
{
|
||||
BOOST_ASSERT(in_iter != node_based_edge_list.end());
|
||||
BOOST_ASSERT(in_iter != node_based_edges_list.end());
|
||||
if (node_is_startpoint[index])
|
||||
{
|
||||
*out_iter = *in_iter;
|
||||
@@ -554,17 +544,17 @@ void Extractor::BuildRTree(std::vector<EdgeBasedNode> node_based_edge_list,
|
||||
}
|
||||
in_iter++;
|
||||
}
|
||||
auto new_size = out_iter - node_based_edge_list.begin();
|
||||
auto new_size = out_iter - node_based_edges_list.begin();
|
||||
if (new_size == 0)
|
||||
{
|
||||
throw util::exception("There are no snappable edges left after processing. Are you "
|
||||
"setting travel modes correctly in the profile? Cannot continue." +
|
||||
SOURCE_REF);
|
||||
}
|
||||
node_based_edge_list.resize(new_size);
|
||||
node_based_edges_list.resize(new_size);
|
||||
|
||||
TIMER_START(construction);
|
||||
util::StaticRTree<EdgeBasedNode> rtree(node_based_edge_list,
|
||||
util::StaticRTree<EdgeBasedNode> rtree(node_based_edges_list,
|
||||
config.rtree_nodes_output_path,
|
||||
config.rtree_leafs_output_path,
|
||||
coordinates);
|
||||
|
||||
Reference in New Issue
Block a user