Refactor file writing in OSRM contract
This commit is contained in:
committed by
Patrick Niklaus
parent
9922c0f4f7
commit
97592e5bc3
@@ -77,20 +77,27 @@ int Contractor::Run()
|
||||
std::move(node_levels),
|
||||
std::move(node_weights));
|
||||
graph_contractor.Run(config.core_factor);
|
||||
graph_contractor.GetEdges(contracted_edge_list);
|
||||
graph_contractor.GetCoreMarker(is_core_node);
|
||||
graph_contractor.GetNodeLevels(node_levels);
|
||||
|
||||
contracted_edge_list = graph_contractor.GetEdges<QueryEdge>();
|
||||
is_core_node = graph_contractor.GetCoreMarker();
|
||||
node_levels = graph_contractor.GetNodeLevels();
|
||||
}
|
||||
TIMER_STOP(contraction);
|
||||
|
||||
util::Log() << "Contraction took " << TIMER_SEC(contraction) << " sec";
|
||||
|
||||
WriteContractedGraph(max_edge_id, std::move(contracted_edge_list));
|
||||
WriteCoreNodeMarker(std::move(is_core_node));
|
||||
{
|
||||
RangebasedCRC32 crc32_calculator;
|
||||
const unsigned checksum = crc32_calculator(contracted_edge_list);
|
||||
|
||||
files::writeGraph(config.graph_output_path,
|
||||
checksum,
|
||||
QueryGraph{max_edge_id + 1, std::move(contracted_edge_list)});
|
||||
}
|
||||
|
||||
files::writeCoreMarker(config.core_output_path, is_core_node);
|
||||
if (!config.use_cached_priority)
|
||||
{
|
||||
std::vector<float> out_node_levels(std::move(node_levels));
|
||||
|
||||
files::writeLevels(config.level_output_path, node_levels);
|
||||
}
|
||||
|
||||
@@ -103,38 +110,5 @@ int Contractor::Run()
|
||||
return 0;
|
||||
}
|
||||
|
||||
void Contractor::WriteCoreNodeMarker(std::vector<bool> &&in_is_core_node) const
|
||||
{
|
||||
std::vector<bool> is_core_node(std::move(in_is_core_node));
|
||||
std::vector<char> unpacked_bool_flags(std::move(is_core_node.size()));
|
||||
for (auto i = 0u; i < is_core_node.size(); ++i)
|
||||
{
|
||||
unpacked_bool_flags[i] = is_core_node[i] ? 1 : 0;
|
||||
}
|
||||
|
||||
storage::io::FileWriter core_marker_output_file(config.core_output_path,
|
||||
storage::io::FileWriter::GenerateFingerprint);
|
||||
|
||||
const std::size_t count = unpacked_bool_flags.size();
|
||||
core_marker_output_file.WriteElementCount64(count);
|
||||
core_marker_output_file.WriteFrom(unpacked_bool_flags.data(), count);
|
||||
}
|
||||
|
||||
void Contractor::WriteContractedGraph(unsigned max_node_id,
|
||||
util::DeallocatingVector<QueryEdge> contracted_edge_list)
|
||||
{
|
||||
// Sorting contracted edges in a way that the static query graph can read some in in-place.
|
||||
tbb::parallel_sort(contracted_edge_list.begin(), contracted_edge_list.end());
|
||||
auto new_end = std::unique(contracted_edge_list.begin(), contracted_edge_list.end());
|
||||
contracted_edge_list.resize(new_end - contracted_edge_list.begin());
|
||||
|
||||
RangebasedCRC32 crc32_calculator;
|
||||
const unsigned checksum = crc32_calculator(contracted_edge_list);
|
||||
|
||||
QueryGraph query_graph{max_node_id + 1, contracted_edge_list};
|
||||
|
||||
files::writeGraph(config.graph_output_path, checksum, query_graph);
|
||||
}
|
||||
|
||||
} // namespace contractor
|
||||
} // namespace osrm
|
||||
|
||||
@@ -12,8 +12,8 @@ GraphContractor::GraphContractor(int nodes, std::vector<ContractorEdge> input_ed
|
||||
|
||||
GraphContractor::GraphContractor(int nodes,
|
||||
std::vector<ContractorEdge> edges,
|
||||
std::vector<float> &&node_levels_,
|
||||
std::vector<EdgeWeight> &&node_weights_)
|
||||
std::vector<float> node_levels_,
|
||||
std::vector<EdgeWeight> node_weights_)
|
||||
: node_levels(std::move(node_levels_)), node_weights(std::move(node_weights_))
|
||||
{
|
||||
tbb::parallel_sort(edges.begin(), edges.end());
|
||||
@@ -427,15 +427,11 @@ void GraphContractor::Run(double core_factor)
|
||||
thread_data_list.data.clear();
|
||||
}
|
||||
|
||||
void GraphContractor::GetCoreMarker(std::vector<bool> &out_is_core_node)
|
||||
{
|
||||
out_is_core_node.swap(is_core_node);
|
||||
}
|
||||
// Can only be called once because it invalides the marker
|
||||
std::vector<bool> GraphContractor::GetCoreMarker() { return std::move(is_core_node); }
|
||||
|
||||
void GraphContractor::GetNodeLevels(std::vector<float> &out_node_levels)
|
||||
{
|
||||
out_node_levels.swap(node_levels);
|
||||
}
|
||||
// Can only be called once because it invalides the node levels
|
||||
std::vector<float> GraphContractor::GetNodeLevels() { return std::move(node_levels); }
|
||||
|
||||
float GraphContractor::EvaluateNodePriority(ContractorThreadData *const data,
|
||||
const NodeDepth node_depth,
|
||||
|
||||
Reference in New Issue
Block a user