Direct edges in contractor correctly and add better graph validation.

This commit is contained in:
Patrick Niklaus
2015-05-24 17:25:38 +02:00
parent aba3ec692f
commit 2777d53a12
4 changed files with 232 additions and 233 deletions
+15 -77
View File
@@ -41,35 +41,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <limits>
bool checkInvariant(const NodeBasedDynamicGraph& graph, const NodeID source, const EdgeID edge)
{
const auto& data = graph.GetEdgeData(edge);
if (!data.forward)
{
auto target = graph.GetTarget(edge);
if (target == SPECIAL_NODEID)
{
SimpleLogger().Write(logWARNING) << "Invalid target";
return false;
}
auto rev_edge = graph.FindEdge(target, source);
if (rev_edge == SPECIAL_EDGEID)
{
SimpleLogger().Write(logWARNING) << "Edge not found";
return false;
}
const auto& rev_data = graph.GetEdgeData(rev_edge);
if (!rev_data.forward)
{
SimpleLogger().Write(logWARNING) << "Reverse edge is not forward";
return false;
}
}
return true;
}
EdgeBasedGraphFactory::EdgeBasedGraphFactory(std::shared_ptr<NodeBasedDynamicGraph> node_based_graph,
std::shared_ptr<RestrictionMap> restriction_map,
@@ -264,32 +235,6 @@ void EdgeBasedGraphFactory::Run(const std::string &original_edge_data_filename,
const std::string &geometry_filename,
lua_State *lua_state)
{
#ifndef NDEBUG
SimpleLogger().Write() << "Verifying the graph structure before compression:";
for (const auto current_node : osrm::irange(0u, m_node_based_graph->GetNumberOfNodes()))
{
for (const auto current_edge : m_node_based_graph->GetAdjacentEdgeRange(current_node))
{
EdgeData &edge_data = m_node_based_graph->GetEdgeData(current_edge);
if (!edge_data.forward)
{
auto target = m_node_based_graph->GetTarget(current_edge);
BOOST_ASSERT(target != SPECIAL_NODEID);
auto rev_edge = m_node_based_graph->FindEdge(target, current_node);
BOOST_ASSERT(rev_edge != SPECIAL_EDGEID);
const auto& rev_data = m_node_based_graph->GetEdgeData(rev_edge);
BOOST_ASSERT(rev_data.forward);
continue;
}
}
}
SimpleLogger().Write() << " -> graph is ok.";
#endif
TIMER_START(geometry);
CompressGeometry();
TIMER_STOP(geometry);
@@ -466,28 +411,20 @@ void EdgeBasedGraphFactory::CompressGeometry()
reverse_weight2 + (has_node_penalty ? speed_profile.traffic_signal_penalty : 0));
++removed_node_count;
#ifndef NDEBUG
if (!checkInvariant(*m_node_based_graph, node_u, forward_e1))
{
SimpleLogger().Write(logWARNING) << "Contracting " << node_u << " " << node_v << " " << node_w;
SimpleLogger().Write(logWARNING) << " coordinates "
<< "(" << m_node_info_list[node_u].lat << ", " << m_node_info_list[node_u].lon << ") "
<< "(" << m_node_info_list[node_v].lat << ", " << m_node_info_list[node_v].lon << ") "
<< "(" << m_node_info_list[node_w].lat << ", " << m_node_info_list[node_w].lon << ") ";
BOOST_ASSERT_MSG(false, "Graph invariant is not fulfilled.");
}
if (!checkInvariant(*m_node_based_graph, node_w, reverse_e1))
{
SimpleLogger().Write(logWARNING) << "Contracting " << node_u << " " << node_v << " " << node_w;
SimpleLogger().Write(logWARNING) << " coordinates "
<< "(" << m_node_info_list[node_u].lat << ", " << m_node_info_list[node_u].lon << ") "
<< "(" << m_node_info_list[node_v].lat << ", " << m_node_info_list[node_v].lon << ") "
<< "(" << m_node_info_list[node_w].lat << ", " << m_node_info_list[node_w].lon << ") ";
BOOST_ASSERT_MSG(false, "Graph invariant is not fulfilled.");
}
#endif
}
#ifndef NDEBUG
if (!validateNeighborHood(*m_node_based_graph, node_v))
{
SimpleLogger().Write(logWARNING) << "Contracting " << node_u << " " << node_v << " " << node_w;
SimpleLogger().Write(logWARNING) << " coordinates "
<< "(" << (m_node_info_list[node_u].lat/COORDINATE_PRECISION) << ", " << (m_node_info_list[node_u].lon/COORDINATE_PRECISION) << ") "
<< "(" << (m_node_info_list[node_v].lat/COORDINATE_PRECISION) << ", " << (m_node_info_list[node_v].lon/COORDINATE_PRECISION) << ") "
<< "(" << (m_node_info_list[node_w].lat/COORDINATE_PRECISION) << ", " << (m_node_info_list[node_w].lon/COORDINATE_PRECISION) << ") ";
BOOST_ASSERT_MSG(false, "Graph invariant is not fulfilled.");
}
#endif
}
SimpleLogger().Write() << "removed " << removed_node_count << " nodes";
m_geometry_compressor.PrintStatistics();
@@ -515,14 +452,15 @@ void EdgeBasedGraphFactory::CompressGeometry()
*/
void EdgeBasedGraphFactory::RenumberEdges()
{
// renumber edge based node IDs
// renumber edge based node of outgoing edges
unsigned numbered_edges_count = 0;
for (const auto current_node : osrm::irange(0u, m_node_based_graph->GetNumberOfNodes()))
{
for (const auto current_edge : m_node_based_graph->GetAdjacentEdgeRange(current_node))
{
EdgeData &edge_data = m_node_based_graph->GetEdgeData(current_edge);
// FIXME when does that happen? why can we skip here?
// this edge is an incoming edge
if (!edge_data.forward)
{
continue;