Fixing issue that enters infinite loop under certain conditions
This commit is contained in:
parent
c2be6bc019
commit
0b1d268b09
@ -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);
|
||||
|
@ -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<NodeID> temporaryPackedPath1;
|
||||
std::vector<NodeID> 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.
|
||||
|
Loading…
Reference in New Issue
Block a user