Skip to content

Commit

Permalink
add a multiplier to the matrix
Browse files Browse the repository at this point in the history
  • Loading branch information
ghoshkaj committed Dec 8, 2018
1 parent 3d781e6 commit e9390bc
Show file tree
Hide file tree
Showing 10 changed files with 118 additions and 13 deletions.
7 changes: 6 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
# UNRELEASED
# 5.21.0
- Changes from 5.20.0:
- Table:
- ADDED: new parameter `scale_factor` which will scale the cell `duration` values by this factor.

# 5.20.0
- Changes from 5.19.0:
- Table:
- CHANGED: switch to pre-calculated distances for table responses for large speedup and 10% memory increase. [#5251](https://github.com/Project-OSRM/osrm-backend/pull/5251)
Expand Down
1 change: 1 addition & 0 deletions docs/http.md
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,7 @@ In addition to the [general options](#general-options) the following options are
|annotations |`duration` (default), `distance`, or `duration,distance`|Return the requested table or tables in response. Note that computing the `distances` table is currently only implemented for CH. If `annotations=distance` or `annotations=duration,distance` is requested when running a MLD router, a `NotImplemented` error will be returned. |
|fallback_speed|`double > 0`|If no route found between a source/destination pair, calculate the as-the-crow-flies distance, then use this speed to estimate duration.|
|fallback_coordinate|`input` (default), or `snapped`| When using a `fallback_speed`, use the user-supplied coordinate (`input`), or the snapped location (`snapped`) for calculating distances.|
|scale_factor|`double > 0`| Multiply the table `duration` values by this number. Default is 1.0.|

Unlike other array encoded options, the length of `sources` and `destinations` can be **smaller or equal**
to number of input locations;
Expand Down
1 change: 1 addition & 0 deletions docs/nodejs/api.md
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ tables. Optionally returns distance table.
- `options.approaches` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)?** Keep waypoints on curb side. Can be `null` (unrestricted, default) or `curb`.
- `options.fallback_speed` **[Number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)?** Replace `null` responses in result with as-the-crow-flies estimates based on `fallback_speed`. Value is in metres/second.
- `options.fallback_coordinate` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)?** Either `input` (default) or `snapped`. If using a `fallback_speed`, use either the user-supplied coordinate (`input`), or the snapped coordinate (`snapped`) for calculating the as-the-crow-flies diestance between two points.
- `options.scale_factor` **[Number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)?** Multiply the table duration values in the table by this number for more controlled input into a route optimization solver.
- `callback` **[Function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function)**

**Examples**
Expand Down
46 changes: 45 additions & 1 deletion features/testbot/duration_matrix.feature
Original file line number Diff line number Diff line change
Expand Up @@ -580,4 +580,48 @@ Feature: Basic Duration Matrix
| a | 0 | 30 | 18 | 24 |
| b | 30 | 0 | 12 | 18 |
| f | 18 | 12 | 0 | 30 |
| 1 | 24 | 18 | 30 | 0 |
| 1 | 24 | 18 | 30 | 0 |

Scenario: Testbot - Test fallback speeds and scale factor
Given a grid size of 300 meters
Given the extract extra arguments "--small-component-size 4"
Given the query options
| scale_factor | 2 |
| fallback_speed | 5 |
| fallback_coordinate | snapped |

Given the node map
"""
a b f h 1
d e g i
"""

And the ways
| nodes |
| abeda |
| fhigf |

When I request a travel time matrix I should get
| | a | b | f | 1 |
| a | 0 | 60 | 36 | 48 |
| b | 60 | 0 | 24 | 36 |
| f | 36 | 24 | 0 | 60 |
| 1 | 48 | 36 | 60 | 0 |

Scenario: Testbot - Travel time matrix of minimal network with scale factor
Given the query options
| scale_factor | 2 |

Given the node map
"""
a b
"""

And the ways
| nodes |
| ab |

When I request a travel time matrix I should get
| | a | b |
| a | 0 | 20 |
| b | 20 | 0 |
10 changes: 9 additions & 1 deletion include/engine/api/table_parameters.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,8 @@ struct TableParameters : public BaseParameters

AnnotationsType annotations = AnnotationsType::Duration;

double scale_factor = 1;

TableParameters() = default;
template <typename... Args>
TableParameters(std::vector<std::size_t> sources_,
Expand All @@ -105,10 +107,13 @@ struct TableParameters : public BaseParameters
const AnnotationsType annotations_,
double fallback_speed_,
FallbackCoordinateType fallback_coordinate_type_,
double scale_factor_,
Args... args_)
: BaseParameters{std::forward<Args>(args_)...}, sources{std::move(sources_)},
destinations{std::move(destinations_)}, fallback_speed{fallback_speed_},
fallback_coordinate_type{fallback_coordinate_type_}, annotations{annotations_}
fallback_coordinate_type{fallback_coordinate_type_}, annotations{annotations_},
scale_factor{scale_factor_}

{
}

Expand All @@ -135,6 +140,9 @@ struct TableParameters : public BaseParameters
if (fallback_speed < 0)
return false;

if (scale_factor < 1)
return false;

return true;
}
};
Expand Down
18 changes: 18 additions & 0 deletions include/nodejs/node_osrm_support.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1229,6 +1229,24 @@ argumentsToTableParameter(const Nan::FunctionCallbackInfo<v8::Value> &args,
}
}

if (obj->Has(Nan::New("scale_factor").ToLocalChecked()))
{
auto scale_factor = obj->Get(Nan::New("scale_factor").ToLocalChecked());

if (!scale_factor->IsNumber())
{
Nan::ThrowError("scale_factor must be a number");
return table_parameters_ptr();
}
else if (scale_factor->NumberValue() < 1)
{
Nan::ThrowError("scale_factor must be > 1");
return table_parameters_ptr();
}

params->scale_factor = static_cast<double>(scale_factor->NumberValue());
}

return params;
}

Expand Down
21 changes: 13 additions & 8 deletions include/server/api/table_parameter_grammar.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,16 +56,20 @@ struct TableParametersGrammar : public BaseParametersGrammar<Iterator, Signature
engine::api::TableParameters::FallbackCoordinateType::Input)(
"snapped", engine::api::TableParameters::FallbackCoordinateType::Snapped);

scale_factor_rule =
qi::lit("scale_factor=") >
(double_)[ph::bind(&engine::api::TableParameters::scale_factor, qi::_r1) = qi::_1];

table_rule = destinations_rule(qi::_r1) | sources_rule(qi::_r1);

root_rule =
BaseGrammar::query_rule(qi::_r1) > -qi::lit(".json") >
-('?' > (table_rule(qi::_r1) | base_rule(qi::_r1) | fallback_speed_rule(qi::_r1) |
(qi::lit("fallback_coordinate=") >
fallback_coordinate_type
[ph::bind(&engine::api::TableParameters::fallback_coordinate_type,
qi::_r1) = qi::_1])) %
'&');
root_rule = BaseGrammar::query_rule(qi::_r1) > -qi::lit(".json") >
-('?' > (table_rule(qi::_r1) | base_rule(qi::_r1) | scale_factor_rule(qi::_r1) |
fallback_speed_rule(qi::_r1) |
(qi::lit("fallback_coordinate=") >
fallback_coordinate_type
[ph::bind(&engine::api::TableParameters::fallback_coordinate_type,
qi::_r1) = qi::_1])) %
'&');
}

TableParametersGrammar(qi::rule<Iterator, Signature> &root_rule_) : BaseGrammar(root_rule_)
Expand Down Expand Up @@ -94,6 +98,7 @@ struct TableParametersGrammar : public BaseParametersGrammar<Iterator, Signature
qi::rule<Iterator, Signature> sources_rule;
qi::rule<Iterator, Signature> destinations_rule;
qi::rule<Iterator, Signature> fallback_speed_rule;
qi::rule<Iterator, Signature> scale_factor_rule;
qi::rule<Iterator, std::size_t()> size_t_;
qi::symbols<char, engine::api::TableParameters::AnnotationsType> annotations;
qi::rule<Iterator, engine::api::TableParameters::AnnotationsType()> annotations_list;
Expand Down
8 changes: 6 additions & 2 deletions src/engine/plugins/table.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -96,15 +96,16 @@ Status TablePlugin::HandleRequest(const RoutingAlgorithmsInterface &algorithms,
}

// Scan table for null results - if any exist, replace with distance estimates
if (params.fallback_speed > 0)
if (params.fallback_speed > 0 || params.scale_factor > 1.0)
{
for (std::size_t row = 0; row < num_sources; row++)
{
for (std::size_t column = 0; column < num_destinations; column++)
{
const auto &table_index = row * num_destinations + column;
BOOST_ASSERT(table_index < result_tables_pair.first.size());
if (result_tables_pair.first[table_index] == MAXIMAL_EDGE_DURATION)
if (params.fallback_speed > 0 &&
result_tables_pair.first[table_index] == MAXIMAL_EDGE_DURATION)
{
const auto &source =
snapped_phantoms[params.sources.empty() ? row : params.sources[row]];
Expand All @@ -127,6 +128,9 @@ Status TablePlugin::HandleRequest(const RoutingAlgorithmsInterface &algorithms,
result_tables_pair.second[table_index] = distance_estimate;
}
}
if (params.scale_factor > 1.0 && result_tables_pair.first[table_index] != MAXIMAL_EDGE_DURATION){
result_tables_pair.first[table_index] = result_tables_pair.first[table_index] * (double)params.scale_factor;
}
}
}
}
Expand Down
5 changes: 5 additions & 0 deletions src/server/service/table_service.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,11 @@ std::string getWrongOptionHelp(const engine::api::TableParameters &parameters)
help = "fallback_speed must be > 0";
}

if (parameters.scale_factor < 1)
{
help = "scale_factor must be > 1";
}

return help;
}
} // anon. ns
Expand Down
14 changes: 14 additions & 0 deletions test/nodejs/table.js
Original file line number Diff line number Diff line change
Expand Up @@ -260,5 +260,19 @@ tables.forEach(function(annotation) {
});
});

test('table: ' + annotation + ' table in Monaco with scale factor', function(assert) {
assert.plan(1);
var osrm = new OSRM({path: mld_data_path, algorithm: 'MLD'});
var options = {
coordinates: two_test_coordinates,
annotations: [annotation.slice(0,-1)],
scale_factor: 2
};
osrm.table(options, function(err, response) {
console.log(response[annotation]);
assert.equal(response[annotation].length, 2);
});
});

});

0 comments on commit e9390bc

Please sign in to comment.