From b5600bdd7f9528f1e00dedd7b6b23f816f838dd9 Mon Sep 17 00:00:00 2001 From: Dennis Luxen Date: Thu, 19 Sep 2013 18:53:34 +0200 Subject: [PATCH] Rewiring routing algorithms --- RoutingAlgorithms/AlternativePathRouting.h | 15 +++-- RoutingAlgorithms/BasicRoutingInterface.h | 77 +++++++++++++--------- RoutingAlgorithms/ShortestPathRouting.h | 5 +- 3 files changed, 59 insertions(+), 38 deletions(-) diff --git a/RoutingAlgorithms/AlternativePathRouting.h b/RoutingAlgorithms/AlternativePathRouting.h index d0fdf3056..dc78db6e5 100644 --- a/RoutingAlgorithms/AlternativePathRouting.h +++ b/RoutingAlgorithms/AlternativePathRouting.h @@ -29,6 +29,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define ALTERNATIVEROUTES_H_ #include "BasicRoutingInterface.h" +#include "../DataStructures/SearchEngineData.h" #include #include #include @@ -37,11 +38,11 @@ const double VIAPATH_ALPHA = 0.15; const double VIAPATH_EPSILON = 0.10; //alternative at most 15% longer const double VIAPATH_GAMMA = 0.75; //alternative shares at most 75% with the shortest. -template -class AlternativeRouting : private BasicRoutingInterface { - typedef BasicRoutingInterface super; - typedef typename QueryDataT::Graph SearchGraph; - typedef typename QueryDataT::QueryHeap QueryHeap; +template +class AlternativeRouting : private BasicRoutingInterface { + typedef BasicRoutingInterface super; + typedef SearchEngineData::QueryGraph SearchGraph; + typedef SearchEngineData::QueryHeap QueryHeap; typedef std::pair SearchSpaceEdge; struct RankedCandidateNode { @@ -55,10 +56,10 @@ class AlternativeRouting : private BasicRoutingInterface { }; const SearchGraph * search_graph; - + SearchEngineData & engine_working_data; public: - AlternativeRouting(QueryDataT & qd) : super(qd), search_graph(qd.graph) { } + AlternativeRouting(DataFacadeT & qd, SearchEngineData & engine_working_data) : super(qd), search_graph(qd.graph), engine_working_data(engine_working_data) { } ~AlternativeRouting() {} diff --git a/RoutingAlgorithms/BasicRoutingInterface.h b/RoutingAlgorithms/BasicRoutingInterface.h index 79ff992e4..e926cba64 100644 --- a/RoutingAlgorithms/BasicRoutingInterface.h +++ b/RoutingAlgorithms/BasicRoutingInterface.h @@ -29,6 +29,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define BASICROUTINGINTERFACE_H_ #include "../DataStructures/RawRouteData.h" +#include "../DataStructures/SearchEngineData.h" #include "../Util/ContainerUtils.h" #include "../Util/SimpleLogger.h" @@ -39,15 +40,22 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include -template +template class BasicRoutingInterface : boost::noncopyable{ protected: - QueryDataT & _queryData; + SearchEngineDataT * engine_working_data; public: - BasicRoutingInterface(QueryDataT & qd) : _queryData(qd) { } + BasicRoutingInterface(SearchEngineDataT * engine_working_data) : engine_working_data(engine_working_data) { } virtual ~BasicRoutingInterface(){ }; - inline void RoutingStep(typename QueryDataT::QueryHeap & _forwardHeap, typename QueryDataT::QueryHeap & _backwardHeap, NodeID *middle, int *_upperbound, const int edgeBasedOffset, const bool forwardDirection) const { + inline void RoutingStep( + SearchEngineData::QueryHeap & _forwardHeap, + SearchEngineData::QueryHeap & _backwardHeap, + NodeID *middle, + int *_upperbound, + const int edgeBasedOffset, + const bool forwardDirection + ) const { const NodeID node = _forwardHeap.DeleteMin(); const int distance = _forwardHeap.GetKey(node); //SimpleLogger().Write() << "Settled (" << _forwardHeap.GetData( node ).parent << "," << node << ")=" << distance; @@ -68,11 +76,15 @@ public: } //Stalling - for ( typename QueryDataT::Graph::EdgeIterator edge = _queryData.graph->BeginEdges( node ); edge < _queryData.graph->EndEdges(node); ++edge ) { - const typename QueryDataT::Graph::EdgeData & data = _queryData.graph->GetEdgeData(edge); + for( + EdgeID edge = engine_working_data->BeginEdges( node ); + edge < engine_working_data->EndEdges(node); + ++edge + ) { + const typename SearchEngineDataT::EdgeData & data = engine_working_data->GetEdgeData(edge); bool backwardDirectionFlag = (!forwardDirection) ? data.forward : data.backward; if(backwardDirectionFlag) { - const NodeID to = _queryData.graph->GetTarget(edge); + const NodeID to = engine_working_data->GetTarget(edge); const int edgeWeight = data.distance; assert( edgeWeight > 0 ); @@ -85,12 +97,12 @@ public: } } - for ( typename QueryDataT::Graph::EdgeIterator edge = _queryData.graph->BeginEdges( node ); edge < _queryData.graph->EndEdges(node); ++edge ) { - const typename QueryDataT::Graph::EdgeData & data = _queryData.graph->GetEdgeData(edge); + for ( EdgeID edge = engine_working_data->BeginEdges( node ); edge < engine_working_data->EndEdges(node); ++edge ) { + const typename SearchEngineDataT::EdgeData & data = engine_working_data->GetEdgeData(edge); bool forwardDirectionFlag = (forwardDirection ? data.forward : data.backward ); if(forwardDirectionFlag) { - const NodeID to = _queryData.graph->GetTarget(edge); + const NodeID to = engine_working_data->GetTarget(edge); const int edgeWeight = data.distance; assert( edgeWeight > 0 ); @@ -124,20 +136,20 @@ public: edge = recursionStack.top(); recursionStack.pop(); - typename QueryDataT::Graph::EdgeIterator smallestEdge = SPECIAL_EDGEID; + EdgeID smallestEdge = SPECIAL_EDGEID; int smallestWeight = INT_MAX; - for(typename QueryDataT::Graph::EdgeIterator eit = _queryData.graph->BeginEdges(edge.first);eit < _queryData.graph->EndEdges(edge.first);++eit){ - const int weight = _queryData.graph->GetEdgeData(eit).distance; - if(_queryData.graph->GetTarget(eit) == edge.second && weight < smallestWeight && _queryData.graph->GetEdgeData(eit).forward){ + for(EdgeID eit = engine_working_data->BeginEdges(edge.first);eit < engine_working_data->EndEdges(edge.first);++eit){ + const int weight = engine_working_data->GetEdgeData(eit).distance; + if(engine_working_data->GetTarget(eit) == edge.second && weight < smallestWeight && engine_working_data->GetEdgeData(eit).forward){ smallestEdge = eit; smallestWeight = weight; } } if(smallestEdge == SPECIAL_EDGEID){ - for(typename QueryDataT::Graph::EdgeIterator eit = _queryData.graph->BeginEdges(edge.second);eit < _queryData.graph->EndEdges(edge.second);++eit){ - const int weight = _queryData.graph->GetEdgeData(eit).distance; - if(_queryData.graph->GetTarget(eit) == edge.first && weight < smallestWeight && _queryData.graph->GetEdgeData(eit).backward){ + for(EdgeID eit = engine_working_data->BeginEdges(edge.second);eit < engine_working_data->EndEdges(edge.second);++eit){ + const int weight = engine_working_data->GetEdgeData(eit).distance; + if(engine_working_data->GetTarget(eit) == edge.first && weight < smallestWeight && engine_working_data->GetEdgeData(eit).backward){ smallestEdge = eit; smallestWeight = weight; } @@ -145,7 +157,7 @@ public: } assert(smallestWeight != INT_MAX); - const typename QueryDataT::Graph::EdgeData& ed = _queryData.graph->GetEdgeData(smallestEdge); + const typename SearchEngineDataT::EdgeData& ed = engine_working_data->GetEdgeData(smallestEdge); if(ed.shortcut) {//unpack const NodeID middle = ed.id; //again, we need to this in reversed order @@ -156,8 +168,8 @@ public: unpackedPath.push_back( _PathData( ed.id, - _queryData.nodeHelpDesk->GetNameIndexFromEdgeID(ed.id), - _queryData.nodeHelpDesk->GetTurnInstructionForEdgeID(ed.id), + engine_working_data->GetNameIndexFromEdgeID(ed.id), + engine_working_data->GetTurnInstructionForEdgeID(ed.id), ed.distance ) ); @@ -174,20 +186,20 @@ public: edge = recursionStack.top(); recursionStack.pop(); - typename QueryDataT::Graph::EdgeIterator smallestEdge = SPECIAL_EDGEID; + EdgeID smallestEdge = SPECIAL_EDGEID; int smallestWeight = INT_MAX; - for(typename QueryDataT::Graph::EdgeIterator eit = _queryData.graph->BeginEdges(edge.first);eit < _queryData.graph->EndEdges(edge.first);++eit){ - const int weight = _queryData.graph->GetEdgeData(eit).distance; - if(_queryData.graph->GetTarget(eit) == edge.second && weight < smallestWeight && _queryData.graph->GetEdgeData(eit).forward){ + for(EdgeID eit = engine_working_data->BeginEdges(edge.first);eit < engine_working_data->EndEdges(edge.first);++eit){ + const int weight = engine_working_data->GetEdgeData(eit).distance; + if(engine_working_data->GetTarget(eit) == edge.second && weight < smallestWeight && engine_working_data->GetEdgeData(eit).forward){ smallestEdge = eit; smallestWeight = weight; } } if(smallestEdge == SPECIAL_EDGEID){ - for(typename QueryDataT::Graph::EdgeIterator eit = _queryData.graph->BeginEdges(edge.second);eit < _queryData.graph->EndEdges(edge.second);++eit){ - const int weight = _queryData.graph->GetEdgeData(eit).distance; - if(_queryData.graph->GetTarget(eit) == edge.first && weight < smallestWeight && _queryData.graph->GetEdgeData(eit).backward){ + for(EdgeID eit = engine_working_data->BeginEdges(edge.second);eit < engine_working_data->EndEdges(edge.second);++eit){ + const int weight = engine_working_data->GetEdgeData(eit).distance; + if(engine_working_data->GetTarget(eit) == edge.first && weight < smallestWeight && engine_working_data->GetEdgeData(eit).backward){ smallestEdge = eit; smallestWeight = weight; } @@ -195,7 +207,7 @@ public: } assert(smallestWeight != INT_MAX); - const typename QueryDataT::Graph::EdgeData& ed = _queryData.graph->GetEdgeData(smallestEdge); + const typename SearchEngineDataT::EdgeData& ed = engine_working_data->GetEdgeData(smallestEdge); if(ed.shortcut) {//unpack const NodeID middle = ed.id; //again, we need to this in reversed order @@ -209,7 +221,12 @@ public: unpackedPath.push_back(t); } - inline void RetrievePackedPathFromHeap(typename QueryDataT::QueryHeap & _fHeap, typename QueryDataT::QueryHeap & _bHeap, const NodeID middle, std::vector& packedPath) const { + inline void RetrievePackedPathFromHeap( + SearchEngineData::QueryHeap & _fHeap, + SearchEngineData::QueryHeap & _bHeap, + const NodeID middle, + std::vector & packedPath + ) const { NodeID pathNode = middle; while(pathNode != _fHeap.GetData(pathNode).parent) { pathNode = _fHeap.GetData(pathNode).parent; @@ -225,7 +242,7 @@ public: } } - inline void RetrievePackedPathFromSingleHeap(typename QueryDataT::QueryHeap & search_heap, const NodeID middle, std::vector& packed_path) const { + inline void RetrievePackedPathFromSingleHeap(SearchEngineData::QueryHeap & search_heap, const NodeID middle, std::vector& packed_path) const { NodeID pathNode = middle; while(pathNode != search_heap.GetData(pathNode).parent) { pathNode = search_heap.GetData(pathNode).parent; diff --git a/RoutingAlgorithms/ShortestPathRouting.h b/RoutingAlgorithms/ShortestPathRouting.h index 9914268c2..28dfaef39 100644 --- a/RoutingAlgorithms/ShortestPathRouting.h +++ b/RoutingAlgorithms/ShortestPathRouting.h @@ -30,12 +30,15 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "BasicRoutingInterface.h" +#include "../DataStructures/SearchEngineData.h" + template class ShortestPathRouting : public BasicRoutingInterface{ typedef BasicRoutingInterface super; typedef typename QueryDataT::QueryHeap QueryHeap; + SearchEngineData & engine_working_data; public: - ShortestPathRouting( QueryDataT & qd) : super(qd) {} + ShortestPathRouting( QueryDataT & qd, SearchEngineData & engine_working_data) : super(qd), engine_working_data(engine_working_data) {} ~ShortestPathRouting() {}