void FixupArrivingTurnRestriction(const NodeID node_u, const NodeID node_v, const NodeID node_w, const GraphT &graph) { BOOST_ASSERT(node_u != SPECIAL_NODEID); BOOST_ASSERT(node_v != SPECIAL_NODEID); BOOST_ASSERT(node_w != SPECIAL_NODEID); if (!IsViaNode(node_u)) { return; } // find all potential start edges. It is more efficient to get a (small) list // of potential start edges than iterating over all buckets std::vector<NodeID> predecessors; for (const EdgeID current_edge_id : graph.GetAdjacentEdgeRange(node_u)) { const NodeID target = graph.GetTarget(current_edge_id); if (node_v != target) { predecessors.push_back(target); } } for (const NodeID node_x : predecessors) { const auto restriction_iterator = m_restriction_map.find({node_x, node_u}); if (restriction_iterator == m_restriction_map.end()) { continue; } const unsigned index = restriction_iterator->second; auto &bucket = m_restriction_bucket_list.at(index); for (RestrictionTarget &restriction_target : bucket) { if (node_v == restriction_target.target_node) { restriction_target.target_node = node_w; } } } }
template <class Edge, typename GraphT> inline std::vector<Edge> toEdges(GraphT graph) { std::vector<Edge> edges; edges.reserve(graph.GetNumberOfEdges()); util::UnbufferedLog log; log << "Getting edges of minimized graph "; util::Percent p(log, graph.GetNumberOfNodes()); const NodeID number_of_nodes = graph.GetNumberOfNodes(); if (graph.GetNumberOfNodes()) { Edge new_edge; for (const auto node : util::irange(0u, number_of_nodes)) { p.PrintStatus(node); for (auto edge : graph.GetAdjacentEdgeRange(node)) { const NodeID target = graph.GetTarget(edge); const ContractorGraph::EdgeData &data = graph.GetEdgeData(edge); new_edge.source = node; new_edge.target = target; BOOST_ASSERT_MSG(SPECIAL_NODEID != new_edge.target, "Target id invalid"); new_edge.data.weight = data.weight; new_edge.data.duration = data.duration; new_edge.data.shortcut = data.shortcut; new_edge.data.turn_id = data.id; BOOST_ASSERT_MSG(new_edge.data.turn_id != INT_MAX, // 2^31 "edge id invalid"); new_edge.data.forward = data.forward; new_edge.data.backward = data.backward; edges.push_back(new_edge); } } } // sort and remove duplicates 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; }