From 5692d43abbd22ca8cf34ea31c14e4002f63a16a2 Mon Sep 17 00:00:00 2001 From: Dennis Luxen Date: Fri, 1 Oct 2010 16:30:35 +0000 Subject: [PATCH] Propagating turn info (not yet finished) --- Contractor/Contractor.h | 37 +++++++-------------- DataStructures/ImportEdge.h | 15 +++++++-- DataStructures/StaticGraph.h | 64 ++++++++++++++++++++++++++++++++++++ HttpServer/request_handler.h | 18 ++++++---- createHierarchy.cpp | 15 ++++++--- 5 files changed, 109 insertions(+), 40 deletions(-) diff --git a/Contractor/Contractor.h b/Contractor/Contractor.h index 0163633cb..6e297bb15 100644 --- a/Contractor/Contractor.h +++ b/Contractor/Contractor.h @@ -59,7 +59,9 @@ private: bool shortcut : 1; bool forward : 1; bool backward : 1; - short type; + short type:6; + bool forwardTurn:1; + bool backwardTurn:1; _MiddleName middleName; } data; @@ -209,6 +211,8 @@ public: std::swap( edge.source, edge.target ); edge.data.forward = i->isBackward(); edge.data.backward = i->isForward(); + edge.data.forwardTurn = i->isForwardTurn(); + edge.data.backwardTurn = i->isBackwardTurn(); edges.push_back( edge ); } 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() { const NodeID numberOfNodes = _graph->GetNumberOfNodes(); _LogData log; @@ -357,8 +342,8 @@ public: statistics0.updating = _Timestamp() - statistics0.updating; log.Insert( statistics0 ); cout << "preprocessing ..." << flush; -// log.PrintHeader(); -// statistics0.PrintStatistics( 0 ); + // log.PrintHeader(); + // statistics0.PrintStatistics( 0 ); while ( levelID < numberOfNodes ) { _LogItem statistics; @@ -450,7 +435,7 @@ public: timeLast = _Timestamp(); //output some statistics -// statistics.PrintStatistics( iteration + 1 ); + // statistics.PrintStatistics( iteration + 1 ); //LogVerbose( wxT( "Printed" ) ); //remove contracted nodes from the pool @@ -466,8 +451,8 @@ public: delete threadData[threadNum]; } -// log.PrintSummary(); -// cout << "Total Time: " << log.GetSum().GetTotalTime()<< " s" << endl; + // log.PrintSummary(); + // cout << "Total Time: " << log.GetSum().GetTotalTime()<< " s" << endl; cout << "checking sanity of generated data ..." << flush; _CheckCH<_EdgeData>(); cout << "ok" << endl; @@ -495,6 +480,8 @@ public: } newEdge.data.forward = data.forward; + newEdge.data.forwardTurn = data.forwardTurn; + newEdge.data.backwardTurn = data.backwardTurn; newEdge.data.backward = data.backward; edges.push_back( newEdge ); } diff --git a/DataStructures/ImportEdge.h b/DataStructures/ImportEdge.h index 2866e6a7c..7badea23b 100644 --- a/DataStructures/ImportEdge.h +++ b/DataStructures/ImportEdge.h @@ -44,7 +44,8 @@ public: /** Default constructor. target and weight are set to 0.*/ 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 source() const {return _source; } @@ -56,13 +57,21 @@ public: bool isForward() const { return forward; } 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: - NodeID _source; - NodeID _target; + NodeID _source:31; + NodeID _target:31; NodeID _name:31; EdgeWeight _weight:31; bool forward:1; bool backward:1; + bool forwardTurn:1; + bool backwardTurn:1; short _type; }; diff --git a/DataStructures/StaticGraph.h b/DataStructures/StaticGraph.h index 903fa5f37..dd8a48785 100644 --- a/DataStructures/StaticGraph.h +++ b/DataStructures/StaticGraph.h @@ -29,6 +29,7 @@ or see http://www.gnu.org/licenses/agpl.txt. #endif #include "../typedefs.h" +#include "ImportEdge.h" template< typename EdgeData> 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 { return _numNodes; } @@ -129,6 +163,36 @@ public: 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: struct _StrNode { diff --git a/HttpServer/request_handler.h b/HttpServer/request_handler.h index 8b0e01ff6..db643676e 100644 --- a/HttpServer/request_handler.h +++ b/HttpServer/request_handler.h @@ -233,8 +233,8 @@ private: output = string; } - // precision: Nachkommastellen - // length: Maximallänge inklusive Komma + // precision: position after decimal point + // length: maximum number of digits including comma and decimals template< int length, int precision > inline char* printInt( char* buffer, int value ) { @@ -337,13 +337,13 @@ private: tmp += /* " (" << angle << ")*/"drive ahead, "; } else if (angle > 290 && angle <= 360) { tmp += /*" (" << angle << ")*/ "turn sharp left, "; - } else if (angle > 245 && angle <= 290) { + } else if (angle > 230 && angle <= 290) { tmp += /*" (" << angle << ")*/ "turn left, "; - } else if (angle > 200 && angle <= 245) { + } else if (angle > 200 && angle <= 230) { tmp += /*" (" << angle << ") */"bear left, "; - } else if (angle > 115 && angle <= 160) { + } else if (angle > 130 && angle <= 160) { tmp += /*" (" << angle << ") */"bear right, "; - } else if (angle > 70 && angle <= 115) { + } else if (angle > 70 && angle <= 130) { tmp += /*" (" << angle << ") */"turn right, "; } else { tmp += /*" (" << angle << ") */"turn sharp right, "; @@ -363,8 +363,12 @@ private: numberString << type; tmp += numberString.str(); numberString.str(""); + tmp += ", id: "; + numberString << nameID; + tmp += numberString.str(); + numberString.str(""); tmp += ")\n 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(); numberString.str(""); tmp += "m\n "; diff --git a/createHierarchy.cpp b/createHierarchy.cpp index 4b7c681e0..b2ab4c1d5 100644 --- a/createHierarchy.cpp +++ b/createHierarchy.cpp @@ -51,6 +51,7 @@ using namespace std; typedef ContractionCleanup::Edge::EdgeData EdgeData; typedef DynamicGraph::InputEdge GridEdge; +typedef StaticGraph::InputEdge StaticEdge; typedef NNGrid::NNGrid WritableGrid; vector * int2ExtNodeMap = new vector(); @@ -73,6 +74,13 @@ int main (int argc, char *argv[]) const NodeID n = readOSRMGraphFromStream(in, edgeList, int2ExtNodeMap); in.close(); + StaticGraph * staticGraph = new StaticGraph( n, edgeList ); + + cout << "computing turn vector info ..." << flush; + staticGraph->ComputeTurnInformation( edgeList ); + cout << "ok" << endl; + delete staticGraph; + char nodeOut[1024]; char edgeOut[1024]; char ramIndexOut[1024]; @@ -127,7 +135,7 @@ int main (int argc, char *argv[]) cout << "initializing contractor ..." << flush; Contractor* contractor = new Contractor( n, edgeList ); - vector(edgeList.begin(), edgeList.end()).swap(edgeList); //remove excess candidates. + contractor->Run(); cout << "checking data sanity ..." << flush; @@ -142,10 +150,6 @@ int main (int argc, char *argv[]) std::vector< GridEdge> cleanedEdgeList; cleanup->GetData(cleanedEdgeList); - cout << "computing turn vector info ..." << flush; - contractor->ComputeTurnInfoVector(cleanedEdgeList); - cout << "ok" << endl; - ofstream edgeOutFile(edgeOut, ios::binary); //Serializing the edge list. @@ -177,6 +181,7 @@ int main (int argc, char *argv[]) edgeOutFile.write((char *)&(distance), sizeof(int)); edgeOutFile.write((char *)&(forwardTurn), sizeof(bool)); edgeOutFile.write((char *)&(backwardTurn), sizeof(bool)); + assert(forwardTurn && backwardTurn); edgeOutFile.write((char *)&(shortcut), sizeof(bool)); edgeOutFile.write((char *)&(forward), sizeof(bool)); edgeOutFile.write((char *)&(backward), sizeof(bool));