Skip to content

Commit ad4e9fa

Browse files
Store dimension sizes for better clarity across methods
1 parent 0185431 commit ad4e9fa

File tree

1 file changed

+26
-24
lines changed

1 file changed

+26
-24
lines changed

src/main/java/com/conveyal/r5/analyst/TemporalDensityResult.java

+26-24
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,13 @@
2323
*/
2424
public class TemporalDensityResult {
2525

26+
private static final int TIME_LIMIT = 120;
27+
2628
// Internal state fields
2729

30+
private final int nPointSets;
31+
private final int nPercentiles;
32+
private final int nThresholds;
2833
private final PointSet[] destinationPointSets;
2934
private final int[] dualAccessibilityThresholds;
3035

@@ -44,20 +49,23 @@ public TemporalDensityResult(AnalysisWorkerTask task) {
4449
);
4550
this.destinationPointSets = task.destinationPointSets;
4651
this.dualAccessibilityThresholds = task.dualAccessibilityThresholds;
47-
this.opportunitiesPerMinute = new double[destinationPointSets.length][task.percentiles.length][120];
52+
this.nPercentiles = task.percentiles.length;
53+
this.nPointSets = this.destinationPointSets.length;
54+
this.nThresholds = this.dualAccessibilityThresholds.length;
55+
opportunitiesPerMinute = new double[this.nPointSets][this.nPercentiles][TIME_LIMIT];
4856
}
4957

5058
public void recordOneTarget (int target, int[] travelTimePercentilesSeconds) {
5159
// Increment histogram bin for the number of minutes of travel by the number of opportunities at the target.
52-
for (int d = 0; d < destinationPointSets.length; d++) {
53-
PointSet dps = destinationPointSets[d];
54-
for (int p = 0; p < opportunitiesPerMinute.length; p++) {
55-
if (travelTimePercentilesSeconds[p] == UNREACHED) {
60+
for (int i = 0; i < nPointSets; i++) {
61+
PointSet dps = destinationPointSets[i];
62+
for (int j = 0; j < nPercentiles; j++) {
63+
if (travelTimePercentilesSeconds[j] == UNREACHED) {
5664
break; // If any percentile is unreached, all higher ones are also unreached.
5765
}
58-
int m = travelTimePercentilesSeconds[p] / 60;
59-
if (m < 120) {
60-
opportunitiesPerMinute[d][p][m] += dps.getOpportunityCount(target);
66+
int minutes = travelTimePercentilesSeconds[j] / 60;
67+
if (minutes < TIME_LIMIT) {
68+
opportunitiesPerMinute[i][j][minutes] += dps.getOpportunityCount(target);
6169
}
6270
}
6371
}
@@ -69,15 +77,13 @@ public void recordOneTarget (int target, int[] travelTimePercentilesSeconds) {
6977
* If one of these invariants does not hold, there is something wrong with the calculations.
7078
*/
7179
private void checkInvariants() {
72-
int nPointSets = opportunitiesPerMinute.length;
73-
int nPercentiles = opportunitiesPerMinute.length > 0 ? opportunitiesPerMinute[0].length : 0;
74-
for (int d = 0; d < nPointSets; d++) {
75-
for (int p = 0; p < nPercentiles; p++) {
76-
for (int m = 0; m < 120; m++) {
77-
if (m > 0 && opportunitiesPerMinute[d][p][m] < opportunitiesPerMinute[d][p][m - 1]) {
80+
for (int i = 0; i < nPointSets; i++) {
81+
for (int j = 0; j < nPercentiles; j++) {
82+
for (int m = 0; m < TIME_LIMIT; m++) {
83+
if (m > 0 && opportunitiesPerMinute[i][j][m] < opportunitiesPerMinute[i][j][m - 1]) {
7884
throw new AssertionError("Increasing travel time decreased accessibility.");
7985
}
80-
if (p > 0 && opportunitiesPerMinute[d][p][m] > opportunitiesPerMinute[d][p - 1][m]) {
86+
if (j > 0 && opportunitiesPerMinute[i][j][m] > opportunitiesPerMinute[i][j - 1][m]) {
8187
throw new AssertionError("Increasing percentile increased accessibility.");
8288
}
8389
}
@@ -94,25 +100,21 @@ private void checkInvariants() {
94100
public int[][][] calculateDualAccessibilityGrid() {
95101
checkInvariants();
96102

97-
int nPointSets = opportunitiesPerMinute.length;
98-
int nPercentiles = opportunitiesPerMinute.length > 0 ? opportunitiesPerMinute[0].length : 0;
99-
int nThresholds = dualAccessibilityThresholds.length;
100103
int[][][] dualAccessibilityGrid = new int[nPointSets][nPercentiles][nThresholds];
101104
for (int i = 0; i < nPointSets; i++) {
102105
for (int j = 0; j < nPercentiles; j++) {
103106
for (int k = 0; k < nThresholds; k++) {
104107
int threshold = dualAccessibilityThresholds[k];
105-
int minute = 0;
108+
int minutes = 0;
106109
double sum = 0;
107-
while (sum < threshold && minute < 120) {
108-
sum += opportunitiesPerMinute[i][j][minute];
109-
minute += 1;
110+
while (sum < threshold && minutes < TIME_LIMIT) {
111+
sum += opportunitiesPerMinute[i][j][minutes];
112+
minutes += 1;
110113
}
111-
dualAccessibilityGrid[i][j][k] = minute;
114+
dualAccessibilityGrid[i][j][k] = minutes;
112115
}
113116
}
114117
}
115-
// TODO check invariants
116118
return dualAccessibilityGrid;
117119
}
118120
}

0 commit comments

Comments
 (0)