From 5b8d8a83dd7e797a80a684ccdf92c12334388e2b Mon Sep 17 00:00:00 2001 From: Dennis Luxen Date: Thu, 10 Apr 2014 16:39:11 -0400 Subject: [PATCH] fix mangled offsets and edge weights on compressed edges (all tests passing) --- Contractor/EdgeBasedGraphFactory.cpp | 46 +++++++++++++++++++------ Contractor/GeometryCompressor.cpp | 1 + Contractor/GeometryCompressor.h | 6 ---- DataStructures/StaticRTree.h | 38 ++++++++++---------- RoutingAlgorithms/ShortestPathRouting.h | 2 ++ 5 files changed, 58 insertions(+), 35 deletions(-) diff --git a/Contractor/EdgeBasedGraphFactory.cpp b/Contractor/EdgeBasedGraphFactory.cpp index 381ad0da6..6b6e4f255 100644 --- a/Contractor/EdgeBasedGraphFactory.cpp +++ b/Contractor/EdgeBasedGraphFactory.cpp @@ -352,25 +352,37 @@ void EdgeBasedGraphFactory::InsertEdgeBasedNode( // reconstruct bidirectional edge with individual weights and put each into the NN index - std::vector forward_dist_prefix_sum( forward_geometry.size() ); - std::vector reverse_dist_prefix_sum( reverse_geometry.size() ); + std::vector forward_dist_prefix_sum(forward_geometry.size(), 0); + std::vector reverse_dist_prefix_sum(reverse_geometry.size(), 0); // quick'n'dirty prefix sum as std::partial_sum needs addtional casts // SimpleLogger().Write(logDEBUG) << "Prefix sums of edge " << e1 << ", w: " << reverse_data.distance; int temp_sum = 0; - for( unsigned i = 0; i < forward_geometry.size(); ++i ) { + + std::cout << "\nfwd geom: "; + for (unsigned i = 0; i < forward_geometry.size(); ++i) + { + forward_dist_prefix_sum[i] = temp_sum; temp_sum += forward_geometry[i].second; + BOOST_ASSERT( forward_data.distance >= temp_sum ); - forward_dist_prefix_sum[i] = forward_data.distance - temp_sum; + std::cout << forward_dist_prefix_sum[i] << " "; } + std::cout << std::endl; + // BOOST_ASSERT( forward_data.distance == temp_sum ); temp_sum = 0; + std::cout << "rev geom: "; for( unsigned i = 0; i < reverse_geometry.size(); ++i ) { - temp_sum += reverse_geometry[i].second; - BOOST_ASSERT( reverse_data.distance >= temp_sum ); + temp_sum += reverse_geometry[reverse_geometry.size()-1-i].second; reverse_dist_prefix_sum[i] = reverse_data.distance - temp_sum; + BOOST_ASSERT( reverse_data.distance >= temp_sum ); + + std::cout << reverse_dist_prefix_sum[i] << " "; } - // BOOST_ASSERT( reverse_data.distance == temp_sum ); + std::cout << std::endl; + + // BOOST_ASSERT(false); BOOST_ASSERT( forward_geometry.size() == reverse_geometry.size() ); @@ -386,12 +398,18 @@ void EdgeBasedGraphFactory::InsertEdgeBasedNode( { max_id = std::max(reverse_data.edgeBasedNodeID, max_id); } + + SimpleLogger().Write(logDEBUG) << "-> serializing packed edge " << forward_data.edgeBasedNodeID << "|" << reverse_data.edgeBasedNodeID; + // traverse arrays from start and end respectively for( unsigned i = 0; i < geometry_size; ++i ) { 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; BOOST_ASSERT( current_edge_target_coordinate_id != current_edge_start_coordinate_id); + SimpleLogger().Write(logDEBUG) << " runs from coordinate " << current_edge_start_coordinate_id << " to " << current_edge_target_coordinate_id; + SimpleLogger().Write(logDEBUG) << " fwd edge: " << forward_geometry[i].second << ", rev edge: " << reverse_geometry[geometry_size-1-i].second; + SimpleLogger().Write(logDEBUG) << " fwd offset: " << forward_dist_prefix_sum[i] << ", rev offset: " << reverse_dist_prefix_sum[geometry_size-1-i]; // build edges m_edge_based_node_list.push_back( EdgeBasedNode( @@ -401,9 +419,9 @@ void EdgeBasedGraphFactory::InsertEdgeBasedNode( current_edge_target_coordinate_id, forward_data.nameID, forward_geometry[i].second, - reverse_geometry[geometry_size-1-i].second, + reverse_geometry[i].second, forward_dist_prefix_sum[i], - reverse_dist_prefix_sum[geometry_size-1-i], + reverse_dist_prefix_sum[i], m_geometry_compressor.GetPositionForID(e1), i, belongs_to_tiny_cc @@ -640,6 +658,12 @@ void EdgeBasedGraphFactory::Run( if( !edge_data.forward ) { continue; } + const NodeID target = m_node_based_graph->GetTarget(current_edge); + + SimpleLogger().Write(logDEBUG) << "expanded node " << numbered_edges_count << " runs from " << + m_node_info_list.at(current_node).lat << "," << m_node_info_list.at(current_node).lon << " to " << + m_node_info_list.at(target).lat << "," << m_node_info_list.at(target).lon; + BOOST_ASSERT( numbered_edges_count < m_node_based_graph->GetNumberOfEdges() ); edge_data.edgeBasedNodeID = numbered_edges_count; @@ -839,7 +863,7 @@ void EdgeBasedGraphFactory::Run( original_edge_data_vector.push_back( OriginalEdgeData( (edge_is_compressed ? m_geometry_compressor.GetPositionForID(e1) : v), - (edge_is_compressed ? edge_data1.nameID : edge_data1.nameID), + edge_data1.nameID, turn_instruction, edge_is_compressed ) @@ -857,6 +881,8 @@ void EdgeBasedGraphFactory::Run( BOOST_ASSERT( SPECIAL_NODEID != edge_data1.edgeBasedNodeID ); BOOST_ASSERT( SPECIAL_NODEID != edge_data2.edgeBasedNodeID ); + SimpleLogger().Write(logDEBUG) << "Generating expanded edge (" << edge_data1.edgeBasedNodeID << "," << edge_data2.edgeBasedNodeID << "), w: " << distance; + m_edge_based_edge_list.push_back( EdgeBasedEdge( edge_data1.edgeBasedNodeID, diff --git a/Contractor/GeometryCompressor.cpp b/Contractor/GeometryCompressor.cpp index c2b7c16d8..318b29d04 100644 --- a/Contractor/GeometryCompressor.cpp +++ b/Contractor/GeometryCompressor.cpp @@ -32,6 +32,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include +#include int current_free_list_maximum = 0; int UniqueNumber () { return ++current_free_list_maximum; } diff --git a/Contractor/GeometryCompressor.h b/Contractor/GeometryCompressor.h index 20f8a01aa..7d3593dc3 100644 --- a/Contractor/GeometryCompressor.h +++ b/Contractor/GeometryCompressor.h @@ -30,7 +30,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include -#include #include #ifndef GEOMETRY_COMPRESSOR_H @@ -50,11 +49,6 @@ public: const EdgeWeight weight2 ); - // void AddLastViaNodeIDToCompressedEdge( - // const EdgeID edge_id, - // const NodeID node_id, - // const EdgeWeight weight - // ); bool HasEntryForID(const EdgeID edge_id) const; void PrintStatistics() const; void SerializeInternalVector(const std::string & path) const; diff --git a/DataStructures/StaticRTree.h b/DataStructures/StaticRTree.h index b0594b199..157affb1b 100644 --- a/DataStructures/StaticRTree.h +++ b/DataStructures/StaticRTree.h @@ -672,7 +672,7 @@ public: } double current_ratio = 0.; - double current_perpendicular_distance = current_edge.ComputePerpendicularDistance( + const double current_perpendicular_distance = current_edge.ComputePerpendicularDistance( m_coordinate_list->at(current_edge.u), m_coordinate_list->at(current_edge.v), input_coordinate, @@ -691,13 +691,13 @@ public: ) { //found a new minimum min_dist = current_perpendicular_distance; //TODO: use assignment c'tor in PhantomNode - result_phantom_node.forward_node_id = current_edge.reverse_edge_based_node_id; - result_phantom_node.reverse_node_id = current_edge.forward_edge_based_node_id; + result_phantom_node.forward_node_id = current_edge.forward_edge_based_node_id; + result_phantom_node.reverse_node_id = current_edge.reverse_edge_based_node_id; result_phantom_node.name_id = current_edge.name_id; - result_phantom_node.forward_weight = current_edge.reverse_weight; - result_phantom_node.reverse_weight = current_edge.forward_weight; - result_phantom_node.forward_offset = current_edge.reverse_offset; - result_phantom_node.reverse_offset = current_edge.forward_offset; + result_phantom_node.forward_weight = current_edge.forward_weight; + result_phantom_node.reverse_weight = current_edge.reverse_weight; + result_phantom_node.forward_offset = current_edge.forward_offset; + result_phantom_node.reverse_offset = current_edge.reverse_offset; result_phantom_node.packed_geometry_id = current_edge.packed_geometry_id; result_phantom_node.fwd_segment_position = current_edge.fwd_segment_position; @@ -758,10 +758,10 @@ public: ratio = std::min(1., ratio); } - SimpleLogger().Write(logDEBUG) << "result_phantom_node.forward_offset: " << result_phantom_node.forward_offset; - SimpleLogger().Write(logDEBUG) << "result_phantom_node.reverse_offset: " << result_phantom_node.reverse_offset; - SimpleLogger().Write(logDEBUG) << "result_phantom_node.forward_weight: " << result_phantom_node.forward_weight; - SimpleLogger().Write(logDEBUG) << "result_phantom_node.reverse_weight: " << result_phantom_node.reverse_weight; + SimpleLogger().Write(logDEBUG) << "[rtree] result_phantom_node.forward_offset: " << result_phantom_node.forward_offset; + SimpleLogger().Write(logDEBUG) << "[rtree] result_phantom_node.reverse_offset: " << result_phantom_node.reverse_offset; + SimpleLogger().Write(logDEBUG) << "[rtree] result_phantom_node.forward_weight: " << result_phantom_node.forward_weight; + SimpleLogger().Write(logDEBUG) << "[rtree] result_phantom_node.reverse_weight: " << result_phantom_node.reverse_weight; if (SPECIAL_NODEID != result_phantom_node.forward_node_id) { @@ -772,14 +772,14 @@ public: result_phantom_node.reverse_weight *= (1.-ratio); } - SimpleLogger().Write(logDEBUG) << "result location: " << result_phantom_node.location << ", start: " << current_start_coordinate << ", end: " << current_end_coordinate; - SimpleLogger().Write(logDEBUG) << "fwd node: " << result_phantom_node.forward_node_id << ", rev node: " << result_phantom_node.reverse_node_id; - SimpleLogger().Write(logDEBUG) << "fwd weight: " << result_phantom_node.forward_weight << ", rev weight: " << result_phantom_node.reverse_weight; - SimpleLogger().Write(logDEBUG) << "fwd offset: " << result_phantom_node.forward_offset << ", rev offset: " << result_phantom_node.reverse_offset; - SimpleLogger().Write(logDEBUG) << "bidirected: " << (result_phantom_node.isBidirected() ? "y" : "n"); - SimpleLogger().Write(logDEBUG) << "name id: " << result_phantom_node.name_id; - SimpleLogger().Write(logDEBUG) << "geom id: " << result_phantom_node.packed_geometry_id; - SimpleLogger().Write(logDEBUG) << "ratio: " << ratio; + SimpleLogger().Write(logDEBUG) << "[rtree] result location: " << result_phantom_node.location << ", start: " << current_start_coordinate << ", end: " << current_end_coordinate; + SimpleLogger().Write(logDEBUG) << "[rtree] fwd node: " << result_phantom_node.forward_node_id << ", rev node: " << result_phantom_node.reverse_node_id; + SimpleLogger().Write(logDEBUG) << "[rtree] fwd weight: " << result_phantom_node.forward_weight << ", rev weight: " << result_phantom_node.reverse_weight; + SimpleLogger().Write(logDEBUG) << "[rtree] fwd offset: " << result_phantom_node.forward_offset << ", rev offset: " << result_phantom_node.reverse_offset; + SimpleLogger().Write(logDEBUG) << "[rtree] bidirected: " << (result_phantom_node.isBidirected() ? "y" : "n"); + SimpleLogger().Write(logDEBUG) << "[rtree] name id: " << result_phantom_node.name_id; + SimpleLogger().Write(logDEBUG) << "[rtree] geom id: " << result_phantom_node.packed_geometry_id; + SimpleLogger().Write(logDEBUG) << "[rtree] ratio: " << ratio; return found_a_nearest_edge; } diff --git a/RoutingAlgorithms/ShortestPathRouting.h b/RoutingAlgorithms/ShortestPathRouting.h index 8eff2cbe3..d49ffb890 100644 --- a/RoutingAlgorithms/ShortestPathRouting.h +++ b/RoutingAlgorithms/ShortestPathRouting.h @@ -57,6 +57,8 @@ public: RawRouteData & raw_route_data ) const { + SimpleLogger().Write(logDEBUG) << "shrt path routing"; + BOOST_FOREACH( const PhantomNodes & phantom_node_pair, phantom_nodes_vector