Simplify toEdges and make it more robust against accidental memory allocations

This commit is contained in:
Patrick Niklaus 2018-04-09 09:33:54 +00:00 committed by Patrick Niklaus
parent 8d8042ebae
commit 600ca06166

View File

@ -128,23 +128,24 @@ ContractorGraph toContractorGraph(NodeID number_of_nodes, InputEdgeContainer inp
template <class Edge, typename GraphT> inline std::vector<Edge> toEdges(GraphT graph) template <class Edge, typename GraphT> inline std::vector<Edge> toEdges(GraphT graph)
{ {
std::vector<Edge> edges; util::Log() << "Converting contracted graph with " << graph.GetNumberOfEdges()
edges.reserve(graph.GetNumberOfEdges()); << " to edge list (" << (graph.GetNumberOfEdges() * sizeof(Edge)) << " bytes)";
std::vector<Edge> edges(graph.GetNumberOfEdges());
{
util::UnbufferedLog log; util::UnbufferedLog log;
log << "Getting edges of minimized graph "; log << "Getting edges of minimized graph ";
util::Percent p(log, graph.GetNumberOfNodes()); util::Percent p(log, graph.GetNumberOfNodes());
const NodeID number_of_nodes = graph.GetNumberOfNodes(); const NodeID number_of_nodes = graph.GetNumberOfNodes();
if (graph.GetNumberOfNodes()) std::size_t edge_index = 0;
{
Edge new_edge;
for (const auto node : util::irange(0u, number_of_nodes)) for (const auto node : util::irange(0u, number_of_nodes))
{ {
p.PrintStatus(node); p.PrintStatus(node);
for (auto edge : graph.GetAdjacentEdgeRange(node)) for (auto edge : graph.GetAdjacentEdgeRange(node))
{ {
const NodeID target = graph.GetTarget(edge); const NodeID target = graph.GetTarget(edge);
const ContractorGraph::EdgeData &data = graph.GetEdgeData(edge); const auto &data = graph.GetEdgeData(edge);
auto &new_edge = edges[edge_index++];
new_edge.source = node; new_edge.source = node;
new_edge.target = target; new_edge.target = target;
BOOST_ASSERT_MSG(SPECIAL_NODEID != new_edge.target, "Target id invalid"); BOOST_ASSERT_MSG(SPECIAL_NODEID != new_edge.target, "Target id invalid");
@ -156,16 +157,12 @@ template <class Edge, typename GraphT> inline std::vector<Edge> toEdges(GraphT g
"edge id invalid"); "edge id invalid");
new_edge.data.forward = data.forward; new_edge.data.forward = data.forward;
new_edge.data.backward = data.backward; new_edge.data.backward = data.backward;
edges.push_back(new_edge);
} }
} }
BOOST_ASSERT(edge_index == edges.size());
} }
// sort and remove duplicates
tbb::parallel_sort(edges.begin(), edges.end()); tbb::parallel_sort(edges.begin(), edges.end());
auto new_end = std::unique(edges.begin(), edges.end());
edges.resize(new_end - edges.begin());
edges.shrink_to_fit();
return edges; return edges;
} }