apply more emplace_backs and range based for loops to Contractor

This commit is contained in:
Dennis Luxen 2014-07-15 12:06:52 +02:00
parent 0ee77a37d1
commit 32fd507ad9

View File

@ -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; #ifndef NDEBUG
new_edge.data = { static_cast<unsigned int>(std::max(diter->weight, 1)), if (static_cast<unsigned int>(std::max(diter->weight, 1)) > 24 * 60 * 60 * 10)
{
SimpleLogger().Write(logWARNING) << "Edge weight large -> "
<< static_cast<unsigned int>(std::max(diter->weight, 1));
}
#endif
edges.emplace_back(diter->source, diter->target,
static_cast<unsigned int>(std::max(diter->weight, 1)),
1, 1,
diter->edge_id, diter->edge_id,
false, false,
diter->forward, static_cast<bool>(diter->forward),
diter->backward}; static_cast<bool>(diter->backward));
BOOST_ASSERT_MSG(new_edge.data.distance > 0, "edge distance < 1"); edges.emplace_back(diter->target, diter->source,
#ifndef NDEBUG static_cast<unsigned int>(std::max(diter->weight, 1)),
if (new_edge.data.distance > 24 * 60 * 60 * 10) 1,
{ diter->edge_id,
SimpleLogger().Write(logWARNING) << "Edge weight large -> " false,
<< new_edge.data.distance; static_cast<bool>(diter->backward),
} static_cast<bool>(diter->forward));
#endif
edges.push_back(new_edge);
std::swap(new_edge.source, new_edge.target);
new_edge.data.forward = diter->backward;
new_edge.data.backward = diter->forward;
edges.push_back(new_edge);
++diter;
} }
// 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;
new_edge.target = target;
new_edge.data =
ContractorEdgeData(path_distance,
out_data.originalEdges + in_data.originalEdges, out_data.originalEdges + in_data.originalEdges,
node /*, 0, in_data.turnInstruction*/, node,
true, true,
true, true,
false); false);
inserted_edges.push_back(new_edge);
std::swap(new_edge.source, new_edge.target); inserted_edges.emplace_back(target, source, path_distance,
new_edge.data.forward = false; out_data.originalEdges + in_data.originalEdges,
new_edge.data.backward = true; node,
inserted_edges.push_back(new_edge); true,
false,
true);
} }
} }
} }
@ -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)
{ {