create sentinel to adjancency array during preprocessing

This commit is contained in:
Dennis Luxen 2013-09-24 18:48:02 +02:00
parent 999f50dce9
commit 5a04700bae
3 changed files with 27 additions and 5 deletions

View File

@ -95,7 +95,7 @@ public:
typename ShM<_StrNode, UseSharedMemory>::vector & nodes,
typename ShM<_StrEdge, UseSharedMemory>::vector & edges
) {
_numNodes = nodes.size();
_numNodes = nodes.size()-1;
_numEdges = edges.size();
_nodes.swap(nodes);
@ -104,8 +104,10 @@ public:
#ifndef NDEBUG
Percent p(GetNumberOfNodes());
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) {
unsigned v = GetTarget(eid);
SimpleLogger().Write() << "Edge (" << u << "," << v << ")";
EdgeData & data = GetEdgeData(eid);
if(data.shortcut) {
unsigned eid2 = FindEdgeInEitherDirection(u, data.id);

View File

@ -82,7 +82,9 @@ private:
void LoadGraph(const boost::filesystem::path & hsgr_path) {
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(
hsgr_path,
@ -90,9 +92,10 @@ private:
edge_list,
&m_check_sum
);
BOOST_ASSERT_MSG(0 != node_list.size(), "node 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);
BOOST_ASSERT_MSG(0 == node_list.size(), "node list not flushed");
@ -248,9 +251,13 @@ public:
//load data
SimpleLogger().Write() << "loading graph data";
LoadGraph(hsgr_path);
SimpleLogger().Write() << "loading egde information";
LoadNodeAndEdgeInformation(node_data_path, edge_data_path);
SimpleLogger().Write() << "loading r-tree";
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);
}

View File

@ -332,6 +332,7 @@ int main (int argc, char *argv[]) {
std::ofstream hsgr_output_stream(graphOut.c_str(), std::ios::binary);
hsgr_output_stream.write((char*)&uuid_orig, sizeof(UUID) );
BOOST_FOREACH(const QueryEdge & edge, contractedEdgeList) {
SimpleLogger().Write() << "edge (" << edge.source << "," << edge.target << ")";
if(edge.source > numberOfNodes) {
numberOfNodes = edge.source;
}
@ -346,14 +347,26 @@ int main (int argc, char *argv[]) {
StaticGraph<EdgeData>::EdgeIterator edge = 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;
while ( edge < numberOfEdges && contractedEdgeList[edge].source == node )
++edge;
_nodes[node].firstEdge = position; //=edge
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;
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
hsgr_output_stream.write((char*) &crc32OfNodeBasedEdgeList, sizeof(unsigned));
hsgr_output_stream.write((char*) &numberOfNodes, sizeof(unsigned));