create sentinel to adjancency array during preprocessing

This commit is contained in:
Dennis Luxen 2013-09-24 18:48:02 +02:00
parent 918e20b164
commit 14bd1d01f2
3 changed files with 27 additions and 5 deletions

View File

@ -88,7 +88,7 @@ public:
typename ShM<_StrNode, UseSharedMemory>::vector & nodes, typename ShM<_StrNode, UseSharedMemory>::vector & nodes,
typename ShM<_StrEdge, UseSharedMemory>::vector & edges typename ShM<_StrEdge, UseSharedMemory>::vector & edges
) { ) {
_numNodes = nodes.size(); _numNodes = nodes.size()-1;
_numEdges = edges.size(); _numEdges = edges.size();
_nodes.swap(nodes); _nodes.swap(nodes);
@ -97,8 +97,10 @@ public:
#ifndef NDEBUG #ifndef NDEBUG
Percent p(GetNumberOfNodes()); Percent p(GetNumberOfNodes());
for(unsigned u = 0; u < GetNumberOfNodes(); ++u) { for(unsigned u = 0; u < GetNumberOfNodes(); ++u) {
SimpleLogger().Write() << "[" << u << "], 1st: " << BeginEdges(u) << ", last: " << EndEdges(u);
for(unsigned eid = BeginEdges(u); eid < EndEdges(u); ++eid) { for(unsigned eid = BeginEdges(u); eid < EndEdges(u); ++eid) {
unsigned v = GetTarget(eid); unsigned v = GetTarget(eid);
SimpleLogger().Write() << "Edge (" << u << "," << v << ")";
EdgeData & data = GetEdgeData(eid); EdgeData & data = GetEdgeData(eid);
if(data.shortcut) { if(data.shortcut) {
unsigned eid2 = FindEdgeInEitherDirection(u, data.id); unsigned eid2 = FindEdgeInEitherDirection(u, data.id);

View File

@ -84,15 +84,18 @@ private:
typename ShM<typename QueryGraph::_StrNode, false>::vector node_list; typename ShM<typename QueryGraph::_StrNode, false>::vector node_list;
typename ShM<typename QueryGraph::_StrEdge, false>::vector edge_list; typename ShM<typename QueryGraph::_StrEdge, false>::vector edge_list;
SimpleLogger().Write() << "loading graph from " << hsgr_path.string();
m_number_of_nodes = readHSGRFromStream( m_number_of_nodes = readHSGRFromStream(
hsgr_path, hsgr_path,
node_list, node_list,
edge_list, edge_list,
&m_check_sum &m_check_sum
); );
BOOST_ASSERT_MSG(0 != node_list.size(), "node list empty"); BOOST_ASSERT_MSG(0 != node_list.size(), "node list empty");
BOOST_ASSERT_MSG(0 != edge_list.size(), "edge list empty"); BOOST_ASSERT_MSG(0 != edge_list.size(), "edge list empty");
SimpleLogger().Write() << "loaded " << node_list.size() << " nodes and " << edge_list.size() << " edges";
m_query_graph = new QueryGraph(node_list, edge_list); m_query_graph = new QueryGraph(node_list, edge_list);
BOOST_ASSERT_MSG(0 == node_list.size(), "node list not flushed"); BOOST_ASSERT_MSG(0 == node_list.size(), "node list not flushed");
@ -248,9 +251,13 @@ public:
//load data //load data
SimpleLogger().Write() << "loading graph data"; SimpleLogger().Write() << "loading graph data";
LoadGraph(hsgr_path); LoadGraph(hsgr_path);
SimpleLogger().Write() << "loading egde information";
LoadNodeAndEdgeInformation(node_data_path, edge_data_path); LoadNodeAndEdgeInformation(node_data_path, edge_data_path);
SimpleLogger().Write() << "loading r-tree";
LoadRTree(ram_index_path, file_index_path); LoadRTree(ram_index_path, file_index_path);
LoadTimestamp(hsgr_path); SimpleLogger().Write() << "loading timestamp";
LoadTimestamp(timestamp_path);
SimpleLogger().Write() << "loading street names";
LoadStreetNames(name_data_path); LoadStreetNames(name_data_path);
} }

View File

@ -269,6 +269,7 @@ int main (int argc, char *argv[]) {
std::ofstream hsgr_output_stream(graphOut.c_str(), std::ios::binary); std::ofstream hsgr_output_stream(graphOut.c_str(), std::ios::binary);
hsgr_output_stream.write((char*)&uuid_orig, sizeof(UUID) ); hsgr_output_stream.write((char*)&uuid_orig, sizeof(UUID) );
BOOST_FOREACH(const QueryEdge & edge, contractedEdgeList) { BOOST_FOREACH(const QueryEdge & edge, contractedEdgeList) {
SimpleLogger().Write() << "edge (" << edge.source << "," << edge.target << ")";
if(edge.source > numberOfNodes) { if(edge.source > numberOfNodes) {
numberOfNodes = edge.source; numberOfNodes = edge.source;
} }
@ -283,14 +284,26 @@ int main (int argc, char *argv[]) {
StaticGraph<EdgeData>::EdgeIterator edge = 0; StaticGraph<EdgeData>::EdgeIterator edge = 0;
StaticGraph<EdgeData>::EdgeIterator position = 0; StaticGraph<EdgeData>::EdgeIterator position = 0;
for ( StaticGraph<EdgeData>::NodeIterator node = 0; node <= numberOfNodes; ++node ) { for ( StaticGraph<EdgeData>::NodeIterator node = 0; node < numberOfNodes; ++node ) {
StaticGraph<EdgeData>::EdgeIterator lastEdge = edge; StaticGraph<EdgeData>::EdgeIterator lastEdge = edge;
while ( edge < numberOfEdges && contractedEdgeList[edge].source == node ) while ( edge < numberOfEdges && contractedEdgeList[edge].source == node )
++edge; ++edge;
_nodes[node].firstEdge = position; //=edge _nodes[node].firstEdge = position; //=edge
position += edge - lastEdge; //remove position += edge - lastEdge; //remove
SimpleLogger().Write() << "_nodes[" << node << "].firstEdge = " << _nodes[node].firstEdge;
} }
_nodes[_nodes.size()-1].firstEdge = _nodes[_nodes.size()-2].firstEdge;
SimpleLogger().Write() << "position: " << position;
++numberOfNodes; ++numberOfNodes;
SimpleLogger().Write() << "no. of nodes: " << numberOfNodes << ", edges: " << edge;
SimpleLogger().Write() << "_nodes.size(): " << _nodes.size();
for(unsigned i = 0; i < _nodes.size(); ++i) {
SimpleLogger().Write() << _nodes[i].firstEdge;
}
BOOST_ASSERT_MSG(_nodes.size() == numberOfNodes, "no. of nodes dont match");
//Serialize numberOfNodes, nodes //Serialize numberOfNodes, nodes
hsgr_output_stream.write((char*) &crc32OfNodeBasedEdgeList, sizeof(unsigned)); hsgr_output_stream.write((char*) &crc32OfNodeBasedEdgeList, sizeof(unsigned));
hsgr_output_stream.write((char*) &numberOfNodes, sizeof(unsigned)); hsgr_output_stream.write((char*) &numberOfNodes, sizeof(unsigned));