wip
This commit is contained in:
parent
49cf294d2f
commit
8b34d5b40c
@ -359,7 +359,7 @@ if(ENABLE_CONAN)
|
|||||||
KEEP_RPATHS
|
KEEP_RPATHS
|
||||||
NO_OUTPUT_DIRS
|
NO_OUTPUT_DIRS
|
||||||
OPTIONS boost:filesystem_version=3 # https://stackoverflow.com/questions/73392648/error-with-boost-filesystem-version-in-cmake
|
OPTIONS boost:filesystem_version=3 # https://stackoverflow.com/questions/73392648/error-with-boost-filesystem-version-in-cmake
|
||||||
onetbb:shared=${TBB_SHARED}
|
# onetbb:shared=${TBB_SHARED}
|
||||||
boost:without_stacktrace=True # Apple Silicon cross-compilation fails without it
|
boost:without_stacktrace=True # Apple Silicon cross-compilation fails without it
|
||||||
BUILD missing
|
BUILD missing
|
||||||
)
|
)
|
||||||
|
@ -471,6 +471,23 @@ double getNetworkDistance(SearchEngineData<Algorithm> &engine_working_data,
|
|||||||
const PhantomNode &target_phantom,
|
const PhantomNode &target_phantom,
|
||||||
EdgeWeight duration_upper_bound = INVALID_EDGE_WEIGHT);
|
EdgeWeight duration_upper_bound = INVALID_EDGE_WEIGHT);
|
||||||
|
|
||||||
|
inline double getNetworkDistanceOld(SearchEngineData<Algorithm> &engine_working_data,
|
||||||
|
const DataFacade<ch::Algorithm> &facade,
|
||||||
|
SearchEngineData<Algorithm>::QueryHeap &forward_heap,
|
||||||
|
SearchEngineData<Algorithm>::QueryHeap &reverse_heap,
|
||||||
|
const PhantomNode &source_phantom,
|
||||||
|
const PhantomNode &target_phantom,
|
||||||
|
EdgeWeight duration_upper_bound = INVALID_EDGE_WEIGHT)
|
||||||
|
{
|
||||||
|
return getNetworkDistance(engine_working_data,
|
||||||
|
facade,
|
||||||
|
forward_heap,
|
||||||
|
reverse_heap,
|
||||||
|
source_phantom,
|
||||||
|
target_phantom,
|
||||||
|
duration_upper_bound);
|
||||||
|
}
|
||||||
|
|
||||||
template <typename EdgeMetric>
|
template <typename EdgeMetric>
|
||||||
std::tuple<EdgeMetric, EdgeDistance> getLoopMetric(const DataFacade<Algorithm> &facade, NodeID node)
|
std::tuple<EdgeMetric, EdgeDistance> getLoopMetric(const DataFacade<Algorithm> &facade, NodeID node)
|
||||||
{
|
{
|
||||||
|
@ -705,42 +705,134 @@ double getNetworkDistance(SearchEngineData<Algorithm> &engine_working_data,
|
|||||||
EdgeWeight weight_upper_bound = INVALID_EDGE_WEIGHT)
|
EdgeWeight weight_upper_bound = INVALID_EDGE_WEIGHT)
|
||||||
{
|
{
|
||||||
reverse_heap.Clear();
|
reverse_heap.Clear();
|
||||||
|
// forward_heap.Clear();
|
||||||
|
|
||||||
if (forward_heap.empty()) {
|
// if (forward_heap.Empty())
|
||||||
if (source_phantom.IsValidForwardSource())
|
// {
|
||||||
{
|
// if (source_phantom.IsValidForwardSource())
|
||||||
forward_heap.Insert(source_phantom.forward_segment_id.id,
|
// {
|
||||||
EdgeWeight{0} - source_phantom.GetForwardWeightPlusOffset(),
|
// forward_heap.Insert(source_phantom.forward_segment_id.id,
|
||||||
{source_phantom.forward_segment_id.id,
|
// EdgeWeight{0} - source_phantom.GetForwardWeightPlusOffset(),
|
||||||
false,
|
// {source_phantom.forward_segment_id.id,
|
||||||
EdgeDistance{0} - source_phantom.GetForwardDistance()});
|
// false,
|
||||||
}
|
// EdgeDistance{0} - source_phantom.GetForwardDistance()});
|
||||||
|
// }
|
||||||
|
|
||||||
if (source_phantom.IsValidReverseSource())
|
// if (source_phantom.IsValidReverseSource())
|
||||||
|
// {
|
||||||
|
// forward_heap.Insert(source_phantom.reverse_segment_id.id,
|
||||||
|
// EdgeWeight{0} - source_phantom.GetReverseWeightPlusOffset(),
|
||||||
|
// {source_phantom.reverse_segment_id.id,
|
||||||
|
// false,
|
||||||
|
// EdgeDistance{0} - source_phantom.GetReverseDistance()});
|
||||||
|
// }
|
||||||
|
// } else {
|
||||||
|
// const auto node =
|
||||||
|
// forward_heap.GetHeapNodeIfWasInserted(target_phantom.forward_segment_id.id); if (node) {
|
||||||
|
// std::cerr << "Found " << target_phantom.forward_segment_id.id << " in forward_heap "
|
||||||
|
// << node->data.distance << std::endl;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
if (!forward_heap.Empty())
|
||||||
|
{
|
||||||
|
if (target_phantom.IsValidForwardTarget() && !target_phantom.IsValidReverseTarget())
|
||||||
{
|
{
|
||||||
forward_heap.Insert(source_phantom.reverse_segment_id.id,
|
if (const auto node =
|
||||||
EdgeWeight{0} - source_phantom.GetReverseWeightPlusOffset(),
|
forward_heap.GetHeapNodeIfWasInserted(target_phantom.forward_segment_id.id))
|
||||||
{source_phantom.reverse_segment_id.id,
|
{
|
||||||
false,
|
return from_alias<double>(node->data.distance);
|
||||||
EdgeDistance{0} - source_phantom.GetReverseDistance()});
|
}
|
||||||
}
|
}
|
||||||
|
// if (target_phantom.IsValidReverseTarget()) {
|
||||||
|
// if (const auto node =
|
||||||
|
// forward_heap.GetHeapNodeIfWasInserted(target_phantom.reverse_segment_id.id)) {
|
||||||
|
// return from_alias<double>(node->data.distance);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
forward_heap.Clear();
|
||||||
|
|
||||||
|
if (source_phantom.IsValidForwardSource())
|
||||||
|
{
|
||||||
|
forward_heap.Insert(source_phantom.forward_segment_id.id,
|
||||||
|
EdgeWeight{0},
|
||||||
|
{source_phantom.forward_segment_id.id, false, EdgeDistance{0}});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (source_phantom.IsValidReverseSource())
|
||||||
|
{
|
||||||
|
forward_heap.Insert(source_phantom.reverse_segment_id.id,
|
||||||
|
EdgeWeight{0},
|
||||||
|
{source_phantom.reverse_segment_id.id, false, EdgeDistance{0}});
|
||||||
|
}
|
||||||
|
|
||||||
if (target_phantom.IsValidForwardTarget())
|
if (target_phantom.IsValidForwardTarget())
|
||||||
{
|
{
|
||||||
reverse_heap.Insert(
|
reverse_heap.Insert(target_phantom.forward_segment_id.id,
|
||||||
target_phantom.forward_segment_id.id,
|
EdgeWeight{0},
|
||||||
target_phantom.GetForwardWeightPlusOffset(),
|
{target_phantom.forward_segment_id.id, false, EdgeDistance{0}});
|
||||||
{target_phantom.forward_segment_id.id, false, target_phantom.GetForwardDistance()});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (target_phantom.IsValidReverseTarget())
|
if (target_phantom.IsValidReverseTarget())
|
||||||
{
|
{
|
||||||
reverse_heap.Insert(
|
reverse_heap.Insert(target_phantom.reverse_segment_id.id,
|
||||||
target_phantom.reverse_segment_id.id,
|
EdgeWeight{0},
|
||||||
target_phantom.GetReverseWeightPlusOffset(),
|
{target_phantom.reverse_segment_id.id, false, EdgeDistance{0}});
|
||||||
{target_phantom.reverse_segment_id.id, false, target_phantom.GetReverseDistance()});
|
}
|
||||||
|
|
||||||
|
const PhantomEndpoints endpoints{source_phantom, target_phantom};
|
||||||
|
|
||||||
|
auto distance = searchDistance(
|
||||||
|
engine_working_data, facade, forward_heap, reverse_heap, {}, weight_upper_bound, endpoints);
|
||||||
|
|
||||||
|
if (distance == INVALID_EDGE_DISTANCE)
|
||||||
|
{
|
||||||
|
return std::numeric_limits<double>::max();
|
||||||
|
}
|
||||||
|
return from_alias<double>(distance);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Algorithm>
|
||||||
|
double
|
||||||
|
getNetworkDistanceOld(SearchEngineData<Algorithm> &engine_working_data,
|
||||||
|
const DataFacade<Algorithm> &facade,
|
||||||
|
typename SearchEngineData<Algorithm>::MapMatchingQueryHeap &forward_heap,
|
||||||
|
typename SearchEngineData<Algorithm>::MapMatchingQueryHeap &reverse_heap,
|
||||||
|
const PhantomNode &source_phantom,
|
||||||
|
const PhantomNode &target_phantom,
|
||||||
|
EdgeWeight weight_upper_bound = INVALID_EDGE_WEIGHT)
|
||||||
|
{
|
||||||
|
reverse_heap.Clear();
|
||||||
|
forward_heap.Clear();
|
||||||
|
|
||||||
|
if (source_phantom.IsValidForwardSource())
|
||||||
|
{
|
||||||
|
forward_heap.Insert(source_phantom.forward_segment_id.id,
|
||||||
|
EdgeWeight{0},
|
||||||
|
{source_phantom.forward_segment_id.id, false, EdgeDistance{0}});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (source_phantom.IsValidReverseSource())
|
||||||
|
{
|
||||||
|
forward_heap.Insert(source_phantom.reverse_segment_id.id,
|
||||||
|
EdgeWeight{0},
|
||||||
|
{source_phantom.reverse_segment_id.id, false, EdgeDistance{0}});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (target_phantom.IsValidForwardTarget())
|
||||||
|
{
|
||||||
|
reverse_heap.Insert(target_phantom.forward_segment_id.id,
|
||||||
|
EdgeWeight{0},
|
||||||
|
{target_phantom.forward_segment_id.id, false, EdgeDistance{0}});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (target_phantom.IsValidReverseTarget())
|
||||||
|
{
|
||||||
|
reverse_heap.Insert(target_phantom.reverse_segment_id.id,
|
||||||
|
EdgeWeight{0},
|
||||||
|
{target_phantom.reverse_segment_id.id, false, EdgeDistance{0}});
|
||||||
}
|
}
|
||||||
|
|
||||||
const PhantomEndpoints endpoints{source_phantom, target_phantom};
|
const PhantomEndpoints endpoints{source_phantom, target_phantom};
|
||||||
|
@ -217,6 +217,78 @@ SubMatchingList mapMatching(SearchEngineData<Algorithm> &engine_working_data,
|
|||||||
const EdgeWeight weight_upper_bound = to_alias<EdgeWeight>(
|
const EdgeWeight weight_upper_bound = to_alias<EdgeWeight>(
|
||||||
((haversine_distance + max_distance_delta) / 4.) * facade.GetWeightMultiplier());
|
((haversine_distance + max_distance_delta) / 4.) * facade.GetWeightMultiplier());
|
||||||
|
|
||||||
|
std::vector<double> old_distances;
|
||||||
|
for (const auto s : util::irange<std::size_t>(0UL, prev_viterbi.size()))
|
||||||
|
{
|
||||||
|
if (prev_pruned[s])
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
forward_heap.Clear();
|
||||||
|
|
||||||
|
for (const auto s_prime : util::irange<std::size_t>(0UL, current_viterbi.size()))
|
||||||
|
{
|
||||||
|
const double emission_pr = emission_log_probabilities[t][s_prime];
|
||||||
|
double new_value = prev_viterbi[s] + emission_pr;
|
||||||
|
if (current_viterbi[s_prime] > new_value)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
double network_distance =
|
||||||
|
getNetworkDistanceOld(engine_working_data,
|
||||||
|
facade,
|
||||||
|
forward_heap,
|
||||||
|
reverse_heap,
|
||||||
|
prev_unbroken_timestamps_list[s].phantom_node,
|
||||||
|
current_timestamps_list[s_prime].phantom_node,
|
||||||
|
weight_upper_bound);
|
||||||
|
old_distances.push_back(network_distance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<double> new_distances;
|
||||||
|
for (const auto s : util::irange<std::size_t>(0UL, prev_viterbi.size()))
|
||||||
|
{
|
||||||
|
if (prev_pruned[s])
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
forward_heap.Clear();
|
||||||
|
|
||||||
|
for (const auto s_prime : util::irange<std::size_t>(0UL, current_viterbi.size()))
|
||||||
|
{
|
||||||
|
const double emission_pr = emission_log_probabilities[t][s_prime];
|
||||||
|
double new_value = prev_viterbi[s] + emission_pr;
|
||||||
|
if (current_viterbi[s_prime] > new_value)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
double network_distance =
|
||||||
|
getNetworkDistance(engine_working_data,
|
||||||
|
facade,
|
||||||
|
forward_heap,
|
||||||
|
reverse_heap,
|
||||||
|
prev_unbroken_timestamps_list[s].phantom_node,
|
||||||
|
current_timestamps_list[s_prime].phantom_node,
|
||||||
|
weight_upper_bound);
|
||||||
|
new_distances.push_back(network_distance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_ASSERT(old_distances.size() == new_distances.size());
|
||||||
|
for (std::size_t i = 0; i < old_distances.size(); i++)
|
||||||
|
{
|
||||||
|
if (std::abs(old_distances[i] - new_distances[i]) > 1e-3)
|
||||||
|
{
|
||||||
|
std::cout << "Old: " << old_distances[i] << " New: " << new_distances[i]
|
||||||
|
<< std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// compute d_t for this timestamp and the next one
|
// compute d_t for this timestamp and the next one
|
||||||
for (const auto s : util::irange<std::size_t>(0UL, prev_viterbi.size()))
|
for (const auto s : util::irange<std::size_t>(0UL, prev_viterbi.size()))
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user