Fix behaviour of table if sources/destinations arrays are empty

This commit is contained in:
Patrick Niklaus 2016-02-25 00:27:14 +01:00
parent 25f86b68dc
commit e4ed2f6a2f
3 changed files with 37 additions and 91 deletions

View File

@ -46,78 +46,6 @@ class ManyToManyRouting final
{
}
// semmetric version
std::vector<EdgeWeight> operator()(const std::vector<PhantomNode> &phantom_nodes) const
{
const auto number_of_sources = phantom_nodes.size();
const auto number_of_targets = phantom_nodes.size();
const auto number_of_entries = number_of_sources * number_of_targets;
std::vector<EdgeWeight> result_table(number_of_entries,
std::numeric_limits<EdgeWeight>::max());
engine_working_data.InitializeOrClearFirstThreadLocalStorage(
super::facade->GetNumberOfNodes());
QueryHeap &query_heap = *(engine_working_data.forward_heap_1);
SearchSpaceWithBuckets search_space_with_buckets;
unsigned column_idx = 0;
for (const auto &phantom : phantom_nodes)
{
query_heap.Clear();
// insert target(s) at distance 0
if (SPECIAL_NODEID != phantom.forward_node_id)
{
query_heap.Insert(phantom.forward_node_id, phantom.GetForwardWeightPlusOffset(),
phantom.forward_node_id);
}
if (SPECIAL_NODEID != phantom.reverse_node_id)
{
query_heap.Insert(phantom.reverse_node_id, phantom.GetReverseWeightPlusOffset(),
phantom.reverse_node_id);
}
// explore search space
while (!query_heap.Empty())
{
BackwardRoutingStep(column_idx, query_heap, search_space_with_buckets);
}
++column_idx;
}
// for each source do forward search
unsigned row_idx = 0;
for (const auto &phantom : phantom_nodes)
{
query_heap.Clear();
// insert target(s) at distance 0
if (SPECIAL_NODEID != phantom.forward_node_id)
{
query_heap.Insert(phantom.forward_node_id, -phantom.GetForwardWeightPlusOffset(),
phantom.forward_node_id);
}
if (SPECIAL_NODEID != phantom.reverse_node_id)
{
query_heap.Insert(phantom.reverse_node_id, -phantom.GetReverseWeightPlusOffset(),
phantom.reverse_node_id);
}
// explore search space
while (!query_heap.Empty())
{
ForwardRoutingStep(row_idx, number_of_targets, query_heap,
search_space_with_buckets, result_table);
}
++row_idx;
}
return result_table;
}
// asymmetric version
std::vector<EdgeWeight> operator()(const std::vector<PhantomNode> &phantom_nodes,
const std::vector<std::size_t> &source_indices,
const std::vector<std::size_t> &target_indices) const
@ -136,9 +64,8 @@ class ManyToManyRouting final
SearchSpaceWithBuckets search_space_with_buckets;
unsigned column_idx = 0;
for (const auto index : target_indices)
const auto search_target_phantom = [&](const PhantomNode &phantom)
{
const auto &phantom = phantom_nodes[index];
query_heap.Clear();
// insert target(s) at distance 0
@ -159,13 +86,12 @@ class ManyToManyRouting final
BackwardRoutingStep(column_idx, query_heap, search_space_with_buckets);
}
++column_idx;
}
};
// for each source do forward search
unsigned row_idx = 0;
for (const auto index : source_indices)
const auto search_source_phantom = [&](const PhantomNode& phantom)
{
const auto &phantom = phantom_nodes[index];
query_heap.Clear();
// insert target(s) at distance 0
@ -187,6 +113,38 @@ class ManyToManyRouting final
search_space_with_buckets, result_table);
}
++row_idx;
};
if (target_indices.empty())
{
for (const auto &phantom : phantom_nodes)
{
search_target_phantom(phantom);
}
}
else
{
for (const auto index : target_indices)
{
const auto &phantom = phantom_nodes[index];
search_target_phantom(phantom);
}
}
if (source_indices.empty())
{
for (const auto &phantom : phantom_nodes)
{
search_source_phantom(phantom);
}
}
else
{
for (const auto index : source_indices)
{
const auto &phantom = phantom_nodes[index];
search_source_phantom(phantom);
}
}
return result_table;

View File

@ -59,19 +59,7 @@ Status TablePlugin::HandleRequest(const api::TableParameters &params, util::json
}
auto snapped_phantoms = SnapPhantomNodes(GetPhantomNodes(params));
const auto result_table = [&]
{
if (params.sources.empty())
{
BOOST_ASSERT(params.destinations.empty());
return distance_table(snapped_phantoms);
}
else
{
return distance_table(snapped_phantoms, params.sources, params.destinations);
}
}();
auto result_table = distance_table(snapped_phantoms, params.sources, params.destinations);
if (result_table.empty())
{

View File

@ -186,7 +186,7 @@ Status TripPlugin::HandleRequest(const api::TripParameters &parameters,
// compute the duration table of all phantom nodes
const auto result_table = util::DistTableWrapper<EdgeWeight>(
duration_table(snapped_phantoms), number_of_locations);
duration_table(snapped_phantoms, {}, {}), number_of_locations);
if (result_table.size() == 0)
{