Return the correct size
This commit is contained in:
parent
021a1c7a39
commit
922e8a4912
@ -77,6 +77,11 @@ void EdgeBasedGraphFactory::GetEdgeBasedNodes(std::vector<EdgeBasedNode> &nodes)
|
||||
nodes.swap(m_edge_based_node_list);
|
||||
}
|
||||
|
||||
unsigned EdgeBasedGraphFactory::GetHighestEdgeID()
|
||||
{
|
||||
return m_max_edge_id;
|
||||
}
|
||||
|
||||
void EdgeBasedGraphFactory::InsertEdgeBasedNode(const NodeID node_u,
|
||||
const NodeID node_v,
|
||||
const unsigned component_id)
|
||||
@ -223,7 +228,7 @@ void EdgeBasedGraphFactory::Run(const std::string &original_edge_data_filename,
|
||||
lua_State *lua_state)
|
||||
{
|
||||
TIMER_START(renumber);
|
||||
RenumberEdges();
|
||||
m_max_edge_id = RenumberEdges() - 1;
|
||||
TIMER_STOP(renumber);
|
||||
|
||||
TIMER_START(generate_nodes);
|
||||
@ -243,7 +248,8 @@ void EdgeBasedGraphFactory::Run(const std::string &original_edge_data_filename,
|
||||
|
||||
/// Renumbers all _forward_ edges and sets the edge_id.
|
||||
/// A specific numbering is not important. Any unique ID will do.
|
||||
void EdgeBasedGraphFactory::RenumberEdges()
|
||||
/// Returns the number of edge based nodes.
|
||||
unsigned EdgeBasedGraphFactory::RenumberEdges()
|
||||
{
|
||||
// renumber edge based node of outgoing edges
|
||||
unsigned numbered_edges_count = 0;
|
||||
@ -266,6 +272,8 @@ void EdgeBasedGraphFactory::RenumberEdges()
|
||||
BOOST_ASSERT(SPECIAL_NODEID != edge_data.edge_id);
|
||||
}
|
||||
}
|
||||
|
||||
return numbered_edges_count;
|
||||
}
|
||||
|
||||
/// Creates the nodes in the edge expanded graph from edges in the node-based graph.
|
||||
|
@ -74,6 +74,8 @@ class EdgeBasedGraphFactory
|
||||
|
||||
void GetEdgeBasedNodes(std::vector<EdgeBasedNode> &nodes);
|
||||
|
||||
unsigned GetHighestEdgeID();
|
||||
|
||||
TurnInstruction AnalyzeTurn(const NodeID u, const NodeID v, const NodeID w, const double angle) const;
|
||||
|
||||
int GetTurnPenalty(double angle, lua_State *lua_state) const;
|
||||
@ -83,6 +85,7 @@ class EdgeBasedGraphFactory
|
||||
|
||||
std::vector<EdgeBasedNode> m_edge_based_node_list;
|
||||
DeallocatingVector<EdgeBasedEdge> m_edge_based_edge_list;
|
||||
unsigned m_max_edge_id;
|
||||
|
||||
const std::vector<QueryNode>& m_node_info_list;
|
||||
std::shared_ptr<NodeBasedDynamicGraph> m_node_based_graph;
|
||||
@ -95,7 +98,7 @@ class EdgeBasedGraphFactory
|
||||
SpeedProfileProperties speed_profile;
|
||||
|
||||
void CompressGeometry();
|
||||
void RenumberEdges();
|
||||
unsigned RenumberEdges();
|
||||
void GenerateEdgeExpandedNodes();
|
||||
void GenerateEdgeExpandedEdges(const std::string &original_edge_data_filename,
|
||||
lua_State *lua_state);
|
||||
|
@ -87,7 +87,7 @@ int Prepare::Run()
|
||||
*node_based_edge_list, edge_based_edge_list);
|
||||
|
||||
auto number_of_node_based_nodes = graph_size.first;
|
||||
auto number_of_edge_based_nodes = graph_size.second;
|
||||
auto max_edge_id = graph_size.second;
|
||||
|
||||
TIMER_STOP(expansion);
|
||||
|
||||
@ -105,12 +105,12 @@ int Prepare::Run()
|
||||
|
||||
TIMER_START(contraction);
|
||||
auto contracted_edge_list = osrm::make_unique<DeallocatingVector<QueryEdge>>();
|
||||
ContractGraph(number_of_edge_based_nodes, edge_based_edge_list, *contracted_edge_list);
|
||||
ContractGraph(max_edge_id, edge_based_edge_list, *contracted_edge_list);
|
||||
TIMER_STOP(contraction);
|
||||
|
||||
SimpleLogger().Write() << "Contraction took " << TIMER_SEC(contraction) << " sec";
|
||||
|
||||
std::size_t number_of_used_edges = WriteContractedGraph(number_of_edge_based_nodes,
|
||||
std::size_t number_of_used_edges = WriteContractedGraph(max_edge_id,
|
||||
std::move(node_based_edge_list),
|
||||
std::move(contracted_edge_list));
|
||||
|
||||
@ -119,10 +119,10 @@ int Prepare::Run()
|
||||
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";
|
||||
<< ((max_edge_id+1) / TIMER_SEC(expansion)) << " edges/sec";
|
||||
|
||||
SimpleLogger().Write() << "Contraction: "
|
||||
<< (number_of_edge_based_nodes / TIMER_SEC(contraction))
|
||||
<< ((max_edge_id+1) / TIMER_SEC(contraction))
|
||||
<< " nodes/sec and " << number_of_used_edges / TIMER_SEC(contraction)
|
||||
<< " edges/sec";
|
||||
|
||||
@ -131,7 +131,7 @@ int Prepare::Run()
|
||||
return 0;
|
||||
}
|
||||
|
||||
std::size_t Prepare::WriteContractedGraph(unsigned number_of_edge_based_nodes,
|
||||
std::size_t Prepare::WriteContractedGraph(unsigned max_node_id,
|
||||
std::unique_ptr<std::vector<EdgeBasedNode>> node_based_edge_list,
|
||||
std::unique_ptr<DeallocatingVector<QueryEdge>> contracted_edge_list)
|
||||
{
|
||||
@ -146,7 +146,7 @@ std::size_t Prepare::WriteContractedGraph(unsigned number_of_edge_based_nodes,
|
||||
const FingerPrint fingerprint = FingerPrint::GetValid();
|
||||
boost::filesystem::ofstream hsgr_output_stream(config.graph_output_path, std::ios::binary);
|
||||
hsgr_output_stream.write((char *)&fingerprint, sizeof(FingerPrint));
|
||||
const unsigned max_used_node_id = 1 + [&contracted_edge_list]
|
||||
const unsigned max_used_node_id = [&contracted_edge_list]
|
||||
{
|
||||
unsigned tmp_max = 0;
|
||||
for (const QueryEdge &edge : *contracted_edge_list)
|
||||
@ -159,11 +159,12 @@ std::size_t Prepare::WriteContractedGraph(unsigned number_of_edge_based_nodes,
|
||||
return tmp_max;
|
||||
}();
|
||||
|
||||
SimpleLogger().Write(logDEBUG) << "input graph has " << number_of_edge_based_nodes << " nodes";
|
||||
SimpleLogger().Write(logDEBUG) << "contracted graph has " << max_used_node_id << " nodes";
|
||||
SimpleLogger().Write(logDEBUG) << "input graph has " << (max_node_id+1) << " nodes";
|
||||
SimpleLogger().Write(logDEBUG) << "contracted graph has " << (max_used_node_id+1) << " nodes";
|
||||
|
||||
std::vector<StaticGraph<EdgeData>::NodeArrayEntry> node_array;
|
||||
node_array.resize(number_of_edge_based_nodes + 1);
|
||||
// make sure we have at least one sentinel
|
||||
node_array.resize(max_node_id + 2);
|
||||
|
||||
SimpleLogger().Write() << "Building node array";
|
||||
StaticGraph<EdgeData>::EdgeIterator edge = 0;
|
||||
@ -171,7 +172,7 @@ std::size_t Prepare::WriteContractedGraph(unsigned number_of_edge_based_nodes,
|
||||
StaticGraph<EdgeData>::EdgeIterator last_edge = edge;
|
||||
|
||||
// initializing 'first_edge'-field of nodes:
|
||||
for (const auto node : osrm::irange(0u, max_used_node_id))
|
||||
for (const auto node : osrm::irange(0u, max_used_node_id+1))
|
||||
{
|
||||
last_edge = edge;
|
||||
while ((edge < contracted_edge_count) && ((*contracted_edge_list)[edge].source == node))
|
||||
@ -182,7 +183,7 @@ std::size_t Prepare::WriteContractedGraph(unsigned number_of_edge_based_nodes,
|
||||
position += edge - last_edge; // remove
|
||||
}
|
||||
|
||||
for (const auto sentinel_counter : osrm::irange<unsigned>(max_used_node_id, node_array.size()))
|
||||
for (const auto sentinel_counter : osrm::irange<unsigned>(max_used_node_id+1, node_array.size()))
|
||||
{
|
||||
// sentinel element, guarded against underflow
|
||||
node_array[sentinel_counter].first_edge = contracted_edge_count;
|
||||
@ -218,7 +219,7 @@ std::size_t Prepare::WriteContractedGraph(unsigned number_of_edge_based_nodes,
|
||||
current_edge.data = (*contracted_edge_list)[edge].data;
|
||||
|
||||
// every target needs to be valid
|
||||
BOOST_ASSERT(current_edge.target < max_used_node_id);
|
||||
BOOST_ASSERT(current_edge.target <= max_used_node_id);
|
||||
#ifndef NDEBUG
|
||||
if (current_edge.data.distance <= 0)
|
||||
{
|
||||
@ -399,19 +400,20 @@ Prepare::BuildEdgeExpandedGraph(std::vector<QueryNode> &internal_to_external_nod
|
||||
|
||||
edge_based_graph_factory.GetEdgeBasedEdges(edge_based_edge_list);
|
||||
edge_based_graph_factory.GetEdgeBasedNodes(node_based_edge_list);
|
||||
auto max_edge_id = edge_based_graph_factory.GetHighestEdgeID();
|
||||
|
||||
const std::size_t number_of_node_based_nodes = node_based_graph->GetNumberOfNodes();
|
||||
return std::make_pair(number_of_node_based_nodes, node_based_edge_list.size());
|
||||
return std::make_pair(number_of_node_based_nodes, max_edge_id);
|
||||
}
|
||||
|
||||
/**
|
||||
\brief Build contracted graph.
|
||||
*/
|
||||
void Prepare::ContractGraph(const std::size_t number_of_edge_based_nodes,
|
||||
void Prepare::ContractGraph(const unsigned max_edge_id,
|
||||
DeallocatingVector<EdgeBasedEdge>& edge_based_edge_list,
|
||||
DeallocatingVector<QueryEdge>& contracted_edge_list)
|
||||
{
|
||||
Contractor contractor(number_of_edge_based_nodes, edge_based_edge_list);
|
||||
Contractor contractor(max_edge_id + 1, edge_based_edge_list);
|
||||
contractor.Run();
|
||||
contractor.GetEdges(contracted_edge_list);
|
||||
}
|
||||
|
@ -62,7 +62,7 @@ class Prepare
|
||||
void SetupScriptingEnvironment(lua_State *myLuaState,
|
||||
SpeedProfileProperties &speed_profile);
|
||||
unsigned CalculateEdgeChecksum(std::unique_ptr<std::vector<EdgeBasedNode>> node_based_edge_list);
|
||||
void ContractGraph(const std::size_t number_of_edge_based_nodes,
|
||||
void ContractGraph(const unsigned max_edge_id,
|
||||
DeallocatingVector<EdgeBasedEdge>& edge_based_edge_list,
|
||||
DeallocatingVector<QueryEdge>& contracted_edge_list);
|
||||
std::size_t WriteContractedGraph(unsigned number_of_edge_based_nodes,
|
||||
|
Loading…
Reference in New Issue
Block a user