diff --git a/CMakeLists.txt b/CMakeLists.txt index 5fe7a58540b..2a9a005cfa3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 2.8) -if( CURRENT_CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR AND NOT MSVC_IDE ) +if( CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR AND NOT MSVC_IDE ) message(FATAL_ERROR "In-source builds are not allowed. Please create a directory and run cmake from there, passing the path to this source directory as the last argument. This process created the file `CMakeCache.txt' and the directory `CMakeFiles'. Please delete them.") diff --git a/DataStructures/SearchEngine.h b/DataStructures/SearchEngine.h index 4df51b3f8cb..d36410f472c 100644 --- a/DataStructures/SearchEngine.h +++ b/DataStructures/SearchEngine.h @@ -45,13 +45,18 @@ template class SearchEngine public: ShortestPathRouting shortest_path; AlternativeRouting alternative_path; - ManyToManyRouting distance_table; + ManyToManyRouting distance_table; + ManyToManyRouting distance_table_single_source; + ManyToManyRouting distance_table_single_target; MultiTargetRouting multi_target; MultiTargetRouting multi_source; explicit SearchEngine(DataFacadeT *facade) : facade(facade), shortest_path(facade, engine_working_data), - alternative_path(facade, engine_working_data), distance_table(facade, engine_working_data), + alternative_path(facade, engine_working_data), + distance_table(facade, engine_working_data), + distance_table_single_source(facade, engine_working_data), + distance_table_single_target(facade, engine_working_data), multi_target(facade, engine_working_data), multi_source(facade, engine_working_data) { diff --git a/DataStructures/SearchEngineData.cpp b/DataStructures/SearchEngineData.cpp index a5e4bfcd88f..2610a0f745f 100644 --- a/DataStructures/SearchEngineData.cpp +++ b/DataStructures/SearchEngineData.cpp @@ -29,6 +29,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "BinaryHeap.h" +SearchEngineData::SearchEngineHeapPtr SearchEngineData::forwardHeap; +SearchEngineData::SearchEngineHeapPtr SearchEngineData::backwardHeap; +SearchEngineData::SearchEngineHeapPtr SearchEngineData::forwardHeap2; +SearchEngineData::SearchEngineHeapPtr SearchEngineData::backwardHeap2; +SearchEngineData::SearchEngineHeapPtr SearchEngineData::forwardHeap3; +SearchEngineData::SearchEngineHeapPtr SearchEngineData::backwardHeap3; + void SearchEngineData::InitializeOrClearFirstThreadLocalStorage(const unsigned number_of_nodes) { if (forwardHeap.get()) diff --git a/Library/OSRM_impl.cpp b/Library/OSRM_impl.cpp index 94965e682f8..99818b9f192 100644 --- a/Library/OSRM_impl.cpp +++ b/Library/OSRM_impl.cpp @@ -71,7 +71,6 @@ OSRM_impl::OSRM_impl(const ServerPaths &server_paths, const bool use_shared_memo } // The following plugins handle all requests. - RegisterPlugin(new DistanceTablePlugin>(query_data_facade)); RegisterPlugin(new HelloWorldPlugin()); RegisterPlugin(new LocatePlugin>(query_data_facade)); RegisterPlugin(new MultiTargetPlugin, true>(query_data_facade)); diff --git a/Plugins/DistanceTablePlugin.h b/Plugins/DistanceTablePlugin.h index 5223e491a71..687d0ae401b 100644 --- a/Plugins/DistanceTablePlugin.h +++ b/Plugins/DistanceTablePlugin.h @@ -47,7 +47,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include -template class DistanceTablePlugin : public BasePlugin +template class DistanceTablePlugin : public BasePlugin { private: std::shared_ptr> search_engine_ptr; @@ -62,13 +64,13 @@ template class DistanceTablePlugin : public BasePlugin const std::string GetDescriptor() const final { return descriptor_string; } - void HandleRequest(const RouteParameters &route_parameters, http::Reply &reply) final + std::shared_ptr> HandleRequest( + const RouteParameters &route_parameters, unsigned &calctime_in_us) { // check number of parameters if (2 > route_parameters.coordinates.size()) { - reply = http::Reply::StockReply(http::Reply::badRequest); - return; + return nullptr; } RawRouteData raw_route; @@ -76,13 +78,11 @@ template class DistanceTablePlugin : public BasePlugin if (std::any_of(begin(route_parameters.coordinates), end(route_parameters.coordinates), - [&](FixedPointCoordinate coordinate) - { - return !coordinate.isValid(); - })) + [&](FixedPointCoordinate coordinate) { + return !coordinate.isValid(); + })) { - reply = http::Reply::StockReply(http::Reply::badRequest); - return; + return nullptr; } for (const FixedPointCoordinate &coordinate : route_parameters.coordinates) @@ -91,8 +91,7 @@ template class DistanceTablePlugin : public BasePlugin } const bool checksum_OK = (route_parameters.check_sum == raw_route.check_sum); - unsigned max_locations = - std::min(100u, static_cast(raw_route.raw_via_node_coordinates.size())); + unsigned max_locations = raw_route.raw_via_node_coordinates.size(); PhantomNodeArray phantom_node_vector(max_locations); for (unsigned i = 0; i < max_locations; ++i) { @@ -115,10 +114,32 @@ template class DistanceTablePlugin : public BasePlugin BOOST_ASSERT(phantom_node_vector[i].front().isValid(facade->GetNumberOfNodes())); } - // TIMER_START(distance_table); - std::shared_ptr> result_table = - search_engine_ptr->distance_table(phantom_node_vector); - // TIMER_STOP(distance_table); + TIMER_START(distance_table); + std::shared_ptr> result_table; + + if (single_source) + { + result_table = search_engine_ptr->distance_table_single_source(phantom_node_vector); + } + else if (single_target) + { + result_table = search_engine_ptr->distance_table_single_target(phantom_node_vector); + } + else + { + result_table = search_engine_ptr->distance_table(phantom_node_vector); + } + + TIMER_STOP(distance_table); + calctime_in_us = TIMER_USEC(distance_table); + + return result_table; + } + + void HandleRequest(const RouteParameters &route_parameters, http::Reply &reply) final + { + unsigned calctime_in_us = 0; + auto result_table = HandleRequest(route_parameters, calctime_in_us); if (!result_table) { @@ -127,7 +148,7 @@ template class DistanceTablePlugin : public BasePlugin } JSON::Object json_object; JSON::Array json_array; - const unsigned number_of_locations = static_cast(phantom_node_vector.size()); + const unsigned number_of_locations = route_parameters.coordinates.size(); for (unsigned row = 0; row < number_of_locations; ++row) { JSON::Array json_row; diff --git a/Plugins/MultiTargetPlugin.h b/Plugins/MultiTargetPlugin.h index cd77abafda9..61451b8d5c1 100644 --- a/Plugins/MultiTargetPlugin.h +++ b/Plugins/MultiTargetPlugin.h @@ -33,6 +33,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "../Algorithms/ObjectToBase64.h" #include "../DataStructures/SearchEngine.h" +#include "../Util/TimingUtil.h" template class MultiTargetPlugin : public BasePlugin @@ -45,7 +46,8 @@ template class MultiTargetPlugin : public Base virtual ~MultiTargetPlugin() {} - std::shared_ptr>> HandleRequest(const RouteParameters &route_parameters) + std::shared_ptr>> HandleRequest(const RouteParameters &route_parameters, + unsigned &calctime_in_us) { // check number of parameters if (2 > route_parameters.coordinates.size()) @@ -93,19 +95,27 @@ template class MultiTargetPlugin : public Base BOOST_ASSERT(phantom_node_vector[i].front().isValid(facade->GetNumberOfNodes())); } + std::shared_ptr>> ret; + + TIMER_START(multi_target); if (forward) { - return search_engine_ptr->multi_target(phantom_node_vector); + ret = search_engine_ptr->multi_target(phantom_node_vector); } else { - return search_engine_ptr->multi_source(phantom_node_vector); + ret = search_engine_ptr->multi_source(phantom_node_vector); } + TIMER_STOP(multi_target); + calctime_in_us = TIMER_USEC(multi_target); + + return ret; } void HandleRequest(const RouteParameters &route_parameters, http::Reply &reply) { - std::shared_ptr>> result_table = HandleRequest(route_parameters); + unsigned calctime_in_ms = 0; + auto result_table = HandleRequest(route_parameters, calctime_in_ms); if (!result_table) { diff --git a/RoutingAlgorithms/BasicRoutingInterface.h b/RoutingAlgorithms/BasicRoutingInterface.h index 807a8610ffb..2c97810d13a 100644 --- a/RoutingAlgorithms/BasicRoutingInterface.h +++ b/RoutingAlgorithms/BasicRoutingInterface.h @@ -38,13 +38,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include -SearchEngineData::SearchEngineHeapPtr SearchEngineData::forwardHeap; -SearchEngineData::SearchEngineHeapPtr SearchEngineData::backwardHeap; -SearchEngineData::SearchEngineHeapPtr SearchEngineData::forwardHeap2; -SearchEngineData::SearchEngineHeapPtr SearchEngineData::backwardHeap2; -SearchEngineData::SearchEngineHeapPtr SearchEngineData::forwardHeap3; -SearchEngineData::SearchEngineHeapPtr SearchEngineData::backwardHeap3; - template class BasicRoutingInterface { private: diff --git a/RoutingAlgorithms/ManyToManyRouting.h b/RoutingAlgorithms/ManyToManyRouting.h index 7819c676d6f..3f3f1e17f97 100644 --- a/RoutingAlgorithms/ManyToManyRouting.h +++ b/RoutingAlgorithms/ManyToManyRouting.h @@ -39,7 +39,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include -template class ManyToManyRouting : public BasicRoutingInterface +template class ManyToManyRouting : public BasicRoutingInterface { typedef BasicRoutingInterface super; typedef SearchEngineData::QueryHeap QueryHeap; @@ -106,6 +108,12 @@ template class ManyToManyRouting : public BasicRoutingInterf { BackwardRoutingStep(target_id, query_heap, search_space_with_buckets); } + + if (single_target) + { + break; + } + ++target_id; } @@ -141,6 +149,11 @@ template class ManyToManyRouting : public BasicRoutingInterf result_table); } + if (single_source) + { + break; + } + ++source_id; } BOOST_ASSERT(source_id == target_id); diff --git a/Util/TimingUtil.h b/Util/TimingUtil.h index c1505cebfe7..cac5e4a154e 100644 --- a/Util/TimingUtil.h +++ b/Util/TimingUtil.h @@ -32,6 +32,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define TIMER_START(_X) auto _X##_start = std::chrono::steady_clock::now(), _X##_stop = _X##_start #define TIMER_STOP(_X) _X##_stop = std::chrono::steady_clock::now() +#define TIMER_USEC(_X) std::chrono::duration_cast(_X##_stop - _X##_start).count() #define TIMER_MSEC(_X) std::chrono::duration_cast(_X##_stop - _X##_start).count() #define TIMER_SEC(_X) (0.001*std::chrono::duration_cast(_X##_stop - _X##_start).count()) #define TIMER_MIN(_X) std::chrono::duration_cast(_X##_stop - _X##_start).count()