unsigned GetDirectedOutDegree(const NodeIterator n) const { unsigned degree = 0; for (const auto edge : osrm::irange(BeginEdges(n), EndEdges(n))) { if (GetEdgeData(edge).forward) { ++degree; } } return degree; }
// searches for a specific edge EdgeIterator FindSmallestEdge(const NodeIterator from, const NodeIterator to) const { EdgeIterator smallest_edge = SPECIAL_EDGEID; EdgeWeight smallest_weight = INVALID_EDGE_WEIGHT; for (auto edge : GetAdjacentEdgeRange(from)) { const NodeID target = GetTarget(edge); const EdgeWeight weight = GetEdgeData(edge).distance; if (target == to && weight < smallest_weight) { smallest_edge = edge; smallest_weight = weight; } } return smallest_edge; }
EdgeIterator FindSmallestEdge(const NodeIterator from, const NodeIterator to, FilterFunction &&filter) const { static_assert(traits::HasDataMember<EdgeArrayEntry>::value, "Filtering on .data not possible without .data member attribute"); EdgeIterator smallest_edge = SPECIAL_EDGEID; EdgeWeight smallest_weight = INVALID_EDGE_WEIGHT; for (auto edge : GetAdjacentEdgeRange(from)) { const NodeID target = GetTarget(edge); const auto &data = GetEdgeData(edge); if (target == to && data.weight < smallest_weight && std::forward<FilterFunction>(filter)(data)) { smallest_edge = edge; smallest_weight = data.weight; } } return smallest_edge; }
int main(int argc, char *argv[]) { LogPolicy::GetInstance().Unmute(); try { if (argc != 2) { SimpleLogger().Write(logWARNING) << "usage: " << argv[0] << " <file.hsgr>"; return 1; } boost::filesystem::path hsgr_path(argv[1]); std::vector<QueryGraph::NodeArrayEntry> node_list; std::vector<QueryGraph::EdgeArrayEntry> edge_list; SimpleLogger().Write() << "loading graph from " << hsgr_path.string(); unsigned m_check_sum = 0; unsigned m_number_of_nodes = readHSGRFromStream(hsgr_path, node_list, edge_list, &m_check_sum); SimpleLogger().Write() << "expecting " << m_number_of_nodes << " nodes, checksum: " << m_check_sum; BOOST_ASSERT_MSG(0 != node_list.size(), "node list empty"); SimpleLogger().Write() << "loaded " << node_list.size() << " nodes and " << edge_list.size() << " edges"; auto m_query_graph = std::make_shared<QueryGraph>(node_list, edge_list); BOOST_ASSERT_MSG(0 == node_list.size(), "node list not flushed"); BOOST_ASSERT_MSG(0 == edge_list.size(), "edge list not flushed"); Percent progress(m_query_graph->GetNumberOfNodes()); for (const auto node_u : osrm::irange(0u, m_query_graph->GetNumberOfNodes())) { for (const auto eid : m_query_graph->GetAdjacentEdgeRange(node_u)) { const EdgeData &data = m_query_graph->GetEdgeData(eid); if (!data.shortcut) { continue; } const unsigned node_v = m_query_graph->GetTarget(eid); const EdgeID edge_id_1 = m_query_graph->FindEdgeInEitherDirection(node_u, data.id); if (SPECIAL_EDGEID == edge_id_1) { throw osrm::exception("cannot find first segment of edge (" + std::to_string(node_u) + "," + std::to_string(data.id) + "," + std::to_string(node_v) + "), eid: " + std::to_string(eid)); } const EdgeID edge_id_2 = m_query_graph->FindEdgeInEitherDirection(data.id, node_v); if (SPECIAL_EDGEID == edge_id_2) { throw osrm::exception("cannot find second segment of edge (" + std::to_string(node_u) + "," + std::to_string(data.id) + "," + std::to_string(node_v) + "), eid: " + std::to_string(eid)); } } progress.printStatus(node_u); } m_query_graph.reset(); SimpleLogger().Write() << "Data file " << argv[0] << " appears to be OK"; } catch (const std::exception &e) { SimpleLogger().Write(logWARNING) << "[exception] " << e.what(); } return 0; }