コード例 #1
0
 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;
 }
コード例 #2
0
 // 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;
 }
コード例 #3
0
    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;
    }
コード例 #4
0
ファイル: check-hsgr.cpp プロジェクト: Gozhack/osrm-backend
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;
}