23
23
*/
24
24
public class TemporalDensityResult {
25
25
26
+ private static final int TIME_LIMIT = 120 ;
27
+
26
28
// Internal state fields
27
29
30
+ private final int nPointSets ;
31
+ private final int nPercentiles ;
32
+ private final int nThresholds ;
28
33
private final PointSet [] destinationPointSets ;
29
34
private final int [] dualAccessibilityThresholds ;
30
35
@@ -44,20 +49,23 @@ public TemporalDensityResult(AnalysisWorkerTask task) {
44
49
);
45
50
this .destinationPointSets = task .destinationPointSets ;
46
51
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 ];
48
56
}
49
57
50
58
public void recordOneTarget (int target , int [] travelTimePercentilesSeconds ) {
51
59
// 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 ) {
56
64
break ; // If any percentile is unreached, all higher ones are also unreached.
57
65
}
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 );
61
69
}
62
70
}
63
71
}
@@ -69,15 +77,13 @@ public void recordOneTarget (int target, int[] travelTimePercentilesSeconds) {
69
77
* If one of these invariants does not hold, there is something wrong with the calculations.
70
78
*/
71
79
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 ]) {
78
84
throw new AssertionError ("Increasing travel time decreased accessibility." );
79
85
}
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 ]) {
81
87
throw new AssertionError ("Increasing percentile increased accessibility." );
82
88
}
83
89
}
@@ -94,25 +100,21 @@ private void checkInvariants() {
94
100
public int [][][] calculateDualAccessibilityGrid () {
95
101
checkInvariants ();
96
102
97
- int nPointSets = opportunitiesPerMinute .length ;
98
- int nPercentiles = opportunitiesPerMinute .length > 0 ? opportunitiesPerMinute [0 ].length : 0 ;
99
- int nThresholds = dualAccessibilityThresholds .length ;
100
103
int [][][] dualAccessibilityGrid = new int [nPointSets ][nPercentiles ][nThresholds ];
101
104
for (int i = 0 ; i < nPointSets ; i ++) {
102
105
for (int j = 0 ; j < nPercentiles ; j ++) {
103
106
for (int k = 0 ; k < nThresholds ; k ++) {
104
107
int threshold = dualAccessibilityThresholds [k ];
105
- int minute = 0 ;
108
+ int minutes = 0 ;
106
109
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 ;
110
113
}
111
- dualAccessibilityGrid [i ][j ][k ] = minute ;
114
+ dualAccessibilityGrid [i ][j ][k ] = minutes ;
112
115
}
113
116
}
114
117
}
115
- // TODO check invariants
116
118
return dualAccessibilityGrid ;
117
119
}
118
120
}
0 commit comments