use correct type in graph contractor to avoid overflows in nodes

This commit is contained in:
Moritz Kobitzsch 2016-12-12 16:14:35 +01:00 committed by Patrick Niklaus
parent 68e38880df
commit dc8e6bd8d9

View File

@ -278,9 +278,9 @@ class GraphContractor
std::vector<RemainingNodeData> remaining_nodes(number_of_nodes); std::vector<RemainingNodeData> remaining_nodes(number_of_nodes);
// initialize priorities in parallel // initialize priorities in parallel
tbb::parallel_for(tbb::blocked_range<int>(0, number_of_nodes, InitGrainSize), tbb::parallel_for(tbb::blocked_range<NodeID>(0, number_of_nodes, InitGrainSize),
[this, &remaining_nodes](const tbb::blocked_range<int> &range) { [this, &remaining_nodes](const tbb::blocked_range<NodeID> &range) {
for (int x = range.begin(), end = range.end(); x != end; ++x) for (auto x = range.begin(), end = range.end(); x != end; ++x)
{ {
remaining_nodes[x].id = x; remaining_nodes[x].id = x;
} }
@ -302,14 +302,14 @@ class GraphContractor
util::UnbufferedLog log; util::UnbufferedLog log;
log << "initializing elimination PQ ..."; log << "initializing elimination PQ ...";
tbb::parallel_for(tbb::blocked_range<int>(0, number_of_nodes, PQGrainSize), tbb::parallel_for(
tbb::blocked_range<NodeID>(0, number_of_nodes, PQGrainSize),
[this, &node_priorities, &node_depth, &thread_data_list]( [this, &node_priorities, &node_depth, &thread_data_list](
const tbb::blocked_range<int> &range) { const tbb::blocked_range<NodeID> &range) {
ContractorThreadData *data = thread_data_list.GetThreadData(); ContractorThreadData *data = thread_data_list.GetThreadData();
for (int x = range.begin(), end = range.end(); x != end; ++x) for (auto x = range.begin(), end = range.end(); x != end; ++x)
{ {
node_priorities[x] = node_priorities[x] = this->EvaluateNodePriority(data, node_depth[x], x);
this->EvaluateNodePriority(data, node_depth[x], x);
} }
}); });
log << "ok"; log << "ok";
@ -429,9 +429,9 @@ class GraphContractor
} }
tbb::parallel_for( tbb::parallel_for(
tbb::blocked_range<std::size_t>(0, remaining_nodes.size(), IndependentGrainSize), tbb::blocked_range<NodeID>(0, remaining_nodes.size(), IndependentGrainSize),
[this, &node_priorities, &remaining_nodes, &thread_data_list]( [this, &node_priorities, &remaining_nodes, &thread_data_list](
const tbb::blocked_range<std::size_t> &range) { const tbb::blocked_range<NodeID> &range) {
ContractorThreadData *data = thread_data_list.GetThreadData(); ContractorThreadData *data = thread_data_list.GetThreadData();
// determine independent node set // determine independent node set
for (auto i = range.begin(), end = range.end(); i != end; ++i) for (auto i = range.begin(), end = range.end(); i != end; ++i)
@ -455,13 +455,13 @@ class GraphContractor
{ {
// write out contraction level // write out contraction level
tbb::parallel_for( tbb::parallel_for(
tbb::blocked_range<std::size_t>( tbb::blocked_range<NodeID>(
begin_independent_nodes_idx, end_independent_nodes_idx, ContractGrainSize), begin_independent_nodes_idx, end_independent_nodes_idx, ContractGrainSize),
[this, remaining_nodes, flushed_contractor, current_level]( [this, remaining_nodes, flushed_contractor, current_level](
const tbb::blocked_range<std::size_t> &range) { const tbb::blocked_range<NodeID> &range) {
if (flushed_contractor) if (flushed_contractor)
{ {
for (int position = range.begin(), end = range.end(); position != end; for (auto position = range.begin(), end = range.end(); position != end;
++position) ++position)
{ {
const NodeID x = remaining_nodes[position].id; const NodeID x = remaining_nodes[position].id;
@ -470,7 +470,7 @@ class GraphContractor
} }
else else
{ {
for (int position = range.begin(), end = range.end(); position != end; for (auto position = range.begin(), end = range.end(); position != end;
++position) ++position)
{ {
const NodeID x = remaining_nodes[position].id; const NodeID x = remaining_nodes[position].id;
@ -482,12 +482,12 @@ class GraphContractor
// contract independent nodes // contract independent nodes
tbb::parallel_for( tbb::parallel_for(
tbb::blocked_range<std::size_t>( tbb::blocked_range<NodeID>(
begin_independent_nodes_idx, end_independent_nodes_idx, ContractGrainSize), begin_independent_nodes_idx, end_independent_nodes_idx, ContractGrainSize),
[this, &remaining_nodes, &thread_data_list]( [this, &remaining_nodes, &thread_data_list](
const tbb::blocked_range<std::size_t> &range) { const tbb::blocked_range<NodeID> &range) {
ContractorThreadData *data = thread_data_list.GetThreadData(); ContractorThreadData *data = thread_data_list.GetThreadData();
for (int position = range.begin(), end = range.end(); position != end; for (auto position = range.begin(), end = range.end(); position != end;
++position) ++position)
{ {
const NodeID x = remaining_nodes[position].id; const NodeID x = remaining_nodes[position].id;
@ -496,11 +496,12 @@ class GraphContractor
}); });
tbb::parallel_for( tbb::parallel_for(
tbb::blocked_range<int>( tbb::blocked_range<NodeID>(
begin_independent_nodes_idx, end_independent_nodes_idx, DeleteGrainSize), begin_independent_nodes_idx, end_independent_nodes_idx, DeleteGrainSize),
[this, &remaining_nodes, &thread_data_list](const tbb::blocked_range<int> &range) { [this, &remaining_nodes, &thread_data_list](
const tbb::blocked_range<NodeID> &range) {
ContractorThreadData *data = thread_data_list.GetThreadData(); ContractorThreadData *data = thread_data_list.GetThreadData();
for (int position = range.begin(), end = range.end(); position != end; for (auto position = range.begin(), end = range.end(); position != end;
++position) ++position)
{ {
const NodeID x = remaining_nodes[position].id; const NodeID x = remaining_nodes[position].id;
@ -545,13 +546,14 @@ class GraphContractor
if (!use_cached_node_priorities) if (!use_cached_node_priorities)
{ {
tbb::parallel_for( tbb::parallel_for(
tbb::blocked_range<int>(begin_independent_nodes_idx, tbb::blocked_range<NodeID>(begin_independent_nodes_idx,
end_independent_nodes_idx, end_independent_nodes_idx,
NeighboursGrainSize), NeighboursGrainSize),
[this, &node_priorities, &remaining_nodes, &node_depth, &thread_data_list]( [this, &node_priorities, &remaining_nodes, &node_depth, &thread_data_list](
const tbb::blocked_range<int> &range) { const tbb::blocked_range<NodeID> &range) {
ContractorThreadData *data = thread_data_list.GetThreadData(); ContractorThreadData *data = thread_data_list.GetThreadData();
for (int position = range.begin(), end = range.end(); position != end; for (auto position = range.begin(), end = range.end();
position != end;
++position) ++position)
{ {
NodeID x = remaining_nodes[position].id; NodeID x = remaining_nodes[position].id;
@ -572,21 +574,22 @@ class GraphContractor
{ {
if (orig_node_id_from_new_node_id_map.size() > 0) if (orig_node_id_from_new_node_id_map.size() > 0)
{ {
tbb::parallel_for(tbb::blocked_range<int>(0, remaining_nodes.size(), InitGrainSize), tbb::parallel_for(
[this, &remaining_nodes](const tbb::blocked_range<int> &range) { tbb::blocked_range<NodeID>(0, remaining_nodes.size(), InitGrainSize),
for (int x = range.begin(), end = range.end(); x != end; ++x) [this, &remaining_nodes](const tbb::blocked_range<NodeID> &range) {
for (auto x = range.begin(), end = range.end(); x != end; ++x)
{ {
const auto orig_id = remaining_nodes[x].id; const auto orig_id = remaining_nodes[x].id;
is_core_node[orig_node_id_from_new_node_id_map[orig_id]] = is_core_node[orig_node_id_from_new_node_id_map[orig_id]] = true;
true;
} }
}); });
} }
else else
{ {
tbb::parallel_for(tbb::blocked_range<int>(0, remaining_nodes.size(), InitGrainSize), tbb::parallel_for(
[this, &remaining_nodes](const tbb::blocked_range<int> &range) { tbb::blocked_range<NodeID>(0, remaining_nodes.size(), InitGrainSize),
for (int x = range.begin(), end = range.end(); x != end; ++x) [this, &remaining_nodes](const tbb::blocked_range<NodeID> &range) {
for (auto x = range.begin(), end = range.end(); x != end; ++x)
{ {
const auto orig_id = remaining_nodes[x].id; const auto orig_id = remaining_nodes[x].id;
is_core_node[orig_id] = true; is_core_node[orig_id] = true;