fixing sentinel nodes in adjacency list graph data structure

This commit is contained in:
Dennis Luxen
2014-03-19 16:42:37 +01:00
parent fdebec6448
commit 87f036e538
10 changed files with 153 additions and 63 deletions
+2 -1
View File
@@ -86,6 +86,7 @@ public:
const PhantomNodes & phantom_node_pair,
RawRouteData & raw_route_data
) {
SimpleLogger().Write(logDEBUG) << "alt path routing";
if( //phantom_node_pair.AtLeastOnePhantomNodeIsUINTMAX() ||
phantom_node_pair.PhantomNodesHaveEqualLocation()
) {
@@ -628,7 +629,7 @@ private:
const NodeID node = forward_heap.DeleteMin();
const int distance = forward_heap.GetKey(node);
const int scaled_distance = (distance-edge_expansion_offset)/(1.+VIAPATH_EPSILON);
SimpleLogger().Write(logDEBUG) << "node: " << node << ", distance: " << distance << ", ub: " << *upper_bound_to_shortest_path_distance << ", scaled_distance: " << scaled_distance;
// SimpleLogger().Write(logDEBUG) << "node: " << node << ", distance: " << distance << ", ub: " << *upper_bound_to_shortest_path_distance << ", scaled_distance: " << scaled_distance;
if(
(INVALID_EDGE_WEIGHT != *upper_bound_to_shortest_path_distance) &&
(scaled_distance > *upper_bound_to_shortest_path_distance)
+15 -6
View File
@@ -67,9 +67,10 @@ public:
) const {
const NodeID node = forward_heap.DeleteMin();
const int distance = forward_heap.GetKey(node);
// SimpleLogger().Write() << (forward_direction ? "fwd" : "rev") << " 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;
SimpleLogger().Write(logDEBUG) << "new_distance: " << new_distance;
if(new_distance < *upper_bound ){
if( new_distance >= 0 ) {
*middle_node_id = node;
@@ -79,6 +80,7 @@ public:
}
if( (distance-edge_expansion_offset) > *upper_bound ){
SimpleLogger().Write() << "found path";
forward_heap.DeleteAll();
return;
}
@@ -99,12 +101,13 @@ public:
if(forward_heap.WasInserted( to )) {
if(forward_heap.GetKey( to ) + edge_weight < distance) {
SimpleLogger().Write(logDEBUG) << "stalled";
return;
}
}
}
}
SimpleLogger().Write(logDEBUG) << "done stalling";
for(
EdgeID edge = facade->BeginEdges(node), end_edge = facade->EndEdges(node);
edge < end_edge;
@@ -122,12 +125,14 @@ public:
//New Node discovered -> Add to Heap + Node Info Storage
if ( !forward_heap.WasInserted( to ) ) {
SimpleLogger().Write() << "insert (" << node << "," << to << "), distance: " << to_distance << ", edge id: " << edge;
forward_heap.Insert( to, to_distance, node );
}
//Found a shorter Path -> Update distance
else if ( to_distance < forward_heap.GetKey( to ) ) {
forward_heap.GetData( to ).parent = node;
forward_heap.DecreaseKey( to, to_distance );
SimpleLogger().Write() << "decrease (" << node << "," << to << "), distance: " << to_distance;
//new parent
}
}
@@ -286,8 +291,8 @@ public:
if (is_local_path)
{
SimpleLogger().Write(logDEBUG) << "case3";
start_index = phantom_node_pair.startPhantom.fwd_segment_position - 1;
end_index = phantom_node_pair.targetPhantom.fwd_segment_position - 1;
start_index = phantom_node_pair.startPhantom.fwd_segment_position;
end_index = phantom_node_pair.targetPhantom.fwd_segment_position;
if (target_traversed_in_reverse)
{
SimpleLogger().Write(logDEBUG) << "case4";
@@ -301,11 +306,15 @@ public:
BOOST_ASSERT( start_index >= 0 );
// BOOST_ASSERT( start_index <= end_index );
for(
unsigned i = start_index;
int i = start_index;
i != end_index;
( start_index < end_index ? ++i :--i)
) {
SimpleLogger().Write(logDEBUG) << "[" << i << "]" << facade->GetCoordinateOfNode(id_vector[i]);
BOOST_ASSERT( i >= -1 );
if ( i >= 0 )
{
SimpleLogger().Write(logDEBUG) << "[" << i << "]" << facade->GetCoordinateOfNode(id_vector[i]);
}
unpacked_path.push_back(
PathData(
id_vector[i],
+6 -6
View File
@@ -113,12 +113,12 @@ public:
SimpleLogger().Write(logDEBUG) << "fwd1 insert: " << phantom_node_pair.startPhantom.forward_node_id << ", w: " << -phantom_node_pair.startPhantom.GetForwardWeightPlusOffset();
forward_heap1.Insert(
phantom_node_pair.startPhantom.forward_node_id,
-distance1-phantom_node_pair.startPhantom.GetForwardWeightPlusOffset(),
distance1-phantom_node_pair.startPhantom.GetForwardWeightPlusOffset(),
phantom_node_pair.startPhantom.forward_node_id
);
forward_heap2.Insert(
phantom_node_pair.startPhantom.forward_node_id,
-distance1-phantom_node_pair.startPhantom.GetForwardWeightPlusOffset(),
distance1-phantom_node_pair.startPhantom.GetForwardWeightPlusOffset(),
phantom_node_pair.startPhantom.forward_node_id
);
}
@@ -129,12 +129,12 @@ public:
SimpleLogger().Write(logDEBUG) << "fwd1 insert: " << phantom_node_pair.startPhantom.reverse_node_id << ", w: " << -phantom_node_pair.startPhantom.GetReverseWeightPlusOffset();
forward_heap1.Insert(
phantom_node_pair.startPhantom.reverse_node_id,
-distance2-phantom_node_pair.startPhantom.GetReverseWeightPlusOffset(),
distance2-phantom_node_pair.startPhantom.GetReverseWeightPlusOffset(),
phantom_node_pair.startPhantom.reverse_node_id
);
forward_heap2.Insert(
phantom_node_pair.startPhantom.reverse_node_id,
-distance2-phantom_node_pair.startPhantom.GetReverseWeightPlusOffset(),
distance2-phantom_node_pair.startPhantom.GetReverseWeightPlusOffset(),
phantom_node_pair.startPhantom.reverse_node_id
);
}
@@ -369,8 +369,8 @@ public:
for(unsigned i = 0; i < packed_legs1.size(); ++i){
BOOST_ASSERT( !phantom_nodes_vector.empty() );
const bool at_beginning = (packed_legs1[i] == packed_legs1.front());
const bool at_end = (packed_legs1[i] == packed_legs1.back());
// const bool at_beginning = (packed_legs1[i] == packed_legs1.front());
// const bool at_end = (packed_legs1[i] == packed_legs1.back());
BOOST_ASSERT(packed_legs1.size() == raw_route_data.unpacked_path_segments.size() );
PhantomNodes unpack_phantom_node_pair = phantom_nodes_vector[i];