Preparing data structures for turn directions

This commit is contained in:
Dennis Luxen 2010-09-23 15:34:22 +00:00
parent 586e8b4c4b
commit 76488c58e8
7 changed files with 58 additions and 29 deletions

View File

@ -60,6 +60,10 @@ private:
delete _heapForward; delete _heapForward;
} }
}; };
union _MiddleName {
NodeID nameID;
NodeID middle;
};
public: public:
@ -71,7 +75,7 @@ public:
bool shortcut : 1; bool shortcut : 1;
bool forward : 1; bool forward : 1;
bool backward : 1; bool backward : 1;
NodeID middle; _MiddleName middleName;
} data; } data;
//sorts by source and other attributes //sorts by source and other attributes
@ -88,7 +92,7 @@ public:
} }
bool operator== ( const Edge& right ) const { 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.distance = _graph[edge].data.distance;
newEdge.data.shortcut = _graph[edge].data.shortcut; newEdge.data.shortcut = _graph[edge].data.shortcut;
if ( newEdge.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.forward = _graph[edge].data.forward;
newEdge.data.backward = _graph[edge].data.backward; newEdge.data.backward = _graph[edge].data.backward;
edges.push_back( newEdge ); edges.push_back( newEdge );
@ -211,7 +215,7 @@ private:
Contractor::Witness temp; Contractor::Witness temp;
temp.source = _graph[i].source; temp.source = _graph[i].source;
temp.target = _graph[i].target; temp.target = _graph[i].target;
temp.middle = _graph[i].data.middle; temp.middleName.middle = _graph[i].data.middleName.middle;
} }
} }
if ( _graph[i].data.backward ) { if ( _graph[i].data.backward ) {
@ -222,7 +226,7 @@ private:
Contractor::Witness temp; Contractor::Witness temp;
temp.source = _graph[i].target; temp.source = _graph[i].target;
temp.target = _graph[i].source; temp.target = _graph[i].source;
temp.middle = _graph[i].data.middle; temp.middleName.middle = _graph[i].data.middleName.middle;
} }
} }
} }

View File

@ -36,23 +36,29 @@ or see http://www.gnu.org/licenses/agpl.txt.
class Contractor { class Contractor {
private:
union _MiddleName {
NodeID middle;
NodeID nameID;
};
public: public:
struct Witness { struct Witness {
NodeID source; NodeID source;
NodeID target; NodeID target;
NodeID middle; _MiddleName middleName;
}; };
private: private:
struct _EdgeData { struct _EdgeData {
int distance; int distance;
unsigned originalEdges : 29; unsigned originalEdges : 29;
bool shortcut : 1; bool shortcut : 1;
bool forward : 1; bool forward : 1;
bool backward : 1; bool backward : 1;
NodeID middle; _MiddleName middleName;
} data; } data;
struct _HeapData { struct _HeapData {
@ -192,7 +198,7 @@ public:
continue; continue;
} }
edge.data.shortcut = false; edge.data.shortcut = false;
edge.data.middle = 0; edge.data.middleName.nameID = i->name();
edge.data.forward = i->isForward(); edge.data.forward = i->isForward();
edge.data.backward = i->isBackward(); edge.data.backward = i->isBackward();
edge.data.originalEdges = 1; edge.data.originalEdges = 1;
@ -223,7 +229,7 @@ public:
forwardEdge.target = backwardEdge.target = target; forwardEdge.target = backwardEdge.target = target;
forwardEdge.data.forward = backwardEdge.data.backward = true; forwardEdge.data.forward = backwardEdge.data.backward = true;
forwardEdge.data.backward = backwardEdge.data.forward = false; 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.shortcut = backwardEdge.data.shortcut = false;
forwardEdge.data.originalEdges = backwardEdge.data.originalEdges = 1; forwardEdge.data.originalEdges = backwardEdge.data.originalEdges = 1;
forwardEdge.data.distance = backwardEdge.data.distance = std::numeric_limits< int >::max(); forwardEdge.data.distance = backwardEdge.data.distance = std::numeric_limits< int >::max();
@ -388,7 +394,7 @@ public:
continue; continue;
if ( data.shortcut != edge.data.shortcut ) if ( data.shortcut != edge.data.shortcut )
continue; continue;
if ( data.middle != edge.data.middle ) if ( data.middleName.middle != edge.data.middleName.middle )
continue; continue;
data.forward |= edge.data.forward; data.forward |= edge.data.forward;
data.backward |= edge.data.backward; data.backward |= edge.data.backward;
@ -451,7 +457,7 @@ public:
newEdge.target = target; newEdge.target = target;
newEdge.data.distance = data.distance; newEdge.data.distance = data.distance;
newEdge.data.shortcut = data.shortcut; newEdge.data.shortcut = data.shortcut;
newEdge.data.middle = data.middle; newEdge.data.middleName.middle = data.middleName.middle;
newEdge.data.forward = data.forward; newEdge.data.forward = data.forward;
newEdge.data.backward = data.backward; newEdge.data.backward = data.backward;
edges.push_back( newEdge ); edges.push_back( newEdge );
@ -526,7 +532,7 @@ private:
const NodeID start = node; const NodeID start = node;
const NodeID target = _graph->GetTarget( edge ); const NodeID target = _graph->GetTarget( edge );
const _EdgeData& data = _graph->GetEdgeData( edge ); const _EdgeData& data = _graph->GetEdgeData( edge );
const NodeID middle = data.middle; const NodeID middle = data.middleName.middle;
assert(start != target); assert(start != target);
if(data.shortcut) if(data.shortcut)
{ {
@ -541,7 +547,8 @@ private:
return false; return false;
} }
} else { } 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.distance = pathDistance;
newEdge.data.forward = true; newEdge.data.forward = true;
newEdge.data.backward = false; newEdge.data.backward = false;
newEdge.data.middle = node; newEdge.data.middleName.middle = node;
newEdge.data.shortcut = true; newEdge.data.shortcut = true;
newEdge.data.originalEdges = outData.originalEdges + inData.originalEdges; newEdge.data.originalEdges = outData.originalEdges + inData.originalEdges;
data->insertedEdges.push_back( newEdge ); data->insertedEdges.push_back( newEdge );

View File

@ -92,7 +92,7 @@ NodeID readOSRMGraphFromStream(istream &in, vector<EdgeT>& edgeList, vector<Node
if(source == UINT_MAX || target == UINT_MAX) { cerr << "nonexisting source or target" << endl; exit(0); } if(source == UINT_MAX || target == UINT_MAX) { cerr << "nonexisting source or target" << endl; exit(0); }
EdgeT inputEdge(source, target, weight, forward, backward, locatable); EdgeT inputEdge(source, target, edgeList.size(), weight, forward, backward, locatable);
edgeList.push_back(inputEdge); edgeList.push_back(inputEdge);
} }
ext2IntNodeMap.clear(); ext2IntNodeMap.clear();
@ -124,7 +124,7 @@ void readHSGRFromStream(istream &in, vector<EdgeT> * edgeList) {
in.read((char *)&(middle), sizeof(NodeID)); in.read((char *)&(middle), sizeof(NodeID));
in.read((char *)&(source), sizeof(NodeID)); in.read((char *)&(source), sizeof(NodeID));
in.read((char *)&(target), 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; g.data = e; g.source = source; g.target = target;
edgeList->push_back(g); edgeList->push_back(g);

View File

@ -56,7 +56,7 @@ public:
return nodeHelpDesk->getNumberOfNodes(); return nodeHelpDesk->getNumberOfNodes();
} }
unsigned int ComputeRoute(PhantomNodes * phantomNodes, vector<NodeID> * path, _Coordinate& startCoord, _Coordinate& targetCoord) unsigned int ComputeRoute(PhantomNodes * phantomNodes, vector<std::pair<NodeID, NodeID> > * path, _Coordinate& startCoord, _Coordinate& targetCoord)
{ {
bool onSameEdge = false; bool onSameEdge = false;
bool onSameEdgeReversed = false; bool onSameEdgeReversed = false;
@ -189,9 +189,12 @@ public:
packedPath.push_back( pathNode ); packedPath.push_back( pathNode );
} }
// push start node explicitely // push start node explicitely
path->push_back(packedPath[0]); NodeID nameID = GetNameIDForOriginDestinationNodeID(phantomNodes->startNode1, packedPath[0]);
// if(packedPath[0] != packedPath[1])
path->push_back(std::make_pair(packedPath[0], nameID) );
{ {
for(deque<NodeID>::size_type i = 0; i < packedPath.size()-1; i++) for(deque<NodeID>::size_type i = 0; i < packedPath.size()-1; i++)
{ {
@ -239,6 +242,16 @@ public:
{ {
nodeHelpDesk->FindRoutingStarts(start, target, routingStarts); 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: private:
NodeHelperT * nodeHelpDesk; 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<NodeID, NodeID> >* path ) {
assert(source != target); assert(source != target);
//find edge first. //find edge first.
typename GraphT::EdgeIterator smallestEdge = SPECIAL_EDGEID; typename GraphT::EdgeIterator smallestEdge = SPECIAL_EDGEID;
@ -315,13 +328,14 @@ private:
const EdgeData ed = _graph->GetEdgeData(smallestEdge); const EdgeData ed = _graph->GetEdgeData(smallestEdge);
if(ed.shortcut) if(ed.shortcut)
{//unpack {//unpack
const NodeID middle = ed.middle; const NodeID middle = ed.middleName.middle;
_UnpackEdge(source, middle, path); _UnpackEdge(source, middle, path);
_UnpackEdge(middle, target, path); _UnpackEdge(middle, target, path);
return false; return false;
} else { } else {
assert(!ed.shortcut); 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; return true;
} }
} }

View File

@ -44,10 +44,11 @@ public:
/** Default constructor. target and weight are set to 0.*/ /** Default constructor. target and weight are set to 0.*/
Edge() { assert(false); } //shall not be used. 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 target() const {return _target; }
NodeID source() const {return _source;} NodeID source() const {return _source; }
NodeID name() const { return _name; }
EdgeWeight weight() const {return _weight; } EdgeWeight weight() const {return _weight; }
bool isBackward() const { return backward; } bool isBackward() const { return backward; }
@ -59,6 +60,7 @@ public:
private: private:
NodeID _source; NodeID _source;
NodeID _target; NodeID _target;
NodeID _name;
EdgeWeight _weight:29; EdgeWeight _weight:29;
bool forward:1; bool forward:1;
bool backward:1; bool backward:1;

View File

@ -107,7 +107,7 @@ public:
//cout << "coordinates in " << timestamp2 - timestamp << "s" << endl; //cout << "coordinates in " << timestamp2 - timestamp << "s" << endl;
vector<NodeID> * path = new vector<NodeID>(); vector<std::pair<NodeID, NodeID> > * path = new vector<std::pair<NodeID, NodeID> >();
PhantomNodes * phantomNodes = new PhantomNodes(); PhantomNodes * phantomNodes = new PhantomNodes();
// timestamp = get_timestamp(); // timestamp = get_timestamp();
sEngine->FindRoutingStarts(startCoord, targetCoord, phantomNodes); sEngine->FindRoutingStarts(startCoord, targetCoord, phantomNodes);
@ -157,10 +157,11 @@ public:
rep.content += tmp; rep.content += tmp;
rep.content += (" "); rep.content += (" ");
_Coordinate result; _Coordinate result;
for(vector<NodeID>::iterator it = path->begin(); it != path->end(); it++) for(vector<std::pair<NodeID, NodeID> >::iterator it = path->begin(); it != path->end(); it++)
{ {
sEngine->getNodeInfo(*it, result); sEngine->getNodeInfo(it->first, result);
convertLatLon(result.lon, tmp); convertLatLon(result.lon, tmp);
rep.content += tmp; rep.content += tmp;
rep.content += (","); rep.content += (",");
@ -168,6 +169,7 @@ public:
rep.content += tmp; rep.content += tmp;
rep.content += (" "); rep.content += (" ");
} }
convertLatLon(phantomNodes->targetCoord.lon, tmp); convertLatLon(phantomNodes->targetCoord.lon, tmp);
rep.content += tmp; rep.content += tmp;
rep.content += (","); rep.content += (",");

View File

@ -156,7 +156,7 @@ int main (int argc, char *argv[])
bool shortcut= it->data.shortcut; bool shortcut= it->data.shortcut;
bool forward= it->data.forward; bool forward= it->data.forward;
bool backward= it->data.backward; bool backward= it->data.backward;
NodeID middle= it->data.middle; NodeID middle= it->data.middleName.middle;
NodeID source = it->source; NodeID source = it->source;
NodeID target = it->target; NodeID target = it->target;