Store node ID's and weights separately in CompressedEdgeContainer

Removes CompressedEdges from the extractor and shared data format by
directly serializing vectors of node ID's, forward weights and reverse
weights for each node-based-edge

Refs #2575
This commit is contained in:
jakepruitt
2016-10-06 21:06:33 -07:00
committed by Jake Pruitt
parent ecee13bffa
commit 42271d99b2
7 changed files with 224 additions and 145 deletions
+41 -22
View File
@@ -488,7 +488,9 @@ EdgeID Contractor::LoadEdgeExpandedGraph(
std::vector<extractor::QueryNode> internal_to_external_node_map;
std::vector<unsigned> m_geometry_indices;
std::vector<extractor::CompressedEdgeContainer::CompressedEdge> m_geometry_list;
std::vector<NodeID> m_geometry_node_list;
std::vector<EdgeWeight> m_geometry_fwd_weight_list;
std::vector<EdgeWeight> m_geometry_rev_weight_list;
const auto maybe_load_internal_to_external_node_map = [&] {
if (!(update_edge_weights || update_turn_penalties))
@@ -534,13 +536,23 @@ EdgeID Contractor::LoadEdgeExpandedGraph(
geometry_stream.read((char *)&number_of_compressed_geometries, sizeof(unsigned));
BOOST_ASSERT(m_geometry_indices.back() == number_of_compressed_geometries);
m_geometry_list.resize(number_of_compressed_geometries);
m_geometry_node_list.resize(number_of_compressed_geometries);
m_geometry_fwd_weight_list.resize(number_of_compressed_geometries);
m_geometry_rev_weight_list.resize(number_of_compressed_geometries);
if (number_of_compressed_geometries > 0)
{
geometry_stream.read((char *)&(m_geometry_list[0]),
geometry_stream.read((char *)&(m_geometry_node_list[0]),
number_of_compressed_geometries *
sizeof(extractor::CompressedEdgeContainer::CompressedEdge));
sizeof(NodeID));
geometry_stream.read((char *)&(m_geometry_fwd_weight_list[0]),
number_of_compressed_geometries *
sizeof(EdgeWeight));
geometry_stream.read((char *)&(m_geometry_rev_weight_list[0]),
number_of_compressed_geometries *
sizeof(EdgeWeight));
}
};
@@ -561,7 +573,7 @@ EdgeID Contractor::LoadEdgeExpandedGraph(
// CSV file that supplied the value that gets used for that segment, then
// we write out this list so that it can be returned by the debugging
// vector tiles later on.
m_geometry_datasource.resize(m_geometry_list.size(), 0);
m_geometry_datasource.resize(m_geometry_fwd_weight_list.size(), 0);
// Now, we iterate over all the segments stored in the StaticRTree, updating
// the packed geometry weights in the `.geometries` file (note: we do not
@@ -595,16 +607,14 @@ EdgeID Contractor::LoadEdgeExpandedGraph(
const unsigned forward_begin =
m_geometry_indices.at(leaf_object.packed_geometry_id);
const auto current_segment =
&(m_geometry_list[forward_begin + leaf_object.fwd_segment_position]);
const auto current_fwd_weight =
m_geometry_fwd_weight_list[forward_begin + leaf_object.fwd_segment_position];
u = &(
internal_to_external_node_map[m_geometry_list[forward_begin +
leaf_object.fwd_segment_position]
.node_id]);
u = &(internal_to_external_node_map
[m_geometry_node_list[forward_begin +
leaf_object.fwd_segment_position]]);
v = &(internal_to_external_node_map
[m_geometry_list[forward_begin + leaf_object.fwd_segment_position + 1]
.node_id]);
[m_geometry_node_list[forward_begin + leaf_object.fwd_segment_position + 1]]);
const double segment_length = util::coordinate_calculation::greatCircleDistance(
util::Coordinate{u->lon, u->lat}, util::Coordinate{v->lon, v->lat});
@@ -616,11 +626,11 @@ EdgeID Contractor::LoadEdgeExpandedGraph(
const auto new_segment_weight = getNewWeight(forward_speed_iter,
segment_length,
segment_speed_filenames,
current_segment->forward_weight,
current_fwd_weight,
log_edge_updates_factor);
m_geometry_list[forward_begin + 1 + leaf_object.fwd_segment_position]
.forward_weight = new_segment_weight;
m_geometry_fwd_weight_list[forward_begin + 1 + leaf_object.fwd_segment_position] =
new_segment_weight;
m_geometry_datasource[forward_begin + 1 + leaf_object.fwd_segment_position] =
forward_speed_iter->speed_source.source;
@@ -633,6 +643,9 @@ EdgeID Contractor::LoadEdgeExpandedGraph(
counters[LUA_SOURCE] += 1;
}
const auto current_rev_weight =
m_geometry_rev_weight_list[forward_begin + leaf_object.fwd_segment_position];
const auto reverse_speed_iter =
find(segment_speed_lookup, Segment{v->node_id, u->node_id});
if (reverse_speed_iter != segment_speed_lookup.end())
@@ -640,10 +653,10 @@ EdgeID Contractor::LoadEdgeExpandedGraph(
const auto new_segment_weight = getNewWeight(reverse_speed_iter,
segment_length,
segment_speed_filenames,
current_segment->reverse_weight,
current_rev_weight,
log_edge_updates_factor);
m_geometry_list[forward_begin + leaf_object.fwd_segment_position]
.reverse_weight = new_segment_weight;
m_geometry_rev_weight_list[forward_begin + leaf_object.fwd_segment_position] =
new_segment_weight;
m_geometry_datasource[forward_begin + leaf_object.fwd_segment_position] =
reverse_speed_iter->speed_source.source;
@@ -694,15 +707,21 @@ EdgeID Contractor::LoadEdgeExpandedGraph(
throw util::exception("Failed to open " + geometry_filename + " for writing");
}
const unsigned number_of_indices = m_geometry_indices.size();
const unsigned number_of_compressed_geometries = m_geometry_list.size();
const unsigned number_of_compressed_geometries = m_geometry_node_list.size();
geometry_stream.write(reinterpret_cast<const char *>(&number_of_indices), sizeof(unsigned));
geometry_stream.write(reinterpret_cast<char *>(&(m_geometry_indices[0])),
number_of_indices * sizeof(unsigned));
geometry_stream.write(reinterpret_cast<const char *>(&number_of_compressed_geometries),
sizeof(unsigned));
geometry_stream.write(reinterpret_cast<char *>(&(m_geometry_list[0])),
geometry_stream.write(reinterpret_cast<char *>(&(m_geometry_node_list[0])),
number_of_compressed_geometries *
sizeof(extractor::CompressedEdgeContainer::CompressedEdge));
sizeof(NodeID));
geometry_stream.write(reinterpret_cast<char *>(&(m_geometry_fwd_weight_list[0])),
number_of_compressed_geometries *
sizeof(EdgeWeight));
geometry_stream.write(reinterpret_cast<char *>(&(m_geometry_rev_weight_list[0])),
number_of_compressed_geometries *
sizeof(EdgeWeight));
};
const auto save_datasource_indexes = [&] {
+36 -42
View File
@@ -61,7 +61,7 @@ unsigned CompressedEdgeContainer::GetZippedPositionForForwardID(const EdgeID edg
{
auto map_iterator = m_forward_edge_id_to_zipped_index_map.find(edge_id);
BOOST_ASSERT(map_iterator != m_forward_edge_id_to_zipped_index_map.end());
BOOST_ASSERT(map_iterator->second < m_compressed_geometries.size());
BOOST_ASSERT(map_iterator->second < m_compressed_geometry_nodes.size());
return map_iterator->second;
}
@@ -69,48 +69,34 @@ unsigned CompressedEdgeContainer::GetZippedPositionForReverseID(const EdgeID edg
{
auto map_iterator = m_reverse_edge_id_to_zipped_index_map.find(edge_id);
BOOST_ASSERT(map_iterator != m_reverse_edge_id_to_zipped_index_map.end());
BOOST_ASSERT(map_iterator->second < m_compressed_geometries.size());
BOOST_ASSERT(map_iterator->second < m_compressed_geometry_nodes.size());
return map_iterator->second;
}
void CompressedEdgeContainer::SerializeInternalVector(const std::string &path) const
{
boost::filesystem::fstream geometry_out_stream(path, std::ios::binary | std::ios::out);
const unsigned compressed_geometries = m_compressed_geometries.size() + 1;
BOOST_ASSERT(std::numeric_limits<unsigned>::max() != compressed_geometries);
geometry_out_stream.write((char *)&compressed_geometries, sizeof(unsigned));
const unsigned compressed_geometry_indices = m_compressed_geometry_index.size() + 1;
const unsigned compressed_geometries = m_compressed_geometry_nodes.size();
BOOST_ASSERT(std::numeric_limits<unsigned>::max() != compressed_geometry_indices);
geometry_out_stream.write((char *)&compressed_geometry_indices, sizeof(unsigned));
// write indices array
unsigned prefix_sum_of_list_indices = 0;
for (const auto &elem : m_compressed_geometries)
{
geometry_out_stream.write((char *)&prefix_sum_of_list_indices, sizeof(unsigned));
geometry_out_stream.write((char *)(m_compressed_geometry_index.data()), sizeof(unsigned) * m_compressed_geometry_index.size());
const std::vector<CompressedEdge> &current_vector = elem;
const unsigned unpacked_size = current_vector.size();
BOOST_ASSERT(std::numeric_limits<unsigned>::max() != unpacked_size);
prefix_sum_of_list_indices += unpacked_size;
}
// sentinel element
geometry_out_stream.write((char *)&prefix_sum_of_list_indices, sizeof(unsigned));
geometry_out_stream.write((char *)&(compressed_geometries), sizeof(unsigned));
// number of geometry entries to follow, it is the (inclusive) prefix sum
geometry_out_stream.write((char *)&prefix_sum_of_list_indices, sizeof(unsigned));
// number of geometry entries to follow
geometry_out_stream.write((char *)&(compressed_geometries), sizeof(unsigned));
unsigned control_sum = 0;
// write compressed geometries
for (auto &elem : m_compressed_geometries)
{
const std::vector<CompressedEdge> &current_vector = elem;
const unsigned unpacked_size = current_vector.size();
control_sum += unpacked_size;
BOOST_ASSERT(std::numeric_limits<unsigned>::max() != unpacked_size);
for (const auto &current_node : current_vector)
{
geometry_out_stream.write((char *)&(current_node), sizeof(CompressedEdge));
}
}
BOOST_ASSERT(control_sum == prefix_sum_of_list_indices);
// write compressed geometry node id's
geometry_out_stream.write((char *)(m_compressed_geometry_nodes.data()), sizeof(NodeID) * m_compressed_geometry_nodes.size());
// write compressed geometry forward weights
geometry_out_stream.write((char *)(m_compressed_geometry_fwd_weights.data()), sizeof(EdgeWeight) * m_compressed_geometry_fwd_weights.size());
// write compressed geometry reverse weights
geometry_out_stream.write((char *)(m_compressed_geometry_rev_weights.data()), sizeof(EdgeWeight) * m_compressed_geometry_rev_weights.size());
}
// Adds info for a compressed edge to the container. edge_id_2
@@ -250,7 +236,10 @@ void CompressedEdgeContainer::AddUncompressedEdge(const EdgeID edge_id,
void CompressedEdgeContainer::InitializeBothwayVector()
{
m_compressed_geometries.reserve(m_compressed_oneway_geometries.size() / 2);
m_compressed_geometry_index.reserve(m_compressed_oneway_geometries.size());
m_compressed_geometry_nodes.reserve(m_compressed_oneway_geometries.size());
m_compressed_geometry_fwd_weights.reserve(m_compressed_oneway_geometries.size());
m_compressed_geometry_rev_weights.reserve(m_compressed_oneway_geometries.size());
}
unsigned CompressedEdgeContainer::ZipEdges(const EdgeID f_edge_id, const EdgeID r_edge_id)
@@ -260,14 +249,17 @@ unsigned CompressedEdgeContainer::ZipEdges(const EdgeID f_edge_id, const EdgeID
BOOST_ASSERT(forward_bucket.size() == reverse_bucket.size());
const unsigned zipped_geometry_id = m_compressed_geometries.size();
const unsigned zipped_geometry_id = m_compressed_geometry_index.size();
m_forward_edge_id_to_zipped_index_map[f_edge_id] = zipped_geometry_id;
m_reverse_edge_id_to_zipped_index_map[r_edge_id] = zipped_geometry_id;
std::vector<CompressedEdge> zipped_edge_bucket;
m_compressed_geometry_index.emplace_back(m_compressed_geometry_nodes.size());
const auto &first_node = reverse_bucket.back();
zipped_edge_bucket.emplace_back(
CompressedEdge{first_node.node_id, INVALID_EDGE_WEIGHT, first_node.weight});
m_compressed_geometry_nodes.emplace_back(first_node.node_id);
m_compressed_geometry_fwd_weights.emplace_back(INVALID_EDGE_WEIGHT);
m_compressed_geometry_rev_weights.emplace_back(first_node.weight);
for (std::size_t i = 0; i < forward_bucket.size() - 1; ++i)
{
@@ -276,14 +268,16 @@ unsigned CompressedEdgeContainer::ZipEdges(const EdgeID f_edge_id, const EdgeID
BOOST_ASSERT(fwd_node.node_id == rev_node.node_id);
zipped_edge_bucket.emplace_back(
CompressedEdge{fwd_node.node_id, fwd_node.weight, rev_node.weight});
m_compressed_geometry_nodes.emplace_back(fwd_node.node_id);
m_compressed_geometry_fwd_weights.emplace_back(fwd_node.weight);
m_compressed_geometry_rev_weights.emplace_back(rev_node.weight);
}
const auto &last_node = forward_bucket.back();
zipped_edge_bucket.emplace_back(
CompressedEdge{last_node.node_id, last_node.weight, INVALID_EDGE_WEIGHT});
m_compressed_geometries.emplace_back(std::move(zipped_edge_bucket));
m_compressed_geometry_nodes.emplace_back(last_node.node_id);
m_compressed_geometry_fwd_weights.emplace_back(last_node.weight);
m_compressed_geometry_rev_weights.emplace_back(INVALID_EDGE_WEIGHT);
return zipped_geometry_id;
}
+39 -9
View File
@@ -329,8 +329,12 @@ Storage::ReturnCode Storage::Run(int max_wait)
boost::iostreams::seek(
geometry_input_stream, number_of_geometries_indices * sizeof(unsigned), BOOST_IOS::cur);
geometry_input_stream.read((char *)&number_of_compressed_geometries, sizeof(unsigned));
shared_layout_ptr->SetBlockSize<extractor::CompressedEdgeContainer::CompressedEdge>(
SharedDataLayout::GEOMETRIES_LIST, number_of_compressed_geometries);
shared_layout_ptr->SetBlockSize<NodeID>(
SharedDataLayout::GEOMETRIES_NODE_LIST, number_of_compressed_geometries);
shared_layout_ptr->SetBlockSize<EdgeWeight>(
SharedDataLayout::GEOMETRIES_FWD_WEIGHT_LIST, number_of_compressed_geometries);
shared_layout_ptr->SetBlockSize<EdgeWeight>(
SharedDataLayout::GEOMETRIES_REV_WEIGHT_LIST, number_of_compressed_geometries);
// load datasource sizes. This file is optional, and it's non-fatal if it doesn't
// exist.
@@ -601,19 +605,45 @@ Storage::ReturnCode Storage::Run(int max_wait)
(char *)geometries_index_ptr,
shared_layout_ptr->GetBlockSize(SharedDataLayout::GEOMETRIES_INDEX));
}
extractor::CompressedEdgeContainer::CompressedEdge *geometries_list_ptr =
shared_layout_ptr->GetBlockPtr<extractor::CompressedEdgeContainer::CompressedEdge, true>(
shared_memory_ptr, SharedDataLayout::GEOMETRIES_LIST);
NodeID *geometries_node_id_list_ptr =
shared_layout_ptr->GetBlockPtr<NodeID, true>(
shared_memory_ptr, SharedDataLayout::GEOMETRIES_NODE_LIST);
geometry_input_stream.read((char *)&temporary_value, sizeof(unsigned));
BOOST_ASSERT(temporary_value ==
shared_layout_ptr->num_entries[SharedDataLayout::GEOMETRIES_LIST]);
shared_layout_ptr->num_entries[SharedDataLayout::GEOMETRIES_NODE_LIST]);
if (shared_layout_ptr->GetBlockSize(SharedDataLayout::GEOMETRIES_LIST) > 0)
if (shared_layout_ptr->GetBlockSize(SharedDataLayout::GEOMETRIES_NODE_LIST) > 0)
{
geometry_input_stream.read(
(char *)geometries_list_ptr,
shared_layout_ptr->GetBlockSize(SharedDataLayout::GEOMETRIES_LIST));
(char *)geometries_node_id_list_ptr,
shared_layout_ptr->GetBlockSize(SharedDataLayout::GEOMETRIES_NODE_LIST));
}
EdgeWeight *geometries_fwd_weight_list_ptr =
shared_layout_ptr->GetBlockPtr<EdgeWeight, true>(
shared_memory_ptr, SharedDataLayout::GEOMETRIES_FWD_WEIGHT_LIST);
BOOST_ASSERT(temporary_value ==
shared_layout_ptr->num_entries[SharedDataLayout::GEOMETRIES_FWD_WEIGHT_LIST]);
if (shared_layout_ptr->GetBlockSize(SharedDataLayout::GEOMETRIES_FWD_WEIGHT_LIST) > 0)
{
geometry_input_stream.read(
(char *)geometries_fwd_weight_list_ptr,
shared_layout_ptr->GetBlockSize(SharedDataLayout::GEOMETRIES_FWD_WEIGHT_LIST));
}
EdgeWeight *geometries_rev_weight_list_ptr =
shared_layout_ptr->GetBlockPtr<EdgeWeight, true>(
shared_memory_ptr, SharedDataLayout::GEOMETRIES_REV_WEIGHT_LIST);
BOOST_ASSERT(temporary_value ==
shared_layout_ptr->num_entries[SharedDataLayout::GEOMETRIES_REV_WEIGHT_LIST]);
if (shared_layout_ptr->GetBlockSize(SharedDataLayout::GEOMETRIES_REV_WEIGHT_LIST) > 0)
{
geometry_input_stream.read(
(char *)geometries_rev_weight_list_ptr,
shared_layout_ptr->GetBlockSize(SharedDataLayout::GEOMETRIES_REV_WEIGHT_LIST));
}
// load datasource information (if it exists)