add skeleton for geometry compression
This commit is contained in:
parent
da17e55657
commit
cb5931aaeb
@ -27,6 +27,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#include "EdgeBasedGraphFactory.h"
|
||||
|
||||
//TODO: CompressionWorker
|
||||
//TODO: EdgeBasedEdgeGenerator
|
||||
|
||||
// template<class Work>
|
||||
// inline static void TraverseGraph(NodeBasedDynamicGraph & graph, Work & work) {
|
||||
|
||||
// }
|
||||
|
||||
EdgeBasedGraphFactory::EdgeBasedGraphFactory(
|
||||
int number_of_nodes,
|
||||
std::vector<ImportEdge> & input_edge_list,
|
||||
@ -35,10 +43,8 @@ EdgeBasedGraphFactory::EdgeBasedGraphFactory(
|
||||
std::vector<TurnRestriction> & input_restrictions_list,
|
||||
std::vector<NodeInfo> & m_node_info_list,
|
||||
SpeedProfileProperties speed_profile
|
||||
) : speed_profile(speed_profile),
|
||||
m_turn_restrictions_count(0),
|
||||
m_node_info_list(m_node_info_list)
|
||||
{
|
||||
) : speed_profile(speed_profile), m_node_info_list(m_node_info_list) {
|
||||
|
||||
BOOST_FOREACH(const TurnRestriction & restriction, input_restrictions_list) {
|
||||
std::pair<NodeID, NodeID> restriction_source =
|
||||
std::make_pair(restriction.fromNode, restriction.viaNode);
|
||||
@ -56,11 +62,11 @@ EdgeBasedGraphFactory::EdgeBasedGraphFactory(
|
||||
continue;
|
||||
} else if(restriction.flags.isOnly) {
|
||||
//We are going to insert an is_only_*-restriction. There can be only one.
|
||||
m_turn_restrictions_count -= m_restriction_bucket_list.at(index).size();
|
||||
stats.turn_restrictions_count -= m_restriction_bucket_list.at(index).size();
|
||||
m_restriction_bucket_list.at(index).clear();
|
||||
}
|
||||
}
|
||||
++m_turn_restrictions_count;
|
||||
++stats.turn_restrictions_count;
|
||||
m_restriction_bucket_list.at(index).push_back(
|
||||
std::make_pair( restriction.toNode, restriction.flags.isOnly)
|
||||
);
|
||||
@ -219,21 +225,73 @@ void EdgeBasedGraphFactory::Run(
|
||||
lua_State *lua_state
|
||||
) {
|
||||
SimpleLogger().Write() << "Compressing geometry of input graph";
|
||||
//TODO: iterate over all turns
|
||||
Percent p(m_node_based_graph->GetNumberOfNodes());
|
||||
// iterate over all turns
|
||||
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
|
||||
) {
|
||||
++stats.node_based_edge_counter;
|
||||
const NodeIterator v = m_node_based_graph->GetTarget(e1);
|
||||
const NodeID to_node_of_only_restriction = CheckForEmanatingIsOnlyTurn(u, v);
|
||||
const bool is_barrier_node = ( m_barrier_nodes.find(v) != m_barrier_nodes.end() );
|
||||
|
||||
//TODO: compress geometries
|
||||
for(
|
||||
EdgeIterator e2 = m_node_based_graph->BeginEdges(v),
|
||||
last_edge_v = m_node_based_graph->EndEdges(v);
|
||||
e2 < last_edge_v;
|
||||
++e2
|
||||
) {
|
||||
const NodeIterator w = m_node_based_graph->GetTarget(e2);
|
||||
if(
|
||||
to_node_of_only_restriction != UINT_MAX &&
|
||||
w != to_node_of_only_restriction
|
||||
) {
|
||||
//We are at an only_-restriction but not at the right turn.
|
||||
++stats.skipped_turns_counter;
|
||||
continue;
|
||||
}
|
||||
|
||||
//TODO: update turn restrictions if concerned by compression
|
||||
if( is_barrier_node && (u != w) ) {
|
||||
++stats.skipped_turns_counter;
|
||||
continue;
|
||||
}
|
||||
|
||||
//TODO: do some compression statistics
|
||||
if( (u == w) && (1 != m_node_based_graph->GetOutDegree(v)) ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
//only add an edge if turn is not a U-turn except when it is
|
||||
//at the end of a dead-end street
|
||||
if (
|
||||
CheckIfTurnIsRestricted(u, v, w) &&
|
||||
(to_node_of_only_restriction == UINT_MAX) &&
|
||||
(w != to_node_of_only_restriction)
|
||||
) {
|
||||
++stats.skipped_turns_counter;
|
||||
continue;
|
||||
}
|
||||
|
||||
//TODO: compress geometries, edgedata is congruent
|
||||
|
||||
//TODO: update turn restrictions if concerned by compression
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//TODO: print compression statistics
|
||||
|
||||
|
||||
SimpleLogger().Write() << "Identifying components of the road network";
|
||||
|
||||
unsigned skipped_turns_counter = 0;
|
||||
unsigned node_based_edge_counter = 0;
|
||||
unsigned original_edges_counter = 0;
|
||||
|
||||
std::ofstream edge_data_file(
|
||||
original_edge_data_filename,
|
||||
std::ios::binary
|
||||
@ -241,7 +299,7 @@ void EdgeBasedGraphFactory::Run(
|
||||
|
||||
//writes a dummy value that is updated later
|
||||
edge_data_file.write(
|
||||
(char*)&original_edges_counter,
|
||||
(char*)&stats.original_edges_counter,
|
||||
sizeof(unsigned)
|
||||
);
|
||||
|
||||
@ -255,7 +313,7 @@ void EdgeBasedGraphFactory::Run(
|
||||
SimpleLogger().Write() <<
|
||||
"generating edge-expanded nodes";
|
||||
|
||||
Percent p(m_node_based_graph->GetNumberOfNodes());
|
||||
p.reinit(m_node_based_graph->GetNumberOfNodes());
|
||||
//loop over all edges and generate new set of nodes.
|
||||
for(
|
||||
NodeIterator u = 0, end = m_node_based_graph->GetNumberOfNodes();
|
||||
@ -320,7 +378,7 @@ void EdgeBasedGraphFactory::Run(
|
||||
e1 < last_edge_u;
|
||||
++e1
|
||||
) {
|
||||
++node_based_edge_counter;
|
||||
++stats.node_based_edge_counter;
|
||||
const NodeIterator v = m_node_based_graph->GetTarget(e1);
|
||||
const NodeID to_node_of_only_restriction = CheckForEmanatingIsOnlyTurn(u, v);
|
||||
const bool is_barrier_node = ( m_barrier_nodes.find(v) != m_barrier_nodes.end() );
|
||||
@ -337,12 +395,12 @@ void EdgeBasedGraphFactory::Run(
|
||||
w != to_node_of_only_restriction
|
||||
) {
|
||||
//We are at an only_-restriction but not at the right turn.
|
||||
++skipped_turns_counter;
|
||||
++stats.skipped_turns_counter;
|
||||
continue;
|
||||
}
|
||||
|
||||
if( is_barrier_node && (u != w) ) {
|
||||
++skipped_turns_counter;
|
||||
++stats.skipped_turns_counter;
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -357,7 +415,7 @@ void EdgeBasedGraphFactory::Run(
|
||||
(to_node_of_only_restriction == UINT_MAX) &&
|
||||
(w != to_node_of_only_restriction)
|
||||
) {
|
||||
++skipped_turns_counter;
|
||||
++stats.skipped_turns_counter;
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -396,7 +454,7 @@ void EdgeBasedGraphFactory::Run(
|
||||
turnInstruction
|
||||
)
|
||||
);
|
||||
++original_edges_counter;
|
||||
++stats.original_edges_counter;
|
||||
|
||||
if(original_edge_data_vector.size() > 100000) {
|
||||
FlushVectorToStream(
|
||||
@ -422,20 +480,20 @@ void EdgeBasedGraphFactory::Run(
|
||||
FlushVectorToStream( edge_data_file, original_edge_data_vector );
|
||||
|
||||
edge_data_file.seekp( std::ios::beg );
|
||||
edge_data_file.write( (char*)&original_edges_counter, sizeof(unsigned) );
|
||||
edge_data_file.write( (char*)&stats.original_edges_counter, sizeof(unsigned) );
|
||||
edge_data_file.close();
|
||||
|
||||
SimpleLogger().Write() <<
|
||||
"Generated " << m_edge_based_node_list.size() << " edge based nodes";
|
||||
SimpleLogger().Write() <<
|
||||
"Node-based graph contains " << node_based_edge_counter << " edges";
|
||||
"Node-based graph contains " << stats.node_based_edge_counter << " edges";
|
||||
SimpleLogger().Write() <<
|
||||
"Edge-expanded graph ...";
|
||||
SimpleLogger().Write() <<
|
||||
" contains " << m_edge_based_edge_list.size() << " edges";
|
||||
SimpleLogger().Write() <<
|
||||
" skips " << skipped_turns_counter << " turns, "
|
||||
"defined by " << m_turn_restrictions_count << " restrictions";
|
||||
" skips " << stats.skipped_turns_counter << " turns, "
|
||||
"defined by " << stats.turn_restrictions_count << " restrictions";
|
||||
}
|
||||
|
||||
int EdgeBasedGraphFactory::GetTurnPenalty(
|
||||
|
@ -101,6 +101,20 @@ public:
|
||||
unsigned GetNumberOfNodes() const;
|
||||
|
||||
private:
|
||||
struct EdgeBasedFactorStatistics {
|
||||
EdgeBasedFactorStatistics() :
|
||||
turn_restrictions_count(0),
|
||||
skipped_turns_counter(0),
|
||||
node_based_edge_counter(0),
|
||||
original_edges_counter(0)
|
||||
{ }
|
||||
|
||||
unsigned turn_restrictions_count;
|
||||
unsigned skipped_turns_counter;
|
||||
unsigned node_based_edge_counter;
|
||||
unsigned original_edges_counter;
|
||||
} stats;
|
||||
|
||||
struct NodeBasedEdgeData {
|
||||
int distance;
|
||||
unsigned edgeBasedNodeID;
|
||||
@ -115,8 +129,6 @@ private:
|
||||
bool contraFlow:1;
|
||||
};
|
||||
|
||||
unsigned m_turn_restrictions_count;
|
||||
|
||||
typedef DynamicGraph<NodeBasedEdgeData> NodeBasedDynamicGraph;
|
||||
typedef NodeBasedDynamicGraph::InputEdge NodeBasedEdge;
|
||||
typedef NodeBasedDynamicGraph::NodeIterator NodeIterator;
|
||||
@ -137,6 +149,7 @@ private:
|
||||
boost::unordered_set<NodeID> m_traffic_lights;
|
||||
|
||||
RestrictionMap m_restriction_map;
|
||||
GeometryCompressor m_geometry_compressor;
|
||||
|
||||
NodeID CheckForEmanatingIsOnlyTurn(
|
||||
const NodeID u,
|
||||
|
Loading…
Reference in New Issue
Block a user