Propagating turn info (not yet finished)

This commit is contained in:
Dennis Luxen 2010-10-01 16:30:35 +00:00
parent 512aabc7a4
commit 5692d43abb
5 changed files with 109 additions and 40 deletions

View File

@ -59,7 +59,9 @@ private:
bool shortcut : 1; bool shortcut : 1;
bool forward : 1; bool forward : 1;
bool backward : 1; bool backward : 1;
short type; short type:6;
bool forwardTurn:1;
bool backwardTurn:1;
_MiddleName middleName; _MiddleName middleName;
} data; } data;
@ -209,6 +211,8 @@ public:
std::swap( edge.source, edge.target ); std::swap( edge.source, edge.target );
edge.data.forward = i->isBackward(); edge.data.forward = i->isBackward();
edge.data.backward = i->isForward(); edge.data.backward = i->isForward();
edge.data.forwardTurn = i->isForwardTurn();
edge.data.backwardTurn = i->isBackwardTurn();
edges.push_back( edge ); edges.push_back( edge );
} }
std::vector< InputEdge >().swap( inputEdges ); //free memory std::vector< InputEdge >().swap( inputEdges ); //free memory
@ -296,25 +300,6 @@ public:
} }
} }
/* check if its possible to turn at the end of an edge */
template< class InputEdge >
void ComputeTurnInfoVector( std::vector< InputEdge >& inputEdges ) {
for(unsigned n = 0; n < inputEdges.size(); n++) {
if(inputEdges[n].data.forward) {
NodeID target = inputEdges[n].target;
if(_graph->BeginEdges(target)+1 < _graph->EndEdges(target)) {
inputEdges[n].data.forwardTurn = true;
}
}
if(inputEdges[n].data.backward) {
NodeID source = inputEdges[n].source;
if(_graph->BeginEdges(source)+1 < _graph->EndEdges(source)) {
inputEdges[n].data.backwardTurn = true;
}
}
}
}
void Run() { void Run() {
const NodeID numberOfNodes = _graph->GetNumberOfNodes(); const NodeID numberOfNodes = _graph->GetNumberOfNodes();
_LogData log; _LogData log;
@ -357,8 +342,8 @@ public:
statistics0.updating = _Timestamp() - statistics0.updating; statistics0.updating = _Timestamp() - statistics0.updating;
log.Insert( statistics0 ); log.Insert( statistics0 );
cout << "preprocessing ..." << flush; cout << "preprocessing ..." << flush;
// log.PrintHeader(); // log.PrintHeader();
// statistics0.PrintStatistics( 0 ); // statistics0.PrintStatistics( 0 );
while ( levelID < numberOfNodes ) { while ( levelID < numberOfNodes ) {
_LogItem statistics; _LogItem statistics;
@ -450,7 +435,7 @@ public:
timeLast = _Timestamp(); timeLast = _Timestamp();
//output some statistics //output some statistics
// statistics.PrintStatistics( iteration + 1 ); // statistics.PrintStatistics( iteration + 1 );
//LogVerbose( wxT( "Printed" ) ); //LogVerbose( wxT( "Printed" ) );
//remove contracted nodes from the pool //remove contracted nodes from the pool
@ -466,8 +451,8 @@ public:
delete threadData[threadNum]; delete threadData[threadNum];
} }
// log.PrintSummary(); // log.PrintSummary();
// cout << "Total Time: " << log.GetSum().GetTotalTime()<< " s" << endl; // cout << "Total Time: " << log.GetSum().GetTotalTime()<< " s" << endl;
cout << "checking sanity of generated data ..." << flush; cout << "checking sanity of generated data ..." << flush;
_CheckCH<_EdgeData>(); _CheckCH<_EdgeData>();
cout << "ok" << endl; cout << "ok" << endl;
@ -495,6 +480,8 @@ public:
} }
newEdge.data.forward = data.forward; newEdge.data.forward = data.forward;
newEdge.data.forwardTurn = data.forwardTurn;
newEdge.data.backwardTurn = data.backwardTurn;
newEdge.data.backward = data.backward; newEdge.data.backward = data.backward;
edges.push_back( newEdge ); edges.push_back( newEdge );
} }

View File

@ -44,7 +44,8 @@ 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, NodeID n, EdgeWeight w, bool f, bool b, short ty) : _source(s), _target(t), _name(n), _weight(w), forward(f), backward(b), _type(ty) { assert(ty >= 0); } explicit Edge(NodeID s, NodeID t, NodeID n, EdgeWeight w, bool f, bool b, short ty) :
_source(s), _target(t), _name(n), _weight(w), forward(f), backward(b), _type(ty), forwardTurn(false), backwardTurn(false) { assert(ty >= 0); }
NodeID target() const {return _target; } NodeID target() const {return _target; }
NodeID source() const {return _source; } NodeID source() const {return _source; }
@ -56,13 +57,21 @@ public:
bool isForward() const { return forward; } bool isForward() const { return forward; }
bool isLocatable() const { return _type != 14; } bool isLocatable() const { return _type != 14; }
bool isForwardTurn() const { return forwardTurn; }
bool isBackwardTurn() const { return backwardTurn; }
void setForwardTurn(bool f) { forwardTurn = f; }
void setBackwardTurn(bool b) { backwardTurn = b; }
private: private:
NodeID _source; NodeID _source:31;
NodeID _target; NodeID _target:31;
NodeID _name:31; NodeID _name:31;
EdgeWeight _weight:31; EdgeWeight _weight:31;
bool forward:1; bool forward:1;
bool backward:1; bool backward:1;
bool forwardTurn:1;
bool backwardTurn:1;
short _type; short _type;
}; };

View File

@ -29,6 +29,7 @@ or see http://www.gnu.org/licenses/agpl.txt.
#endif #endif
#include "../typedefs.h" #include "../typedefs.h"
#include "ImportEdge.h"
template< typename EdgeData> template< typename EdgeData>
class StaticGraph { class StaticGraph {
@ -79,6 +80,39 @@ public:
} }
} }
//Attention: Use this constructor only to if you know what you are doing
// Edges do not have any weight. _edges[i].data is undefined!
StaticGraph( int nodes, std::vector< ImportEdge > &graph ) {
#ifdef _GLIBCXX_PARALLEL
__gnu_parallel::sort( graph.begin(), graph.end() );
#else
std::sort( graph.begin(), graph.end() );
#endif
_numNodes = nodes;
_numEdges = ( EdgeIterator ) graph.size();
_nodes.resize( _numNodes + 1);
EdgeIterator edge = 0;
EdgeIterator position = 0;
for ( NodeIterator node = 0; node <= _numNodes; ++node ) {
EdgeIterator lastEdge = edge;
while ( edge < _numEdges && graph[edge].source() == node ) {
++edge;
}
_nodes[node].firstEdge = position; //=edge
position += edge - lastEdge; //remove
}
_edges.resize( position ); //(edge)
edge = 0;
for ( NodeIterator node = 0; node < _numNodes; ++node ) {
for ( EdgeIterator i = _nodes[node].firstEdge, e = _nodes[node+1].firstEdge; i != e; ++i ) {
_edges[i].target = graph[edge].target();
// _edges[i].data = graph[edge].data;
// assert(_edges[i].data.distance > 0);
edge++;
}
}
}
unsigned GetNumberOfNodes() const { unsigned GetNumberOfNodes() const {
return _numNodes; return _numNodes;
} }
@ -129,6 +163,36 @@ public:
return smallestEdge; return smallestEdge;
} }
/* check if its possible to turn at the end of an edge */
template< class InputEdge >
void ComputeTurnInformation( std::vector< InputEdge >& inputEdges ) {
unsigned count = 0;
for(unsigned n = 0; n < inputEdges.size(); n++) {
NodeIterator target = inputEdges[n].target();
NodeIterator source = inputEdges[n].source();
if(inputEdges[n].isForward() ) {
EdgeIterator begin = BeginEdges(target);
EdgeIterator end = EndEdges(target);
if( begin + ( inputEdges[n].isBackward() ? 2 : 1 ) < end ) {
inputEdges[n].setForwardTurn( true );
count++;
}
}
if(inputEdges[n].isBackward() ) {
EdgeIterator begin = BeginEdges(source);
EdgeIterator end = EndEdges(source);
if( begin + ( inputEdges[n].isForward() ? 2 : 1 ) < end ) {
inputEdges[n].setBackwardTurn( true );
count ++;
}
}
}
cout << "allowed turns: " << count << endl;
}
private: private:
struct _StrNode { struct _StrNode {

View File

@ -233,8 +233,8 @@ private:
output = string; output = string;
} }
// precision: Nachkommastellen // precision: position after decimal point
// length: Maximallänge inklusive Komma // length: maximum number of digits including comma and decimals
template< int length, int precision > template< int length, int precision >
inline char* printInt( char* buffer, int value ) inline char* printInt( char* buffer, int value )
{ {
@ -337,13 +337,13 @@ private:
tmp += /* " (" << angle << ")*/"drive ahead, "; tmp += /* " (" << angle << ")*/"drive ahead, ";
} else if (angle > 290 && angle <= 360) { } else if (angle > 290 && angle <= 360) {
tmp += /*" (" << angle << ")*/ "turn sharp left, "; tmp += /*" (" << angle << ")*/ "turn sharp left, ";
} else if (angle > 245 && angle <= 290) { } else if (angle > 230 && angle <= 290) {
tmp += /*" (" << angle << ")*/ "turn left, "; tmp += /*" (" << angle << ")*/ "turn left, ";
} else if (angle > 200 && angle <= 245) { } else if (angle > 200 && angle <= 230) {
tmp += /*" (" << angle << ") */"bear left, "; tmp += /*" (" << angle << ") */"bear left, ";
} else if (angle > 115 && angle <= 160) { } else if (angle > 130 && angle <= 160) {
tmp += /*" (" << angle << ") */"bear right, "; tmp += /*" (" << angle << ") */"bear right, ";
} else if (angle > 70 && angle <= 115) { } else if (angle > 70 && angle <= 130) {
tmp += /*" (" << angle << ") */"turn right, "; tmp += /*" (" << angle << ") */"turn right, ";
} else { } else {
tmp += /*" (" << angle << ") */"turn sharp right, "; tmp += /*" (" << angle << ") */"turn sharp right, ";
@ -363,8 +363,12 @@ private:
numberString << type; numberString << type;
tmp += numberString.str(); tmp += numberString.str();
numberString.str(""); numberString.str("");
tmp += ", id: ";
numberString << nameID;
tmp += numberString.str();
numberString.str("");
tmp += ")</name>\n <Description> drive for "; tmp += ")</name>\n <Description> drive for ";
numberString << (previous.lat, previous.lon, phantomNodes->targetCoord.lat, phantomNodes->targetCoord.lon) + tempDist; numberString << ApproximateDistance(previous.lat, previous.lon, phantomNodes->targetCoord.lat, phantomNodes->targetCoord.lon) + tempDist;
tmp += numberString.str(); tmp += numberString.str();
numberString.str(""); numberString.str("");
tmp += "m</Description>\n "; tmp += "m</Description>\n ";

View File

@ -51,6 +51,7 @@ using namespace std;
typedef ContractionCleanup::Edge::EdgeData EdgeData; typedef ContractionCleanup::Edge::EdgeData EdgeData;
typedef DynamicGraph<EdgeData>::InputEdge GridEdge; typedef DynamicGraph<EdgeData>::InputEdge GridEdge;
typedef StaticGraph<EdgeData>::InputEdge StaticEdge;
typedef NNGrid::NNGrid<true> WritableGrid; typedef NNGrid::NNGrid<true> WritableGrid;
vector<NodeInfo> * int2ExtNodeMap = new vector<NodeInfo>(); vector<NodeInfo> * int2ExtNodeMap = new vector<NodeInfo>();
@ -73,6 +74,13 @@ int main (int argc, char *argv[])
const NodeID n = readOSRMGraphFromStream(in, edgeList, int2ExtNodeMap); const NodeID n = readOSRMGraphFromStream(in, edgeList, int2ExtNodeMap);
in.close(); in.close();
StaticGraph<EdgeData> * staticGraph = new StaticGraph<EdgeData>( n, edgeList );
cout << "computing turn vector info ..." << flush;
staticGraph->ComputeTurnInformation( edgeList );
cout << "ok" << endl;
delete staticGraph;
char nodeOut[1024]; char nodeOut[1024];
char edgeOut[1024]; char edgeOut[1024];
char ramIndexOut[1024]; char ramIndexOut[1024];
@ -127,7 +135,7 @@ int main (int argc, char *argv[])
cout << "initializing contractor ..." << flush; cout << "initializing contractor ..." << flush;
Contractor* contractor = new Contractor( n, edgeList ); Contractor* contractor = new Contractor( n, edgeList );
vector<ImportEdge>(edgeList.begin(), edgeList.end()).swap(edgeList); //remove excess candidates.
contractor->Run(); contractor->Run();
cout << "checking data sanity ..." << flush; cout << "checking data sanity ..." << flush;
@ -142,10 +150,6 @@ int main (int argc, char *argv[])
std::vector< GridEdge> cleanedEdgeList; std::vector< GridEdge> cleanedEdgeList;
cleanup->GetData(cleanedEdgeList); cleanup->GetData(cleanedEdgeList);
cout << "computing turn vector info ..." << flush;
contractor->ComputeTurnInfoVector(cleanedEdgeList);
cout << "ok" << endl;
ofstream edgeOutFile(edgeOut, ios::binary); ofstream edgeOutFile(edgeOut, ios::binary);
//Serializing the edge list. //Serializing the edge list.
@ -177,6 +181,7 @@ int main (int argc, char *argv[])
edgeOutFile.write((char *)&(distance), sizeof(int)); edgeOutFile.write((char *)&(distance), sizeof(int));
edgeOutFile.write((char *)&(forwardTurn), sizeof(bool)); edgeOutFile.write((char *)&(forwardTurn), sizeof(bool));
edgeOutFile.write((char *)&(backwardTurn), sizeof(bool)); edgeOutFile.write((char *)&(backwardTurn), sizeof(bool));
assert(forwardTurn && backwardTurn);
edgeOutFile.write((char *)&(shortcut), sizeof(bool)); edgeOutFile.write((char *)&(shortcut), sizeof(bool));
edgeOutFile.write((char *)&(forward), sizeof(bool)); edgeOutFile.write((char *)&(forward), sizeof(bool));
edgeOutFile.write((char *)&(backward), sizeof(bool)); edgeOutFile.write((char *)&(backward), sizeof(bool));