Move writing graph to an own function
This commit is contained in:
parent
d64e6e6c1f
commit
1f985d04a2
@ -114,8 +114,6 @@ int Prepare::Process(int argc, char *argv[])
|
||||
|
||||
LogPolicy::GetInstance().Unmute();
|
||||
|
||||
FingerPrint fingerprint_orig;
|
||||
|
||||
node_output_path = osrm_input_path.string() + ".nodes";
|
||||
edge_output_path = osrm_input_path.string() + ".edges";
|
||||
geometry_output_path = osrm_input_path.string() + ".geometry";
|
||||
@ -148,34 +146,58 @@ int Prepare::Process(int argc, char *argv[])
|
||||
|
||||
TIMER_STOP(rtree);
|
||||
|
||||
|
||||
const unsigned crc32_value = CalculateEdgeChecksum(std::move(node_based_edge_list));
|
||||
|
||||
SimpleLogger().Write() << "writing node map ...";
|
||||
WriteNodeMapping(std::move(internal_to_external_node_map));
|
||||
|
||||
// Contracting the edge-expanded graph
|
||||
|
||||
TIMER_START(contraction);
|
||||
DeallocatingVector<QueryEdge> contracted_edge_list;
|
||||
ContractGraph(number_of_edge_based_nodes, edge_based_edge_list, contracted_edge_list);
|
||||
auto contracted_edge_list = osrm::make_unique<DeallocatingVector<QueryEdge>>();
|
||||
ContractGraph(number_of_edge_based_nodes, edge_based_edge_list, *contracted_edge_list);
|
||||
TIMER_STOP(contraction);
|
||||
|
||||
SimpleLogger().Write() << "Contraction took " << TIMER_SEC(contraction) << " sec";
|
||||
|
||||
// Sorting contracted edges in a way that the static query graph can read some in in-place.
|
||||
std::size_t number_of_used_edges = WriteContractedGraph(number_of_edge_based_nodes,
|
||||
std::move(node_based_edge_list),
|
||||
std::move(contracted_edge_list));
|
||||
|
||||
tbb::parallel_sort(contracted_edge_list.begin(), contracted_edge_list.end());
|
||||
const unsigned contracted_edge_count = contracted_edge_list.size();
|
||||
TIMER_STOP(preparing);
|
||||
|
||||
SimpleLogger().Write() << "Preprocessing : " << TIMER_SEC(preparing) << " seconds";
|
||||
SimpleLogger().Write() << "Expansion : " << (number_of_node_based_nodes / TIMER_SEC(expansion))
|
||||
<< " nodes/sec and "
|
||||
<< (number_of_edge_based_nodes / TIMER_SEC(expansion)) << " edges/sec";
|
||||
|
||||
SimpleLogger().Write() << "Contraction: "
|
||||
<< (number_of_edge_based_nodes / TIMER_SEC(contraction))
|
||||
<< " nodes/sec and " << number_of_used_edges / TIMER_SEC(contraction)
|
||||
<< " edges/sec";
|
||||
|
||||
SimpleLogger().Write() << "finished preprocessing";
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
std::size_t Prepare::WriteContractedGraph(unsigned number_of_edge_based_nodes,
|
||||
std::unique_ptr<std::vector<EdgeBasedNode>> node_based_edge_list,
|
||||
std::unique_ptr<DeallocatingVector<QueryEdge>> contracted_edge_list)
|
||||
{
|
||||
const unsigned crc32_value = CalculateEdgeChecksum(std::move(node_based_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());
|
||||
const unsigned contracted_edge_count = contracted_edge_list->size();
|
||||
SimpleLogger().Write() << "Serializing compacted graph of " << contracted_edge_count
|
||||
<< " edges";
|
||||
|
||||
FingerPrint fingerprint_orig;
|
||||
boost::filesystem::ofstream hsgr_output_stream(graph_output_path, std::ios::binary);
|
||||
hsgr_output_stream.write((char *)&fingerprint_orig, sizeof(FingerPrint));
|
||||
const unsigned max_used_node_id = 1 + [&contracted_edge_list]
|
||||
{
|
||||
unsigned tmp_max = 0;
|
||||
for (const QueryEdge &edge : contracted_edge_list)
|
||||
for (const QueryEdge &edge : *contracted_edge_list)
|
||||
{
|
||||
BOOST_ASSERT(SPECIAL_NODEID != edge.source);
|
||||
BOOST_ASSERT(SPECIAL_NODEID != edge.target);
|
||||
@ -200,7 +222,7 @@ int Prepare::Process(int argc, char *argv[])
|
||||
for (const auto node : osrm::irange(0u, max_used_node_id))
|
||||
{
|
||||
last_edge = edge;
|
||||
while ((edge < contracted_edge_count) && (contracted_edge_list[edge].source == node))
|
||||
while ((edge < contracted_edge_count) && ((*contracted_edge_list)[edge].source == node))
|
||||
{
|
||||
++edge;
|
||||
}
|
||||
@ -236,12 +258,12 @@ int Prepare::Process(int argc, char *argv[])
|
||||
int number_of_used_edges = 0;
|
||||
|
||||
StaticGraph<EdgeData>::EdgeArrayEntry current_edge;
|
||||
for (const auto edge : osrm::irange<std::size_t>(0, contracted_edge_list.size()))
|
||||
for (const auto edge : osrm::irange<std::size_t>(0, contracted_edge_list->size()))
|
||||
{
|
||||
// no eigen loops
|
||||
BOOST_ASSERT(contracted_edge_list[edge].source != contracted_edge_list[edge].target);
|
||||
current_edge.target = contracted_edge_list[edge].target;
|
||||
current_edge.data = contracted_edge_list[edge].data;
|
||||
BOOST_ASSERT(contracted_edge_list->(edge).source != contracted_edge_list->(edge).target);
|
||||
current_edge.target = (*contracted_edge_list)[edge].target;
|
||||
current_edge.data = (*contracted_edge_list)[edge].data;
|
||||
|
||||
// every target needs to be valid
|
||||
BOOST_ASSERT(current_edge.target < max_used_node_id);
|
||||
@ -249,12 +271,12 @@ int Prepare::Process(int argc, char *argv[])
|
||||
if (current_edge.data.distance <= 0)
|
||||
{
|
||||
SimpleLogger().Write(logWARNING) << "Edge: " << edge
|
||||
<< ",source: " << contracted_edge_list[edge].source
|
||||
<< ", target: " << contracted_edge_list[edge].target
|
||||
<< ",source: " << contracted_edge_list->at(edge).source
|
||||
<< ", target: " << contracted_edge_list->at(edge).target
|
||||
<< ", dist: " << current_edge.data.distance;
|
||||
|
||||
SimpleLogger().Write(logWARNING) << "Failed at adjacency list of node "
|
||||
<< contracted_edge_list[edge].source << "/"
|
||||
<< contracted_edge_list->at(edge).source << "/"
|
||||
<< node_array.size() - 1;
|
||||
return 1;
|
||||
}
|
||||
@ -264,24 +286,8 @@ int Prepare::Process(int argc, char *argv[])
|
||||
|
||||
++number_of_used_edges;
|
||||
}
|
||||
hsgr_output_stream.close();
|
||||
|
||||
TIMER_STOP(preparing);
|
||||
|
||||
SimpleLogger().Write() << "Preprocessing : " << TIMER_SEC(preparing) << " seconds";
|
||||
SimpleLogger().Write() << "Expansion : " << (number_of_node_based_nodes / TIMER_SEC(expansion))
|
||||
<< " nodes/sec and "
|
||||
<< (number_of_edge_based_nodes / TIMER_SEC(expansion)) << " edges/sec";
|
||||
|
||||
SimpleLogger().Write() << "Contraction: "
|
||||
<< (number_of_edge_based_nodes / TIMER_SEC(contraction))
|
||||
<< " nodes/sec and " << number_of_used_edges / TIMER_SEC(contraction)
|
||||
<< " edges/sec";
|
||||
|
||||
node_array.clear();
|
||||
SimpleLogger().Write() << "finished preprocessing";
|
||||
|
||||
return 0;
|
||||
return number_of_used_edges;
|
||||
}
|
||||
|
||||
unsigned Prepare::CalculateEdgeChecksum(std::unique_ptr<std::vector<EdgeBasedNode>> node_based_edge_list)
|
||||
|
@ -66,6 +66,9 @@ class Prepare
|
||||
void ContractGraph(const std::size_t number_of_edge_based_nodes,
|
||||
DeallocatingVector<EdgeBasedEdge>& edge_based_edge_list,
|
||||
DeallocatingVector<QueryEdge>& contracted_edge_list);
|
||||
std::size_t WriteContractedGraph(unsigned number_of_edge_based_nodes,
|
||||
std::unique_ptr<std::vector<EdgeBasedNode>> node_based_edge_list,
|
||||
std::unique_ptr<DeallocatingVector<QueryEdge>> contracted_edge_list);
|
||||
std::shared_ptr<NodeBasedDynamicGraph> LoadNodeBasedGraph(std::vector<NodeID> &barrier_node_list,
|
||||
std::vector<NodeID> &traffic_light_list,
|
||||
RestrictionMap &restriction_map,
|
||||
|
Loading…
Reference in New Issue
Block a user