Split EBGF::Run into smaller sub-functions
I'm not too happy with this yet. It is not really clear cut. Also, I would like to move the logging in ::Run, seems messy in the sub-functions.
This commit is contained in:
parent
5a13c6cc3f
commit
3ef054bbac
@ -279,6 +279,21 @@ void EdgeBasedGraphFactory::Run(
|
|||||||
const std::string & geometry_filename,
|
const std::string & geometry_filename,
|
||||||
lua_State *lua_state
|
lua_State *lua_state
|
||||||
) {
|
) {
|
||||||
|
|
||||||
|
CompressGeometry();
|
||||||
|
|
||||||
|
RenumberEdges();
|
||||||
|
|
||||||
|
GenerateEdgeExpandedNodes();
|
||||||
|
|
||||||
|
GenerateEdgeExpandedEdges(original_edge_data_filename, lua_state);
|
||||||
|
|
||||||
|
m_geometry_compressor.SerializeInternalVector( geometry_filename );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void EdgeBasedGraphFactory::CompressGeometry()
|
||||||
|
{
|
||||||
SimpleLogger().Write() << "Removing graph geometry while preserving topology";
|
SimpleLogger().Write() << "Removing graph geometry while preserving topology";
|
||||||
|
|
||||||
const unsigned original_number_of_nodes = m_node_based_graph->GetNumberOfNodes();
|
const unsigned original_number_of_nodes = m_node_based_graph->GetNumberOfNodes();
|
||||||
@ -417,7 +432,13 @@ void EdgeBasedGraphFactory::Run(
|
|||||||
SimpleLogger().Write() << "new nodes: " << new_node_count << ", edges " << new_edge_count;
|
SimpleLogger().Write() << "new nodes: " << new_node_count << ", edges " << new_edge_count;
|
||||||
SimpleLogger().Write() << "Node compression ratio: " << new_node_count/(double)original_number_of_nodes;
|
SimpleLogger().Write() << "Node compression ratio: " << new_node_count/(double)original_number_of_nodes;
|
||||||
SimpleLogger().Write() << "Edge compression ratio: " << new_edge_count/(double)original_number_of_edges;
|
SimpleLogger().Write() << "Edge compression ratio: " << new_edge_count/(double)original_number_of_edges;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes the id of the edge in the edge expanded graph (into the egde in the node based graph)
|
||||||
|
*/
|
||||||
|
void EdgeBasedGraphFactory::RenumberEdges()
|
||||||
|
{
|
||||||
// renumber edge based node IDs
|
// renumber edge based node IDs
|
||||||
unsigned numbered_edges_count = 0;
|
unsigned numbered_edges_count = 0;
|
||||||
for(NodeID current_node = 0; current_node < m_node_based_graph->GetNumberOfNodes(); ++current_node) {
|
for(NodeID current_node = 0; current_node < m_node_based_graph->GetNumberOfNodes(); ++current_node) {
|
||||||
@ -435,37 +456,30 @@ void EdgeBasedGraphFactory::Run(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned node_based_edge_counter = 0;
|
m_number_of_edge_based_nodes = numbered_edges_count;
|
||||||
unsigned original_edges_counter = 0;
|
}
|
||||||
|
|
||||||
std::ofstream edge_data_file(
|
|
||||||
original_edge_data_filename.c_str(),
|
|
||||||
std::ios::binary
|
|
||||||
);
|
|
||||||
|
|
||||||
//writes a dummy value that is updated later
|
|
||||||
edge_data_file.write(
|
|
||||||
(char*)&original_edges_counter,
|
|
||||||
sizeof(unsigned)
|
|
||||||
);
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates the nodes in the edge expanded graph from edges in the node-based graph.
|
||||||
|
*/
|
||||||
|
void EdgeBasedGraphFactory::GenerateEdgeExpandedNodes()
|
||||||
|
{
|
||||||
SimpleLogger().Write() << "Identifying components of the road network";
|
SimpleLogger().Write() << "Identifying components of the road network";
|
||||||
|
|
||||||
//Run a BFS on the undirected graph and identify small components
|
//Run a BFS on the undirected graph and identify small components
|
||||||
//TODO move this to a sub function, so we can just use scoping
|
BFSComponentExplorer<NodeBasedDynamicGraph> component_explorer(
|
||||||
auto component_explorer = new BFSComponentExplorer<NodeBasedDynamicGraph>(
|
|
||||||
*m_node_based_graph,
|
*m_node_based_graph,
|
||||||
*m_restriction_map,
|
*m_restriction_map,
|
||||||
m_barrier_nodes
|
m_barrier_nodes
|
||||||
);
|
);
|
||||||
|
|
||||||
component_explorer->run();
|
component_explorer.run();
|
||||||
|
|
||||||
SimpleLogger().Write() <<
|
SimpleLogger().Write() <<
|
||||||
"identified: " << component_explorer->getNumberOfComponents() << " many components";
|
"identified: " << component_explorer.getNumberOfComponents() << " many components";
|
||||||
SimpleLogger().Write() << "generating edge-expanded nodes";
|
SimpleLogger().Write() << "generating edge-expanded nodes";
|
||||||
|
|
||||||
p.reinit(m_node_based_graph->GetNumberOfNodes());
|
Percent p(m_node_based_graph->GetNumberOfNodes());
|
||||||
|
|
||||||
//loop over all edges and generate new set of nodes
|
//loop over all edges and generate new set of nodes
|
||||||
for(
|
for(
|
||||||
@ -501,8 +515,8 @@ void EdgeBasedGraphFactory::Run(
|
|||||||
//Note: edges that end on barrier nodes or on a turn restriction
|
//Note: edges that end on barrier nodes or on a turn restriction
|
||||||
//may actually be in two distinct components. We choose the smallest
|
//may actually be in two distinct components. We choose the smallest
|
||||||
const unsigned size_of_component = std::min(
|
const unsigned size_of_component = std::min(
|
||||||
component_explorer->getComponentSize(u),
|
component_explorer.getComponentSize(u),
|
||||||
component_explorer->getComponentSize(v)
|
component_explorer.getComponentSize(v)
|
||||||
);
|
);
|
||||||
|
|
||||||
const bool component_is_tiny = ( size_of_component < 1000 );
|
const bool component_is_tiny = ( size_of_component < 1000 );
|
||||||
@ -510,15 +524,32 @@ void EdgeBasedGraphFactory::Run(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
delete component_explorer;
|
|
||||||
|
|
||||||
m_number_of_edge_based_nodes = numbered_edges_count;
|
|
||||||
|
|
||||||
SimpleLogger().Write() << "Generated " << m_edge_based_node_list.size() <<
|
SimpleLogger().Write() << "Generated " << m_edge_based_node_list.size() <<
|
||||||
" nodes in edge-expanded graph";
|
" nodes in edge-expanded graph";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Actually it also generates OriginalEdgeData and serializes them...
|
||||||
|
*/
|
||||||
|
void EdgeBasedGraphFactory::GenerateEdgeExpandedEdges(const std::string& original_edge_data_filename, lua_State* lua_state)
|
||||||
|
{
|
||||||
SimpleLogger().Write() << "generating edge-expanded edges";
|
SimpleLogger().Write() << "generating edge-expanded edges";
|
||||||
|
|
||||||
|
unsigned node_based_edge_counter = 0;
|
||||||
|
unsigned original_edges_counter = 0;
|
||||||
|
|
||||||
|
std::ofstream edge_data_file(
|
||||||
|
original_edge_data_filename.c_str(),
|
||||||
|
std::ios::binary
|
||||||
|
);
|
||||||
|
|
||||||
|
//writes a dummy value that is updated later
|
||||||
|
edge_data_file.write(
|
||||||
|
(char*)&original_edges_counter,
|
||||||
|
sizeof(unsigned)
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
std::vector<OriginalEdgeData> original_edge_data_vector;
|
std::vector<OriginalEdgeData> original_edge_data_vector;
|
||||||
original_edge_data_vector.reserve(1024*1024);
|
original_edge_data_vector.reserve(1024*1024);
|
||||||
|
|
||||||
@ -529,7 +560,9 @@ void EdgeBasedGraphFactory::Run(
|
|||||||
unsigned skipped_uturns_counter = 0;
|
unsigned skipped_uturns_counter = 0;
|
||||||
unsigned skipped_barrier_turns_counter = 0;
|
unsigned skipped_barrier_turns_counter = 0;
|
||||||
unsigned compressed = 0;
|
unsigned compressed = 0;
|
||||||
p.reinit(m_node_based_graph->GetNumberOfNodes());
|
|
||||||
|
Percent p(m_node_based_graph->GetNumberOfNodes());
|
||||||
|
|
||||||
for (NodeIterator u = 0, end = m_node_based_graph->GetNumberOfNodes(); u < end; ++u)
|
for (NodeIterator u = 0, end = m_node_based_graph->GetNumberOfNodes(); u < end; ++u)
|
||||||
{
|
{
|
||||||
for (EdgeIterator e1 = m_node_based_graph->BeginEdges(u), last_edge_u = m_node_based_graph->EndEdges(u); e1 < last_edge_u; ++e1)
|
for (EdgeIterator e1 = m_node_based_graph->BeginEdges(u), last_edge_u = m_node_based_graph->EndEdges(u); e1 < last_edge_u; ++e1)
|
||||||
@ -635,7 +668,7 @@ void EdgeBasedGraphFactory::Run(
|
|||||||
BOOST_ASSERT( SPECIAL_NODEID != edge_data1.edgeBasedNodeID );
|
BOOST_ASSERT( SPECIAL_NODEID != edge_data1.edgeBasedNodeID );
|
||||||
BOOST_ASSERT( SPECIAL_NODEID != edge_data2.edgeBasedNodeID );
|
BOOST_ASSERT( SPECIAL_NODEID != edge_data2.edgeBasedNodeID );
|
||||||
|
|
||||||
m_edge_based_edge_list.push_back(
|
m_edge_based_edge_list.emplace_back(
|
||||||
EdgeBasedEdge(
|
EdgeBasedEdge(
|
||||||
edge_data1.edgeBasedNodeID,
|
edge_data1.edgeBasedNodeID,
|
||||||
edge_data2.edgeBasedNodeID,
|
edge_data2.edgeBasedNodeID,
|
||||||
@ -655,8 +688,6 @@ void EdgeBasedGraphFactory::Run(
|
|||||||
edge_data_file.write( (char*)&original_edges_counter, sizeof(unsigned) );
|
edge_data_file.write( (char*)&original_edges_counter, sizeof(unsigned) );
|
||||||
edge_data_file.close();
|
edge_data_file.close();
|
||||||
|
|
||||||
m_geometry_compressor.SerializeInternalVector( geometry_filename );
|
|
||||||
|
|
||||||
SimpleLogger().Write() << "Generated " << m_edge_based_node_list.size() << " edge based nodes";
|
SimpleLogger().Write() << "Generated " << m_edge_based_node_list.size() << " edge based nodes";
|
||||||
SimpleLogger().Write() << "Node-based graph contains " << node_based_edge_counter << " edges";
|
SimpleLogger().Write() << "Node-based graph contains " << node_based_edge_counter << " edges";
|
||||||
SimpleLogger().Write() << "Edge-expanded graph ...";
|
SimpleLogger().Write() << "Edge-expanded graph ...";
|
||||||
@ -667,6 +698,7 @@ void EdgeBasedGraphFactory::Run(
|
|||||||
SimpleLogger().Write() << " skips " << skipped_barrier_turns_counter << " turns over barriers";
|
SimpleLogger().Write() << " skips " << skipped_barrier_turns_counter << " turns over barriers";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int EdgeBasedGraphFactory::GetTurnPenalty(
|
int EdgeBasedGraphFactory::GetTurnPenalty(
|
||||||
const NodeID u,
|
const NodeID u,
|
||||||
const NodeID v,
|
const NodeID v,
|
||||||
|
@ -127,16 +127,13 @@ private:
|
|||||||
|
|
||||||
GeometryCompressor m_geometry_compressor;
|
GeometryCompressor m_geometry_compressor;
|
||||||
|
|
||||||
NodeID CheckForEmanatingIsOnlyTurn(
|
void CompressGeometry();
|
||||||
const NodeID u,
|
void RenumberEdges();
|
||||||
const NodeID v
|
void GenerateEdgeExpandedNodes();
|
||||||
) const;
|
void GenerateEdgeExpandedEdges(
|
||||||
|
const std::string& original_edge_data_filename,
|
||||||
bool CheckIfTurnIsRestricted(
|
lua_State* lua_state
|
||||||
const NodeID u,
|
);
|
||||||
const NodeID v,
|
|
||||||
const NodeID w
|
|
||||||
) const;
|
|
||||||
|
|
||||||
void InsertEdgeBasedNode(
|
void InsertEdgeBasedNode(
|
||||||
NodeBasedDynamicGraph::NodeIterator u,
|
NodeBasedDynamicGraph::NodeIterator u,
|
||||||
@ -150,18 +147,6 @@ private:
|
|||||||
std::vector<OriginalEdgeData> & original_edge_data_vector
|
std::vector<OriginalEdgeData> & original_edge_data_vector
|
||||||
) const;
|
) const;
|
||||||
|
|
||||||
void FixupArrivingTurnRestriction(
|
|
||||||
const NodeID u,
|
|
||||||
const NodeID v,
|
|
||||||
const NodeID w
|
|
||||||
);
|
|
||||||
|
|
||||||
void FixupStartingTurnRestriction(
|
|
||||||
const NodeID u,
|
|
||||||
const NodeID v,
|
|
||||||
const NodeID w
|
|
||||||
);
|
|
||||||
|
|
||||||
unsigned max_id;
|
unsigned max_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user