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
@@ -67,23 +67,26 @@ struct CmpEdgeByInternalSourceTargetAndName
|
||||
if (lhs.result.target == SPECIAL_NODEID)
|
||||
return false;
|
||||
|
||||
if (lhs.result.name_id == rhs.result.name_id)
|
||||
auto const lhs_name_id = edge_annotation_data[lhs.result.annotation_data].name_id;
|
||||
auto const rhs_name_id = edge_annotation_data[rhs.result.annotation_data].name_id;
|
||||
if (lhs_name_id == rhs_name_id)
|
||||
return false;
|
||||
|
||||
if (lhs.result.name_id == EMPTY_NAMEID)
|
||||
if (lhs_name_id == EMPTY_NAMEID)
|
||||
return false;
|
||||
|
||||
if (rhs.result.name_id == EMPTY_NAMEID)
|
||||
if (rhs_name_id == EMPTY_NAMEID)
|
||||
return true;
|
||||
|
||||
BOOST_ASSERT(!name_offsets.empty() && name_offsets.back() == name_data.size());
|
||||
const oe::ExtractionContainers::NameCharData::const_iterator data = name_data.begin();
|
||||
return std::lexicographical_compare(data + name_offsets[lhs.result.name_id],
|
||||
data + name_offsets[lhs.result.name_id + 1],
|
||||
data + name_offsets[rhs.result.name_id],
|
||||
data + name_offsets[rhs.result.name_id + 1]);
|
||||
return std::lexicographical_compare(data + name_offsets[lhs_name_id],
|
||||
data + name_offsets[lhs_name_id + 1],
|
||||
data + name_offsets[rhs_name_id],
|
||||
data + name_offsets[rhs_name_id + 1]);
|
||||
}
|
||||
|
||||
const oe::ExtractionContainers::AnnotationDataVector &edge_annotation_data;
|
||||
const oe::ExtractionContainers::NameCharData &name_data;
|
||||
const oe::ExtractionContainers::NameOffsets &name_offsets;
|
||||
};
|
||||
@@ -136,6 +139,7 @@ void ExtractionContainers::PrepareData(ScriptingEnvironment &scripting_environme
|
||||
all_nodes_list.clear(); // free all_nodes_list before allocation of normal_edges
|
||||
all_nodes_list.shrink_to_fit();
|
||||
WriteEdges(file_out);
|
||||
WriteMetadata(file_out);
|
||||
|
||||
PrepareRestrictions();
|
||||
WriteCharData(name_file_name);
|
||||
@@ -361,7 +365,7 @@ void ExtractionContainers::PrepareEdges(ScriptingEnvironment &scripting_environm
|
||||
util::Coordinate target_coord{node_iterator->lon, node_iterator->lat};
|
||||
|
||||
// flip source and target coordinates if segment is in backward direction only
|
||||
if (!edge_iterator->result.forward && edge_iterator->result.backward)
|
||||
if (!edge_iterator->result.flags.forward && edge_iterator->result.flags.backward)
|
||||
std::swap(source_coord, target_coord);
|
||||
|
||||
const auto distance =
|
||||
@@ -389,9 +393,9 @@ void ExtractionContainers::PrepareEdges(ScriptingEnvironment &scripting_environm
|
||||
std::swap(edge.source, edge.target);
|
||||
|
||||
// std::swap does not work with bit-fields
|
||||
bool temp = edge.forward;
|
||||
edge.forward = edge.backward;
|
||||
edge.backward = temp;
|
||||
bool temp = edge.flags.forward;
|
||||
edge.flags.forward = edge.flags.backward;
|
||||
edge.flags.backward = temp;
|
||||
}
|
||||
++edge_iterator;
|
||||
}
|
||||
@@ -415,7 +419,8 @@ void ExtractionContainers::PrepareEdges(ScriptingEnvironment &scripting_environm
|
||||
std::mutex name_data_mutex;
|
||||
tbb::parallel_sort(all_edges_list.begin(),
|
||||
all_edges_list.end(),
|
||||
CmpEdgeByInternalSourceTargetAndName{name_char_data, name_offsets});
|
||||
CmpEdgeByInternalSourceTargetAndName{
|
||||
all_edges_annotation_data_list, name_char_data, name_offsets});
|
||||
TIMER_STOP(sort_edges_by_renumbered_start);
|
||||
log << "ok, after " << TIMER_SEC(sort_edges_by_renumbered_start) << "s";
|
||||
}
|
||||
@@ -452,12 +457,12 @@ void ExtractionContainers::PrepareEdges(ScriptingEnvironment &scripting_environm
|
||||
{
|
||||
const auto &result = all_edges_list[i].result;
|
||||
const auto value = std::make_pair(result.weight, result.duration);
|
||||
if (result.forward && value < min_forward)
|
||||
if (result.flags.forward && value < min_forward)
|
||||
{
|
||||
min_forward_idx = i;
|
||||
min_forward = value;
|
||||
}
|
||||
if (result.backward && value < min_backward)
|
||||
if (result.flags.backward && value < min_backward)
|
||||
{
|
||||
min_backward_idx = i;
|
||||
min_backward = value;
|
||||
@@ -476,9 +481,9 @@ void ExtractionContainers::PrepareEdges(ScriptingEnvironment &scripting_environm
|
||||
|
||||
if (min_backward_idx == min_forward_idx)
|
||||
{
|
||||
all_edges_list[min_forward_idx].result.is_split = false;
|
||||
all_edges_list[min_forward_idx].result.forward = true;
|
||||
all_edges_list[min_forward_idx].result.backward = true;
|
||||
all_edges_list[min_forward_idx].result.flags.is_split = false;
|
||||
all_edges_list[min_forward_idx].result.flags.forward = true;
|
||||
all_edges_list[min_forward_idx].result.flags.backward = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -486,17 +491,17 @@ void ExtractionContainers::PrepareEdges(ScriptingEnvironment &scripting_environm
|
||||
bool has_backward = min_backward_idx != std::numeric_limits<std::size_t>::max();
|
||||
if (has_forward)
|
||||
{
|
||||
all_edges_list[min_forward_idx].result.forward = true;
|
||||
all_edges_list[min_forward_idx].result.backward = false;
|
||||
all_edges_list[min_forward_idx].result.is_split = has_backward;
|
||||
all_edges_list[min_forward_idx].result.flags.forward = true;
|
||||
all_edges_list[min_forward_idx].result.flags.backward = false;
|
||||
all_edges_list[min_forward_idx].result.flags.is_split = has_backward;
|
||||
}
|
||||
if (has_backward)
|
||||
{
|
||||
std::swap(all_edges_list[min_backward_idx].result.source,
|
||||
all_edges_list[min_backward_idx].result.target);
|
||||
all_edges_list[min_backward_idx].result.forward = true;
|
||||
all_edges_list[min_backward_idx].result.backward = false;
|
||||
all_edges_list[min_backward_idx].result.is_split = has_forward;
|
||||
all_edges_list[min_backward_idx].result.flags.forward = true;
|
||||
all_edges_list[min_backward_idx].result.flags.backward = false;
|
||||
all_edges_list[min_backward_idx].result.flags.is_split = has_forward;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -545,10 +550,25 @@ void ExtractionContainers::WriteEdges(storage::io::FileWriter &file_out) const
|
||||
|
||||
TIMER_STOP(write_edges);
|
||||
log << "ok, after " << TIMER_SEC(write_edges) << "s";
|
||||
log << "Processed " << normal_edges.size() << " edges";
|
||||
log << " -- Processed " << normal_edges.size() << " edges";
|
||||
}
|
||||
}
|
||||
|
||||
void ExtractionContainers::WriteMetadata(storage::io::FileWriter &file_out) const
|
||||
{
|
||||
util::UnbufferedLog log;
|
||||
log << "Writing way meta-data ... " << std::flush;
|
||||
TIMER_START(write_meta_data);
|
||||
|
||||
file_out.WriteElementCount64(all_edges_annotation_data_list.size());
|
||||
file_out.WriteFrom(all_edges_annotation_data_list.data(),
|
||||
all_edges_annotation_data_list.size());
|
||||
|
||||
TIMER_STOP(write_meta_data);
|
||||
log << "ok, after " << TIMER_SEC(write_meta_data) << "s";
|
||||
log << " -- Metadata contains << " << all_edges_annotation_data_list.size() << " entries.";
|
||||
}
|
||||
|
||||
void ExtractionContainers::WriteNodes(storage::io::FileWriter &file_out) const
|
||||
{
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user