Verify graph before compression
This commit is contained in:
parent
b7c8fcd062
commit
aba3ec692f
@ -40,6 +40,37 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#include <iomanip>
|
||||
#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,
|
||||
std::unique_ptr<std::vector<NodeID>> barrier_node_list,
|
||||
@ -234,6 +265,31 @@ void EdgeBasedGraphFactory::Run(const std::string &original_edge_data_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);
|
||||
@ -410,6 +466,27 @@ 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
|
||||
|
||||
}
|
||||
}
|
||||
SimpleLogger().Write() << "removed " << removed_node_count << " nodes";
|
||||
|
Loading…
Reference in New Issue
Block a user