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),
"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
BOOST_ASSERT(forward_core_heap.GetData(middle).parent == middle &&
reverse_core_heap.GetData(middle).parent == middle);
packed_leg.push_back(middle);
packed_leg.push_back(middle);
}
else
{
// we need to unpack sub path from core heaps
if (facade->IsCoreNode(middle))
if (distance != forward_core_heap.GetKey(middle) + reverse_core_heap.GetKey(middle))
{
// self loop
BOOST_ASSERT(forward_core_heap.GetData(middle).parent == middle &&
reverse_core_heap.GetData(middle).parent == middle);
packed_leg.push_back(middle);
packed_leg.push_back(middle);
}
else
{
std::vector<NodeID> packed_core_leg;
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());
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
{
RetrievePackedPathFromHeap(forward_heap, reverse_heap, middle, packed_leg);