Skip to content

Commit 514076e

Browse files
authored
Merge pull request #122 from moia-oss/master
Update MATSim
2 parents 3bcd816 + bea85e8 commit 514076e

File tree

575 files changed

+40411
-3944
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

575 files changed

+40411
-3944
lines changed

.github/workflows/deploy-dtds.yaml

+6-4
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
11
name: deploy-dtds-on-website
22

33
on:
4-
push:
5-
branches:
6-
- master
4+
pull_request:
5+
types:
6+
- closed
77
paths:
8-
- matsim/src/main/resources/dtd
8+
- 'matsim/src/main/resources/dtd/**'
99

1010
jobs:
1111
rsync-dtds:
12+
if: github.event.pull_request.merged == true # only if PR closed by merging
1213
name: sync DTDs to website
1314
runs-on: ubuntu-latest
1415

1516
steps:
17+
- uses: actions/checkout@v4
1618
- name: rsync dtds
1719
uses: burnett01/[email protected]
1820
with:

.github/workflows/full-integration.yaml

+2-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ jobs:
1414
strategy:
1515
fail-fast: false
1616
matrix:
17-
os: [ubuntu-latest, windows-latest, macos-latest]
17+
os: [ubuntu-latest, windows-latest]
18+
#os: [ubuntu-latest, windows-latest, macos-latest]
1819

1920
steps:
2021
- name: Prepare git

contribs/accessibility/pom.xml

+3-3
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,12 @@
3737
<dependency>
3838
<groupId>org.matsim.contrib</groupId>
3939
<artifactId>matrixbasedptrouter</artifactId>
40-
<version>2025.0-SNAPSHOT</version>
40+
<version>${project.parent.version}</version>
4141
</dependency>
4242
<dependency>
4343
<groupId>org.matsim.contrib</groupId>
4444
<artifactId>roadpricing</artifactId>
45-
<version>2025.0-SNAPSHOT</version>
45+
<version>${project.parent.version}</version>
4646
</dependency>
4747
<dependency>
4848
<groupId>net.sf.trove4j</groupId>
@@ -70,7 +70,7 @@
7070
<dependency>
7171
<groupId>org.matsim.contrib</groupId>
7272
<artifactId>analysis</artifactId>
73-
<version>2025.0-SNAPSHOT</version>
73+
<version>${project.parent.version}</version>
7474
</dependency>
7575
<!-- <dependency>-->
7676
<!-- <groupId>org.matsim.contrib</groupId>-->

contribs/analysis/pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
<dependency>
1414
<groupId>org.matsim.contrib</groupId>
1515
<artifactId>roadpricing</artifactId>
16-
<version>2025.0-SNAPSHOT</version>
16+
<version>${project.parent.version}</version>
1717
</dependency>
1818
<dependency>
1919
<groupId>org.osgeo</groupId>

contribs/application/pom.xml

+9-9
Original file line numberDiff line numberDiff line change
@@ -40,37 +40,37 @@
4040
<dependency>
4141
<groupId>org.matsim.contrib</groupId>
4242
<artifactId>otfvis</artifactId>
43-
<version>2025.0-SNAPSHOT</version>
43+
<version>${project.parent.version}</version>
4444
</dependency>
4545
<dependency>
4646
<groupId>org.matsim.contrib</groupId>
4747
<artifactId>osm</artifactId>
48-
<version>2025.0-SNAPSHOT</version>
48+
<version>${project.parent.version}</version>
4949
</dependency>
5050
<dependency>
5151
<groupId>org.matsim.contrib</groupId>
5252
<artifactId>sumo</artifactId>
53-
<version>2025.0-SNAPSHOT</version>
53+
<version>${project.parent.version}</version>
5454
</dependency>
5555
<dependency>
5656
<groupId>org.matsim.contrib</groupId>
5757
<artifactId>analysis</artifactId>
58-
<version>2025.0-SNAPSHOT</version>
58+
<version>${project.parent.version}</version>
5959
</dependency>
6060
<dependency>
6161
<groupId>org.matsim.contrib</groupId>
6262
<artifactId>emissions</artifactId>
63-
<version>2025.0-SNAPSHOT</version>
63+
<version>${project.parent.version}</version>
6464
</dependency>
6565
<dependency>
6666
<groupId>org.matsim.contrib</groupId>
6767
<artifactId>noise</artifactId>
68-
<version>2025.0-SNAPSHOT</version>
68+
<version>${project.parent.version}</version>
6969
</dependency>
7070
<dependency>
7171
<groupId>org.matsim.contrib</groupId>
7272
<artifactId>freight</artifactId>
73-
<version>2025.0-SNAPSHOT</version>
73+
<version>${project.parent.version}</version>
7474
<exclusions>
7575
<!-- Logging levels are all messed up without this exclusion -->
7676
<exclusion>
@@ -87,7 +87,7 @@
8787
<dependency>
8888
<groupId>com.github.matsim-org</groupId>
8989
<artifactId>gtfs2matsim</artifactId>
90-
<version>47b0802a29</version>
90+
<version>19f1676fc6</version>
9191
<exclusions>
9292
<!-- Exclude unneeded dependencies and these with known CVE -->
9393
<exclusion>
@@ -151,7 +151,7 @@
151151
<dependency>
152152
<groupId>org.matsim.contrib</groupId>
153153
<artifactId>dvrp</artifactId>
154-
<version>2025.0-SNAPSHOT</version>
154+
<version>${project.parent.version}</version>
155155
<scope>compile</scope>
156156
</dependency>
157157

contribs/application/src/main/java/org/matsim/application/prepare/network/params/ApplyNetworkParams.java

+22-4
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@ public class ApplyNetworkParams implements MATSimAppCommand {
5353
@CommandLine.Option(names = "--model", description = "Reference to the network model class", required = true)
5454
private Class<? extends NetworkModel> modelClazz;
5555

56-
@CommandLine.Option(names = "--factor-bounds", split = ",", description = "Speed factor limits (lower,upper bound)", defaultValue = NetworkParamsOpt.DEFAULT_FACTOR_BOUNDS)
56+
@CommandLine.Option(names = "--factor-bounds", split = ",", description = "Speed factor limits (lower, upper bound). " +
57+
"Can be negative to indicate absolute speed bounds (in km/h)", defaultValue = NetworkParamsOpt.DEFAULT_FACTOR_BOUNDS)
5758
private double[] speedFactorBounds;
5859

5960
@CommandLine.Option(names = "--capacity-bounds", split = ",", defaultValue = "0.4,0.6,0.8",
@@ -234,23 +235,40 @@ private boolean applyFreeSpeed(Link link, Feature ft) {
234235
return false;
235236
}
236237

238+
double allowedSpeed = (double) link.getAttributes().getAttribute("allowed_speed");
239+
double freeSpeed = allowedSpeed * speedFactor;
240+
237241
boolean modified = false;
238242

239-
if (speedFactor > speedFactorBounds[1]) {
243+
if (speedFactor > speedFactorBounds[1] && speedFactorBounds[1] >= 0) {
240244
log.warn("Reducing speed factor on {} from {} to {}", link.getId(), speedFactor, speedFactorBounds[1]);
241245
speedFactor = speedFactorBounds[1];
242246
modified = true;
243247
}
244248

249+
// Use absolute bound for speed
250+
if (freeSpeed > -speedFactorBounds[1]/3.6 && speedFactorBounds[1] < 0) {
251+
log.warn("Reducing speed on {} from {} to {}", link.getId(), freeSpeed, -speedFactorBounds[1]/3.6);
252+
speedFactor = (-speedFactorBounds[1] / 3.6) / allowedSpeed;
253+
modified = true;
254+
}
255+
245256
// Threshold for very low speed factors
246-
if (speedFactor < speedFactorBounds[0]) {
257+
if (speedFactor < speedFactorBounds[0] && speedFactorBounds[0] >= 0) {
247258
log.warn("Increasing speed factor on {} from {} to {}", link, speedFactor, speedFactorBounds[0]);
248259
speedFactor = speedFactorBounds[0];
249260
modified = true;
250261
}
251262

252-
double freeSpeed = (double) link.getAttributes().getAttribute("allowed_speed") * speedFactor;
263+
// Absolute negative speed factor
264+
if (freeSpeed < -speedFactorBounds[0]/3.6 && speedFactorBounds[0] < 0) {
265+
log.warn("Increasing speed on {} from {} to {}", link, freeSpeed, -speedFactorBounds[0]/3.6);
266+
speedFactor = (-speedFactorBounds[0] / 3.6) / allowedSpeed;
267+
modified = true;
268+
}
253269

270+
// Recalculate with updated speed factor
271+
freeSpeed = allowedSpeed * speedFactor;
254272
freeSpeed = BigDecimal.valueOf(freeSpeed).setScale(3, RoundingMode.HALF_EVEN).doubleValue();
255273

256274
if (decrease && freeSpeed > link.getFreespeed())

contribs/application/src/main/java/org/matsim/application/prepare/network/params/EvalFreespeedParams.java

+18-3
Original file line numberDiff line numberDiff line change
@@ -121,12 +121,27 @@ static Result applyAndEvaluateParams(
121121
speedFactor = speedModel.predict(ft.features(), ft.categories());
122122

123123
// apply lower and upper bound
124-
speedFactor = Math.max(speedFactorBounds[0], speedFactor);
125-
speedFactor = Math.min(speedFactorBounds[1], speedFactor);
124+
if (speedFactorBounds[0] >= 0)
125+
speedFactor = Math.max(speedFactorBounds[0], speedFactor);
126+
127+
if (speedFactorBounds[1] >= 0)
128+
speedFactor = Math.min(speedFactorBounds[1], speedFactor);
126129

127130
attributes.put(link.getId(), speedModel.getData(ft.features(), ft.categories()));
128131

129-
link.setFreespeed(allowedSpeed * speedFactor);
132+
double freespeed = allowedSpeed * speedFactor;
133+
134+
// Check absolute bounds on the freespeed
135+
if (speedFactorBounds[0] < 0 && freespeed < -speedFactorBounds[0]/3.6) {
136+
freespeed = -speedFactorBounds[0]/3.6;
137+
speedFactor = freespeed / allowedSpeed;
138+
}
139+
if (speedFactorBounds[1] < 0 && freespeed > -speedFactorBounds[1]/3.6) {
140+
freespeed = -speedFactorBounds[1]/3.6;
141+
speedFactor = freespeed / allowedSpeed;
142+
}
143+
144+
link.setFreespeed(freespeed);
130145
link.getAttributes().putAttribute("speed_factor", speedFactor);
131146

132147
} else

contribs/application/src/main/java/org/matsim/application/prepare/network/params/FreespeedOptServer.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,8 @@ public class FreespeedOptServer implements MATSimAppCommand {
5757
@CommandLine.Parameters(arity = "1..*", description = "Input validation files loaded from APIs")
5858
private List<String> validationFiles;
5959

60-
@CommandLine.Option(names = "--factor-bounds", split = ",", description = "Speed factor limits (lower,upper bound)", defaultValue = NetworkParamsOpt.DEFAULT_FACTOR_BOUNDS)
60+
@CommandLine.Option(names = "--factor-bounds", split = ",", description = "Speed factor limits (lower, upper bound). " +
61+
"Can be negative to indicate absolute speed bounds (in km/h)", defaultValue = NetworkParamsOpt.DEFAULT_FACTOR_BOUNDS)
6162
private double[] speedFactorBounds;
6263

6364
@CommandLine.Option(names = "--ref-hours", description = "Reference hours", defaultValue = "3,21", split = ",")

contribs/application/src/main/java/org/matsim/application/prepare/pt/CreateTransitScheduleFromGtfs.java

+67-21
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.matsim.core.utils.io.IOUtils;
2626
import org.matsim.pt.transitSchedule.api.*;
2727
import org.matsim.pt.utils.CreatePseudoNetwork;
28+
import org.matsim.pt.utils.CreatePseudoNetworkWithLoopLinks;
2829
import org.matsim.pt.utils.TransitScheduleValidator;
2930
import org.matsim.vehicles.*;
3031
import picocli.CommandLine;
@@ -85,8 +86,8 @@ public class CreateTransitScheduleFromGtfs implements MATSimAppCommand {
8586
@CommandLine.Option(names = "--transform-schedule", description = "Fully qualified class name to a Consumer<TransitSchedule> to be executed after the schedule was created", arity = "0..*", split = ",")
8687
private List<Class<?>> transformSchedule;
8788

88-
@CommandLine.Option(names = "--merge-stops", description = "Whether stops should be merged by coordinate")
89-
private boolean mergeStops;
89+
@CommandLine.Option(names = "--merge-stops", description = "Whether stops should be merged by coordinate", defaultValue = "doNotMerge")
90+
private GtfsConverter.MergeGtfsStops mergeStops;
9091

9192
@CommandLine.Option(names = "--prefix", description = "Prefixes to add to the gtfs ids. Required if multiple inputs are used and ids are not unique.", split = ",")
9293
private List<String> prefixes = new ArrayList<>();
@@ -100,10 +101,29 @@ public class CreateTransitScheduleFromGtfs implements MATSimAppCommand {
100101
@CommandLine.Option(names = "--shp-crs", description = "Overwrite coordinate system of the shape file")
101102
private String shpCrs;
102103

104+
@CommandLine.Option(names = "--pseudo-network", description = "Define how the pseudo network should be created", defaultValue = "singleLinkBetweenStops")
105+
private PseudoNetwork pseudoNetwork;
106+
107+
103108
public static void main(String[] args) {
104109
System.exit(new CommandLine(new CreateTransitScheduleFromGtfs()).execute(args));
105110
}
106111

112+
private static void addHbefaMapping(VehicleType vehicleType, HbefaVehicleCategory category) {
113+
EngineInformation carEngineInformation = vehicleType.getEngineInformation();
114+
VehicleUtils.setHbefaVehicleCategory(carEngineInformation, String.valueOf(category));
115+
VehicleUtils.setHbefaTechnology(carEngineInformation, "average");
116+
VehicleUtils.setHbefaSizeClass(carEngineInformation, "average");
117+
VehicleUtils.setHbefaEmissionsConcept(carEngineInformation, "average");
118+
vehicleType.setNetworkMode(TransportMode.pt);
119+
}
120+
121+
private static void increaseLinkFreespeedIfLower(Link link, double newFreespeed) {
122+
if (link.getFreespeed() < newFreespeed) {
123+
link.setFreespeed(newFreespeed);
124+
}
125+
}
126+
107127
@Override
108128
public Integer call() throws Exception {
109129

@@ -183,6 +203,13 @@ public Integer call() throws Exception {
183203

184204
Scenario ptScenario = getScenarioWithPseudoPtNetworkAndTransitVehicles(network, scenario.getTransitSchedule(), "pt_");
185205

206+
for (TransitLine line : new ArrayList<>(scenario.getTransitSchedule().getTransitLines().values())) {
207+
if (line.getRoutes().isEmpty()) {
208+
log.warn("Line {} with no routes removed.", line.getId());
209+
scenario.getTransitSchedule().removeTransitLine(line);
210+
}
211+
}
212+
186213
if (validate) {
187214
//Check schedule and network
188215
TransitScheduleValidator.ValidationResult checkResult = TransitScheduleValidator.validateAll(ptScenario.getTransitSchedule(), ptScenario.getNetwork());
@@ -237,14 +264,19 @@ private Predicate<Stop> createFilter(int i) throws Exception {
237264
/**
238265
* Creates the pt scenario and network.
239266
*/
240-
private static Scenario getScenarioWithPseudoPtNetworkAndTransitVehicles(Network network, TransitSchedule schedule, String ptNetworkIdentifier) {
267+
private Scenario getScenarioWithPseudoPtNetworkAndTransitVehicles(Network network, TransitSchedule schedule, String ptNetworkIdentifier) {
241268
ScenarioUtils.ScenarioBuilder builder = new ScenarioUtils.ScenarioBuilder(ConfigUtils.createConfig());
242269
builder.setNetwork(network);
243270
builder.setTransitSchedule(schedule);
244271
Scenario scenario = builder.build();
245272

246273
// add pseudo network for pt
247-
new CreatePseudoNetwork(scenario.getTransitSchedule(), scenario.getNetwork(), ptNetworkIdentifier, 0.1, 100000.0).createNetwork();
274+
switch (pseudoNetwork) {
275+
case singleLinkBetweenStops ->
276+
new CreatePseudoNetwork(scenario.getTransitSchedule(), scenario.getNetwork(), ptNetworkIdentifier, 0.1, 100000.0).createNetwork();
277+
case withLoopLinks ->
278+
new CreatePseudoNetworkWithLoopLinks(scenario.getTransitSchedule(), scenario.getNetwork(), ptNetworkIdentifier, 0.1, 100000.0).createNetwork();
279+
}
248280

249281
// create TransitVehicle types
250282
// see https://svn.vsp.tu-berlin.de/repos/public-svn/publications/vspwp/2014/14-24/ for veh capacities
@@ -449,8 +481,12 @@ private static Scenario getScenarioWithPseudoPtNetworkAndTransitVehicles(Network
449481
// so we need to add time for passengers to board and alight
450482
double minStopTime = 30.0;
451483

484+
List<Id<Link>> routeIds = new LinkedList<>();
485+
routeIds.add(route.getRoute().getStartLinkId());
486+
routeIds.addAll(route.getRoute().getLinkIds());
487+
routeIds.add(route.getRoute().getEndLinkId());
488+
452489
for (int i = 1; i < routeStops.size(); i++) {
453-
// TODO cater for loop link at first stop? Seems to just work without.
454490
TransitRouteStop routeStop = routeStops.get(i);
455491
// if there is no departure offset set (or infinity), it is the last stop of the line,
456492
// so we don't need to care about the stop duration
@@ -462,8 +498,23 @@ private static Scenario getScenarioWithPseudoPtNetworkAndTransitVehicles(Network
462498
// Math.max to avoid negative values of travelTime
463499
double travelTime = Math.max(1, routeStop.getArrivalOffset().seconds() - lastDepartureOffset - 1.0 -
464500
(stopDuration >= minStopTime ? 0 : (minStopTime - stopDuration)));
465-
Link link = network.getLinks().get(routeStop.getStopFacility().getLinkId());
466-
increaseLinkFreespeedIfLower(link, link.getLength() / travelTime);
501+
502+
503+
Id<Link> stopLink = routeStop.getStopFacility().getLinkId();
504+
List<Id<Link>> subRoute = new LinkedList<>();
505+
do {
506+
Id<Link> linkId = routeIds.removeFirst();
507+
subRoute.add(linkId);
508+
} while (!subRoute.contains(stopLink));
509+
510+
List<? extends Link> links = subRoute.stream().map(scenario.getNetwork().getLinks()::get)
511+
.toList();
512+
513+
double length = links.stream().mapToDouble(Link::getLength).sum();
514+
515+
for (Link link : links) {
516+
increaseLinkFreespeedIfLower(link, length / travelTime);
517+
}
467518
lastDepartureOffset = routeStop.getDepartureOffset().seconds();
468519
}
469520

@@ -481,20 +532,15 @@ private static Scenario getScenarioWithPseudoPtNetworkAndTransitVehicles(Network
481532
return scenario;
482533
}
483534

484-
private static void addHbefaMapping(VehicleType vehicleType, HbefaVehicleCategory category) {
485-
EngineInformation carEngineInformation = vehicleType.getEngineInformation();
486-
VehicleUtils.setHbefaVehicleCategory(carEngineInformation, String.valueOf(category));
487-
VehicleUtils.setHbefaTechnology(carEngineInformation, "average");
488-
VehicleUtils.setHbefaSizeClass(carEngineInformation, "average");
489-
VehicleUtils.setHbefaEmissionsConcept(carEngineInformation, "average");
490-
vehicleType.setNetworkMode(TransportMode.pt);
491-
}
492-
493-
private static void increaseLinkFreespeedIfLower(Link link, double newFreespeed) {
494-
if (link.getFreespeed() < newFreespeed) {
495-
link.setFreespeed(newFreespeed);
496-
}
535+
public enum PseudoNetwork {
536+
/**
537+
* Create links between all stops and possibly duplicate stops.
538+
*/
539+
singleLinkBetweenStops,
540+
/**
541+
* Create a pseudo network with loop links at each stop.
542+
*/
543+
withLoopLinks,
497544
}
498545

499-
500546
}

contribs/application/src/main/java/org/matsim/application/prepare/scenario/CreateScenarioCutOut.java

+6-3
Original file line numberDiff line numberDiff line change
@@ -590,9 +590,12 @@ public void run(Person person) {
590590
}
591591

592592
// Remove all unselected plans because these are not handled
593-
person.getPlans().stream()
594-
.filter(p -> p != person.getSelectedPlan())
595-
.forEach(person::removePlan);
593+
List<Plan> plans = new ArrayList<>(person.getPlans());
594+
for(Plan p : plans){
595+
if (p != person.getSelectedPlan()){
596+
person.removePlan(p);
597+
}
598+
}
596599
}
597600

598601

0 commit comments

Comments
 (0)