Fix unpacking for self-loop nodes not in core. Fixes #1999

This commit is contained in:
Patrick Niklaus 2016-02-21 01:38:06 +01:00
parent d0644bace9
commit 69bc8a8b22

View File

@ -679,18 +679,18 @@ template <class DataFacadeT, class Derived> class BasicRoutingInterface
BOOST_ASSERT_MSG((SPECIAL_NODEID != middle && INVALID_EDGE_WEIGHT != distance), BOOST_ASSERT_MSG((SPECIAL_NODEID != middle && INVALID_EDGE_WEIGHT != distance),
"no path found"); "no path found");
if (distance != forward_core_heap.GetKey(middle) + reverse_core_heap.GetKey(middle)) // we need to unpack sub path from core heaps
if (facade->IsCoreNode(middle))
{ {
// self loop if (distance != forward_core_heap.GetKey(middle) + reverse_core_heap.GetKey(middle))
BOOST_ASSERT(forward_core_heap.GetData(middle).parent == middle && {
reverse_core_heap.GetData(middle).parent == middle); // self loop
packed_leg.push_back(middle); BOOST_ASSERT(forward_core_heap.GetData(middle).parent == middle &&
packed_leg.push_back(middle); reverse_core_heap.GetData(middle).parent == middle);
} packed_leg.push_back(middle);
else packed_leg.push_back(middle);
{ }
// we need to unpack sub path from core heaps else
if (facade->IsCoreNode(middle))
{ {
std::vector<NodeID> packed_core_leg; std::vector<NodeID> packed_core_leg;
RetrievePackedPathFromHeap(forward_core_heap, reverse_core_heap, middle, RetrievePackedPathFromHeap(forward_core_heap, reverse_core_heap, middle,
@ -701,6 +701,17 @@ template <class DataFacadeT, class Derived> class BasicRoutingInterface
packed_leg.insert(packed_leg.end(), packed_core_leg.begin(), packed_core_leg.end()); packed_leg.insert(packed_leg.end(), packed_core_leg.begin(), packed_core_leg.end());
RetrievePackedPathFromSingleHeap(reverse_heap, packed_core_leg.back(), packed_leg); RetrievePackedPathFromSingleHeap(reverse_heap, packed_core_leg.back(), packed_leg);
} }
}
else
{
if (distance != forward_heap.GetKey(middle) + reverse_heap.GetKey(middle))
{
// self loop
BOOST_ASSERT(forward_heap.GetData(middle).parent == middle &&
reverse_heap.GetData(middle).parent == middle);
packed_leg.push_back(middle);
packed_leg.push_back(middle);
}
else else
{ {
RetrievePackedPathFromHeap(forward_heap, reverse_heap, middle, packed_leg); RetrievePackedPathFromHeap(forward_heap, reverse_heap, middle, packed_leg);