|
41 | 41 | import static uk.cam.mrc.phm.util.CoefficientLookup.CoefficientSet; |
42 | 42 |
|
43 | 43 | import java.util.*; |
| 44 | +import java.util.function.Function; |
44 | 45 | import java.util.function.ToDoubleFunction; |
45 | 46 |
|
46 | 47 | import static uk.cam.mrc.phm.util.MelbourneImplementationConfig.getMelbourneProperties; |
@@ -201,21 +202,110 @@ private static void fillBikePedConfig(Config bikePedConfig) { |
201 | 202 | bikeAttributes.add(l -> Math.max(Math.min(Gradient.getGradient(l),0.5),0.)); |
202 | 203 | bikeAttributes.add(l -> LinkStress.getStress(l,TransportMode.bike)); |
203 | 204 |
|
| 205 | + // Bike weights |
| 206 | + Function<org.matsim.api.core.v01.population.Person,double[]> bikeWeights = p -> { |
| 207 | + switch((Purpose) p.getAttributes().getAttribute("purpose")) { |
| 208 | + case HBW -> { |
| 209 | + if(p.getAttributes().getAttribute("sex").equals(MitoGender.FEMALE)) { |
| 210 | + // https://github.com/jibeproject/matsim-jibe/blob/3d1a34d60a9a1aae5945967b728d5254ba596dd6/src/main/java/skim/RunSkimsMelbourne.java#L130 |
| 211 | + return new double[] {0, 1.1705777 + 1.3119864}; |
| 212 | + } else { |
| 213 | + // https://github.com/jibeproject/matsim-jibe/blob/3d1a34d60a9a1aae5945967b728d5254ba596dd6/src/main/java/skim/RunSkimsMelbourne.java#L129 |
| 214 | + return new double[] {0, 1.1705777}; |
| 215 | + } |
| 216 | + } |
| 217 | + case HBE -> { |
| 218 | + // https://github.com/jibeproject/matsim-jibe/blob/3d1a34d60a9a1aae5945967b728d5254ba596dd6/src/main/java/skim/RunSkimsMelbourne.java#L139 |
| 219 | + return new double[] {65.8455067, 2.6375670}; |
| 220 | + } |
| 221 | + case HBR -> { |
| 222 | + if ((int) p.getAttributes().getAttribute("age") < 16) { |
| 223 | + // https://github.com/jibeproject/matsim-jibe/blob/3d1a34d60a9a1aae5945967b728d5254ba596dd6/src/main/java/skim/RunSkimsMelbourne.java#L149 |
| 224 | + return new double[] {8.7270880 + 51.9352371, 0 + 4.6070250}; |
| 225 | + } |
| 226 | + else if(p.getAttributes().getAttribute("sex").equals(MitoGender.FEMALE)) { |
| 227 | + // https://github.com/jibeproject/matsim-jibe/blob/3d1a34d60a9a1aae5945967b728d5254ba596dd6/src/main/java/skim/RunSkimsMelbourne.java#L148 |
| 228 | + return new double[] {8.7270880 + 23.5710917, 0 + 1.7298508}; |
| 229 | + } else { |
| 230 | + // https://github.com/jibeproject/matsim-jibe/blob/3d1a34d60a9a1aae5945967b728d5254ba596dd6/src/main/java/skim/RunSkimsMelbourne.java#L147 |
| 231 | + return new double[] {8.7270880, 0}; |
| 232 | + } |
| 233 | + } |
| 234 | + case HBS, HBO -> { |
| 235 | + // https://github.com/jibeproject/matsim-jibe/blob/3d1a34d60a9a1aae5945967b728d5254ba596dd6/src/main/java/skim/RunSkimsMelbourne.java#L161 |
| 236 | + return new double[]{331.2382835, 11.4359257}; |
| 237 | + } |
| 238 | + case HBA -> { |
| 239 | + // https://github.com/jibeproject/matsim-jibe/blob/3d1a34d60a9a1aae5945967b728d5254ba596dd6/src/main/java/skim/RunSkimsMelbourne.java#L169 |
| 240 | + return new double[]{21.4115565, 0}; |
| 241 | + } |
| 242 | + case NHBW -> { |
| 243 | + // https://github.com/jibeproject/matsim-jibe/blob/3d1a34d60a9a1aae5945967b728d5254ba596dd6/src/main/java/skim/RunSkimsMelbourne.java#L175 |
| 244 | + return new double[]{0, 3.9477647}; |
| 245 | + } |
| 246 | + case NHBO -> { |
| 247 | + // https://github.com/jibeproject/matsim-jibe/blob/3d1a34d60a9a1aae5945967b728d5254ba596dd6/src/main/java/skim/RunSkimsMelbourne.java#L183 |
| 248 | + return new double[]{0, 2.6660050}; |
| 249 | + } |
| 250 | + default -> { |
| 251 | + return null; |
| 252 | + } |
| 253 | + } |
| 254 | + }; |
| 255 | + |
204 | 256 | // Bicycle config group |
205 | 257 | BicycleConfigGroup bicycle = (BicycleConfigGroup) bikePedConfig.getModules().get(BicycleConfigGroup.GROUP_NAME); |
206 | 258 | bicycle.setAttributes(bikeAttributes); |
207 | | - bicycle.setWeights(RunMatsimActiveMode::calculateBikeWeights); |
| 259 | + bicycle.setWeights(bikeWeights); |
208 | 260 |
|
209 | 261 | // WALK ATTRIBUTES |
210 | 262 | List<ToDoubleFunction<Link>> walkAttributes = new ArrayList<>(); |
211 | 263 | walkAttributes.add(l -> Math.max(0.,0.81 - LinkAmbience.getVgviFactor(l))); |
212 | 264 | walkAttributes.add(l -> Math.min(1.,l.getFreespeed() / 22.35)); |
213 | | - walkAttributes.add(l -> JctStress.getStressProp(l,TransportMode.walk)); |
| 265 | + |
| 266 | + // Walk weights |
| 267 | + Function<org.matsim.api.core.v01.population.Person,double[]> walkWeights = p -> { |
| 268 | + switch ((Purpose) p.getAttributes().getAttribute("purpose")) { |
| 269 | + case HBW -> { |
| 270 | + // https://github.com/jibeproject/matsim-jibe/blob/3d1a34d60a9a1aae5945967b728d5254ba596dd6/src/main/java/skim/RunSkimsMelbourne.java#L131 |
| 271 | + return new double[]{0, 2.2560371}; |
| 272 | + } |
| 273 | + case HBE -> { |
| 274 | + // https://github.com/jibeproject/matsim-jibe/blob/3d1a34d60a9a1aae5945967b728d5254ba596dd6/src/main/java/skim/RunSkimsMelbourne.java#L140 |
| 275 | + return new double[]{0, 0.8270912}; |
| 276 | + } |
| 277 | + case HBR -> { |
| 278 | + if ((int) p.getAttributes().getAttribute("age") < 16) { |
| 279 | + // https://github.com/jibeproject/matsim-jibe/blob/3d1a34d60a9a1aae5945967b728d5254ba596dd6/src/main/java/skim/RunSkimsMelbourne.java#L151 |
| 280 | + return new double[] {0.6866997, 0.6779886 + 1.0379374}; |
| 281 | + } else { |
| 282 | + // https://github.com/jibeproject/matsim-jibe/blob/3d1a34d60a9a1aae5945967b728d5254ba596dd6/src/main/java/skim/RunSkimsMelbourne.java#L150 |
| 283 | + return new double[] {0.6866997, 0.6779886}; |
| 284 | + } |
| 285 | + } |
| 286 | + |
| 287 | + case HBS, HBO -> { |
| 288 | + // https://github.com/jibeproject/matsim-jibe/blob/3d1a34d60a9a1aae5945967b728d5254ba596dd6/src/main/java/skim/RunSkimsMelbourne.java#L162C120-L162C132 |
| 289 | + return new double[]{0, 0.3421390}; |
| 290 | + } |
| 291 | + case NHBW -> { |
| 292 | + // https://github.com/jibeproject/matsim-jibe/blob/3d1a34d60a9a1aae5945967b728d5254ba596dd6/src/main/java/skim/RunSkimsMelbourne.java#L176 |
| 293 | + return new double[]{0, 4.3210968}; |
| 294 | + } |
| 295 | + case NHBO -> { |
| 296 | + // https://github.com/jibeproject/matsim-jibe/blob/3d1a34d60a9a1aae5945967b728d5254ba596dd6/src/main/java/skim/RunSkimsMelbourne.java#L184 |
| 297 | + return new double[]{0, 5.7158683}; |
| 298 | + } |
| 299 | + default -> { |
| 300 | + return null; |
| 301 | + } |
| 302 | + } |
| 303 | + }; |
214 | 304 |
|
215 | 305 | // Walk config group |
216 | 306 | WalkConfigGroup walkConfigGroup = (WalkConfigGroup) bikePedConfig.getModules().get(WalkConfigGroup.GROUP_NAME); |
217 | 307 | walkConfigGroup.setAttributes(walkAttributes); |
218 | | - walkConfigGroup.setWeights(RunMatsimActiveMode::calculateWalkWeights); |
| 308 | + walkConfigGroup.setWeights(walkWeights); |
219 | 309 |
|
220 | 310 | ActivityParams homeActivity = new ActivityParams("home").setTypicalDuration(getHoursAsSeconds(12)); |
221 | 311 | bikePedConfig.scoring().addActivityParams(homeActivity); |
|
0 commit comments