Skip to content

Commit 40a2077

Browse files
committed
feature: implement isInIteration on RaptorTransitCalculator
1 parent bab0cee commit 40a2077

File tree

5 files changed

+71
-0
lines changed

5 files changed

+71
-0
lines changed

raptor/src/main/java/org/opentripplanner/raptor/rangeraptor/transit/ForwardRaptorTransitCalculator.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,30 @@ public boolean oneIterationOnly() {
8282
return searchWindowInSeconds <= iterationStep;
8383
}
8484

85+
/**
86+
* Note: This implementation is an identical copy of the one in
87+
* {@link ReverseRaptorTransitCalculator}, because introducing a common ancestor with
88+
* iterationStep for these two calculators would be too large a performance hit.
89+
* {@inheritDoc}
90+
*/
91+
@Override
92+
public boolean isInIteration(int subjectTime, int iterationDepartureTime) {
93+
// A <= x
94+
boolean iterationDepartureBeforeOrEqSubject = !isAfter(iterationDepartureTime, subjectTime);
95+
if (oneIterationOnly()) {
96+
return iterationDepartureBeforeOrEqSubject;
97+
}
98+
99+
// x < B
100+
boolean subjectBeforeIterationWindowEnd = isBefore(
101+
subjectTime,
102+
plusDuration(iterationDepartureTime, iterationStep)
103+
);
104+
105+
// A <= x < B
106+
return iterationDepartureBeforeOrEqSubject && subjectBeforeIterationWindowEnd;
107+
}
108+
85109
@Override
86110
public IntIterator patternStopIterator(int nStopsInPattern) {
87111
return IntIterators.intIncIterator(0, nStopsInPattern);

raptor/src/main/java/org/opentripplanner/raptor/rangeraptor/transit/RaptorTransitCalculator.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,12 @@ static <T extends RaptorTripSchedule> RaptorTransitCalculator<T> testDummyCalcul
103103
*/
104104
boolean oneIterationOnly();
105105

106+
/**
107+
* Return TRUE if the subject time is within the iteration given by the provided iteration
108+
* departure time.
109+
*/
110+
boolean isInIteration(int subjectTime, int iterationDepartureTime);
111+
106112
/**
107113
* Return an iterator, iterating over the stop positions in a pattern. Iterate from '0' to
108114
* 'nStopsInPattern - 1' in a forward search and from 'nStopsInPattern - 1' to '0' in a reverse

raptor/src/main/java/org/opentripplanner/raptor/rangeraptor/transit/ReverseRaptorTransitCalculator.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,27 @@ public boolean oneIterationOnly() {
8585
return searchWindowInSeconds <= iterationStep;
8686
}
8787

88+
/**
89+
* Note: This implementation is an identical copy of the one in
90+
* {@link ForwardRaptorTransitCalculator}, because introducing a common ancestor with
91+
* iterationStep for these two calculators would be too large a performance hit.
92+
* {@inheritDoc}
93+
*/
94+
@Override
95+
public boolean isInIteration(int subjectTime, int iterationDepartureTime) {
96+
boolean iterationDepartureBeforeOrEqSubject = !isAfter(iterationDepartureTime, subjectTime);
97+
if (oneIterationOnly()) {
98+
return iterationDepartureBeforeOrEqSubject;
99+
}
100+
101+
boolean subjectBeforeIterationWindowEnd = isBefore(
102+
subjectTime,
103+
plusDuration(iterationDepartureTime, iterationStep)
104+
);
105+
106+
return iterationDepartureBeforeOrEqSubject && subjectBeforeIterationWindowEnd;
107+
}
108+
88109
@Override
89110
public IntIterator patternStopIterator(int nStopsInPattern) {
90111
return IntIterators.intDecIterator(nStopsInPattern, 0);

raptor/src/test/java/org/opentripplanner/raptor/rangeraptor/transit/ForwardRaptorTransitCalculatorTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,16 @@ public void oneIterationOnly() {
5757
assertTrue(subject.oneIterationOnly());
5858
}
5959

60+
@Test
61+
public void isInIteration() {
62+
var subject = create();
63+
64+
assertFalse(subject.isInIteration(59, 60));
65+
assertTrue(subject.isInIteration(60, 60));
66+
assertTrue(subject.isInIteration(119, 60));
67+
assertFalse(subject.isInIteration(120, 60));
68+
}
69+
6070
@Test
6171
public void rangeRaptorMinutes() {
6272
earliestDepartureTime = 500;

raptor/src/test/java/org/opentripplanner/raptor/rangeraptor/transit/ReverseRaptorTransitCalculatorTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,16 @@ public void oneIterationOnly() {
5858
assertTrue(subject.oneIterationOnly());
5959
}
6060

61+
@Test
62+
public void isInIteration() {
63+
var subject = create();
64+
65+
assertFalse(subject.isInIteration(60, 120));
66+
assertTrue(subject.isInIteration(61, 120));
67+
assertTrue(subject.isInIteration(120, 120));
68+
assertFalse(subject.isInIteration(121, 120));
69+
}
70+
6171
@Test
6272
public void rangeRaptorMinutes() {
6373
latestArrivalTime = 500;

0 commit comments

Comments
 (0)