From 76488c58e876ba86b836643634950ec0d04c7009 Mon Sep 17 00:00:00 2001 From: Dennis Luxen Date: Thu, 23 Sep 2010 15:34:22 +0000 Subject: [PATCH] Preparing data structures for turn directions --- Contractor/ContractionCleanup.h | 14 +++++++++----- Contractor/Contractor.h | 27 +++++++++++++++++---------- Contractor/GraphLoader.h | 4 ++-- Contractor/SearchEngine.h | 26 ++++++++++++++++++++------ DataStructures/ImportEdge.h | 6 ++++-- HttpServer/request_handler.h | 8 +++++--- createHierarchy.cpp | 2 +- 7 files changed, 58 insertions(+), 29 deletions(-) diff --git a/Contractor/ContractionCleanup.h b/Contractor/ContractionCleanup.h index 12961fc94..1471d56ba 100644 --- a/Contractor/ContractionCleanup.h +++ b/Contractor/ContractionCleanup.h @@ -60,6 +60,10 @@ private: delete _heapForward; } }; + union _MiddleName { + NodeID nameID; + NodeID middle; + }; public: @@ -71,7 +75,7 @@ public: bool shortcut : 1; bool forward : 1; bool backward : 1; - NodeID middle; + _MiddleName middleName; } data; //sorts by source and other attributes @@ -88,7 +92,7 @@ public: } bool operator== ( const Edge& right ) const { - return ( source == right.source && target == right.target && data.distance == right.data.distance && data.shortcut == right.data.shortcut && data.forward == right.data.forward && data.backward == right.data.backward && data.middle == right.data.middle ); + return ( source == right.source && target == right.target && data.distance == right.data.distance && data.shortcut == right.data.shortcut && data.forward == right.data.forward && data.backward == right.data.backward && data.middleName.middle == right.data.middleName.middle ); } }; @@ -118,7 +122,7 @@ public: newEdge.data.distance = _graph[edge].data.distance; newEdge.data.shortcut = _graph[edge].data.shortcut; if ( newEdge.data.shortcut ) - newEdge.data.middle = _graph[edge].data.middle; + newEdge.data.middleName = _graph[edge].data.middleName; newEdge.data.forward = _graph[edge].data.forward; newEdge.data.backward = _graph[edge].data.backward; edges.push_back( newEdge ); @@ -211,7 +215,7 @@ private: Contractor::Witness temp; temp.source = _graph[i].source; temp.target = _graph[i].target; - temp.middle = _graph[i].data.middle; + temp.middleName.middle = _graph[i].data.middleName.middle; } } if ( _graph[i].data.backward ) { @@ -222,7 +226,7 @@ private: Contractor::Witness temp; temp.source = _graph[i].target; temp.target = _graph[i].source; - temp.middle = _graph[i].data.middle; + temp.middleName.middle = _graph[i].data.middleName.middle; } } } diff --git a/Contractor/Contractor.h b/Contractor/Contractor.h index 1e7777c92..0248b23f5 100644 --- a/Contractor/Contractor.h +++ b/Contractor/Contractor.h @@ -36,23 +36,29 @@ or see http://www.gnu.org/licenses/agpl.txt. class Contractor { +private: + + union _MiddleName { + NodeID middle; + NodeID nameID; + }; + public: struct Witness { NodeID source; NodeID target; - NodeID middle; + _MiddleName middleName; }; private: - struct _EdgeData { int distance; unsigned originalEdges : 29; bool shortcut : 1; bool forward : 1; bool backward : 1; - NodeID middle; + _MiddleName middleName; } data; struct _HeapData { @@ -192,7 +198,7 @@ public: continue; } edge.data.shortcut = false; - edge.data.middle = 0; + edge.data.middleName.nameID = i->name(); edge.data.forward = i->isForward(); edge.data.backward = i->isBackward(); edge.data.originalEdges = 1; @@ -223,7 +229,7 @@ public: forwardEdge.target = backwardEdge.target = target; forwardEdge.data.forward = backwardEdge.data.backward = true; forwardEdge.data.backward = backwardEdge.data.forward = false; - forwardEdge.data.middle = backwardEdge.data.middle = 0; + forwardEdge.data.middleName.nameID = backwardEdge.data.middleName.nameID = 0; forwardEdge.data.shortcut = backwardEdge.data.shortcut = false; forwardEdge.data.originalEdges = backwardEdge.data.originalEdges = 1; forwardEdge.data.distance = backwardEdge.data.distance = std::numeric_limits< int >::max(); @@ -388,7 +394,7 @@ public: continue; if ( data.shortcut != edge.data.shortcut ) continue; - if ( data.middle != edge.data.middle ) + if ( data.middleName.middle != edge.data.middleName.middle ) continue; data.forward |= edge.data.forward; data.backward |= edge.data.backward; @@ -451,7 +457,7 @@ public: newEdge.target = target; newEdge.data.distance = data.distance; newEdge.data.shortcut = data.shortcut; - newEdge.data.middle = data.middle; + newEdge.data.middleName.middle = data.middleName.middle; newEdge.data.forward = data.forward; newEdge.data.backward = data.backward; edges.push_back( newEdge ); @@ -526,7 +532,7 @@ private: const NodeID start = node; const NodeID target = _graph->GetTarget( edge ); const _EdgeData& data = _graph->GetEdgeData( edge ); - const NodeID middle = data.middle; + const NodeID middle = data.middleName.middle; assert(start != target); if(data.shortcut) { @@ -541,7 +547,8 @@ private: return false; } } else { - assert(data.middle == 0); + //can't rely on that, because we save the nameID instead + assert(data.middleName.nameID == 0); } } } @@ -604,7 +611,7 @@ private: newEdge.data.distance = pathDistance; newEdge.data.forward = true; newEdge.data.backward = false; - newEdge.data.middle = node; + newEdge.data.middleName.middle = node; newEdge.data.shortcut = true; newEdge.data.originalEdges = outData.originalEdges + inData.originalEdges; data->insertedEdges.push_back( newEdge ); diff --git a/Contractor/GraphLoader.h b/Contractor/GraphLoader.h index 858d157d1..a01d63a47 100644 --- a/Contractor/GraphLoader.h +++ b/Contractor/GraphLoader.h @@ -92,7 +92,7 @@ NodeID readOSRMGraphFromStream(istream &in, vector& edgeList, vector * edgeList) { in.read((char *)&(middle), sizeof(NodeID)); in.read((char *)&(source), sizeof(NodeID)); in.read((char *)&(target), sizeof(NodeID)); - e.backward = backward; e.distance = distance; e.forward = forward; e.middle = middle; e.shortcut = shortcut; + e.backward = backward; e.distance = distance; e.forward = forward; e.middleName.middle = middle; e.shortcut = shortcut; g.data = e; g.source = source; g.target = target; edgeList->push_back(g); diff --git a/Contractor/SearchEngine.h b/Contractor/SearchEngine.h index 5c71833c4..cb7f4c43f 100644 --- a/Contractor/SearchEngine.h +++ b/Contractor/SearchEngine.h @@ -56,7 +56,7 @@ public: return nodeHelpDesk->getNumberOfNodes(); } - unsigned int ComputeRoute(PhantomNodes * phantomNodes, vector * path, _Coordinate& startCoord, _Coordinate& targetCoord) + unsigned int ComputeRoute(PhantomNodes * phantomNodes, vector > * path, _Coordinate& startCoord, _Coordinate& targetCoord) { bool onSameEdge = false; bool onSameEdgeReversed = false; @@ -189,9 +189,12 @@ public: packedPath.push_back( pathNode ); } + + // push start node explicitely - path->push_back(packedPath[0]); - // if(packedPath[0] != packedPath[1]) + NodeID nameID = GetNameIDForOriginDestinationNodeID(phantomNodes->startNode1, packedPath[0]); + + path->push_back(std::make_pair(packedPath[0], nameID) ); { for(deque::size_type i = 0; i < packedPath.size()-1; i++) { @@ -239,6 +242,16 @@ public: { nodeHelpDesk->FindRoutingStarts(start, target, routingStarts); } + + inline NodeID GetNameIDForOriginDestinationNodeID(NodeID s, NodeID t) const { + assert(s!=t); + EdgeID e = _graph->FindEdge( s, t ); + if(e == UINT_MAX) + e = _graph->FindEdge( t, s ); + assert(e != UINT_MAX); + const EdgeData ed = _graph->GetEdgeData(e); + return ed.middleName.nameID; + } private: NodeHelperT * nodeHelpDesk; @@ -281,7 +294,7 @@ private: } } - bool _UnpackEdge( const NodeID source, const NodeID target, std::vector< NodeID >* path ) { + bool _UnpackEdge( const NodeID source, const NodeID target, std::vector< std::pair >* path ) { assert(source != target); //find edge first. typename GraphT::EdgeIterator smallestEdge = SPECIAL_EDGEID; @@ -315,13 +328,14 @@ private: const EdgeData ed = _graph->GetEdgeData(smallestEdge); if(ed.shortcut) {//unpack - const NodeID middle = ed.middle; + const NodeID middle = ed.middleName.middle; _UnpackEdge(source, middle, path); _UnpackEdge(middle, target, path); return false; } else { assert(!ed.shortcut); - path->push_back(target); + //todo: push nameID along with target as a pair: push_back(std::make_pair(target, nameID)) + path->push_back(std::make_pair(target, ed.middleName.nameID) ); return true; } } diff --git a/DataStructures/ImportEdge.h b/DataStructures/ImportEdge.h index 954527b0f..14346cfe5 100644 --- a/DataStructures/ImportEdge.h +++ b/DataStructures/ImportEdge.h @@ -44,10 +44,11 @@ public: /** Default constructor. target and weight are set to 0.*/ Edge() { assert(false); } //shall not be used. - explicit Edge(NodeID s, NodeID t, EdgeWeight w, bool f, bool b, bool l) : _source(s), _target(t), _weight(w), forward(f), backward(b), locatable(l) { } + explicit Edge(NodeID s, NodeID t, NodeID n, EdgeWeight w, bool f, bool b, bool l) : _source(s), _target(t), _name(n), _weight(w), forward(f), backward(b), locatable(l) { } NodeID target() const {return _target; } - NodeID source() const {return _source;} + NodeID source() const {return _source; } + NodeID name() const { return _name; } EdgeWeight weight() const {return _weight; } bool isBackward() const { return backward; } @@ -59,6 +60,7 @@ public: private: NodeID _source; NodeID _target; + NodeID _name; EdgeWeight _weight:29; bool forward:1; bool backward:1; diff --git a/HttpServer/request_handler.h b/HttpServer/request_handler.h index be579054d..17061a664 100644 --- a/HttpServer/request_handler.h +++ b/HttpServer/request_handler.h @@ -107,7 +107,7 @@ public: //cout << "coordinates in " << timestamp2 - timestamp << "s" << endl; - vector * path = new vector(); + vector > * path = new vector >(); PhantomNodes * phantomNodes = new PhantomNodes(); // timestamp = get_timestamp(); sEngine->FindRoutingStarts(startCoord, targetCoord, phantomNodes); @@ -157,10 +157,11 @@ public: rep.content += tmp; rep.content += (" "); + _Coordinate result; - for(vector::iterator it = path->begin(); it != path->end(); it++) + for(vector >::iterator it = path->begin(); it != path->end(); it++) { - sEngine->getNodeInfo(*it, result); + sEngine->getNodeInfo(it->first, result); convertLatLon(result.lon, tmp); rep.content += tmp; rep.content += (","); @@ -168,6 +169,7 @@ public: rep.content += tmp; rep.content += (" "); } + convertLatLon(phantomNodes->targetCoord.lon, tmp); rep.content += tmp; rep.content += (","); diff --git a/createHierarchy.cpp b/createHierarchy.cpp index 78c9c44ef..a7acb0352 100644 --- a/createHierarchy.cpp +++ b/createHierarchy.cpp @@ -156,7 +156,7 @@ int main (int argc, char *argv[]) bool shortcut= it->data.shortcut; bool forward= it->data.forward; bool backward= it->data.backward; - NodeID middle= it->data.middle; + NodeID middle= it->data.middleName.middle; NodeID source = it->source; NodeID target = it->target;