fix mangled offsets and edge weights on compressed edges (all tests passing)
This commit is contained in:
		
							parent
							
								
									8ec3d549a6
								
							
						
					
					
						commit
						5b8d8a83dd
					
				| @ -352,25 +352,37 @@ void EdgeBasedGraphFactory::InsertEdgeBasedNode( | ||||
| 
 | ||||
|         // 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() ); | ||||
|         std::vector<int> forward_dist_prefix_sum(forward_geometry.size(), 0); | ||||
|         std::vector<int> 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, | ||||
|  | ||||
| @ -32,6 +32,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| #include <boost/foreach.hpp> | ||||
| 
 | ||||
| #include <fstream> | ||||
| #include <limits> | ||||
| 
 | ||||
| int current_free_list_maximum = 0; | ||||
| int UniqueNumber () { return ++current_free_list_maximum; } | ||||
|  | ||||
| @ -30,7 +30,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| #include <boost/unordered_map.hpp> | ||||
| #include <boost/filesystem.hpp> | ||||
| 
 | ||||
| #include <limits> | ||||
| #include <vector> | ||||
| 
 | ||||
| #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; | ||||
|  | ||||
| @ -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; | ||||
|     } | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user