diff --git a/contractor/contractor_options.cpp b/contractor/contractor_options.cpp new file mode 100644 index 000000000..b6a1e2caa --- /dev/null +++ b/contractor/contractor_options.cpp @@ -0,0 +1,136 @@ +/* + +Copyright (c) 2015, Project OSRM contributors +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list +of conditions and the following disclaimer. +Redistributions in binary form must reproduce the above copyright notice, this +list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include "contractor_options.hpp" + +#include "../util/git_sha.hpp" +#include "../util/ini_file.hpp" +#include "../util/simple_logger.hpp" + +#include +#include + +#include + +return_code +ContractorOptions::ParseArguments(int argc, char *argv[], ContractorConfig &contractor_config) +{ + // declare a group of options that will be allowed only on command line + boost::program_options::options_description generic_options("Options"); + generic_options.add_options()("version,v", "Show version")("help,h", "Show this help message")( + "config,c", boost::program_options::value(&contractor_config.config_file_path) + ->default_value("contractor.ini"), + "Path to a configuration file."); + + // declare a group of options that will be allowed both on command line and in config file + boost::program_options::options_description config_options("Configuration"); + config_options.add_options()( + "restrictions,r", + boost::program_options::value(&contractor_config.restrictions_path), + "Restrictions file in .osrm.restrictions format")( + "profile,p", boost::program_options::value(&contractor_config.profile_path) + ->default_value("profile.lua"), + "Path to LUA routing profile")( + "threads,t", boost::program_options::value(&contractor_config.requested_num_threads) + ->default_value(tbb::task_scheduler_init::default_num_threads()), + "Number of threads to use"); + + // hidden options, will be allowed both on command line and in config file, but will not be + // shown to the user + boost::program_options::options_description hidden_options("Hidden options"); + hidden_options.add_options()( + "input,i", boost::program_options::value(&contractor_config.osrm_input_path), + "Input file in .osm, .osm.bz2 or .osm.pbf format"); + + // positional option + boost::program_options::positional_options_description positional_options; + positional_options.add("input", 1); + + // combine above options for parsing + boost::program_options::options_description cmdline_options; + cmdline_options.add(generic_options).add(config_options).add(hidden_options); + + boost::program_options::options_description config_file_options; + config_file_options.add(config_options).add(hidden_options); + + boost::program_options::options_description visible_options( + "Usage: " + boost::filesystem::basename(argv[0]) + " [options]"); + visible_options.add(generic_options).add(config_options); + + // parse command line options + boost::program_options::variables_map option_variables; + boost::program_options::store(boost::program_options::command_line_parser(argc, argv) + .options(cmdline_options) + .positional(positional_options) + .run(), + option_variables); + + const auto &temp_config_path = option_variables["config"].as(); + if (boost::filesystem::is_regular_file(temp_config_path)) + { + boost::program_options::store(boost::program_options::parse_config_file( + temp_config_path.string().c_str(), cmdline_options, true), + option_variables); + } + + if (option_variables.count("version")) + { + SimpleLogger().Write() << g_GIT_DESCRIPTION; + return return_code::fail; + } + + if (option_variables.count("help")) + { + SimpleLogger().Write() << "\n" << visible_options; + return return_code::fail; + } + + boost::program_options::notify(option_variables); + + if (!option_variables.count("restrictions")) + { + contractor_config.restrictions_path = contractor_config.osrm_input_path.string() + ".restrictions"; + } + + if (!option_variables.count("input")) + { + SimpleLogger().Write() << "\n" << visible_options; + return return_code::fail; + } + + return return_code::ok; +} + +void ContractorOptions::GenerateOutputFilesNames(ContractorConfig &contractor_config) +{ + contractor_config.node_output_path = contractor_config.osrm_input_path.string() + ".nodes"; + contractor_config.edge_output_path = contractor_config.osrm_input_path.string() + ".edges"; + contractor_config.geometry_output_path = contractor_config.osrm_input_path.string() + ".geometry"; + contractor_config.graph_output_path = contractor_config.osrm_input_path.string() + ".hsgr"; + contractor_config.rtree_nodes_output_path = contractor_config.osrm_input_path.string() + ".ramIndex"; + contractor_config.rtree_leafs_output_path = contractor_config.osrm_input_path.string() + ".fileIndex"; +} diff --git a/contractor/contractor_options.hpp b/contractor/contractor_options.hpp new file mode 100644 index 000000000..87541af9d --- /dev/null +++ b/contractor/contractor_options.hpp @@ -0,0 +1,68 @@ +/* + +Copyright (c) 2015, Project OSRM contributors +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list +of conditions and the following disclaimer. +Redistributions in binary form must reproduce the above copyright notice, this +list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +#ifndef CONTRACTOR_OPTIONS_HPP +#define CONTRACTOR_OPTIONS_HPP + +#include + +#include + +enum class return_code : unsigned +{ + ok, + fail, + exit +}; + +struct ContractorConfig +{ + ContractorConfig() noexcept : requested_num_threads(0) {} + + boost::filesystem::path config_file_path; + boost::filesystem::path osrm_input_path; + boost::filesystem::path restrictions_path; + boost::filesystem::path profile_path; + + std::string node_output_path; + std::string edge_output_path; + std::string geometry_output_path; + std::string graph_output_path; + std::string rtree_nodes_output_path; + std::string rtree_leafs_output_path; + + unsigned requested_num_threads; +}; + +struct ContractorOptions +{ + static return_code ParseArguments(int argc, char *argv[], ContractorConfig &extractor_config); + + static void GenerateOutputFilesNames(ContractorConfig &extractor_config); +}; + +#endif // EXTRACTOR_OPTIONS_HPP diff --git a/contractor/processing_chain.cpp b/contractor/processing_chain.cpp index 2b202f0c8..ffbad0b1f 100644 --- a/contractor/processing_chain.cpp +++ b/contractor/processing_chain.cpp @@ -48,7 +48,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include -#include #include #include @@ -57,11 +56,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include -Prepare::Prepare() : requested_num_threads(1) {} - Prepare::~Prepare() {} -int Prepare::Process(int argc, char *argv[]) +int Prepare::Run() { #ifdef WIN32 #pragma message("Memory consumption on Windows can be higher due to different bit packing") @@ -72,55 +69,8 @@ int Prepare::Process(int argc, char *argv[]) "changing EdgeBasedEdge type has influence on memory consumption!"); #endif - LogPolicy::GetInstance().Unmute(); TIMER_START(preparing); - if (!ParseArguments(argc, argv)) - { - return 0; - } - if (!boost::filesystem::is_regular_file(osrm_input_path)) - { - SimpleLogger().Write(logWARNING) << "Input file " << osrm_input_path.string() << " not found!"; - return 1; - } - - if (!boost::filesystem::is_regular_file(profile_path)) - { - SimpleLogger().Write(logWARNING) << "Profile " << profile_path.string() << " not found!"; - return 1; - } - - if (1 > requested_num_threads) - { - SimpleLogger().Write(logWARNING) << "Number of threads must be 1 or larger"; - return 1; - } - - const unsigned recommended_num_threads = tbb::task_scheduler_init::default_num_threads(); - - SimpleLogger().Write() << "Input file: " << osrm_input_path.filename().string(); - SimpleLogger().Write() << "Restrictions file: " << restrictions_path.filename().string(); - SimpleLogger().Write() << "Profile: " << profile_path.filename().string(); - SimpleLogger().Write() << "Threads: " << requested_num_threads; - if (recommended_num_threads != requested_num_threads) - { - SimpleLogger().Write(logWARNING) << "The recommended number of threads is " - << recommended_num_threads - << "! This setting may have performance side-effects."; - } - - tbb::task_scheduler_init init(requested_num_threads); - - LogPolicy::GetInstance().Unmute(); - - node_output_path = osrm_input_path.string() + ".nodes"; - edge_output_path = osrm_input_path.string() + ".edges"; - geometry_output_path = osrm_input_path.string() + ".geometry"; - graph_output_path = osrm_input_path.string() + ".hsgr"; - rtree_nodes_output_path = osrm_input_path.string() + ".ramIndex"; - rtree_leafs_output_path = osrm_input_path.string() + ".fileIndex"; - // Create a new lua state SimpleLogger().Write() << "Generating edge-expanded graph representation"; @@ -192,7 +142,7 @@ std::size_t Prepare::WriteContractedGraph(unsigned number_of_edge_based_nodes, << " edges"; FingerPrint fingerprint_orig; - boost::filesystem::ofstream hsgr_output_stream(graph_output_path, std::ios::binary); + boost::filesystem::ofstream hsgr_output_stream(config.graph_output_path, std::ios::binary); hsgr_output_stream.write((char *)&fingerprint_orig, sizeof(FingerPrint)); const unsigned max_used_node_id = 1 + [&contracted_edge_list] { @@ -308,101 +258,6 @@ unsigned Prepare::CalculateEdgeChecksum(std::unique_ptr(&config_file_path) - ->default_value("contractor.ini"), - "Path to a configuration file."); - - // declare a group of options that will be allowed both on command line and in config file - boost::program_options::options_description config_options("Configuration"); - config_options.add_options()( - "restrictions,r", - boost::program_options::value(&restrictions_path), - "Restrictions file in .osrm.restrictions format")( - "profile,p", boost::program_options::value(&profile_path) - ->default_value("profile.lua"), - "Path to LUA routing profile")( - "threads,t", boost::program_options::value(&requested_num_threads) - ->default_value(tbb::task_scheduler_init::default_num_threads()), - "Number of threads to use"); - - // hidden options, will be allowed both on command line and in config file, but will not be - // shown to the user - boost::program_options::options_description hidden_options("Hidden options"); - hidden_options.add_options()( - "input,i", boost::program_options::value(&osrm_input_path), - "Input file in .osm, .osm.bz2 or .osm.pbf format"); - - // positional option - boost::program_options::positional_options_description positional_options; - positional_options.add("input", 1); - - // combine above options for parsing - boost::program_options::options_description cmdline_options; - cmdline_options.add(generic_options).add(config_options).add(hidden_options); - - boost::program_options::options_description config_file_options; - config_file_options.add(config_options).add(hidden_options); - - boost::program_options::options_description visible_options( - "Usage: " + boost::filesystem::basename(argv[0]) + " [options]"); - visible_options.add(generic_options).add(config_options); - - // parse command line options - boost::program_options::variables_map option_variables; - boost::program_options::store(boost::program_options::command_line_parser(argc, argv) - .options(cmdline_options) - .positional(positional_options) - .run(), - option_variables); - - const auto &temp_config_path = option_variables["config"].as(); - if (boost::filesystem::is_regular_file(temp_config_path)) - { - boost::program_options::store(boost::program_options::parse_config_file( - temp_config_path.string().c_str(), cmdline_options, true), - option_variables); - } - - if (option_variables.count("version")) - { - SimpleLogger().Write() << g_GIT_DESCRIPTION; - return false; - } - - if (option_variables.count("help")) - { - SimpleLogger().Write() << "\n" << visible_options; - return false; - } - - boost::program_options::notify(option_variables); - - if (!option_variables.count("restrictions")) - { - restrictions_path = std::string(osrm_input_path.string() + ".restrictions"); - } - - if (!option_variables.count("input")) - { - SimpleLogger().Write() << "\n" << visible_options; - return false; - } - - return true; -} - /** \brief Setups scripting environment (lua-scripting) Also initializes speed profile. @@ -414,10 +269,10 @@ void Prepare::SetupScriptingEnvironment( luaL_openlibs(lua_state); // adjust lua load path - luaAddScriptFolderToLoadPath(lua_state, profile_path.string().c_str()); + luaAddScriptFolderToLoadPath(lua_state, config.profile_path.string().c_str()); // Now call our function in a lua script - if (0 != luaL_dofile(lua_state, profile_path.string().c_str())) + if (0 != luaL_dofile(lua_state, config.profile_path.string().c_str())) { std::stringstream msg; msg << lua_tostring(lua_state, -1) << " occured in scripting block"; @@ -451,7 +306,7 @@ void Prepare::SetupScriptingEnvironment( void Prepare::LoadRestrictionMap(const std::unordered_map &external_to_internal_node_map, RestrictionMap &restriction_map) { - boost::filesystem::ifstream input_stream(restrictions_path, std::ios::in | std::ios::binary); + boost::filesystem::ifstream input_stream(config.restrictions_path, std::ios::in | std::ios::binary); std::vector restriction_list; loadRestrictionsFromFile(input_stream, external_to_internal_node_map, restriction_list); @@ -473,7 +328,7 @@ Prepare::LoadNodeBasedGraph(std::vector &barrier_node_list, std::vector edge_list; std::unordered_map external_to_internal_node_map; - boost::filesystem::ifstream input_stream(osrm_input_path, std::ios::in | std::ios::binary); + boost::filesystem::ifstream input_stream(config.osrm_input_path, std::ios::in | std::ios::binary); NodeID number_of_node_based_nodes = loadNodesFromFile(input_stream, barrier_node_list, traffic_light_list, @@ -527,7 +382,7 @@ Prepare::BuildEdgeExpandedGraph(std::vector &internal_to_external_nod internal_to_external_node_map, speed_profile); - edge_based_graph_factory.Run(edge_output_path, geometry_output_path, lua_state); + edge_based_graph_factory.Run(config.edge_output_path, config.geometry_output_path, lua_state); lua_close(lua_state); const std::size_t number_of_edge_based_nodes = @@ -558,7 +413,7 @@ void Prepare::ContractGraph(const std::size_t number_of_edge_based_nodes, */ void Prepare::WriteNodeMapping(std::unique_ptr> internal_to_external_node_map) { - boost::filesystem::ofstream node_stream(node_output_path, std::ios::binary); + boost::filesystem::ofstream node_stream(config.node_output_path, std::ios::binary); const unsigned size_of_mapping = internal_to_external_node_map->size(); node_stream.write((char *)&size_of_mapping, sizeof(unsigned)); if (size_of_mapping > 0) @@ -576,6 +431,6 @@ void Prepare::WriteNodeMapping(std::unique_ptr> internal_ */ void Prepare::BuildRTree(const std::vector &node_based_edge_list, const std::vector& internal_to_external_node_map) { - StaticRTree(node_based_edge_list, rtree_nodes_output_path.c_str(), - rtree_leafs_output_path.c_str(), internal_to_external_node_map); + StaticRTree(node_based_edge_list, config.rtree_nodes_output_path.c_str(), + config.rtree_leafs_output_path.c_str(), internal_to_external_node_map); } diff --git a/contractor/processing_chain.hpp b/contractor/processing_chain.hpp index a07623a59..2e4b2cd1f 100644 --- a/contractor/processing_chain.hpp +++ b/contractor/processing_chain.hpp @@ -28,6 +28,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef PROCESSING_CHAIN_HPP #define PROCESSING_CHAIN_HPP +#include "contractor_options.hpp" #include "edge_based_graph_factory.hpp" #include "../data_structures/query_edge.hpp" #include "../data_structures/static_graph.hpp" @@ -50,14 +51,14 @@ class Prepare using InputEdge = DynamicGraph::InputEdge; using StaticEdge = StaticGraph::InputEdge; - explicit Prepare(); + explicit Prepare(const ContractorConfig& contractor_config) + : config(contractor_config) {} Prepare(const Prepare &) = delete; ~Prepare(); - int Process(int argc, char *argv[]); + int Run(); protected: - bool ParseArguments(int argc, char *argv[]); void SetupScriptingEnvironment(lua_State *myLuaState, EdgeBasedGraphFactory::SpeedProfileProperties &speed_profile); void LoadRestrictionMap(const std::unordered_map &external_to_internal_node_map, @@ -80,22 +81,8 @@ class Prepare void WriteNodeMapping(std::unique_ptr> internal_to_external_node_map); void BuildRTree(const std::vector &node_based_edge_list, const std::vector &internal_to_external_node_map); - private: - - unsigned requested_num_threads; - boost::filesystem::path config_file_path; - boost::filesystem::path osrm_input_path; - boost::filesystem::path restrictions_path; - boost::filesystem::path preinfo_path; - boost::filesystem::path profile_path; - - std::string node_output_path; - std::string edge_output_path; - std::string geometry_output_path; - std::string graph_output_path; - std::string rtree_nodes_output_path; - std::string rtree_leafs_output_path; + ContractorConfig config; }; #endif // PROCESSING_CHAIN_HPP diff --git a/extract.cpp b/extract.cpp index a14762983..5f88cc301 100644 --- a/extract.cpp +++ b/extract.cpp @@ -73,7 +73,7 @@ int main(int argc, char *argv[]) << " not found!"; return 1; } - return extractor().run(extractor_config); + return extractor(extractor_config).run(); } catch (const std::exception &e) { diff --git a/extractor/extractor.cpp b/extractor/extractor.cpp index fce0f8898..90fad4eec 100644 --- a/extractor/extractor.cpp +++ b/extractor/extractor.cpp @@ -82,7 +82,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * .restrictions : Turn restrictions that are used my osrm-prepare to construct the edge-expanded graph * */ -int extractor::run(const ExtractorConfig &extractor_config) +int extractor::run() { try { @@ -91,20 +91,20 @@ int extractor::run(const ExtractorConfig &extractor_config) const unsigned recommended_num_threads = tbb::task_scheduler_init::default_num_threads(); const auto number_of_threads = - std::min(recommended_num_threads, extractor_config.requested_num_threads); + std::min(recommended_num_threads, config.requested_num_threads); tbb::task_scheduler_init init(number_of_threads); - SimpleLogger().Write() << "Input file: " << extractor_config.input_path.filename().string(); - SimpleLogger().Write() << "Profile: " << extractor_config.profile_path.filename().string(); + SimpleLogger().Write() << "Input file: " << config.input_path.filename().string(); + SimpleLogger().Write() << "Profile: " << config.profile_path.filename().string(); SimpleLogger().Write() << "Threads: " << number_of_threads; // setup scripting environment - ScriptingEnvironment scripting_environment(extractor_config.profile_path.string().c_str()); + ScriptingEnvironment scripting_environment(config.profile_path.string().c_str()); ExtractionContainers extraction_containers; auto extractor_callbacks = osrm::make_unique(extraction_containers); - const osmium::io::File input_file(extractor_config.input_path.string()); + const osmium::io::File input_file(config.input_path.string()); osmium::io::Reader reader(input_file); const osmium::io::Header header = reader.header(); @@ -131,7 +131,7 @@ int extractor::run(const ExtractorConfig &extractor_config) } SimpleLogger().Write() << "timestamp: " << timestamp; - boost::filesystem::ofstream timestamp_out(extractor_config.timestamp_file_name); + boost::filesystem::ofstream timestamp_out(config.timestamp_file_name); timestamp_out.write(timestamp.c_str(), timestamp.length()); timestamp_out.close(); @@ -236,12 +236,12 @@ int extractor::run(const ExtractorConfig &extractor_config) return 1; } - extraction_containers.PrepareData(extractor_config.output_file_name, - extractor_config.restriction_file_name); + extraction_containers.PrepareData(config.output_file_name, + config.restriction_file_name); TIMER_STOP(extracting); SimpleLogger().Write() << "extraction finished after " << TIMER_SEC(extracting) << "s"; SimpleLogger().Write() << "To prepare the data for routing, run: " - << "./osrm-prepare " << extractor_config.output_file_name + << "./osrm-prepare " << config.output_file_name << std::endl; } catch (std::exception &e) diff --git a/extractor/extractor.hpp b/extractor/extractor.hpp index 8ea56c3cb..72defca05 100644 --- a/extractor/extractor.hpp +++ b/extractor/extractor.hpp @@ -30,8 +30,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "extractor_options.hpp" -struct extractor +class extractor { - int run(const ExtractorConfig &extractor_config); +public: + extractor(const ExtractorConfig &extractor_config) + : config(extractor_config) {} + int run(); +private: + ExtractorConfig config; }; #endif /* EXTRACTOR_HPP */ diff --git a/prepare.cpp b/prepare.cpp index af10df035..5de320463 100644 --- a/prepare.cpp +++ b/prepare.cpp @@ -26,10 +26,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "contractor/processing_chain.hpp" +#include "contractor/contractor_options.hpp" #include "util/simple_logger.hpp" #include +#include + #include #include @@ -37,21 +40,64 @@ int main(int argc, char *argv[]) { try { - return Prepare().Process(argc, argv); - } - catch (boost::program_options::too_many_positional_options_error &) - { - SimpleLogger().Write(logWARNING) << "Only one file can be specified"; - return 1; - } - catch (boost::program_options::error &e) - { - SimpleLogger().Write(logWARNING) << e.what(); - return 1; + LogPolicy::GetInstance().Unmute(); + ContractorConfig contractor_config; + + const return_code result = ContractorOptions::ParseArguments(argc, argv, contractor_config); + + if (return_code::fail == result) + { + return 1; + } + + if (return_code::exit == result) + { + return 0; + } + + ContractorOptions::GenerateOutputFilesNames(contractor_config); + + if (1 > contractor_config.requested_num_threads) + { + SimpleLogger().Write(logWARNING) << "Number of threads must be 1 or larger"; + return 1; + } + + const unsigned recommended_num_threads = tbb::task_scheduler_init::default_num_threads(); + + if (recommended_num_threads != contractor_config.requested_num_threads) + { + SimpleLogger().Write(logWARNING) << "The recommended number of threads is " + << recommended_num_threads + << "! This setting may have performance side-effects."; + } + + if (!boost::filesystem::is_regular_file(contractor_config.osrm_input_path)) + { + SimpleLogger().Write(logWARNING) + << "Input file " << contractor_config.osrm_input_path.string() << " not found!"; + return 1; + } + + if (!boost::filesystem::is_regular_file(contractor_config.profile_path)) + { + SimpleLogger().Write(logWARNING) << "Profile " << contractor_config.profile_path.string() + << " not found!"; + return 1; + } + + SimpleLogger().Write() << "Input file: " << contractor_config.osrm_input_path.filename().string(); + SimpleLogger().Write() << "Restrictions file: " << contractor_config.restrictions_path.filename().string(); + SimpleLogger().Write() << "Profile: " << contractor_config.profile_path.filename().string(); + SimpleLogger().Write() << "Threads: " << contractor_config.requested_num_threads; + + tbb::task_scheduler_init init(contractor_config.requested_num_threads); + + return Prepare(contractor_config).Run(); } catch (const std::exception &e) { - SimpleLogger().Write(logWARNING) << "Exception occured: " << e.what() << std::endl; + SimpleLogger().Write(logWARNING) << "[exception] " << e.what(); return 1; } }