std::vector<EdgeWeight> operator()(const DataFacadeT &facade, const std::vector<PhantomNode> &phantom_nodes, const std::vector<std::size_t> &source_indices, const std::vector<std::size_t> &target_indices) const { const auto number_of_sources = source_indices.empty() ? phantom_nodes.size() : source_indices.size(); const auto number_of_targets = target_indices.empty() ? phantom_nodes.size() : target_indices.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(facade.GetNumberOfNodes()); QueryHeap &query_heap = *(engine_working_data.forward_heap_1); SearchSpaceWithBuckets search_space_with_buckets; unsigned column_idx = 0; const auto search_target_phantom = [&](const PhantomNode &phantom) { query_heap.Clear(); // insert target(s) at weight 0 if (phantom.forward_segment_id.enabled) { query_heap.Insert(phantom.forward_segment_id.id, phantom.GetForwardWeightPlusOffset(), phantom.forward_segment_id.id); } if (phantom.reverse_segment_id.enabled) { query_heap.Insert(phantom.reverse_segment_id.id, phantom.GetReverseWeightPlusOffset(), phantom.reverse_segment_id.id); } // explore search space while (!query_heap.Empty()) { BackwardRoutingStep(facade, column_idx, query_heap, search_space_with_buckets); } ++column_idx; }; // for each source do forward search unsigned row_idx = 0; const auto search_source_phantom = [&](const PhantomNode &phantom) { query_heap.Clear(); // insert target(s) at weight 0 if (phantom.forward_segment_id.enabled) { query_heap.Insert(phantom.forward_segment_id.id, -phantom.GetForwardWeightPlusOffset(), phantom.forward_segment_id.id); } if (phantom.reverse_segment_id.enabled) { query_heap.Insert(phantom.reverse_segment_id.id, -phantom.GetReverseWeightPlusOffset(), phantom.reverse_segment_id.id); } // explore search space while (!query_heap.Empty()) { ForwardRoutingStep(facade, row_idx, number_of_targets, query_heap, 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; }
std::shared_ptr<std::vector<EdgeWeight>> operator()(const PhantomNodeArray &phantom_nodes_array) const { const auto number_of_locations = phantom_nodes_array.size(); std::shared_ptr<std::vector<EdgeWeight>> result_table = std::make_shared<std::vector<EdgeWeight>>(number_of_locations * number_of_locations, std::numeric_limits<EdgeWeight>::max()); engine_working_data.InitializeOrClearFirstThreadLocalStorage( super::facade->GetNumberOfNodes()); QueryHeap &query_heap = *(engine_working_data.forwardHeap); SearchSpaceWithBuckets search_space_with_buckets; unsigned target_id = 0; for (const std::vector<PhantomNode> &phantom_node_vector : phantom_nodes_array) { query_heap.Clear(); // insert target(s) at distance 0 for (const PhantomNode &phantom_node : phantom_node_vector) { if (SPECIAL_NODEID != phantom_node.forward_node_id) { query_heap.Insert(phantom_node.forward_node_id, phantom_node.GetForwardWeightPlusOffset(), phantom_node.forward_node_id); } if (SPECIAL_NODEID != phantom_node.reverse_node_id) { query_heap.Insert(phantom_node.reverse_node_id, phantom_node.GetReverseWeightPlusOffset(), phantom_node.reverse_node_id); } } // explore search space while (!query_heap.Empty()) { BackwardRoutingStep(target_id, query_heap, search_space_with_buckets); } ++target_id; } // for each source do forward search unsigned source_id = 0; for (const std::vector<PhantomNode> &phantom_node_vector : phantom_nodes_array) { query_heap.Clear(); for (const PhantomNode &phantom_node : phantom_node_vector) { // insert sources at distance 0 if (SPECIAL_NODEID != phantom_node.forward_node_id) { query_heap.Insert(phantom_node.forward_node_id, -phantom_node.GetForwardWeightPlusOffset(), phantom_node.forward_node_id); } if (SPECIAL_NODEID != phantom_node.reverse_node_id) { query_heap.Insert(phantom_node.reverse_node_id, -phantom_node.GetReverseWeightPlusOffset(), phantom_node.reverse_node_id); } } // explore search space while (!query_heap.Empty()) { ForwardRoutingStep(source_id, number_of_locations, query_heap, search_space_with_buckets, result_table); } ++source_id; } BOOST_ASSERT(source_id == target_id); return result_table; }