apply more emplace_backs and range based for loops to Contractor
This commit is contained in:
		
							parent
							
								
									0ee77a37d1
								
							
						
					
					
						commit
						32fd507ad9
					
				| @ -40,6 +40,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||||||
| #include "../Util/TimingUtil.h" | #include "../Util/TimingUtil.h" | ||||||
| 
 | 
 | ||||||
| #include <boost/assert.hpp> | #include <boost/assert.hpp> | ||||||
|  | #include <boost/range/irange.hpp> | ||||||
| 
 | 
 | ||||||
| #include <tbb/enumerable_thread_specific.h> | #include <tbb/enumerable_thread_specific.h> | ||||||
| #include <tbb/parallel_for.h> | #include <tbb/parallel_for.h> | ||||||
| @ -158,39 +159,38 @@ class Contractor | |||||||
|         edges.reserve(input_edge_list.size() * 2); |         edges.reserve(input_edge_list.size() * 2); | ||||||
|         temp_edge_counter = 0; |         temp_edge_counter = 0; | ||||||
| 
 | 
 | ||||||
|         auto diter = input_edge_list.dbegin(); |         const auto dend = input_edge_list.dend(); | ||||||
|         auto dend = input_edge_list.dend(); |  | ||||||
| 
 | 
 | ||||||
|         ContractorEdge new_edge; |         for (auto diter = input_edge_list.dbegin(); diter != dend; ++diter) | ||||||
|         while (diter != dend) |  | ||||||
|         { |         { | ||||||
|             new_edge.source = diter->source; |             BOOST_ASSERT_MSG(static_cast<unsigned int>(std::max(diter->weight, 1)) > 0, "edge distance < 1"); | ||||||
|             new_edge.target = diter->target; |  | ||||||
|             new_edge.data = { static_cast<unsigned int>(std::max(diter->weight, 1)), |  | ||||||
|                               1, |  | ||||||
|                               diter->edge_id, |  | ||||||
|                               false, |  | ||||||
|                               diter->forward, |  | ||||||
|                               diter->backward}; |  | ||||||
| 
 |  | ||||||
|             BOOST_ASSERT_MSG(new_edge.data.distance > 0, "edge distance < 1"); |  | ||||||
| #ifndef NDEBUG | #ifndef NDEBUG | ||||||
|             if (new_edge.data.distance > 24 * 60 * 60 * 10) |             if (static_cast<unsigned int>(std::max(diter->weight, 1)) > 24 * 60 * 60 * 10) | ||||||
|             { |             { | ||||||
|                 SimpleLogger().Write(logWARNING) << "Edge weight large -> " |                 SimpleLogger().Write(logWARNING) << "Edge weight large -> " | ||||||
|                                                  << new_edge.data.distance; |                                                  << static_cast<unsigned int>(std::max(diter->weight, 1)); | ||||||
|             } |             } | ||||||
| #endif | #endif | ||||||
|             edges.push_back(new_edge); |             edges.emplace_back(diter->source, diter->target, | ||||||
|             std::swap(new_edge.source, new_edge.target); |                 static_cast<unsigned int>(std::max(diter->weight, 1)), | ||||||
|             new_edge.data.forward = diter->backward; |                 1, | ||||||
|             new_edge.data.backward = diter->forward; |                 diter->edge_id, | ||||||
|             edges.push_back(new_edge); |                 false, | ||||||
|             ++diter; |                 static_cast<bool>(diter->forward), | ||||||
|  |                 static_cast<bool>(diter->backward)); | ||||||
|  | 
 | ||||||
|  |             edges.emplace_back(diter->target, diter->source, | ||||||
|  |                 static_cast<unsigned int>(std::max(diter->weight, 1)), | ||||||
|  |                 1, | ||||||
|  |                 diter->edge_id, | ||||||
|  |                 false, | ||||||
|  |                 static_cast<bool>(diter->backward), | ||||||
|  |                 static_cast<bool>(diter->forward)); | ||||||
|         } |         } | ||||||
|         // clear input vector
 |         // clear input vector
 | ||||||
|         edges.shrink_to_fit(); |  | ||||||
|         input_edge_list.clear(); |         input_edge_list.clear(); | ||||||
|  |         edges.shrink_to_fit(); | ||||||
|  | 
 | ||||||
|         tbb::parallel_sort(edges.begin(), edges.end()); |         tbb::parallel_sort(edges.begin(), edges.end()); | ||||||
|         NodeID edge = 0; |         NodeID edge = 0; | ||||||
|         for (NodeID i = 0; i < edges.size();) |         for (NodeID i = 0; i < edges.size();) | ||||||
| @ -201,7 +201,7 @@ class Contractor | |||||||
|             // remove eigenloops
 |             // remove eigenloops
 | ||||||
|             if (source == target) |             if (source == target) | ||||||
|             { |             { | ||||||
|                 i++; |                 ++i; | ||||||
|                 continue; |                 continue; | ||||||
|             } |             } | ||||||
|             ContractorEdge forward_edge; |             ContractorEdge forward_edge; | ||||||
| @ -362,7 +362,7 @@ class Contractor | |||||||
| 
 | 
 | ||||||
|                 // build forward and backward renumbering map and remap ids in remaining_nodes and
 |                 // build forward and backward renumbering map and remap ids in remaining_nodes and
 | ||||||
|                 // Priorities.
 |                 // Priorities.
 | ||||||
|                 for (unsigned new_node_id = 0; new_node_id < remaining_nodes.size(); ++new_node_id) |                 for (const auto new_node_id : boost::irange(0u, (unsigned)remaining_nodes.size())) | ||||||
|                 { |                 { | ||||||
|                     // create renumbering maps in both directions
 |                     // create renumbering maps in both directions
 | ||||||
|                     orig_node_id_to_new_id_map[new_node_id] = remaining_nodes[new_node_id].id; |                     orig_node_id_to_new_id_map[new_node_id] = remaining_nodes[new_node_id].id; | ||||||
| @ -373,7 +373,7 @@ class Contractor | |||||||
|                 } |                 } | ||||||
|                 TemporaryStorage &temporary_storage = TemporaryStorage::GetInstance(); |                 TemporaryStorage &temporary_storage = TemporaryStorage::GetInstance(); | ||||||
|                 // walk over all nodes
 |                 // walk over all nodes
 | ||||||
|                 for (unsigned i = 0; i < contractor_graph->GetNumberOfNodes(); ++i) |                 for (const auto i : boost::irange(0u, (unsigned)contractor_graph->GetNumberOfNodes())) | ||||||
|                 { |                 { | ||||||
|                     const NodeID source = i; |                     const NodeID source = i; | ||||||
|                     for (auto current_edge : contractor_graph->GetAdjacentEdgeRange(source)) |                     for (auto current_edge : contractor_graph->GetAdjacentEdgeRange(source)) | ||||||
| @ -381,7 +381,7 @@ class Contractor | |||||||
|                         ContractorGraph::EdgeData &data = |                         ContractorGraph::EdgeData &data = | ||||||
|                             contractor_graph->GetEdgeData(current_edge); |                             contractor_graph->GetEdgeData(current_edge); | ||||||
|                         const NodeID target = contractor_graph->GetTarget(current_edge); |                         const NodeID target = contractor_graph->GetTarget(current_edge); | ||||||
|                         if (UINT_MAX == new_node_id_from_orig_id_map[i]) |                         if (SPECIAL_NODEID == new_node_id_from_orig_id_map[i]) | ||||||
|                         { |                         { | ||||||
|                             // Save edges of this node w/o renumbering.
 |                             // Save edges of this node w/o renumbering.
 | ||||||
|                             temporary_storage.WriteToSlot( |                             temporary_storage.WriteToSlot( | ||||||
| @ -397,10 +397,12 @@ class Contractor | |||||||
|                         { |                         { | ||||||
|                             // node is not yet contracted.
 |                             // node is not yet contracted.
 | ||||||
|                             // add (renumbered) outgoing edges to new DynamicGraph.
 |                             // add (renumbered) outgoing edges to new DynamicGraph.
 | ||||||
|                             ContractorEdge new_edge; |                             ContractorEdge new_edge = { | ||||||
|                             new_edge.source = new_node_id_from_orig_id_map[source]; |                                 new_node_id_from_orig_id_map[source], | ||||||
|                             new_edge.target = new_node_id_from_orig_id_map[target]; |                                 new_node_id_from_orig_id_map[target], | ||||||
|                             new_edge.data = data; |                                 data | ||||||
|  |                             }; | ||||||
|  | 
 | ||||||
|                             new_edge.data.is_original_via_node_ID = true; |                             new_edge.data.is_original_via_node_ID = true; | ||||||
|                             BOOST_ASSERT_MSG(UINT_MAX != new_node_id_from_orig_id_map[source], |                             BOOST_ASSERT_MSG(UINT_MAX != new_node_id_from_orig_id_map[source], | ||||||
|                                              "new source id not resolveable"); |                                              "new source id not resolveable"); | ||||||
| @ -569,7 +571,7 @@ class Contractor | |||||||
|         if (contractor_graph->GetNumberOfNodes()) |         if (contractor_graph->GetNumberOfNodes()) | ||||||
|         { |         { | ||||||
|             Edge new_edge; |             Edge new_edge; | ||||||
|             for (NodeID node = 0; node < number_of_nodes; ++node) |             for (const auto node : boost::irange(0u, number_of_nodes)) | ||||||
|             { |             { | ||||||
|                 p.printStatus(node); |                 p.printStatus(node); | ||||||
|                 for (auto edge : contractor_graph->GetAdjacentEdgeRange(node)) |                 for (auto edge : contractor_graph->GetAdjacentEdgeRange(node)) | ||||||
| @ -612,26 +614,19 @@ class Contractor | |||||||
| 
 | 
 | ||||||
|         BOOST_ASSERT(0 == orig_node_id_to_new_id_map.capacity()); |         BOOST_ASSERT(0 == orig_node_id_to_new_id_map.capacity()); | ||||||
|         TemporaryStorage &temporary_storage = TemporaryStorage::GetInstance(); |         TemporaryStorage &temporary_storage = TemporaryStorage::GetInstance(); | ||||||
|  | 
 | ||||||
|         // loads edges of graph before renumbering, no need for further numbering action.
 |         // loads edges of graph before renumbering, no need for further numbering action.
 | ||||||
|         NodeID source; |         NodeID source; | ||||||
|         NodeID target; |         NodeID target; | ||||||
|         ContractorGraph::EdgeData data; |         ContractorGraph::EdgeData data; | ||||||
| 
 | 
 | ||||||
|         Edge restored_edge; |         for (auto i  = 0; i < temp_edge_counter; ++i) | ||||||
|         for (unsigned i = 0; i < temp_edge_counter; ++i) |  | ||||||
|         { |         { | ||||||
|             temporary_storage.ReadFromSlot(edge_storage_slot, (char *)&source, sizeof(NodeID)); |             temporary_storage.ReadFromSlot(edge_storage_slot, (char *)&source, sizeof(NodeID)); | ||||||
|             temporary_storage.ReadFromSlot(edge_storage_slot, (char *)&target, sizeof(NodeID)); |             temporary_storage.ReadFromSlot(edge_storage_slot, (char *)&target, sizeof(NodeID)); | ||||||
|             temporary_storage.ReadFromSlot( |             temporary_storage.ReadFromSlot( | ||||||
|                 edge_storage_slot, (char *)&data, sizeof(ContractorGraph::EdgeData)); |                 edge_storage_slot, (char *)&data, sizeof(ContractorGraph::EdgeData)); | ||||||
|             restored_edge.source = source; |             edges.emplace_back(source, target, data); | ||||||
|             restored_edge.target = target; |  | ||||||
|             restored_edge.data.distance = data.distance; |  | ||||||
|             restored_edge.data.shortcut = data.shortcut; |  | ||||||
|             restored_edge.data.id = data.id; |  | ||||||
|             restored_edge.data.forward = data.forward; |  | ||||||
|             restored_edge.data.backward = data.backward; |  | ||||||
|             edges.push_back(restored_edge); |  | ||||||
|         } |         } | ||||||
|         temporary_storage.DeallocateSlot(edge_storage_slot); |         temporary_storage.DeallocateSlot(edge_storage_slot); | ||||||
|     } |     } | ||||||
| @ -648,7 +643,7 @@ class Contractor | |||||||
| 
 | 
 | ||||||
|         int nodes = 0; |         int nodes = 0; | ||||||
|         unsigned number_of_targets_found = 0; |         unsigned number_of_targets_found = 0; | ||||||
|         while (heap.Size() > 0) |         while (!heap.Empty()) | ||||||
|         { |         { | ||||||
|             const NodeID node = heap.DeleteMin(); |             const NodeID node = heap.DeleteMin(); | ||||||
|             const int distance = heap.GetKey(node); |             const int distance = heap.GetKey(node); | ||||||
| @ -658,12 +653,12 @@ class Contractor | |||||||
|             { |             { | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|             // Destination settled?
 |  | ||||||
|             if (distance > max_distance) |             if (distance > max_distance) | ||||||
|             { |             { | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|  |             // Destination settled?
 | ||||||
|             if (heap.GetData(node).target) |             if (heap.GetData(node).target) | ||||||
|             { |             { | ||||||
|                 ++number_of_targets_found; |                 ++number_of_targets_found; | ||||||
| @ -803,21 +798,19 @@ class Contractor | |||||||
|                     } |                     } | ||||||
|                     else |                     else | ||||||
|                     { |                     { | ||||||
|                         ContractorEdge new_edge; |                         inserted_edges.emplace_back(source, target, path_distance, | ||||||
|                         new_edge.source = source; |                                                     out_data.originalEdges + in_data.originalEdges, | ||||||
|                         new_edge.target = target; |                                                     node, | ||||||
|                         new_edge.data = |                                                     true, | ||||||
|                             ContractorEdgeData(path_distance, |                                                     true, | ||||||
|                                                out_data.originalEdges + in_data.originalEdges, |                                                     false); | ||||||
|                                                node /*, 0, in_data.turnInstruction*/, | 
 | ||||||
|                                                true, |                         inserted_edges.emplace_back(target, source, path_distance, | ||||||
|                                                true, |                                                     out_data.originalEdges + in_data.originalEdges, | ||||||
|                                                false); |                                                     node, | ||||||
|                         inserted_edges.push_back(new_edge); |                                                     true, | ||||||
|                         std::swap(new_edge.source, new_edge.target); |                                                     false, | ||||||
|                         new_edge.data.forward = false; |                                                     true); | ||||||
|                         new_edge.data.backward = true; |  | ||||||
|                         inserted_edges.push_back(new_edge); |  | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
| @ -879,7 +872,7 @@ class Contractor | |||||||
|         std::sort(neighbours.begin(), neighbours.end()); |         std::sort(neighbours.begin(), neighbours.end()); | ||||||
|         neighbours.resize(std::unique(neighbours.begin(), neighbours.end()) - neighbours.begin()); |         neighbours.resize(std::unique(neighbours.begin(), neighbours.end()) - neighbours.begin()); | ||||||
| 
 | 
 | ||||||
|         for (int i = 0, e = (int)neighbours.size(); i < e; ++i) |         for (const auto i : boost::irange(0ul, neighbours.size())) | ||||||
|         { |         { | ||||||
|             contractor_graph->DeleteEdgesTo(neighbours[i], node); |             contractor_graph->DeleteEdgesTo(neighbours[i], node); | ||||||
|         } |         } | ||||||
| @ -917,7 +910,7 @@ class Contractor | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     inline bool IsNodeIndependent( |     inline bool IsNodeIndependent( | ||||||
|         const std::vector<float> &priorities /*, const std::vector< NodePriorityData >& node_data*/, |         const std::vector<float> &priorities, | ||||||
|         ContractorThreadData *const data, |         ContractorThreadData *const data, | ||||||
|         NodeID node) const |         NodeID node) const | ||||||
|     { |     { | ||||||
| @ -963,7 +956,7 @@ class Contractor | |||||||
|                     continue; |                     continue; | ||||||
|                 } |                 } | ||||||
|                 const float target_priority = priorities[target]; |                 const float target_priority = priorities[target]; | ||||||
|                 assert(target_priority >= 0); |                 BOOST_ASSERT(target_priority >= 0); | ||||||
|                 // found a neighbour with lower priority?
 |                 // found a neighbour with lower priority?
 | ||||||
|                 if (priority > target_priority) |                 if (priority > target_priority) | ||||||
|                 { |                 { | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user