path searches were pruned too early, fixes #1117
This commit is contained in:
parent
d05152af71
commit
c324fbace4
@ -98,6 +98,9 @@ template <class DataFacadeT> class AlternativeRouting : private BasicRoutingInte
|
|||||||
|
|
||||||
int upper_bound_to_shortest_path_distance = INVALID_EDGE_WEIGHT;
|
int upper_bound_to_shortest_path_distance = INVALID_EDGE_WEIGHT;
|
||||||
NodeID middle_node = SPECIAL_NODEID;
|
NodeID middle_node = SPECIAL_NODEID;
|
||||||
|
EdgeWeight min_edge_offset = std::min(min_edge_offset, -phantom_node_pair.source_phantom.GetForwardWeightPlusOffset());
|
||||||
|
min_edge_offset = std::min(min_edge_offset, -phantom_node_pair.source_phantom.GetReverseWeightPlusOffset());
|
||||||
|
|
||||||
if (phantom_node_pair.source_phantom.forward_node_id != SPECIAL_NODEID)
|
if (phantom_node_pair.source_phantom.forward_node_id != SPECIAL_NODEID)
|
||||||
{
|
{
|
||||||
// SimpleLogger().Write(logDEBUG) << "fwd-a insert: " <<
|
// SimpleLogger().Write(logDEBUG) << "fwd-a insert: " <<
|
||||||
@ -109,8 +112,8 @@ template <class DataFacadeT> class AlternativeRouting : private BasicRoutingInte
|
|||||||
}
|
}
|
||||||
if (phantom_node_pair.source_phantom.reverse_node_id != SPECIAL_NODEID)
|
if (phantom_node_pair.source_phantom.reverse_node_id != SPECIAL_NODEID)
|
||||||
{
|
{
|
||||||
// SimpleLogger().Write(logDEBUG) << "fwd-b insert: " <<
|
// SimpleLogger().Write(logDEBUG) << "fwd-b insert: " <<
|
||||||
// phantom_node_pair.source_phantom.reverse_node_id << ", w: " <<
|
// phantom_node_pair.source_phantom.reverse_node_id << ", w: " <<
|
||||||
// -phantom_node_pair.source_phantom.GetReverseWeightPlusOffset();
|
// -phantom_node_pair.source_phantom.GetReverseWeightPlusOffset();
|
||||||
forward_heap1.Insert(phantom_node_pair.source_phantom.reverse_node_id,
|
forward_heap1.Insert(phantom_node_pair.source_phantom.reverse_node_id,
|
||||||
-phantom_node_pair.source_phantom.GetReverseWeightPlusOffset(),
|
-phantom_node_pair.source_phantom.GetReverseWeightPlusOffset(),
|
||||||
@ -146,7 +149,8 @@ template <class DataFacadeT> class AlternativeRouting : private BasicRoutingInte
|
|||||||
&middle_node,
|
&middle_node,
|
||||||
&upper_bound_to_shortest_path_distance,
|
&upper_bound_to_shortest_path_distance,
|
||||||
via_node_candidate_list,
|
via_node_candidate_list,
|
||||||
forward_search_space);
|
forward_search_space,
|
||||||
|
min_edge_offset);
|
||||||
}
|
}
|
||||||
if (0 < reverse_heap1.Size())
|
if (0 < reverse_heap1.Size())
|
||||||
{
|
{
|
||||||
@ -155,7 +159,8 @@ template <class DataFacadeT> class AlternativeRouting : private BasicRoutingInte
|
|||||||
&middle_node,
|
&middle_node,
|
||||||
&upper_bound_to_shortest_path_distance,
|
&upper_bound_to_shortest_path_distance,
|
||||||
via_node_candidate_list,
|
via_node_candidate_list,
|
||||||
reverse_search_space);
|
reverse_search_space,
|
||||||
|
min_edge_offset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -271,7 +276,7 @@ template <class DataFacadeT> class AlternativeRouting : private BasicRoutingInte
|
|||||||
{
|
{
|
||||||
int length_of_via_path = 0, sharing_of_via_path = 0;
|
int length_of_via_path = 0, sharing_of_via_path = 0;
|
||||||
ComputeLengthAndSharingOfViaPath(
|
ComputeLengthAndSharingOfViaPath(
|
||||||
node, &length_of_via_path, &sharing_of_via_path, packed_shortest_path);
|
node, &length_of_via_path, &sharing_of_via_path, packed_shortest_path, min_edge_offset);
|
||||||
const int maximum_allowed_sharing = static_cast<int>(
|
const int maximum_allowed_sharing = static_cast<int>(
|
||||||
upper_bound_to_shortest_path_distance * VIAPATH_GAMMA);
|
upper_bound_to_shortest_path_distance * VIAPATH_GAMMA);
|
||||||
if (sharing_of_via_path <= maximum_allowed_sharing &&
|
if (sharing_of_via_path <= maximum_allowed_sharing &&
|
||||||
@ -295,7 +300,8 @@ template <class DataFacadeT> class AlternativeRouting : private BasicRoutingInte
|
|||||||
upper_bound_to_shortest_path_distance,
|
upper_bound_to_shortest_path_distance,
|
||||||
&length_of_via_path,
|
&length_of_via_path,
|
||||||
&s_v_middle,
|
&s_v_middle,
|
||||||
&v_t_middle))
|
&v_t_middle,
|
||||||
|
min_edge_offset))
|
||||||
{
|
{
|
||||||
// select first admissable
|
// select first admissable
|
||||||
selected_via_node = candidate.node;
|
selected_via_node = candidate.node;
|
||||||
@ -379,7 +385,8 @@ template <class DataFacadeT> class AlternativeRouting : private BasicRoutingInte
|
|||||||
inline void ComputeLengthAndSharingOfViaPath(const NodeID via_node,
|
inline void ComputeLengthAndSharingOfViaPath(const NodeID via_node,
|
||||||
int *real_length_of_via_path,
|
int *real_length_of_via_path,
|
||||||
int *sharing_of_via_path,
|
int *sharing_of_via_path,
|
||||||
const std::vector<NodeID> &packed_shortest_path)
|
const std::vector<NodeID> &packed_shortest_path,
|
||||||
|
const EdgeWeight min_edge_offset)
|
||||||
{
|
{
|
||||||
engine_working_data.InitializeOrClearSecondThreadLocalStorage(
|
engine_working_data.InitializeOrClearSecondThreadLocalStorage(
|
||||||
super::facade->GetNumberOfNodes());
|
super::facade->GetNumberOfNodes());
|
||||||
@ -405,6 +412,7 @@ template <class DataFacadeT> class AlternativeRouting : private BasicRoutingInte
|
|||||||
existing_forward_heap,
|
existing_forward_heap,
|
||||||
&s_v_middle,
|
&s_v_middle,
|
||||||
&upper_bound_s_v_path_length,
|
&upper_bound_s_v_path_length,
|
||||||
|
min_edge_offset,
|
||||||
false);
|
false);
|
||||||
}
|
}
|
||||||
// compute path <v,..,t> by reusing backward search from node t
|
// compute path <v,..,t> by reusing backward search from node t
|
||||||
@ -417,6 +425,7 @@ template <class DataFacadeT> class AlternativeRouting : private BasicRoutingInte
|
|||||||
existing_reverse_heap,
|
existing_reverse_heap,
|
||||||
&v_t_middle,
|
&v_t_middle,
|
||||||
&upper_bound_of_v_t_path_length,
|
&upper_bound_of_v_t_path_length,
|
||||||
|
min_edge_offset,
|
||||||
true);
|
true);
|
||||||
}
|
}
|
||||||
*real_length_of_via_path = upper_bound_s_v_path_length + upper_bound_of_v_t_path_length;
|
*real_length_of_via_path = upper_bound_s_v_path_length + upper_bound_of_v_t_path_length;
|
||||||
@ -578,11 +587,15 @@ template <class DataFacadeT> class AlternativeRouting : private BasicRoutingInte
|
|||||||
NodeID *middle_node,
|
NodeID *middle_node,
|
||||||
int *upper_bound_to_shortest_path_distance,
|
int *upper_bound_to_shortest_path_distance,
|
||||||
std::vector<NodeID> &search_space_intersection,
|
std::vector<NodeID> &search_space_intersection,
|
||||||
std::vector<SearchSpaceEdge> &search_space) const
|
std::vector<SearchSpaceEdge> &search_space,
|
||||||
|
const EdgeWeight min_edge_offset) const
|
||||||
{
|
{
|
||||||
const NodeID node = forward_heap.DeleteMin();
|
const NodeID node = forward_heap.DeleteMin();
|
||||||
const int distance = forward_heap.GetKey(node);
|
const int distance = forward_heap.GetKey(node);
|
||||||
const int scaled_distance = static_cast<int>(distance / (1. + VIAPATH_EPSILON));
|
// const NodeID parentnode = forward_heap.GetData(node).parent;
|
||||||
|
// SimpleLogger().Write() << (is_forward_directed ? "[fwd] " : "[rev] ") << "settled edge (" << parentnode << "," << node << "), dist: " << distance;
|
||||||
|
|
||||||
|
const int scaled_distance = static_cast<int>((distance + min_edge_offset) / (1. + VIAPATH_EPSILON));
|
||||||
if ((INVALID_EDGE_WEIGHT != *upper_bound_to_shortest_path_distance) &&
|
if ((INVALID_EDGE_WEIGHT != *upper_bound_to_shortest_path_distance) &&
|
||||||
(scaled_distance > *upper_bound_to_shortest_path_distance))
|
(scaled_distance > *upper_bound_to_shortest_path_distance))
|
||||||
{
|
{
|
||||||
@ -595,7 +608,6 @@ template <class DataFacadeT> class AlternativeRouting : private BasicRoutingInte
|
|||||||
if (reverse_heap.WasInserted(node))
|
if (reverse_heap.WasInserted(node))
|
||||||
{
|
{
|
||||||
search_space_intersection.emplace_back(node);
|
search_space_intersection.emplace_back(node);
|
||||||
|
|
||||||
const int new_distance = reverse_heap.GetKey(node) + distance;
|
const int new_distance = reverse_heap.GetKey(node) + distance;
|
||||||
if (new_distance < *upper_bound_to_shortest_path_distance)
|
if (new_distance < *upper_bound_to_shortest_path_distance)
|
||||||
{
|
{
|
||||||
@ -603,6 +615,9 @@ template <class DataFacadeT> class AlternativeRouting : private BasicRoutingInte
|
|||||||
{
|
{
|
||||||
*middle_node = node;
|
*middle_node = node;
|
||||||
*upper_bound_to_shortest_path_distance = new_distance;
|
*upper_bound_to_shortest_path_distance = new_distance;
|
||||||
|
// SimpleLogger().Write() << "accepted middle_node " << *middle_node << " at distance " << new_distance;
|
||||||
|
// } else {
|
||||||
|
// SimpleLogger().Write() << "discarded middle_node " << *middle_node << " at distance " << new_distance;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -647,7 +662,8 @@ template <class DataFacadeT> class AlternativeRouting : private BasicRoutingInte
|
|||||||
const int length_of_shortest_path,
|
const int length_of_shortest_path,
|
||||||
int *length_of_via_path,
|
int *length_of_via_path,
|
||||||
NodeID *s_v_middle,
|
NodeID *s_v_middle,
|
||||||
NodeID *v_t_middle) const
|
NodeID *v_t_middle,
|
||||||
|
const EdgeWeight min_edge_offset) const
|
||||||
{
|
{
|
||||||
new_forward_heap.Clear();
|
new_forward_heap.Clear();
|
||||||
new_reverse_heap.Clear();
|
new_reverse_heap.Clear();
|
||||||
@ -664,6 +680,7 @@ template <class DataFacadeT> class AlternativeRouting : private BasicRoutingInte
|
|||||||
existing_forward_heap,
|
existing_forward_heap,
|
||||||
s_v_middle,
|
s_v_middle,
|
||||||
&upper_bound_s_v_path_length,
|
&upper_bound_s_v_path_length,
|
||||||
|
min_edge_offset,
|
||||||
false);
|
false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -682,6 +699,7 @@ template <class DataFacadeT> class AlternativeRouting : private BasicRoutingInte
|
|||||||
existing_reverse_heap,
|
existing_reverse_heap,
|
||||||
v_t_middle,
|
v_t_middle,
|
||||||
&upper_bound_of_v_t_path_length,
|
&upper_bound_of_v_t_path_length,
|
||||||
|
min_edge_offset,
|
||||||
true);
|
true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -850,11 +868,11 @@ template <class DataFacadeT> class AlternativeRouting : private BasicRoutingInte
|
|||||||
{
|
{
|
||||||
if (!forward_heap3.Empty())
|
if (!forward_heap3.Empty())
|
||||||
{
|
{
|
||||||
super::RoutingStep(forward_heap3, reverse_heap3, &middle, &upper_bound, true);
|
super::RoutingStep(forward_heap3, reverse_heap3, &middle, &upper_bound, min_edge_offset, true);
|
||||||
}
|
}
|
||||||
if (!reverse_heap3.Empty())
|
if (!reverse_heap3.Empty())
|
||||||
{
|
{
|
||||||
super::RoutingStep(reverse_heap3, forward_heap3, &middle, &upper_bound, false);
|
super::RoutingStep(reverse_heap3, forward_heap3, &middle, &upper_bound, min_edge_offset, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return (upper_bound <= t_test_path_length);
|
return (upper_bound <= t_test_path_length);
|
||||||
|
@ -63,10 +63,15 @@ template <class DataFacadeT> class BasicRoutingInterface
|
|||||||
SearchEngineData::QueryHeap &reverse_heap,
|
SearchEngineData::QueryHeap &reverse_heap,
|
||||||
NodeID *middle_node_id,
|
NodeID *middle_node_id,
|
||||||
int *upper_bound,
|
int *upper_bound,
|
||||||
|
const int min_edge_offset,
|
||||||
const bool forward_direction) const
|
const bool forward_direction) const
|
||||||
{
|
{
|
||||||
const NodeID node = forward_heap.DeleteMin();
|
const NodeID node = forward_heap.DeleteMin();
|
||||||
const int distance = forward_heap.GetKey(node);
|
const int distance = forward_heap.GetKey(node);
|
||||||
|
|
||||||
|
// const NodeID parentnode = forward_heap.GetData(node).parent;
|
||||||
|
// SimpleLogger().Write() << (forward_direction ? "[fwd] " : "[rev] ") << "settled edge (" << parentnode << "," << node << "), dist: " << distance;
|
||||||
|
|
||||||
if (reverse_heap.WasInserted(node))
|
if (reverse_heap.WasInserted(node))
|
||||||
{
|
{
|
||||||
const int new_distance = reverse_heap.GetKey(node) + distance;
|
const int new_distance = reverse_heap.GetKey(node) + distance;
|
||||||
@ -76,12 +81,16 @@ template <class DataFacadeT> class BasicRoutingInterface
|
|||||||
{
|
{
|
||||||
*middle_node_id = node;
|
*middle_node_id = node;
|
||||||
*upper_bound = new_distance;
|
*upper_bound = new_distance;
|
||||||
|
// SimpleLogger().Write() << "accepted middle node " << node << " at distance " << new_distance;
|
||||||
|
// } else {
|
||||||
|
// SimpleLogger().Write() << "discared middle node " << node << " at distance " << new_distance;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (distance > *upper_bound)
|
if (distance + min_edge_offset > *upper_bound)
|
||||||
{
|
{
|
||||||
|
// SimpleLogger().Write() << "min_edge_offset: " << min_edge_offset;
|
||||||
forward_heap.DeleteAll();
|
forward_heap.DeleteAll();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -86,6 +86,8 @@ template <class DataFacadeT> class ShortestPathRouting : public BasicRoutingInte
|
|||||||
middle1 = UINT_MAX;
|
middle1 = UINT_MAX;
|
||||||
middle2 = UINT_MAX;
|
middle2 = UINT_MAX;
|
||||||
|
|
||||||
|
int min_edge_offset = 0;
|
||||||
|
|
||||||
// insert new starting nodes into forward heap, adjusted by previous distances.
|
// insert new starting nodes into forward heap, adjusted by previous distances.
|
||||||
if (search_from_1st_node &&
|
if (search_from_1st_node &&
|
||||||
phantom_node_pair.source_phantom.forward_node_id != SPECIAL_NODEID)
|
phantom_node_pair.source_phantom.forward_node_id != SPECIAL_NODEID)
|
||||||
@ -94,10 +96,15 @@ template <class DataFacadeT> class ShortestPathRouting : public BasicRoutingInte
|
|||||||
phantom_node_pair.source_phantom.forward_node_id,
|
phantom_node_pair.source_phantom.forward_node_id,
|
||||||
distance1 - phantom_node_pair.source_phantom.GetForwardWeightPlusOffset(),
|
distance1 - phantom_node_pair.source_phantom.GetForwardWeightPlusOffset(),
|
||||||
phantom_node_pair.source_phantom.forward_node_id);
|
phantom_node_pair.source_phantom.forward_node_id);
|
||||||
|
min_edge_offset = std::min(min_edge_offset, distance1 - phantom_node_pair.source_phantom.GetForwardWeightPlusOffset());
|
||||||
|
// SimpleLogger().Write(logDEBUG) << "fwd-a2 insert: " << phantom_node_pair.source_phantom.forward_node_id << ", w: " << distance1 - phantom_node_pair.source_phantom.GetForwardWeightPlusOffset();
|
||||||
forward_heap2.Insert(
|
forward_heap2.Insert(
|
||||||
phantom_node_pair.source_phantom.forward_node_id,
|
phantom_node_pair.source_phantom.forward_node_id,
|
||||||
distance1 - phantom_node_pair.source_phantom.GetForwardWeightPlusOffset(),
|
distance1 - phantom_node_pair.source_phantom.GetForwardWeightPlusOffset(),
|
||||||
phantom_node_pair.source_phantom.forward_node_id);
|
phantom_node_pair.source_phantom.forward_node_id);
|
||||||
|
min_edge_offset = std::min(min_edge_offset, distance1 - phantom_node_pair.source_phantom.GetForwardWeightPlusOffset());
|
||||||
|
// SimpleLogger().Write(logDEBUG) << "fwd-b2 insert: " << phantom_node_pair.source_phantom.forward_node_id << ", w: " << distance1 - phantom_node_pair.source_phantom.GetForwardWeightPlusOffset();
|
||||||
|
|
||||||
}
|
}
|
||||||
if (search_from_2nd_node &&
|
if (search_from_2nd_node &&
|
||||||
phantom_node_pair.source_phantom.reverse_node_id != SPECIAL_NODEID)
|
phantom_node_pair.source_phantom.reverse_node_id != SPECIAL_NODEID)
|
||||||
@ -106,10 +113,16 @@ template <class DataFacadeT> class ShortestPathRouting : public BasicRoutingInte
|
|||||||
phantom_node_pair.source_phantom.reverse_node_id,
|
phantom_node_pair.source_phantom.reverse_node_id,
|
||||||
distance2 - phantom_node_pair.source_phantom.GetReverseWeightPlusOffset(),
|
distance2 - phantom_node_pair.source_phantom.GetReverseWeightPlusOffset(),
|
||||||
phantom_node_pair.source_phantom.reverse_node_id);
|
phantom_node_pair.source_phantom.reverse_node_id);
|
||||||
|
min_edge_offset = std::min(min_edge_offset, distance2 - phantom_node_pair.source_phantom.GetReverseWeightPlusOffset());
|
||||||
|
// SimpleLogger().Write(logDEBUG) << "fwd-a2 insert: " << phantom_node_pair.source_phantom.reverse_node_id <<
|
||||||
|
// ", w: " << distance2 - phantom_node_pair.source_phantom.GetReverseWeightPlusOffset();
|
||||||
forward_heap2.Insert(
|
forward_heap2.Insert(
|
||||||
phantom_node_pair.source_phantom.reverse_node_id,
|
phantom_node_pair.source_phantom.reverse_node_id,
|
||||||
distance2 - phantom_node_pair.source_phantom.GetReverseWeightPlusOffset(),
|
distance2 - phantom_node_pair.source_phantom.GetReverseWeightPlusOffset(),
|
||||||
phantom_node_pair.source_phantom.reverse_node_id);
|
phantom_node_pair.source_phantom.reverse_node_id);
|
||||||
|
min_edge_offset = std::min(min_edge_offset, distance2 - phantom_node_pair.source_phantom.GetReverseWeightPlusOffset());
|
||||||
|
// SimpleLogger().Write(logDEBUG) << "fwd-b2 insert: " << phantom_node_pair.source_phantom.reverse_node_id <<
|
||||||
|
// ", w: " << distance2 - phantom_node_pair.source_phantom.GetReverseWeightPlusOffset();
|
||||||
}
|
}
|
||||||
|
|
||||||
// insert new backward nodes into backward heap, unadjusted.
|
// insert new backward nodes into backward heap, unadjusted.
|
||||||
@ -118,13 +131,17 @@ template <class DataFacadeT> class ShortestPathRouting : public BasicRoutingInte
|
|||||||
reverse_heap1.Insert(phantom_node_pair.target_phantom.forward_node_id,
|
reverse_heap1.Insert(phantom_node_pair.target_phantom.forward_node_id,
|
||||||
phantom_node_pair.target_phantom.GetForwardWeightPlusOffset(),
|
phantom_node_pair.target_phantom.GetForwardWeightPlusOffset(),
|
||||||
phantom_node_pair.target_phantom.forward_node_id);
|
phantom_node_pair.target_phantom.forward_node_id);
|
||||||
}
|
// SimpleLogger().Write(logDEBUG) << "rev-a insert: " << phantom_node_pair.target_phantom.forward_node_id <<
|
||||||
|
// ", w: " << phantom_node_pair.target_phantom.GetForwardWeightPlusOffset();
|
||||||
|
}
|
||||||
|
|
||||||
if (phantom_node_pair.target_phantom.reverse_node_id != SPECIAL_NODEID)
|
if (phantom_node_pair.target_phantom.reverse_node_id != SPECIAL_NODEID)
|
||||||
{
|
{
|
||||||
reverse_heap2.Insert(phantom_node_pair.target_phantom.reverse_node_id,
|
reverse_heap2.Insert(phantom_node_pair.target_phantom.reverse_node_id,
|
||||||
phantom_node_pair.target_phantom.GetReverseWeightPlusOffset(),
|
phantom_node_pair.target_phantom.GetReverseWeightPlusOffset(),
|
||||||
phantom_node_pair.target_phantom.reverse_node_id);
|
phantom_node_pair.target_phantom.reverse_node_id);
|
||||||
|
// SimpleLogger().Write(logDEBUG) << "rev-a insert: " << phantom_node_pair.target_phantom.reverse_node_id <<
|
||||||
|
// ", w: " << phantom_node_pair.target_phantom.GetReverseWeightPlusOffset();
|
||||||
}
|
}
|
||||||
|
|
||||||
// run two-Target Dijkstra routing step.
|
// run two-Target Dijkstra routing step.
|
||||||
@ -133,12 +150,12 @@ template <class DataFacadeT> class ShortestPathRouting : public BasicRoutingInte
|
|||||||
if (0 < forward_heap1.Size())
|
if (0 < forward_heap1.Size())
|
||||||
{
|
{
|
||||||
super::RoutingStep(
|
super::RoutingStep(
|
||||||
forward_heap1, reverse_heap1, &middle1, &local_upper_bound1, true);
|
forward_heap1, reverse_heap1, &middle1, &local_upper_bound1, min_edge_offset, true);
|
||||||
}
|
}
|
||||||
if (0 < reverse_heap1.Size())
|
if (0 < reverse_heap1.Size())
|
||||||
{
|
{
|
||||||
super::RoutingStep(
|
super::RoutingStep(
|
||||||
reverse_heap1, forward_heap1, &middle1, &local_upper_bound1, false);
|
reverse_heap1, forward_heap1, &middle1, &local_upper_bound1, min_edge_offset, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -149,12 +166,12 @@ template <class DataFacadeT> class ShortestPathRouting : public BasicRoutingInte
|
|||||||
if (0 < forward_heap2.Size())
|
if (0 < forward_heap2.Size())
|
||||||
{
|
{
|
||||||
super::RoutingStep(
|
super::RoutingStep(
|
||||||
forward_heap2, reverse_heap2, &middle2, &local_upper_bound2, true);
|
forward_heap2, reverse_heap2, &middle2, &local_upper_bound2, min_edge_offset, true);
|
||||||
}
|
}
|
||||||
if (0 < reverse_heap2.Size())
|
if (0 < reverse_heap2.Size())
|
||||||
{
|
{
|
||||||
super::RoutingStep(
|
super::RoutingStep(
|
||||||
reverse_heap2, forward_heap2, &middle2, &local_upper_bound2, false);
|
reverse_heap2, forward_heap2, &middle2, &local_upper_bound2, min_edge_offset, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user