correctly unpacking the first segment
This commit is contained in:
parent
a0bddab169
commit
874c579f86
@ -299,53 +299,29 @@ void EdgeBasedGraphFactory::InsertEdgeBasedNode(
|
||||
// find forward edge id and
|
||||
// const EdgeID e1 = m_node_based_graph->FindEdge(u, v);
|
||||
|
||||
BOOST_ASSERT( e1 != std::numeric_limits<unsigned>::max() );
|
||||
BOOST_ASSERT( e1 != SPECIAL_EDGEID );
|
||||
const EdgeData & forward_data = m_node_based_graph->GetEdgeData(e1);
|
||||
if( forward_data.edgeBasedNodeID == std::numeric_limits<unsigned>::max() ) {
|
||||
for(EdgeIterator id = m_node_based_graph->BeginEdges(v); id < m_node_based_graph->EndEdges(v); ++id) {
|
||||
SimpleLogger().Write(logDEBUG) << " id: " << id << ", edge (" << v << "," << m_node_based_graph->GetTarget(id) << ")";
|
||||
}
|
||||
SimpleLogger().Write() << std::setprecision(6) << m_node_info_list[u].lat/COORDINATE_PRECISION << "," << m_node_info_list[u].lon/COORDINATE_PRECISION << " <-> " <<
|
||||
m_node_info_list[v].lat/COORDINATE_PRECISION << "," << m_node_info_list[v].lon/COORDINATE_PRECISION;
|
||||
}
|
||||
BOOST_ASSERT( forward_data.edgeBasedNodeID != std::numeric_limits<unsigned>::max() );
|
||||
// SimpleLogger().Write() << "e1: " << e1 << "u: " << u << ", v: " << v;
|
||||
|
||||
if( forward_data.ignore_in_grid ) {
|
||||
// SimpleLogger().Write(logDEBUG) << "skipped edge at " << m_node_info_list[u].lat << "," <<
|
||||
// m_node_info_list[u].lon << " - " <<
|
||||
// m_node_info_list[v].lat << "," <<
|
||||
// m_node_info_list[v].lon;
|
||||
return;
|
||||
}
|
||||
|
||||
BOOST_ASSERT( forward_data.forward );
|
||||
|
||||
// find reverse edge id and
|
||||
const EdgeID e2 = m_node_based_graph->FindEdge(v, u);
|
||||
|
||||
#ifndef NDEBUG
|
||||
if ( e2 == m_node_based_graph->EndEdges(v) ) {
|
||||
SimpleLogger().Write(logDEBUG) << "Did not find edge (" << v << "," << u << ")";
|
||||
SimpleLogger().Write(logWARNING) << "Did not find edge (" << v << "," << u << ")";
|
||||
}
|
||||
#endif
|
||||
BOOST_ASSERT( e2 != std::numeric_limits<unsigned>::max() );
|
||||
BOOST_ASSERT( e2 != SPECIAL_EDGEID );
|
||||
BOOST_ASSERT( e2 < m_node_based_graph->EndEdges(v) );
|
||||
const EdgeData & reverse_data = m_node_based_graph->GetEdgeData(e2);
|
||||
|
||||
// if( forward_data.forward == reverse_data.forward && forward_data.forward != forward_data.backward ) {
|
||||
// SimpleLogger().Write(logDEBUG) << "flags on edge (" << u << "," << v << "), e1: " << e1 << ", e2: " << e2;
|
||||
// SimpleLogger().Write(logDEBUG) << "fwd-fwd: " << (forward_data.forward ? "y" : "n");
|
||||
// SimpleLogger().Write(logDEBUG) << "fwd-rev: " << (forward_data.backward ? "y": "n");
|
||||
// SimpleLogger().Write(logDEBUG) << "rev-fwd: " << (reverse_data.forward ? "y" : "n");
|
||||
// SimpleLogger().Write(logDEBUG) << "rev-rev: " << (reverse_data.backward ? "y": "n");
|
||||
// SimpleLogger().Write(logDEBUG) << "outgoing edges to ";
|
||||
// for(EdgeIterator id = m_node_based_graph->BeginEdges(v); id < m_node_based_graph->EndEdges(v); ++id) {
|
||||
// SimpleLogger().Write(logDEBUG) << " id: " << id << ", edge (" << v << "," << m_node_based_graph->GetTarget(id) << ")";
|
||||
// }
|
||||
// BOOST_ASSERT( reverse_data.edgeBasedNodeID != std::numeric_limits<unsigned>::max() );
|
||||
// } else {
|
||||
// BOOST_ASSERT( reverse_data.edgeBasedNodeID == std::numeric_limits<unsigned>::max() );
|
||||
// }
|
||||
if(
|
||||
forward_data.edgeBasedNodeID == SPECIAL_NODEID &&
|
||||
reverse_data.edgeBasedNodeID == SPECIAL_NODEID
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
||||
BOOST_ASSERT( m_geometry_compressor.HasEntryForID(e1) == m_geometry_compressor.HasEntryForID(e2) );
|
||||
|
||||
if( m_geometry_compressor.HasEntryForID(e1) ) {
|
||||
BOOST_ASSERT( m_geometry_compressor.HasEntryForID(e2) );
|
||||
@ -356,70 +332,30 @@ void EdgeBasedGraphFactory::InsertEdgeBasedNode(
|
||||
BOOST_ASSERT( forward_geometry.size() == reverse_geometry.size() );
|
||||
BOOST_ASSERT( 0 != forward_geometry.size() );
|
||||
|
||||
int fwd_sum_of_weights = 0;
|
||||
NodeID fwd_start_node = u;
|
||||
// SimpleLogger().Write(logDEBUG) << "fwd node " << "weight" << "," << m_node_info_list[u].lat/COORDINATE_PRECISION << "," << m_node_info_list[u].lon/COORDINATE_PRECISION;
|
||||
// if( 1 == e1 ) {
|
||||
// SimpleLogger().Write(logDEBUG) << "fwd edge id: " << e1;
|
||||
// int fwd_sum_of_weights = 0;
|
||||
// NodeID fwd_start_node = u;
|
||||
// BOOST_FOREACH(const GeometryCompressor::CompressedNode & geometry_node, forward_geometry) {
|
||||
// const NodeID fwd_end_node = geometry_node.first;
|
||||
// const EdgeWeight fwd_weight = geometry_node.second;
|
||||
// fwd_sum_of_weights += fwd_weight;
|
||||
// fwd_start_node = fwd_end_node;
|
||||
// }
|
||||
BOOST_FOREACH(const GeometryCompressor::CompressedNode & geometry_node, forward_geometry) {
|
||||
const NodeID fwd_end_node = geometry_node.first;
|
||||
const EdgeWeight fwd_weight = geometry_node.second;
|
||||
|
||||
// SimpleLogger().Write(logDEBUG) << "fwd node " << geometry_node.first << "," << m_node_info_list[geometry_node.first].lat/COORDINATE_PRECISION << "," << m_node_info_list[geometry_node.first].lon/COORDINATE_PRECISION << ", w: " << geometry_node.second;
|
||||
fwd_sum_of_weights += fwd_weight;
|
||||
// if( 1 == e1 ) {
|
||||
// SimpleLogger().Write(logDEBUG) << "fwd-edge (" << fwd_start_node << "," << fwd_end_node << "), w: " << fwd_weight;
|
||||
// BOOST_ASSERT( forward_data.distance == fwd_sum_of_weights );
|
||||
|
||||
// int rev_sum_of_weights = 0;
|
||||
// NodeID rev_start_node = v;
|
||||
// BOOST_FOREACH(const GeometryCompressor::CompressedNode & geometry_node, reverse_geometry) {
|
||||
// const NodeID rev_end_node = geometry_node.first;
|
||||
// const EdgeWeight rev_weight = geometry_node.second;
|
||||
|
||||
// rev_sum_of_weights += rev_weight;
|
||||
// rev_start_node = rev_end_node;
|
||||
// }
|
||||
fwd_start_node = fwd_end_node;
|
||||
}
|
||||
// if( 1 == e1 ) {
|
||||
// SimpleLogger().Write(logDEBUG) << "fwd-edge (" << fwd_start_node << "," << v << "), w: " << (forward_data.distance - fwd_sum_of_weights);
|
||||
// }
|
||||
// SimpleLogger().Write(logDEBUG) << "fwd node " << "weight" << "," << m_node_info_list[v].lat/COORDINATE_PRECISION << "," << m_node_info_list[v].lon/COORDINATE_PRECISION;
|
||||
// SimpleLogger().Write(logDEBUG) << "rev node " << "weight" << "," << m_node_info_list[v].lat/COORDINATE_PRECISION << "," << m_node_info_list[v].lon/COORDINATE_PRECISION;
|
||||
// BOOST_FOREACH(const GeometryCompressor::CompressedNode geometry_node, reverse_geometry) {
|
||||
// SimpleLogger().Write(logDEBUG) << "rev node " << geometry_node.first << "," << m_node_info_list[geometry_node.first].lat/COORDINATE_PRECISION << "," << m_node_info_list[geometry_node.first].lon/COORDINATE_PRECISION;
|
||||
// }
|
||||
// SimpleLogger().Write(logDEBUG) << "rev node " << "weight" << "," << m_node_info_list[u].lat/COORDINATE_PRECISION << "," << m_node_info_list[u].lon/COORDINATE_PRECISION;
|
||||
|
||||
// if( 1 == e1 ) {
|
||||
// SimpleLogger().Write(logDEBUG) << "fwd sum of edge weights: " << fwd_sum_of_weights;
|
||||
// SimpleLogger().Write(logDEBUG) << "c'ted edge weight: " << forward_data.distance;
|
||||
// SimpleLogger().Write(logDEBUG) << "weight diff: " << (forward_data.distance - fwd_sum_of_weights);
|
||||
// }
|
||||
BOOST_ASSERT( forward_data.distance == fwd_sum_of_weights );
|
||||
// BOOST_ASSERT( reverse_data.distance == rev_sum_of_weights );
|
||||
|
||||
|
||||
int rev_sum_of_weights = 0;
|
||||
NodeID rev_start_node = v;
|
||||
// SimpleLogger().Write(logDEBUG) << "fwd node " << "weight" << "," << m_node_info_list[u].lat/COORDINATE_PRECISION << "," << m_node_info_list[u].lon/COORDINATE_PRECISION;
|
||||
BOOST_FOREACH(const GeometryCompressor::CompressedNode & geometry_node, reverse_geometry) {
|
||||
const NodeID rev_end_node = geometry_node.first;
|
||||
const EdgeWeight rev_weight = geometry_node.second;
|
||||
|
||||
// SimpleLogger().Write(logDEBUG) << "rev node " << geometry_node.first << "," << m_node_info_list[geometry_node.first].lat/COORDINATE_PRECISION << "," << m_node_info_list[geometry_node.first].lon/COORDINATE_PRECISION << ", w: " << geometry_node.second;
|
||||
rev_sum_of_weights += rev_weight;
|
||||
// if( 1 == e1 ) {
|
||||
// SimpleLogger().Write(logDEBUG) << "Edge (" << rev_start_node << "," << rev_end_node << "), w: " << rev_weight;
|
||||
// }
|
||||
rev_start_node = rev_end_node;
|
||||
}
|
||||
// if( 1 == e1 ) {
|
||||
// SimpleLogger().Write(logDEBUG) << "Edge (" << rev_start_node << "," << u << "), w: " << (reverse_data.distance - rev_sum_of_weights);
|
||||
|
||||
// SimpleLogger().Write(logDEBUG) << "rev sum of edge weights: " << rev_sum_of_weights;
|
||||
// SimpleLogger().Write(logDEBUG) << "c'ted edge weight: " << reverse_data.distance;
|
||||
// SimpleLogger().Write(logDEBUG) << "weight diff: " << (reverse_data.distance - rev_sum_of_weights);
|
||||
|
||||
BOOST_ASSERT( reverse_data.distance == rev_sum_of_weights );
|
||||
// // BOOST_ASSERT(false);
|
||||
// }
|
||||
// SimpleLogger().Write(logDEBUG) << "start " << m_node_info_list[u].lat << "," << m_node_info_list[u].lon;
|
||||
// SimpleLogger().Write(logDEBUG) << "target " << m_node_info_list[v].lat << "," << m_node_info_list[v].lon;
|
||||
// BOOST_ASSERT( false );
|
||||
|
||||
//TODO reconstruct bidirectional edge with individual weights and put each into the NN index
|
||||
// reconstruct bidirectional edge with individual weights and put each into the NN index
|
||||
|
||||
std::vector<int> forward_dist_prefix_sum( forward_geometry.size() );
|
||||
std::vector<int> reverse_dist_prefix_sum( reverse_geometry.size() );
|
||||
@ -431,7 +367,6 @@ void EdgeBasedGraphFactory::InsertEdgeBasedNode(
|
||||
temp_sum += forward_geometry[i].second;
|
||||
BOOST_ASSERT( forward_data.distance >= temp_sum );
|
||||
forward_dist_prefix_sum[i] = forward_data.distance - temp_sum;
|
||||
// SimpleLogger().Write(logDEBUG) << "[" << i << "]" << temp_sum << ", n: " << forward_geometry[i].first << ", loc: " << m_node_info_list[forward_geometry[i].first].lat/COORDINATE_PRECISION << "," << m_node_info_list[forward_geometry[i].first].lon/COORDINATE_PRECISION;
|
||||
}
|
||||
BOOST_ASSERT( forward_data.distance == temp_sum );
|
||||
temp_sum = 0;
|
||||
@ -439,7 +374,6 @@ void EdgeBasedGraphFactory::InsertEdgeBasedNode(
|
||||
temp_sum += reverse_geometry[i].second;
|
||||
BOOST_ASSERT( reverse_data.distance >= temp_sum );
|
||||
reverse_dist_prefix_sum[i] = reverse_data.distance - temp_sum;
|
||||
// SimpleLogger().Write(logDEBUG) << "[" << i << "]" << temp_sum << ", n: " << reverse_geometry[i].first << ", loc: " << m_node_info_list[reverse_geometry[i].first].lat/COORDINATE_PRECISION << "," << m_node_info_list[reverse_geometry[i].first].lon/COORDINATE_PRECISION;
|
||||
}
|
||||
BOOST_ASSERT( reverse_data.distance == temp_sum );
|
||||
|
||||
@ -453,11 +387,7 @@ void EdgeBasedGraphFactory::InsertEdgeBasedNode(
|
||||
BOOST_ASSERT( current_edge_start_coordinate_id == reverse_geometry[geometry_size-1-i].first );
|
||||
const NodeID current_edge_target_coordinate_id = forward_geometry[i].first;
|
||||
|
||||
// SimpleLogger().Write() << "adding edge (" << current_edge_start_coordinate_id << "," << forward_geometry[i].first << ") ";
|
||||
// SimpleLogger().Write() << "fwd w: " << forward_geometry[i].second << ", fwd o: " << forward_dist_prefix_sum[i];
|
||||
// SimpleLogger().Write() << "rev w: " << reverse_geometry[geometry_size-1-i].second << ", rev o: " << reverse_dist_prefix_sum[geometry_size-1-i];
|
||||
|
||||
//TODO: build edges
|
||||
// build edges
|
||||
m_edge_based_node_list.push_back(
|
||||
EdgeBasedNode(
|
||||
forward_data.edgeBasedNodeID,
|
||||
@ -471,7 +401,8 @@ void EdgeBasedGraphFactory::InsertEdgeBasedNode(
|
||||
reverse_dist_prefix_sum[geometry_size-1-i],
|
||||
i,
|
||||
geometry_size-1-i,
|
||||
belongs_to_tiny_cc
|
||||
belongs_to_tiny_cc,
|
||||
true
|
||||
)
|
||||
);
|
||||
current_edge_start_coordinate_id = current_edge_target_coordinate_id;
|
||||
@ -511,6 +442,11 @@ void EdgeBasedGraphFactory::InsertEdgeBasedNode(
|
||||
// BOOST_ASSERT( forward_data.forward == reverse_data.backward );
|
||||
// BOOST_ASSERT( reverse_data.forward == forward_data.backward );
|
||||
|
||||
BOOST_ASSERT(
|
||||
forward_data.edgeBasedNodeID != SPECIAL_NODEID ||
|
||||
reverse_data.edgeBasedNodeID != SPECIAL_NODEID
|
||||
);
|
||||
|
||||
//TODO: emplace_back with C++11
|
||||
m_edge_based_node_list.push_back(
|
||||
EdgeBasedNode(
|
||||
@ -525,7 +461,8 @@ void EdgeBasedGraphFactory::InsertEdgeBasedNode(
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
belongs_to_tiny_cc
|
||||
belongs_to_tiny_cc,
|
||||
false
|
||||
)
|
||||
);
|
||||
BOOST_ASSERT( !m_edge_based_node_list.back().IsCompressed() );
|
||||
@ -641,8 +578,6 @@ void EdgeBasedGraphFactory::Run(
|
||||
FixupStartingTurnRestriction( w, v, u );
|
||||
FixupArrivingTurnRestriction( w, v, u );
|
||||
|
||||
// const int reverse_weight2 = rev_edge_data2.distance;
|
||||
|
||||
// store compressed geometry in container
|
||||
m_geometry_compressor.CompressEdge(
|
||||
forward_e1,
|
||||
@ -686,7 +621,6 @@ void EdgeBasedGraphFactory::Run(
|
||||
for(EdgeIterator current_edge = m_node_based_graph->BeginEdges(current_node); current_edge < m_node_based_graph->EndEdges(current_node); ++current_edge) {
|
||||
EdgeData & edge_data = m_node_based_graph->GetEdgeData(current_edge);
|
||||
if( !edge_data.forward ) {
|
||||
// SimpleLogger().Write(logDEBUG) << "skipped edge (" << source << "," << target << ")=[" << current_edge_id << "]";
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -722,8 +656,7 @@ void EdgeBasedGraphFactory::Run(
|
||||
|
||||
SimpleLogger().Write() <<
|
||||
"identified: " << component_index_size.size() << " many components";
|
||||
SimpleLogger().Write() <<
|
||||
"generating edge-expanded nodes";
|
||||
SimpleLogger().Write() << "generating edge-expanded nodes";
|
||||
|
||||
p.reinit(m_node_based_graph->GetNumberOfNodes());
|
||||
|
||||
@ -737,22 +670,24 @@ void EdgeBasedGraphFactory::Run(
|
||||
BOOST_ASSERT( u < m_node_based_graph->GetNumberOfNodes() );
|
||||
p.printIncrement();
|
||||
for(
|
||||
EdgeIterator e1 = m_node_based_graph->BeginEdges(u),
|
||||
EdgeID e1 = m_node_based_graph->BeginEdges(u),
|
||||
last_edge = m_node_based_graph->EndEdges(u);
|
||||
e1 < last_edge;
|
||||
++e1
|
||||
) {
|
||||
const EdgeData & edge_data = m_node_based_graph->GetEdgeData(e1);
|
||||
if( edge_data.edgeBasedNodeID == std::numeric_limits<unsigned>::max() ) {
|
||||
continue;
|
||||
if( edge_data.edgeBasedNodeID == SPECIAL_NODEID ) {
|
||||
// continue;
|
||||
}
|
||||
BOOST_ASSERT( e1 != std::numeric_limits<unsigned>::max() );
|
||||
NodeIterator v = m_node_based_graph->GetTarget(e1);
|
||||
BOOST_ASSERT( std::numeric_limits<unsigned>::max() != v );
|
||||
BOOST_ASSERT( e1 != SPECIAL_EDGEID );
|
||||
const NodeID v = m_node_based_graph->GetTarget(e1);
|
||||
|
||||
BOOST_ASSERT( SPECIAL_NODEID != v );
|
||||
// pick only every other edge
|
||||
if( u > v ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// BOOST_ASSERT( u < v );
|
||||
BOOST_ASSERT( edge_data.type != SHRT_MAX );
|
||||
|
||||
@ -764,40 +699,10 @@ void EdgeBasedGraphFactory::Run(
|
||||
);
|
||||
|
||||
const bool component_is_tiny = ( size_of_component < 1000 );
|
||||
|
||||
InsertEdgeBasedNode( u, v, e1, component_is_tiny );
|
||||
}
|
||||
}
|
||||
|
||||
// for(
|
||||
// NodeIterator u = 0, end = m_node_based_graph->GetNumberOfNodes();
|
||||
// u < end;
|
||||
// ++u
|
||||
// ) {
|
||||
// BOOST_ASSERT( u != std::numeric_limits<unsigned>::max() );
|
||||
// BOOST_ASSERT( u < m_node_based_graph->GetNumberOfNodes() );
|
||||
// p.printIncrement();
|
||||
// for(
|
||||
// EdgeIterator e1 = m_node_based_graph->BeginEdges(u),
|
||||
// last_edge = m_node_based_graph->EndEdges(u);
|
||||
// e1 < last_edge;
|
||||
// ++e1
|
||||
// ) {
|
||||
// BOOST_ASSERT( e1 != std::numeric_limits<unsigned>::max() );
|
||||
// NodeIterator v = m_node_based_graph->GetTarget(e1);
|
||||
|
||||
// EdgeIterator e2 = m_node_based_graph->FindEdge(u, v);
|
||||
// BOOST_ASSERT( e2 != m_node_based_graph->EndEdges(v) );
|
||||
// BOOST_ASSERT( e1 == e2 );
|
||||
|
||||
// const EdgeData & data = m_node_based_graph->GetEdgeData(e1);
|
||||
// if( data.forward ) {
|
||||
// BOOST_ASSERT( data.edgeBasedNodeID != std::numeric_limits<unsigned>::max() );
|
||||
// }
|
||||
|
||||
// }
|
||||
// }
|
||||
|
||||
m_number_of_edge_based_nodes = numbered_edges_count;
|
||||
|
||||
SimpleLogger().Write() << "Generated " << m_edge_based_node_list.size() <<
|
||||
@ -855,8 +760,9 @@ void EdgeBasedGraphFactory::Run(
|
||||
continue;
|
||||
}
|
||||
const NodeIterator w = m_node_based_graph->GetTarget(e2);
|
||||
|
||||
if(
|
||||
to_node_of_only_restriction != std::numeric_limits<unsigned>::max() &&
|
||||
to_node_of_only_restriction != SPECIAL_NODEID &&
|
||||
w != to_node_of_only_restriction
|
||||
) {
|
||||
//We are at an only_-restriction but not at the right turn.
|
||||
@ -880,7 +786,7 @@ void EdgeBasedGraphFactory::Run(
|
||||
//at the end of a dead-end street
|
||||
if (
|
||||
CheckIfTurnIsRestricted(u, v, w) &&
|
||||
(to_node_of_only_restriction == std::numeric_limits<unsigned>::max()) &&
|
||||
(to_node_of_only_restriction == SPECIAL_NODEID) &&
|
||||
(w != to_node_of_only_restriction)
|
||||
) {
|
||||
++restricted_turns_counter;
|
||||
@ -916,12 +822,9 @@ void EdgeBasedGraphFactory::Run(
|
||||
distance += turn_penalty;
|
||||
|
||||
const bool edge_is_compressed = m_geometry_compressor.HasEntryForID(e1);
|
||||
|
||||
if(edge_is_compressed) {
|
||||
++compressed;
|
||||
// m_geometry_compressor.AddLastViaNodeIDToCompressedEdge(e1, v, /*TODO*/ 1);
|
||||
if ( 0 == m_geometry_compressor.GetPositionForID(e1) ) {
|
||||
SimpleLogger().Write(logDEBUG) << "e1: " << e1 << " is zero with via node: " << v;
|
||||
}
|
||||
}
|
||||
|
||||
original_edge_data_vector.push_back(
|
||||
@ -932,6 +835,7 @@ void EdgeBasedGraphFactory::Run(
|
||||
edge_is_compressed
|
||||
)
|
||||
);
|
||||
|
||||
++original_edges_counter;
|
||||
|
||||
if(original_edge_data_vector.size() > 100000) {
|
||||
@ -941,6 +845,9 @@ void EdgeBasedGraphFactory::Run(
|
||||
);
|
||||
}
|
||||
|
||||
BOOST_ASSERT( SPECIAL_NODEID != edge_data1.edgeBasedNodeID );
|
||||
BOOST_ASSERT( SPECIAL_NODEID != edge_data2.edgeBasedNodeID );
|
||||
|
||||
m_edge_based_edge_list.push_back(
|
||||
EdgeBasedEdge(
|
||||
edge_data1.edgeBasedNodeID,
|
||||
|
@ -166,10 +166,6 @@ void GeometryCompressor::CompressEdge(
|
||||
|
||||
std::vector<CompressedNode> & edge_bucket_list1 = m_compressed_geometries[edge_bucket_id1];
|
||||
|
||||
if( 0 == edge_id_1 ) {
|
||||
SimpleLogger().Write(logDEBUG) << "adding via " << via_node_id << ", w: " << weight1;
|
||||
}
|
||||
|
||||
if( edge_bucket_list1.empty() ) {
|
||||
edge_bucket_list1.push_back( std::make_pair(via_node_id, weight1) );
|
||||
}
|
||||
@ -183,12 +179,6 @@ void GeometryCompressor::CompressEdge(
|
||||
BOOST_ASSERT( list_to_remove_index < m_compressed_geometries.size() );
|
||||
|
||||
std::vector<CompressedNode> & edge_bucket_list2 = m_compressed_geometries[list_to_remove_index];
|
||||
if( 0 == edge_id_1 ) {
|
||||
SimpleLogger().Write(logDEBUG) << "appending to list: ";
|
||||
BOOST_FOREACH(const CompressedNode & node, edge_bucket_list2) {
|
||||
SimpleLogger().Write(logDEBUG) << "adding via " << node.first << ", w: " << node.second;
|
||||
}
|
||||
}
|
||||
|
||||
// found an existing list, append it to the list of edge_id_1
|
||||
edge_bucket_list1.insert(
|
||||
|
@ -174,5 +174,5 @@ void FixedPointCoordinate::convertInternalReversedCoordinateToString(
|
||||
}
|
||||
|
||||
void FixedPointCoordinate::Output(std::ostream & out) const {//, FixedPointCoordinate & c) {
|
||||
out << "(" << lat << "," << lon << ")";
|
||||
out << "(" << lat/COORDINATE_PRECISION << "," << lon/COORDINATE_PRECISION << ")";
|
||||
}
|
||||
|
@ -23,11 +23,12 @@ struct EdgeBasedNode {
|
||||
forward_offset(0),
|
||||
reverse_offset(0),
|
||||
fwd_segment_position( std::numeric_limits<unsigned short>::max() ),
|
||||
rev_segment_position( std::numeric_limits<unsigned short>::max() >> 1 ),
|
||||
belongsToTinyComponent(false)
|
||||
rev_segment_position( std::numeric_limits<unsigned short>::max() >> 2 ),
|
||||
belongsToTinyComponent(false),
|
||||
is_compressed(false)
|
||||
{ }
|
||||
|
||||
EdgeBasedNode(
|
||||
explicit EdgeBasedNode(
|
||||
NodeID forward_edge_based_node_id,
|
||||
NodeID reverse_edge_based_node_id,
|
||||
NodeID u,
|
||||
@ -39,7 +40,8 @@ struct EdgeBasedNode {
|
||||
int reverse_offset,
|
||||
unsigned short fwd_segment_position,
|
||||
unsigned short rev_segment_position,
|
||||
bool belongsToTinyComponent
|
||||
bool belongsToTinyComponent,
|
||||
bool is_compressed
|
||||
) :
|
||||
forward_edge_based_node_id(forward_edge_based_node_id),
|
||||
reverse_edge_based_node_id(reverse_edge_based_node_id),
|
||||
@ -52,10 +54,23 @@ struct EdgeBasedNode {
|
||||
reverse_offset(reverse_offset),
|
||||
fwd_segment_position(fwd_segment_position),
|
||||
rev_segment_position(rev_segment_position),
|
||||
belongsToTinyComponent(belongsToTinyComponent)
|
||||
{ }
|
||||
// Computes:
|
||||
// - the distance from the given query location to nearest point on this edge (and returns it)
|
||||
belongsToTinyComponent(belongsToTinyComponent),
|
||||
is_compressed(is_compressed)
|
||||
{
|
||||
BOOST_ASSERT(
|
||||
( forward_edge_based_node_id != SPECIAL_NODEID ) ||
|
||||
( reverse_edge_based_node_id != SPECIAL_NODEID )
|
||||
);
|
||||
// if( forward_edge_based_node_id == SPECIAL_NODEID ) {
|
||||
// using namespace std;
|
||||
// swap( forward_edge_based_node_id, reverse_edge_based_node_id );
|
||||
// swap( u, v );
|
||||
// swap( forward_weight, reverse_weight );
|
||||
// swap( forward_offset, reverse_offset );
|
||||
// swap( fwd_segment_position, rev_segment_position );
|
||||
// }
|
||||
}
|
||||
|
||||
inline static double ComputePerpendicularDistance(
|
||||
const FixedPointCoordinate & coord_a,
|
||||
const FixedPointCoordinate & coord_b,
|
||||
@ -134,7 +149,7 @@ struct EdgeBasedNode {
|
||||
}
|
||||
|
||||
bool IsCompressed() {
|
||||
return (fwd_segment_position + rev_segment_position) != 0;
|
||||
return is_compressed;
|
||||
}
|
||||
|
||||
// Returns the midpoint of the underlying edge.
|
||||
@ -152,7 +167,7 @@ struct EdgeBasedNode {
|
||||
int forward_offset;
|
||||
int reverse_offset;
|
||||
unsigned short fwd_segment_position;
|
||||
unsigned short rev_segment_position:15;
|
||||
unsigned short rev_segment_position:14; //TODO: not actually needed!
|
||||
bool belongsToTinyComponent:1;
|
||||
NodeID name_id;
|
||||
|
||||
|
@ -683,11 +683,11 @@ public:
|
||||
BOOST_ASSERT( 0. <= current_perpendicular_distance );
|
||||
|
||||
if(
|
||||
( current_perpendicular_distance < min_dist ) //&&
|
||||
// !DoubleEpsilonCompare(
|
||||
// current_perpendicular_distance,
|
||||
// min_dist
|
||||
// )
|
||||
( current_perpendicular_distance < min_dist ) &&
|
||||
!DoubleEpsilonCompare(
|
||||
current_perpendicular_distance,
|
||||
min_dist
|
||||
)
|
||||
) { //found a new minimum
|
||||
min_dist = current_perpendicular_distance;
|
||||
result_phantom_node.forward_node_id = current_edge.forward_edge_based_node_id;
|
||||
|
@ -294,7 +294,7 @@ public:
|
||||
super::UnpackPath(
|
||||
packed_shortest_path,
|
||||
phantom_node_pair.startPhantom.fwd_segment_position,
|
||||
(packed_shortest_path.front() == phantom_node_pair.startPhantom.forward_node_id),
|
||||
(packed_shortest_path.front() != phantom_node_pair.startPhantom.forward_node_id),
|
||||
phantom_node_pair.targetPhantom.fwd_segment_position,//( packed_forward_path.back() == phantom_node_pair.targetPhantom.forward_node_id ? 1 : -1 )*phantom_node_pair.targetPhantom.fwd_segment_position,
|
||||
raw_route_data.unpacked_path_segments.front()
|
||||
);
|
||||
|
@ -69,7 +69,7 @@ public:
|
||||
) const {
|
||||
const NodeID node = forward_heap.DeleteMin();
|
||||
const int distance = forward_heap.GetKey(node);
|
||||
//SimpleLogger().Write() << "Settled (" << forward_heap.GetData( node ).parent << "," << node << ")=" << distance;
|
||||
SimpleLogger().Write() << (forward_direction ? "fwd" : "rev") << " settled (" << forward_heap.GetData( node ).parent << "," << node << ")=" << distance;
|
||||
if(reverse_heap.WasInserted(node) ){
|
||||
const int new_distance = reverse_heap.GetKey(node) + distance;
|
||||
if(new_distance < *upper_bound ){
|
||||
@ -143,13 +143,6 @@ public:
|
||||
int rev_index_offset,
|
||||
std::vector<PathData> & unpacked_path
|
||||
) const {
|
||||
|
||||
// SimpleLogger().Write(logDEBUG) << "unpacking path";
|
||||
// for(unsigned i = 0; i < packed_path.size(); ++i) {
|
||||
// std::cout << packed_path[i] << " ";
|
||||
// }
|
||||
|
||||
// SimpleLogger().Write() << "starting unpack";
|
||||
const unsigned packed_path_size = packed_path.size();
|
||||
std::stack<std::pair<NodeID, NodeID> > recursion_stack;
|
||||
|
||||
@ -162,17 +155,50 @@ public:
|
||||
|
||||
std::pair<NodeID, NodeID> edge;
|
||||
while(!recursion_stack.empty()) {
|
||||
bool segment_reversed = false;
|
||||
// bool segment_reversed = false;
|
||||
edge = recursion_stack.top();
|
||||
recursion_stack.pop();
|
||||
|
||||
EdgeID smaller_edge_id = facade->FindEdgeIndicateIfReverse(
|
||||
edge.first,
|
||||
edge.second,
|
||||
segment_reversed
|
||||
);
|
||||
// facade->FindEdge does not suffice here in case of shortcuts.
|
||||
// The above explanation unclear? Think!
|
||||
EdgeID smaller_edge_id = SPECIAL_EDGEID;
|
||||
int edge_weight = INT_MAX;
|
||||
for(
|
||||
EdgeID edge_id = facade->BeginEdges(edge.first);
|
||||
edge_id < facade->EndEdges(edge.first);
|
||||
++edge_id
|
||||
){
|
||||
const int weight = facade->GetEdgeData(edge_id).distance;
|
||||
if(
|
||||
(facade->GetTarget(edge_id) == edge.second) &&
|
||||
(weight < edge_weight) &&
|
||||
facade->GetEdgeData(edge_id).forward
|
||||
){
|
||||
smaller_edge_id = edge_id;
|
||||
edge_weight = weight;
|
||||
}
|
||||
}
|
||||
if( SPECIAL_EDGEID == smaller_edge_id ){
|
||||
for(
|
||||
EdgeID edge_id = facade->BeginEdges(edge.second);
|
||||
edge_id < facade->EndEdges(edge.second);
|
||||
++edge_id
|
||||
){
|
||||
const int weight = facade->GetEdgeData(edge_id).distance;
|
||||
if(
|
||||
(facade->GetTarget(edge_id) == edge.first) &&
|
||||
(weight < edge_weight) &&
|
||||
facade->GetEdgeData(edge_id).backward
|
||||
){
|
||||
smaller_edge_id = edge_id;
|
||||
edge_weight = weight;
|
||||
}
|
||||
}
|
||||
}
|
||||
BOOST_ASSERT_MSG(edge_weight != INT_MAX, "edge id invalid");
|
||||
|
||||
BOOST_ASSERT( SPECIAL_EDGEID != smaller_edge_id );
|
||||
|
||||
BOOST_ASSERT( facade->EndEdges(edge.first) != smaller_edge_id );
|
||||
|
||||
const EdgeData& ed = facade->GetEdgeData(smaller_edge_id);
|
||||
if( ed.shortcut ) {//unpack
|
||||
@ -185,7 +211,6 @@ public:
|
||||
unsigned name_index = facade->GetNameIndexFromEdgeID(ed.id);
|
||||
const TurnInstruction turn_instruction = facade->GetTurnInstructionForEdgeID(ed.id);
|
||||
|
||||
//TODO: refactor to iterate over a result vector in both cases
|
||||
if ( !facade->EdgeIsCompressed(ed.id) ){
|
||||
BOOST_ASSERT( !facade->EdgeIsCompressed(ed.id) );
|
||||
unpacked_path.push_back(
|
||||
@ -200,56 +225,16 @@ public:
|
||||
std::vector<unsigned> id_vector;
|
||||
facade->GetUncompressedGeometry(ed.id, id_vector);
|
||||
|
||||
const int start_index = ( unpacked_path.empty() ? ( ( start_traversed_in_reverse ) ? id_vector.size() - fwd_index_offset - 1 : fwd_index_offset ) : 0 );
|
||||
const int end_index = id_vector.size();
|
||||
|
||||
//TODO use only a single for loop
|
||||
if( unpacked_path.empty() ) {
|
||||
// // SimpleLogger().Write(logDEBUG) << "1st node in packed path: " << packed_path.front() << ", edge (" << edge.first << "," << edge.second << ")";
|
||||
// // SimpleLogger().Write(logDEBUG) << "REVERSED1: " << ( facade->GetTarget(smaller_edge_id) != edge.second ? "y" : "n" );
|
||||
// // SimpleLogger().Write(logDEBUG) << "REVERSED2: " << ( facade->GetTarget(smaller_edge_id) != edge.first ? "y" : "n" );
|
||||
// SimpleLogger().Write(logDEBUG) << "segment_reversed: " << ( segment_reversed ? "y" : "n" );
|
||||
// // SimpleLogger().Write(logDEBUG) << "target of edge: " << facade->GetTarget(smaller_edge_id);
|
||||
// // SimpleLogger().Write(logDEBUG) << "first geometry: " << id_vector.front() << ", last geometry: " << id_vector.back();
|
||||
|
||||
const bool edge_is_reversed = (!ed.forward && ed.backward);
|
||||
SimpleLogger().Write(logDEBUG) << "fwd offset: " << fwd_index_offset;
|
||||
SimpleLogger().Write(logDEBUG) << "rev offset: " << rev_index_offset;
|
||||
SimpleLogger().Write(logDEBUG) << "start_traversed_in_reverse: " << ( start_traversed_in_reverse ? "y" : "n" );
|
||||
SimpleLogger().Write(logDEBUG) << "edge_is_reversed: " << ( edge_is_reversed ? "y" : "n" );
|
||||
|
||||
|
||||
|
||||
|
||||
// if( edge_is_reversed ) {
|
||||
// SimpleLogger().Write(logDEBUG) << "reversing geometry";
|
||||
// std::reverse( id_vector.begin(), id_vector.end() );
|
||||
// fwd_index_offset = id_vector.size() - (1+fwd_index_offset);
|
||||
// SimpleLogger().Write() << "new fwd offset: " << fwd_index_offset;
|
||||
// }
|
||||
|
||||
SimpleLogger().Write(logDEBUG) << "edge data fwd: " << (ed.forward ? "y": "n") << ", reverse: " << (ed.backward ? "y" : "n" );
|
||||
SimpleLogger().Write() << "Edge " << ed.id << "=(" << edge.first << "," << edge.second << ") is compressed";
|
||||
SimpleLogger().Write(logDEBUG) << "packed ids: ";
|
||||
BOOST_FOREACH(unsigned number, id_vector) {
|
||||
SimpleLogger().Write() << "[" << number << "] " << facade->GetCoordinateOfNode(number);
|
||||
}
|
||||
int start_index = ( ( start_traversed_in_reverse ) ? 0 : id_vector.size() - fwd_index_offset );
|
||||
int end_index = ( ( start_traversed_in_reverse ) ? id_vector.size() + 1 - fwd_index_offset : id_vector.size() );
|
||||
|
||||
if( edge_is_reversed ) {
|
||||
start_index = ( ( !start_traversed_in_reverse ) ? id_vector.size() - fwd_index_offset - 1: fwd_index_offset );
|
||||
end_index = ( ( !start_traversed_in_reverse ) ? id_vector.size() : id_vector.size() + 1 - fwd_index_offset );
|
||||
}
|
||||
|
||||
|
||||
// BOOST_ASSERT( start_index >= 0 );
|
||||
// // BOOST_ASSERT( start_index <= end_index );
|
||||
SimpleLogger().Write(logDEBUG) << "geometry count: " << id_vector.size() << ", fetching[" << start_index << "..." << end_index << "]";
|
||||
BOOST_ASSERT( start_index >= 0 );
|
||||
BOOST_ASSERT( start_index <= end_index );
|
||||
for(
|
||||
unsigned i = start_index;
|
||||
i != end_index;
|
||||
(start_index > end_index) ? --i : ++i
|
||||
i < end_index;
|
||||
++i
|
||||
) {
|
||||
SimpleLogger().Write(logDEBUG) << "[" << i << "]pushing id: " << id_vector[i];
|
||||
unpacked_path.push_back(
|
||||
PathData(
|
||||
id_vector[i],
|
||||
@ -259,26 +244,12 @@ public:
|
||||
)
|
||||
);
|
||||
}
|
||||
} else {
|
||||
BOOST_FOREACH(const unsigned coordinate_id, id_vector){
|
||||
// SimpleLogger().Write(logDEBUG) << "pushing id: " << coordinate_id;
|
||||
unpacked_path.push_back(
|
||||
PathData(
|
||||
coordinate_id,
|
||||
name_index,
|
||||
TurnInstructionsClass::NoTurn,
|
||||
0
|
||||
)
|
||||
);
|
||||
|
||||
}
|
||||
unpacked_path.back().turnInstruction = turn_instruction;
|
||||
unpacked_path.back().durationOfSegment = ed.distance;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
inline void UnpackEdge(
|
||||
const NodeID s,
|
||||
@ -368,6 +339,11 @@ public:
|
||||
current_node_id = reverse_heap.GetData(current_node_id).parent;
|
||||
packed_path.push_back(current_node_id);
|
||||
}
|
||||
|
||||
|
||||
BOOST_FOREACH(NodeID node, packed_path) {
|
||||
SimpleLogger().Write(logDEBUG) << "node: " << node;
|
||||
}
|
||||
}
|
||||
|
||||
//TODO: reorder parameters
|
||||
|
Loading…
Reference in New Issue
Block a user