make sure all node-based edges are serialized in forward fashion

This commit is contained in:
Dennis Luxen 2014-07-04 17:33:18 +02:00
parent 6cfbd4cefe
commit ba0c17e287
2 changed files with 39 additions and 36 deletions

View File

@ -34,6 +34,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "../Util/TimingUtil.h" #include "../Util/TimingUtil.h"
#include <boost/assert.hpp> #include <boost/assert.hpp>
#include <boost/range.hpp>
#include <fstream> #include <fstream>
#include <limits> #include <limits>
@ -77,20 +78,16 @@ void EdgeBasedGraphFactory::GetEdgeBasedNodes(std::vector<EdgeBasedNode> &nodes)
} }
void void
EdgeBasedGraphFactory::InsertEdgeBasedNode(NodeID u, NodeID v, EdgeID e1, bool belongs_to_tiny_cc) EdgeBasedGraphFactory::InsertEdgeBasedNode(const NodeID u, const NodeID v, const bool belongs_to_tiny_cc)
{ {
// merge edges together into one EdgeBasedNode // merge edges together into one EdgeBasedNode
BOOST_ASSERT(u != SPECIAL_NODEID); BOOST_ASSERT(u != SPECIAL_NODEID);
BOOST_ASSERT(v != SPECIAL_NODEID); BOOST_ASSERT(v != SPECIAL_NODEID);
BOOST_ASSERT(e1 != SPECIAL_EDGEID);
#ifndef NDEBUG
// find forward edge id and // find forward edge id and
const EdgeID e1b = m_node_based_graph->FindEdge(u, v); const EdgeID e1 = m_node_based_graph->FindEdge(u, v);
BOOST_ASSERT(e1 == e1b);
#endif
BOOST_ASSERT(e1 != SPECIAL_EDGEID); BOOST_ASSERT(e1 != SPECIAL_EDGEID);
const EdgeData &forward_data = m_node_based_graph->GetEdgeData(e1); const EdgeData &forward_data = m_node_based_graph->GetEdgeData(e1);
// find reverse edge id and // find reverse edge id and
@ -125,6 +122,8 @@ EdgeBasedGraphFactory::InsertEdgeBasedNode(NodeID u, NodeID v, EdgeID e1, bool b
m_geometry_compressor.GetBucketReference(e2); m_geometry_compressor.GetBucketReference(e2);
BOOST_ASSERT(forward_geometry.size() == reverse_geometry.size()); BOOST_ASSERT(forward_geometry.size() == reverse_geometry.size());
BOOST_ASSERT(0 != forward_geometry.size()); BOOST_ASSERT(0 != forward_geometry.size());
const unsigned geometry_size = forward_geometry.size();
BOOST_ASSERT(geometry_size > 1);
// reconstruct bidirectional edge with individual weights and put each into the NN index // reconstruct bidirectional edge with individual weights and put each into the NN index
@ -135,7 +134,7 @@ EdgeBasedGraphFactory::InsertEdgeBasedNode(NodeID u, NodeID v, EdgeID e1, bool b
// TODO: move to lambda function with C++11 // TODO: move to lambda function with C++11
int temp_sum = 0; int temp_sum = 0;
for (unsigned i = 0; i < forward_geometry.size(); ++i) for (const auto i : boost::irange(0u, geometry_size))
{ {
forward_dist_prefix_sum[i] = temp_sum; forward_dist_prefix_sum[i] = temp_sum;
temp_sum += forward_geometry[i].second; temp_sum += forward_geometry[i].second;
@ -144,20 +143,16 @@ EdgeBasedGraphFactory::InsertEdgeBasedNode(NodeID u, NodeID v, EdgeID e1, bool b
} }
temp_sum = 0; temp_sum = 0;
for (unsigned i = 0; i < reverse_geometry.size(); ++i) for (const auto i : boost::irange(0u, geometry_size))
{ {
temp_sum += reverse_geometry[reverse_geometry.size() - 1 - i].second; temp_sum += reverse_geometry[reverse_geometry.size() - 1 - i].second;
reverse_dist_prefix_sum[i] = reverse_data.distance - temp_sum; reverse_dist_prefix_sum[i] = reverse_data.distance - temp_sum;
BOOST_ASSERT(reverse_data.distance >= temp_sum); // BOOST_ASSERT(reverse_data.distance >= temp_sum);
} }
BOOST_ASSERT(forward_geometry.size() == reverse_geometry.size());
const unsigned geometry_size = forward_geometry.size();
BOOST_ASSERT(geometry_size > 1);
NodeID current_edge_source_coordinate_id = u; NodeID current_edge_source_coordinate_id = u;
if (forward_data.edgeBasedNodeID != SPECIAL_NODEID) if (SPECIAL_NODEID != forward_data.edgeBasedNodeID)
{ {
max_id = std::max(forward_data.edgeBasedNodeID, max_id); max_id = std::max(forward_data.edgeBasedNodeID, max_id);
} }
@ -167,7 +162,7 @@ EdgeBasedGraphFactory::InsertEdgeBasedNode(NodeID u, NodeID v, EdgeID e1, bool b
} }
// traverse arrays from start and end respectively // traverse arrays from start and end respectively
for (unsigned i = 0; i < geometry_size; ++i) for (const auto i : boost::irange(0u, geometry_size))
{ {
BOOST_ASSERT(current_edge_source_coordinate_id == BOOST_ASSERT(current_edge_source_coordinate_id ==
reverse_geometry[geometry_size - 1 - i].first); reverse_geometry[geometry_size - 1 - i].first);
@ -225,18 +220,18 @@ EdgeBasedGraphFactory::InsertEdgeBasedNode(NodeID u, NodeID v, EdgeID e1, bool b
BOOST_ASSERT(forward_data.edgeBasedNodeID != SPECIAL_NODEID || BOOST_ASSERT(forward_data.edgeBasedNodeID != SPECIAL_NODEID ||
reverse_data.edgeBasedNodeID != SPECIAL_NODEID); reverse_data.edgeBasedNodeID != SPECIAL_NODEID);
m_edge_based_node_list.emplace_back(EdgeBasedNode(forward_data.edgeBasedNodeID, m_edge_based_node_list.emplace_back(forward_data.edgeBasedNodeID,
reverse_data.edgeBasedNodeID, reverse_data.edgeBasedNodeID,
u, u,
v, v,
forward_data.nameID, forward_data.nameID,
forward_data.distance, forward_data.distance,
reverse_data.distance, reverse_data.distance,
0, 0,
0, 0,
SPECIAL_EDGEID, SPECIAL_EDGEID,
0, 0,
belongs_to_tiny_cc)); belongs_to_tiny_cc);
BOOST_ASSERT(!m_edge_based_node_list.back().IsCompressed()); BOOST_ASSERT(!m_edge_based_node_list.back().IsCompressed());
} }
} }
@ -292,7 +287,7 @@ void EdgeBasedGraphFactory::CompressGeometry()
Percent p(original_number_of_nodes); Percent p(original_number_of_nodes);
unsigned removed_node_count = 0; unsigned removed_node_count = 0;
for (NodeID v = 0; v < original_number_of_nodes; ++v) for (const NodeID v : boost::irange(0u, original_number_of_nodes))
{ {
p.printStatus(v); p.printStatus(v);
@ -422,7 +417,8 @@ void EdgeBasedGraphFactory::CompressGeometry()
unsigned new_node_count = 0; unsigned new_node_count = 0;
unsigned new_edge_count = 0; unsigned new_edge_count = 0;
for (unsigned i = 0; i < m_node_based_graph->GetNumberOfNodes(); ++i)
for(const auto i : boost::irange(0u, m_node_based_graph->GetNumberOfNodes()))
{ {
if (m_node_based_graph->GetOutDegree(i) > 0) if (m_node_based_graph->GetOutDegree(i) > 0)
{ {
@ -493,10 +489,10 @@ void EdgeBasedGraphFactory::GenerateEdgeExpandedNodes()
for (EdgeID e1 : m_node_based_graph->GetAdjacentEdgeRange(u)) for (EdgeID e1 : m_node_based_graph->GetAdjacentEdgeRange(u))
{ {
const EdgeData &edge_data = m_node_based_graph->GetEdgeData(e1); const EdgeData &edge_data = m_node_based_graph->GetEdgeData(e1);
if (edge_data.edgeBasedNodeID == SPECIAL_NODEID) // if (edge_data.edgeBasedNodeID == SPECIAL_NODEID)
{ // {
// continue; // continue;
} // }
BOOST_ASSERT(e1 != SPECIAL_EDGEID); BOOST_ASSERT(e1 != SPECIAL_EDGEID);
const NodeID v = m_node_based_graph->GetTarget(e1); const NodeID v = m_node_based_graph->GetTarget(e1);
@ -516,7 +512,14 @@ void EdgeBasedGraphFactory::GenerateEdgeExpandedNodes()
component_explorer.GetComponentSize(v)); component_explorer.GetComponentSize(v));
const bool component_is_tiny = (size_of_component < 1000); const bool component_is_tiny = (size_of_component < 1000);
InsertEdgeBasedNode(u, v, e1, component_is_tiny); if (edge_data.edgeBasedNodeID == SPECIAL_NODEID)
{
InsertEdgeBasedNode(v, u, component_is_tiny);
}
else
{
InsertEdgeBasedNode(u, v, component_is_tiny);
}
} }
} }

View File

@ -115,7 +115,7 @@ class EdgeBasedGraphFactory
void GenerateEdgeExpandedEdges(const std::string &original_edge_data_filename, void GenerateEdgeExpandedEdges(const std::string &original_edge_data_filename,
lua_State *lua_state); lua_State *lua_state);
void InsertEdgeBasedNode(NodeID u, NodeID v, EdgeID e1, bool belongsToTinyComponent); void InsertEdgeBasedNode(const NodeID u, const NodeID v, const bool belongsToTinyComponent);
void FlushVectorToStream(std::ofstream &edge_data_file, void FlushVectorToStream(std::ofstream &edge_data_file,
std::vector<OriginalEdgeData> &original_edge_data_vector) const; std::vector<OriginalEdgeData> &original_edge_data_vector) const;