Add routed parameter to limit matching size

This commit is contained in:
Patrick Niklaus 2015-03-02 23:39:53 +01:00
parent e5830b0116
commit d8d46e0f3e
5 changed files with 58 additions and 35 deletions

View File

@ -33,15 +33,21 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
struct libosrm_config
{
libosrm_config(const libosrm_config &) = delete;
libosrm_config() : max_locations_distance_table(100), use_shared_memory(false) {}
libosrm_config()
: max_locations_distance_table(100), max_locations_map_matching(-1),
use_shared_memory(false)
{
}
libosrm_config(const ServerPaths &paths, const bool flag, const int max)
: server_paths(paths), max_locations_distance_table(max), use_shared_memory(flag)
libosrm_config(const ServerPaths &paths, const bool flag, const int max_table, const int max_matching)
: server_paths(paths), max_locations_distance_table(max_table),
max_locations_map_matching(max_matching), use_shared_memory(flag)
{
}
ServerPaths server_paths;
int max_locations_distance_table;
int max_locations_map_matching;
bool use_shared_memory;
};

View File

@ -82,7 +82,8 @@ OSRM_impl::OSRM_impl(libosrm_config &lib_config)
RegisterPlugin(new HelloWorldPlugin());
RegisterPlugin(new LocatePlugin<BaseDataFacade<QueryEdge::EdgeData>>(query_data_facade));
RegisterPlugin(new NearestPlugin<BaseDataFacade<QueryEdge::EdgeData>>(query_data_facade));
RegisterPlugin(new MapMatchingPlugin<BaseDataFacade<QueryEdge::EdgeData>>(query_data_facade));
RegisterPlugin(new MapMatchingPlugin<BaseDataFacade<QueryEdge::EdgeData>>(
query_data_facade, lib_config.max_locations_map_matching));
RegisterPlugin(new TimestampPlugin<BaseDataFacade<QueryEdge::EdgeData>>(query_data_facade));
RegisterPlugin(new ViaRoutePlugin<BaseDataFacade<QueryEdge::EdgeData>>(query_data_facade));
}

View File

@ -59,9 +59,10 @@ template <class DataFacadeT> class MapMatchingPlugin : public BasePlugin
using TraceClassification = ClassifierT::ClassificationT;
public:
MapMatchingPlugin(DataFacadeT *facade)
MapMatchingPlugin(DataFacadeT *facade, const int max_locations_map_matching)
: descriptor_string("match")
, facade(facade)
, max_locations_map_matching(max_locations_map_matching)
// the values where derived from fitting a laplace distribution
// to the values of manually classified traces
, classifier(LaplaceDistribution(0.0057154021891018675, 0.020294704891166186),
@ -225,6 +226,13 @@ template <class DataFacadeT> class MapMatchingPlugin : public BasePlugin
{
return 400;
}
// enforce maximum number of locations for performance reasons
if (max_locations_map_matching > 0 && static_cast<int>(input_coords.size()) > max_locations_map_matching)
{
return 400;
}
bool found_candidates = getCandiates(input_coords, sub_trace_lengths, candidates_lists);
if (!found_candidates)
{
@ -299,6 +307,7 @@ template <class DataFacadeT> class MapMatchingPlugin : public BasePlugin
private:
std::string descriptor_string;
DataFacadeT *facade;
int max_locations_map_matching;
ClassifierT classifier;
};

View File

@ -77,7 +77,8 @@ int main(int argc, const char *argv[])
const unsigned init_result = GenerateServerProgramOptions(
argc, argv, lib_config.server_paths, ip_address, ip_port, requested_thread_num,
lib_config.use_shared_memory, trial_run, lib_config.max_locations_distance_table);
lib_config.use_shared_memory, trial_run, lib_config.max_locations_distance_table,
lib_config.max_locations_map_matching);
if (init_result == INIT_OK_DO_NOT_START_ENGINE)
{
return 0;

View File

@ -151,7 +151,8 @@ inline unsigned GenerateServerProgramOptions(const int argc,
int &requested_num_threads,
bool &use_shared_memory,
bool &trial,
int &max_locations_distance_table)
int &max_locations_distance_table,
int &max_locations_map_matching)
{
// declare a group of options that will be allowed only on command line
boost::program_options::options_description generic_options("Options");
@ -165,34 +166,35 @@ inline unsigned GenerateServerProgramOptions(const int argc,
// declare a group of options that will be allowed both on command line
// as well as in a config file
boost::program_options::options_description config_options("Configuration");
config_options.add_options()(
"hsgrdata", boost::program_options::value<boost::filesystem::path>(&paths["hsgrdata"]),
".hsgr file")("nodesdata",
boost::program_options::value<boost::filesystem::path>(&paths["nodesdata"]),
".nodes file")(
"edgesdata", boost::program_options::value<boost::filesystem::path>(&paths["edgesdata"]),
".edges file")("geometry",
boost::program_options::value<boost::filesystem::path>(&paths["geometries"]),
".geometry file")(
"ramindex", boost::program_options::value<boost::filesystem::path>(&paths["ramindex"]),
".ramIndex file")(
"fileindex", boost::program_options::value<boost::filesystem::path>(&paths["fileindex"]),
"File index file")(
"namesdata", boost::program_options::value<boost::filesystem::path>(&paths["namesdata"]),
".names file")("timestamp",
boost::program_options::value<boost::filesystem::path>(&paths["timestamp"]),
".timestamp file")(
"ip,i", boost::program_options::value<std::string>(&ip_address)->default_value("0.0.0.0"),
"IP address")("port,p", boost::program_options::value<int>(&ip_port)->default_value(5000),
"TCP/IP port")(
"threads,t", boost::program_options::value<int>(&requested_num_threads)->default_value(8),
"Number of threads to use")(
"shared-memory,s",
boost::program_options::value<bool>(&use_shared_memory)->implicit_value(true),
"Load data from shared memory")(
"max-table-size,m",
boost::program_options::value<int>(&max_locations_distance_table)->default_value(100),
"Max. locations supported in distance table query");
config_options.add_options()
("hsgrdata", boost::program_options::value<boost::filesystem::path>(&paths["hsgrdata"]),
".hsgr file")
("nodesdata", boost::program_options::value<boost::filesystem::path>(&paths["nodesdata"]),
".nodes file")
("edgesdata", boost::program_options::value<boost::filesystem::path>(&paths["edgesdata"]),
".edges file")
("geometry", boost::program_options::value<boost::filesystem::path>(&paths["geometries"]),
".geometry file")
("ramindex", boost::program_options::value<boost::filesystem::path>(&paths["ramindex"]),
".ramIndex file")
("fileindex", boost::program_options::value<boost::filesystem::path>(&paths["fileindex"]),
"File index file")
("namesdata", boost::program_options::value<boost::filesystem::path>(&paths["namesdata"]),
".names file")
("timestamp", boost::program_options::value<boost::filesystem::path>(&paths["timestamp"]),
".timestamp file")
("ip,i", boost::program_options::value<std::string>(&ip_address)->default_value("0.0.0.0"),
"IP address")
("port,p", boost::program_options::value<int>(&ip_port)->default_value(5000),
"TCP/IP port")
("threads,t", boost::program_options::value<int>(&requested_num_threads)->default_value(8),
"Number of threads to use")
("shared-memory,s", boost::program_options::value<bool>(&use_shared_memory)->implicit_value(true),
"Load data from shared memory")
("max-table-size,m", boost::program_options::value<int>(&max_locations_distance_table)->default_value(100),
"Max. locations supported in distance table query")
("max-matching-size,m", boost::program_options::value<int>(&max_locations_map_matching)->default_value(-1),
"Max. locations supported in map matching query");
// hidden options, will be allowed both on command line and in config
// file, but will not be shown to the user
@ -269,6 +271,10 @@ inline unsigned GenerateServerProgramOptions(const int argc,
{
throw osrm::exception("Max location for distance table must be a positive number");
}
if (2 > max_locations_map_matching)
{
throw osrm::exception("Max location for map matching must be at least two");
}
SimpleLogger().Write() << visible_options;
return INIT_OK_DO_NOT_START_ENGINE;