diff --git a/RoutingAlgorithms/AlternativePathRouting.h b/RoutingAlgorithms/AlternativePathRouting.h index bd542e1a3..4cd256b98 100644 --- a/RoutingAlgorithms/AlternativePathRouting.h +++ b/RoutingAlgorithms/AlternativePathRouting.h @@ -419,6 +419,13 @@ private: super::RetrievePackedPathFromHeap(newForwardHeap, existingBackwardHeap, *v_t_middle, packed_v_t_path); NodeID s_P = *s_v_middle, t_P = *v_t_middle; + if(UINT_MAX == s_P) { + return false; + } + + if(UINT_MAX == t_P) { + return false; + } const int T_threshold = VIAPATH_EPSILON * lengthOfShortestPath; int unpackedUntilDistance = 0; @@ -504,19 +511,21 @@ private: lengthOfPathT_Test_Path += unpackedUntilDistance; //Run actual T-Test query and compare if distances equal. - QueryHeap& forwardHeap = *super::_queryData.forwardHeap3; - QueryHeap& backwardHeap = *super::_queryData.backwardHeap3; + super::_queryData.InitializeOrClearThirdThreadLocalStorage(); + + QueryHeap& forward_heap3 = *super::_queryData.forwardHeap3; + QueryHeap& backward_heap3 = *super::_queryData.backwardHeap3; int _upperBound = INT_MAX; NodeID middle = UINT_MAX; - forwardHeap.Insert(s_P, 0, s_P); - backwardHeap.Insert(t_P, 0, t_P); + forward_heap3.Insert(s_P, 0, s_P); + backward_heap3.Insert(t_P, 0, t_P); //exploration from s and t until deletemin/(1+epsilon) > _lengthOfShortestPath - while (forwardHeap.Size() + backwardHeap.Size() > 0) { - if (forwardHeap.Size() > 0) { - super::RoutingStep(forwardHeap, backwardHeap, &middle, &_upperBound, offset, true); + while (forward_heap3.Size() + backward_heap3.Size() > 0) { + if (forward_heap3.Size() > 0) { + super::RoutingStep(forward_heap3, backward_heap3, &middle, &_upperBound, offset, true); } - if (backwardHeap.Size() > 0) { - super::RoutingStep(backwardHeap, forwardHeap, &middle, &_upperBound, offset, false); + if (backward_heap3.Size() > 0) { + super::RoutingStep(backward_heap3, forward_heap3, &middle, &_upperBound, offset, false); } } return (_upperBound <= lengthOfPathT_Test_Path); diff --git a/RoutingAlgorithms/ShortestPathRouting.h b/RoutingAlgorithms/ShortestPathRouting.h index 4799d49d3..66d374079 100644 --- a/RoutingAlgorithms/ShortestPathRouting.h +++ b/RoutingAlgorithms/ShortestPathRouting.h @@ -53,53 +53,57 @@ public: super::_queryData.InitializeOrClearFirstThreadLocalStorage(); super::_queryData.InitializeOrClearSecondThreadLocalStorage(); + super::_queryData.InitializeOrClearThirdThreadLocalStorage(); - QueryHeap & forwardHeap = *super::_queryData.forwardHeap; - QueryHeap & backwardHeap = *super::_queryData.backwardHeap; - QueryHeap & forwardHeap2 = *super::_queryData.forwardHeap2; - QueryHeap & backwardHeap2 = *super::_queryData.backwardHeap2; + QueryHeap & forward_heap1 = *(super::_queryData.forwardHeap); + QueryHeap & reverse_heap1 = *(super::_queryData.backwardHeap); + QueryHeap & forward_heap2 = *(super::_queryData.forwardHeap2); + QueryHeap & reverse_heap2 = *(super::_queryData.backwardHeap2); //Get distance to next pair of target nodes. BOOST_FOREACH(const PhantomNodes & phantomNodePair, phantomNodesVector) { - forwardHeap.Clear(); forwardHeap2.Clear(); - backwardHeap.Clear(); backwardHeap2.Clear(); + forward_heap1.Clear(); forward_heap2.Clear(); + reverse_heap1.Clear(); reverse_heap2.Clear(); int _localUpperbound1 = INT_MAX; int _localUpperbound2 = INT_MAX; + middle1 = UINT_MAX; + middle2 = UINT_MAX; + //insert new starting nodes into forward heap, adjusted by previous distances. if(searchFrom1stStartNode) { - forwardHeap.Insert(phantomNodePair.startPhantom.edgeBasedNode, -phantomNodePair.startPhantom.weight1, phantomNodePair.startPhantom.edgeBasedNode); - forwardHeap2.Insert(phantomNodePair.startPhantom.edgeBasedNode, -phantomNodePair.startPhantom.weight1, phantomNodePair.startPhantom.edgeBasedNode); + forward_heap1.Insert(phantomNodePair.startPhantom.edgeBasedNode, -phantomNodePair.startPhantom.weight1, phantomNodePair.startPhantom.edgeBasedNode); + forward_heap2.Insert(phantomNodePair.startPhantom.edgeBasedNode, -phantomNodePair.startPhantom.weight1, phantomNodePair.startPhantom.edgeBasedNode); } if(phantomNodePair.startPhantom.isBidirected() && searchFrom2ndStartNode) { - forwardHeap.Insert(phantomNodePair.startPhantom.edgeBasedNode+1, -phantomNodePair.startPhantom.weight2, phantomNodePair.startPhantom.edgeBasedNode+1); - forwardHeap2.Insert(phantomNodePair.startPhantom.edgeBasedNode+1, -phantomNodePair.startPhantom.weight2, phantomNodePair.startPhantom.edgeBasedNode+1); + forward_heap1.Insert(phantomNodePair.startPhantom.edgeBasedNode+1, -phantomNodePair.startPhantom.weight2, phantomNodePair.startPhantom.edgeBasedNode+1); + forward_heap2.Insert(phantomNodePair.startPhantom.edgeBasedNode+1, -phantomNodePair.startPhantom.weight2, phantomNodePair.startPhantom.edgeBasedNode+1); } //insert new backward nodes into backward heap, unadjusted. - backwardHeap.Insert(phantomNodePair.targetPhantom.edgeBasedNode, phantomNodePair.targetPhantom.weight1, phantomNodePair.targetPhantom.edgeBasedNode); + reverse_heap1.Insert(phantomNodePair.targetPhantom.edgeBasedNode, phantomNodePair.targetPhantom.weight1, phantomNodePair.targetPhantom.edgeBasedNode); if(phantomNodePair.targetPhantom.isBidirected() ) { - backwardHeap2.Insert(phantomNodePair.targetPhantom.edgeBasedNode+1, phantomNodePair.targetPhantom.weight2, phantomNodePair.targetPhantom.edgeBasedNode+1); + reverse_heap2.Insert(phantomNodePair.targetPhantom.edgeBasedNode+1, phantomNodePair.targetPhantom.weight2, phantomNodePair.targetPhantom.edgeBasedNode+1); } const int forward_offset = phantomNodePair.startPhantom.weight1 + (phantomNodePair.startPhantom.isBidirected() ? phantomNodePair.startPhantom.weight2 : 0); const int reverse_offset = phantomNodePair.targetPhantom.weight1 + (phantomNodePair.targetPhantom.isBidirected() ? phantomNodePair.targetPhantom.weight2 : 0); //run two-Target Dijkstra routing step. - while(0 < (forwardHeap.Size() + backwardHeap.Size() )){ - if(0 < forwardHeap.Size()){ - super::RoutingStep(forwardHeap, backwardHeap, &middle1, &_localUpperbound1, forward_offset, true); + while(0 < (forward_heap1.Size() + reverse_heap1.Size() )){ + if(0 < forward_heap1.Size()){ + super::RoutingStep(forward_heap1, reverse_heap1, &middle1, &_localUpperbound1, forward_offset, true); } - if(0 < backwardHeap.Size() ){ - super::RoutingStep(backwardHeap, forwardHeap, &middle1, &_localUpperbound1, reverse_offset, false); + if(0 < reverse_heap1.Size() ){ + super::RoutingStep(reverse_heap1, forward_heap1, &middle1, &_localUpperbound1, reverse_offset, false); } } - if(0 < backwardHeap2.Size()) { - while(0 < (forwardHeap2.Size() + backwardHeap2.Size() )){ - if(0 < forwardHeap2.Size()){ - super::RoutingStep(forwardHeap2, backwardHeap2, &middle2, &_localUpperbound2, forward_offset, true); + if(0 < reverse_heap2.Size()) { + while(0 < (forward_heap2.Size() + reverse_heap2.Size() )){ + if(0 < forward_heap2.Size()){ + super::RoutingStep(forward_heap2, reverse_heap2, &middle2, &_localUpperbound2, forward_offset, true); } - if(0 < backwardHeap2.Size()){ - super::RoutingStep(backwardHeap2, forwardHeap2, &middle2, &_localUpperbound2, reverse_offset, false); + if(0 < reverse_heap2.Size()){ + super::RoutingStep(reverse_heap2, forward_heap2, &middle2, &_localUpperbound2, reverse_offset, false); } } } @@ -111,13 +115,9 @@ public: } if(UINT_MAX == middle1) { searchFrom1stStartNode = false; - } else { - searchFrom1stStartNode = true; } if(UINT_MAX == middle2) { searchFrom2ndStartNode = false; - } else { - searchFrom2ndStartNode = true; } //Was at most one of the two paths not found? @@ -127,11 +127,11 @@ public: std::vector temporaryPackedPath1; std::vector temporaryPackedPath2; if(INT_MAX != _localUpperbound1) { - super::RetrievePackedPathFromHeap(forwardHeap, backwardHeap, middle1, temporaryPackedPath1); + super::RetrievePackedPathFromHeap(forward_heap1, reverse_heap1, middle1, temporaryPackedPath1); } if(INT_MAX != _localUpperbound2) { - super::RetrievePackedPathFromHeap(forwardHeap2, backwardHeap2, middle2, temporaryPackedPath2); + super::RetrievePackedPathFromHeap(forward_heap2, reverse_heap2, middle2, temporaryPackedPath2); } //if one of the paths was not found, replace it with the other one.