Skip to content

Commit 208a6fe

Browse files
Convert tranferSlack to duration or int
1 parent c3c298e commit 208a6fe

File tree

12 files changed

+45
-23
lines changed

12 files changed

+45
-23
lines changed

docs/RouteRequest.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ and in the [transferRequests in build-config.json](BuildConfiguration.md#transfe
3838
| [searchWindow](#rd_searchWindow) | `duration` | The duration of the search-window. | *Optional* | | 2.0 |
3939
| [streetRoutingTimeout](#rd_streetRoutingTimeout) | `duration` | The maximum time a street routing request is allowed to take before returning the results. | *Optional* | `"PT5S"` | 2.2 |
4040
| [transferPenalty](#rd_transferPenalty) | `integer` | An additional penalty added to boardings after the first. | *Optional* | `0` | 2.0 |
41-
| [transferSlack](#rd_transferSlack) | `integer` | The extra time needed to make a safe transfer in seconds. | *Optional* | `120` | 2.0 |
41+
| [transferSlack](#rd_transferSlack) | `duration` | The extra time needed to make a safe transfer in seconds. | *Optional* | `"PT2M"` | 2.0 |
4242
| turnReluctance | `double` | Multiplicative factor on expected turning time. | *Optional* | `1.0` | 2.0 |
4343
| [unpreferredCost](#rd_unpreferredCost) | `cost-linear-function` | A cost function used to calculate penalty for an unpreferred route. | *Optional* | `"0s + 1.00 t"` | 2.2 |
4444
| waitReluctance | `double` | How much worse is waiting for a transit vehicle than being on a transit vehicle, as a multiplier. | *Optional* | `1.0` | 2.0 |
@@ -351,7 +351,7 @@ significant time or walking will still be taken.
351351

352352
<h3 id="rd_transferSlack">transferSlack</h3>
353353

354-
**Since version:** `2.0`**Type:** `integer`**Cardinality:** `Optional`**Default value:** `120`
354+
**Since version:** `2.0`**Type:** `duration`**Cardinality:** `Optional`**Default value:** `"PT2M"`
355355
**Path:** /routingDefaults
356356

357357
The extra time needed to make a safe transfer in seconds.
@@ -1181,7 +1181,7 @@ include stairs as a last result.
11811181
},
11821182
"waitReluctance" : 1.0,
11831183
"otherThanPreferredRoutesPenalty" : 300,
1184-
"transferSlack" : 120,
1184+
"transferSlack" : "2m",
11851185
"boardSlackForMode" : {
11861186
"AIRPLANE" : "35m"
11871187
},

docs/RouterConfiguration.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -522,7 +522,7 @@ Used to group requests when monitoring OTP.
522522
},
523523
"waitReluctance" : 1.0,
524524
"otherThanPreferredRoutesPenalty" : 300,
525-
"transferSlack" : 120,
525+
"transferSlack" : "2m",
526526
"boardSlackForMode" : {
527527
"AIRPLANE" : "35m"
528528
},

src/ext/java/org/opentripplanner/ext/restapi/resources/RequestToPreferencesMapper.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.opentripplanner.ext.restapi.resources;
22

33
import jakarta.validation.constraints.NotNull;
4+
import java.time.Duration;
45
import java.util.function.Consumer;
56
import org.opentripplanner.ext.restapi.mapping.LegacyVehicleRoutingOptimizeType;
67
import org.opentripplanner.framework.lang.ObjectUtils;
@@ -151,7 +152,7 @@ private void mapTransfer(BoardAndAlightSlack boardAndAlightSlack) {
151152
"Invalid parameters: 'minTransferTime' must be greater than or equal to board slack plus alight slack"
152153
);
153154
}
154-
transfer.withSlack(req.minTransferTime - boardAndAlightSlack.value);
155+
transfer.withSlack(Duration.ofSeconds(req.minTransferTime - boardAndAlightSlack.value));
155156
}
156157

157158
setIfNotNull(req.nonpreferredTransferPenalty, transfer::withNonpreferredCost);

src/main/java/org/opentripplanner/routing/algorithm/raptoradapter/transit/request/RaptorRoutingRequestTransitData.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ public RaptorRoutingRequestTransitData(
109109

110110
this.slackProvider =
111111
new SlackProvider(
112-
request.preferences().transfer().slack(),
112+
(int) request.preferences().transfer().slack().toSeconds(),
113113
request.preferences().transit().boardSlack(),
114114
request.preferences().transit().alightSlack()
115115
);

src/main/java/org/opentripplanner/routing/api/request/preference/TransferPreferences.java

+9-7
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@
44
import static org.opentripplanner.framework.lang.DoubleUtils.doubleEquals;
55

66
import java.io.Serializable;
7+
import java.time.Duration;
78
import java.util.Objects;
89
import java.util.function.Consumer;
910
import org.opentripplanner.framework.model.Cost;
1011
import org.opentripplanner.framework.model.Units;
12+
import org.opentripplanner.framework.time.DurationUtils;
1113
import org.opentripplanner.framework.tostring.ToStringBuilder;
1214
import org.opentripplanner.routing.algorithm.transferoptimization.api.TransferOptimizationParameters;
1315

@@ -23,7 +25,7 @@ public final class TransferPreferences implements Serializable {
2325
private static final int MAX_NUMBER_OF_TRANSFERS = 30;
2426

2527
private final Cost cost;
26-
private final int slack;
28+
private final Duration slack;
2729
private final double waitReluctance;
2830
private final int maxTransfers;
2931
private final int maxAdditionalTransfers;
@@ -32,7 +34,7 @@ public final class TransferPreferences implements Serializable {
3234

3335
private TransferPreferences() {
3436
this.cost = Cost.ZERO;
35-
this.slack = 120;
37+
this.slack = Duration.ofMinutes(2);
3638
this.waitReluctance = 1.0;
3739
this.maxTransfers = 12;
3840
this.maxAdditionalTransfers = 5;
@@ -42,7 +44,7 @@ private TransferPreferences() {
4244

4345
private TransferPreferences(Builder builder) {
4446
this.cost = builder.cost;
45-
this.slack = Units.duration(builder.slack);
47+
this.slack = DurationUtils.requireNonNegative(builder.slack);
4648
this.waitReluctance = Units.reluctance(builder.waitReluctance);
4749
this.maxTransfers = Units.count(builder.maxTransfers, MAX_NUMBER_OF_TRANSFERS);
4850
this.maxAdditionalTransfers =
@@ -89,7 +91,7 @@ public int cost() {
8991
* <p>
9092
* Unit is seconds. Default value is 2 minutes.
9193
*/
92-
public int slack() {
94+
public Duration slack() {
9395
return slack;
9496
}
9597

@@ -183,7 +185,7 @@ public String toString() {
183185
return ToStringBuilder
184186
.of(TransferPreferences.class)
185187
.addObj("cost", cost, DEFAULT.cost)
186-
.addNum("slack", slack, DEFAULT.slack)
188+
.addDuration("slack", slack, DEFAULT.slack)
187189
.addNum("waitReluctance", waitReluctance, DEFAULT.waitReluctance)
188190
.addNum("maxTransfers", maxTransfers, DEFAULT.maxTransfers)
189191
.addNum("maxAdditionalTransfers", maxAdditionalTransfers, DEFAULT.maxAdditionalTransfers)
@@ -196,7 +198,7 @@ public static class Builder {
196198

197199
private final TransferPreferences original;
198200
private Cost cost;
199-
private int slack;
201+
private Duration slack;
200202
private Integer maxTransfers;
201203
private Integer maxAdditionalTransfers;
202204
private double waitReluctance;
@@ -223,7 +225,7 @@ public Builder withCost(int cost) {
223225
return this;
224226
}
225227

226-
public Builder withSlack(int slack) {
228+
public Builder withSlack(Duration slack) {
227229
this.slack = slack;
228230
return this;
229231
}

src/main/java/org/opentripplanner/standalone/config/framework/json/ParameterBuilder.java

+13
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,19 @@ public Duration asDuration() {
389389
return ofRequired(DURATION, node -> parseDuration(node.asText()));
390390
}
391391

392+
public Duration asDurationOrSeconds(Duration dflt) {
393+
// we claim that this only accepts durations but in reality it also accepts number of seconds
394+
// we don't want to advertise this fact though
395+
info.withType(DURATION);
396+
setInfoOptional(dflt.toString());
397+
var node = build();
398+
if (node.isTextual()) {
399+
return asDuration(dflt);
400+
} else {
401+
return Duration.ofSeconds((long) asDouble(dflt.toSeconds()));
402+
}
403+
}
404+
392405
public List<Duration> asDurations(List<Duration> defaultValues) {
393406
return ofArrayAsList(DURATION, defaultValues, node -> parseDuration(node.asText()));
394407
}

src/main/java/org/opentripplanner/standalone/config/routerequest/TransferConfig.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ static void mapTransferPreferences(NodeAdapter c, TransferPreferences.Builder tx
4646
`alightSlack`.
4747
"""
4848
)
49-
.asInt(dft.slack())
49+
.asDurationOrSeconds(dft.slack())
5050
)
5151
.withWaitReluctance(
5252
c

src/test/java/org/opentripplanner/GtfsTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ public Itinerary plan(
128128
// Init preferences
129129
routingRequest.withPreferences(preferences -> {
130130
preferences.withTransfer(tx -> {
131-
tx.withSlack(0);
131+
tx.withSlack(Duration.ZERO);
132132
tx.withWaitReluctance(1);
133133
tx.withCost(preferLeastTransfers ? 300 : 0);
134134
});

src/test/java/org/opentripplanner/routing/api/request/preference/TransferPreferencesTest.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,13 @@
44
import static org.junit.jupiter.api.Assertions.assertSame;
55
import static org.opentripplanner.routing.api.request.preference.ImmutablePreferencesAsserts.assertEqualsAndHashCode;
66

7+
import java.time.Duration;
78
import org.junit.jupiter.api.Test;
89

910
class TransferPreferencesTest {
1011

1112
private static final int COST = 200;
12-
private static final int SLACK = 150;
13+
private static final Duration SLACK = Duration.ofSeconds(150);
1314
private static final double WAIT_RELUCTANCE = 0.95;
1415
private static final int MAX_TRANSFERS = 17;
1516
private static final int MAX_ADDITIONAL_TRANSFERS = 7;

src/test/java/org/opentripplanner/routing/core/RoutingPreferencesTest.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import static org.junit.jupiter.api.Assertions.assertNotSame;
44
import static org.junit.jupiter.api.Assertions.assertSame;
55

6+
import java.time.Duration;
67
import org.junit.jupiter.api.Test;
78
import org.opentripplanner.routing.api.request.preference.RoutingPreferences;
89

@@ -71,7 +72,7 @@ public void copyOfWithWalkChanges() {
7172
@Test
7273
public void copyOfWithTransferChanges() {
7374
var pref = new RoutingPreferences();
74-
var copy = pref.copyOf().withTransfer(t -> t.withSlack(2)).build();
75+
var copy = pref.copyOf().withTransfer(t -> t.withSlack(Duration.ofSeconds(2))).build();
7576

7677
assertNotSame(pref, copy);
7778
assertNotSame(pref.transfer(), copy.transfer());

src/test/java/org/opentripplanner/standalone/config/routerequest/RouteRequestConfigTest.java

+9-5
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@
55
import static org.junit.jupiter.api.Assertions.assertTrue;
66
import static org.opentripplanner.standalone.config.framework.json.JsonSupport.newNodeAdapterForTest;
77

8+
import java.time.Duration;
89
import org.junit.jupiter.api.Test;
10+
import org.junit.jupiter.params.ParameterizedTest;
11+
import org.junit.jupiter.params.provider.ValueSource;
912
import org.opentripplanner.routing.api.request.StreetMode;
1013

1114
class RouteRequestConfigTest {
@@ -96,13 +99,14 @@ public void testAccessEgressPenalty() {
9699
);
97100
}
98101

99-
@Test
100-
public void transferSlackAsInt() {
101-
var slack = mapSlack("99");
102-
assertEquals(99, slack);
102+
@ParameterizedTest
103+
@ValueSource(strings = { "99", "\"99s\"", "\"1m39s\"", "\"PT1m39s\"" })
104+
public void transferSlackAsIntOrDuration(String input) {
105+
var slack = mapSlack(input);
106+
assertEquals(Duration.ofSeconds(99), slack);
103107
}
104108

105-
private static int mapSlack(String input) {
109+
private static Duration mapSlack(String input) {
106110
var nodeAdapter = newNodeAdapterForTest(
107111
"""
108112
{

src/test/resources/standalone/config/router-config.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@
7979
},
8080
"waitReluctance": 1.0,
8181
"otherThanPreferredRoutesPenalty": 300,
82-
"transferSlack": 120,
82+
"transferSlack": "2m",
8383
// Default slack for any mode is 0 (zero)
8484
"boardSlackForMode": {
8585
"AIRPLANE": "35m"

0 commit comments

Comments
 (0)