diff --git a/src/main/R/routes_val.R b/src/main/R/routes_val.R index e192b705..f9d1bb0a 100644 --- a/src/main/R/routes_val.R +++ b/src/main/R/routes_val.R @@ -28,13 +28,23 @@ df <- read_csv(files) df <- df %>% filter(api != "Google" & api != "here") %>% mutate(api=ifelse(api=="woosmap", "here", api)) %>% - mutate(speed=3.6*dist/travel_time) + mutate(speed=3.6*dist/travel_time) %>% + mutate(across(where(is.numeric), ~na_if(., Inf))) %>% + drop_na() + +aggr <- df %>% + group_by(hour, api) %>% + summarise(speed=mean(speed)) + +ggplot(aggr, aes(x=hour, y=speed, color=api)) + + labs(title = "Avg. speed per hour") + + geom_line(size=1.5) std <- read_csv("routes-std.csv") %>% filter(hour!=22) -ggplot(filter(bind_rows(df, mopt), hour==21), aes(x=api, y=speed, fill=api)) + - labs(title = "Avg. speed at 21:00") + +ggplot(filter(bind_rows(df, ms), hour==21), aes(x=api, y=speed, fill=api)) + + labs(title = "Speed at 21:00") + geom_violin(trim = T) + geom_boxplot(width=0.1, fill="white") @@ -77,6 +87,23 @@ trips %>% ###### - capacity <- read_csv("dtv_links_capacity.csv") sum(capacity$is_valid, na.rm = TRUE) / length(capacity$is_valid) + + +ft <- read_csv("input/sumo.net-edges.csv.gz") + +###### + +freight <- read_csv("count_error_by_hour.csv") +freight_h <- read_csv("count_comparison_by_hour.csv") %>% group_by(hour) %>% + summarise(observed=mean(observed_traffic_volume), simulated=mean(simulated_traffic_volume)) + +ggplot(freight, aes(x=hour)) + + geom_line(aes(y=mean_bias)) + +ggplot(freight_h, aes(x=hour)) + + labs(title = "Observed vs. simulated freight counts") + + ylab("Mean vehicles /h") + + geom_line(aes(y=observed, color="observed"), size=2) + + geom_line(aes(y=simulated, color="simulated"), size=2) diff --git a/src/main/java/org/matsim/prepare/ExtractFacilityShp.java b/src/main/java/org/matsim/prepare/ExtractFacilityShp.java index 357e1bdf..1b17f4e1 100644 --- a/src/main/java/org/matsim/prepare/ExtractFacilityShp.java +++ b/src/main/java/org/matsim/prepare/ExtractFacilityShp.java @@ -54,11 +54,11 @@ import java.util.function.Function; import java.util.stream.Collectors; -import static org.matsim.prepare.population.RunOpenBerlinCalibration.roundCoord; +import static org.matsim.prepare.RunOpenBerlinCalibration.roundCoord; @CommandLine.Command( - name = "facility-shp", - description = "Generate facility shape file from OSM data." + name = "facility-shp", + description = "Generate facility shape file from OSM data." ) public class ExtractFacilityShp implements MATSimAppCommand { @@ -75,34 +75,25 @@ public class ExtractFacilityShp implements MATSimAppCommand { * Usually large areas such as parks, campus, etc. */ private static final double MAX_ASSIGN = 50_000; - + private final GeometryBuilder geometryBuilder = new GeometryBuilder(); @CommandLine.Option(names = "--input", description = "Path to input .pbf file", required = true) private Path pbf; - @CommandLine.Option(names = "--output", description = "Path to output shape file", required = true) private Path output; - @CommandLine.Option(names = "--activity-mapping", description = "Path to activity napping json", required = true) private Path mappingPath; - @CommandLine.Mixin private CrsOptions crs = new CrsOptions("EPSG:4326", RunOpenBerlinScenario.CRS); - /** * Maps types to feature index. */ private Object2IntMap types; - private ActivityMapping config; - private List pois; private List landuse; private List entities; - private MathTransform transform; private InMemoryMapDataSet data; - private final GeometryBuilder geometryBuilder = new GeometryBuilder(); - private int ignored; public static void main(String[] args) { @@ -124,11 +115,11 @@ public Integer call() throws Exception { types = new Object2IntLinkedOpenHashMap<>(); config.types.values().stream() - .flatMap(c -> c.values.values().stream()) - .flatMap(Collection::stream) - .distinct() - .sorted() - .forEach(e -> types.put(e, types.size())); + .flatMap(c -> c.values.values().stream()) + .flatMap(Collection::stream) + .distinct() + .sorted() + .forEach(e -> types.put(e, types.size())); log.info("Configured activity types: {}", types.keySet()); @@ -371,6 +362,242 @@ private MultiPolygon createPolygon(OsmEntity entity) { return null; } + private static final class ActivityMapping { + private final Map types = new HashMap<>(); + + public Set getTypes() { + return types.keySet(); + } + + @JsonAnyGetter + public MappingConfig getTag(String type) { + return types.get(type); + } + + @JsonAnySetter + private void setTag(String type, MappingConfig config) { + types.put(type, config); + } + + } + + /** + * Helper class to define data structure for mapping. + */ + public static final class MappingConfig { + + private final Map> values = new HashMap<>(); + + @JsonAnyGetter + public Set getActivities(String value) { + return values.get(value); + } + + @JsonAnySetter + private void setActivities(String value, Set activities) { + values.put(value, activities); + } + + } + + @CommandLine.Command( + name = "facilities", + description = "Creates MATSim facilities from shape-file and network" + ) + public static class CreateMATSimFacilities implements MATSimAppCommand { + + /** + * Filter link types that don't have a facility associated. + */ + public static final Set IGNORED_LINK_TYPES = Set.of("motorway", "trunk", + "motorway_link", "trunk_link", "secondary_link", "primary_link"); + private static final Logger log = LogManager.getLogger(CreateMATSimFacilities.class); + @CommandLine.Option(names = "--network", required = true, description = "Path to car network") + private Path network; + + @CommandLine.Option(names = "--output", required = true, description = "Path to output facility file") + private Path output; + + @CommandLine.Mixin + private ShpOptions shp; + + public static void main(String[] args) { + new CreateMATSimFacilities().execute(args); + } + + @Override + public Integer call() throws Exception { + + if (shp.getShapeFile() == null) { + log.error("Shp file with facilities is required."); + return 2; + } + + Network completeNetwork = NetworkUtils.readNetwork(this.network.toString()); + TransportModeNetworkFilter filter = new TransportModeNetworkFilter(completeNetwork); + Network carOnlyNetwork = NetworkUtils.createNetwork(); + filter.filter(carOnlyNetwork, Set.of(TransportMode.car)); + + List fts = shp.readFeatures(); + + Map, Holder> data = new ConcurrentHashMap<>(); + + fts.parallelStream().forEach(ft -> processFeature(ft, carOnlyNetwork, data)); + + ActivityFacilities facilities = FacilitiesUtils.createActivityFacilities(); + + ActivityFacilitiesFactory f = facilities.getFactory(); + + for (Map.Entry, Holder> e : data.entrySet()) { + + Holder h = e.getValue(); + + Id id = Id.create(String.join("_", h.ids), ActivityFacility.class); + + // Create mean coordinate + OptionalDouble x = h.coords.stream().mapToDouble(Coord::getX).average(); + OptionalDouble y = h.coords.stream().mapToDouble(Coord::getY).average(); + + if (x.isEmpty() || y.isEmpty()) { + log.warn("Empty coordinate (Should never happen)"); + continue; + } + + ActivityFacility facility = f.createActivityFacility(id, roundCoord(new Coord(x.getAsDouble(), y.getAsDouble()))); + for (String act : h.activities) { + facility.addActivityOption(f.createActivityOption(act)); + } + + facilities.addActivityFacility(facility); + } + + log.info("Created {} facilities, writing to {}", facilities.getFacilities().size(), output); + + FacilitiesWriter writer = new FacilitiesWriter(facilities); + writer.write(output.toString()); + + return 0; + } + + /** + * Sample points and choose link with the nearest points. Aggregate everything so there is at most one facility per link. + */ + private void processFeature(SimpleFeature ft, Network network, Map, Holder> data) { + + // Actual id is the last part + String[] id = ft.getID().split("\\."); + + // Pairs of coords and corresponding links + List coords = samplePoints((MultiPolygon) ft.getDefaultGeometry(), 23); + List> links = coords.stream().map(coord -> NetworkUtils.getNearestLinkExactly(network, coord).getId()).toList(); + + Map, Long> map = links.stream() + .filter(l -> !IGNORED_LINK_TYPES.contains(NetworkUtils.getType(network.getLinks().get(l)))) + .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())); + + // Everything could be filtered and map empty + if (map.isEmpty()) + return; + + List, Long>> counts = map.entrySet().stream().sorted(Map.Entry.comparingByValue()) + .toList(); + + // The "main" link of the facility + Id link = counts.get(counts.size() - 1).getKey(); + + Holder holder = data.computeIfAbsent(link, k -> new Holder(ConcurrentHashMap.newKeySet(), ConcurrentHashMap.newKeySet(), Collections.synchronizedList(new ArrayList<>()))); + + holder.ids.add(id[id.length - 1]); + holder.activities.addAll(activities(ft)); + + // Search for the original drawn coordinate of the associated link + for (int i = 0; i < links.size(); i++) { + if (links.get(i).equals(link)) { + holder.coords.add(coords.get(i)); + break; + } + } + } + + /** + * Sample coordinates within polygon. + */ + private List samplePoints(MultiPolygon geometry, int n) { + + SplittableRandom rnd = new SplittableRandom(); + + List result = new ArrayList<>(); + Envelope bbox = geometry.getEnvelopeInternal(); + int max = n * 10; + for (int i = 0; i < max && result.size() < n; i++) { + + Coord coord = roundCoord(new Coord( + bbox.getMinX() + (bbox.getMaxX() - bbox.getMinX()) * rnd.nextDouble(), + bbox.getMinY() + (bbox.getMaxY() - bbox.getMinY()) * rnd.nextDouble() + )); + + try { + if (geometry.contains(MGC.coord2Point(coord))) { + result.add(coord); + } + } catch (TopologyException e) { + if (geometry.getBoundary().contains(MGC.coord2Point(coord))) { + result.add(coord); + } + } + + } + + if (result.isEmpty()) + result.add(MGC.point2Coord(geometry.getCentroid())); + + return result; + } + + private Set activities(SimpleFeature ft) { + Set act = new HashSet<>(); + + if (Boolean.TRUE == ft.getAttribute("work")) { + act.add("work"); + act.add("work_business"); + } + if (Boolean.TRUE == ft.getAttribute("shop")) { + act.add("shop_other"); + } + if (Boolean.TRUE == ft.getAttribute("shop_daily")) { + act.add("shop_other"); + act.add("shop_daily"); + } + if (Boolean.TRUE == ft.getAttribute("leisure")) + act.add("leisure"); + if (Boolean.TRUE == ft.getAttribute("dining")) + act.add("dining"); + if (Boolean.TRUE == ft.getAttribute("edu_higher")) + act.add("edu_higher"); + if (Boolean.TRUE == ft.getAttribute("edu_prim")) { + act.add("edu_primary"); + act.add("edu_secondary"); + } + if (Boolean.TRUE == ft.getAttribute("edu_kiga")) + act.add("edu_kiga"); + if (Boolean.TRUE == ft.getAttribute("edu_other")) + act.add("edu_other"); + if (Boolean.TRUE == ft.getAttribute("p_business") || Boolean.TRUE == ft.getAttribute("medical") || Boolean.TRUE == ft.getAttribute("religious")) { + act.add("personal_business"); + act.add("work_business"); + } + + return act; + } + + /** + * Temporary data holder for facilities. + */ + private record Holder(Set ids, Set activities, List coords) { + + } + + } /** * Features for one facility, stored as bit set. @@ -435,243 +662,4 @@ public SimpleFeature createFeature(SimpleFeatureBuilder builder) { return builder.buildFeature(null); } } - - private static final class ActivityMapping { - private final Map types = new HashMap<>(); - - public Set getTypes() { - return types.keySet(); - } - - @JsonAnyGetter - public MappingConfig getTag(String type) { - return types.get(type); - } - - @JsonAnySetter - private void setTag(String type, MappingConfig config) { - types.put(type, config); - } - - } - - /** - * Helper class to define data structure for mapping. - */ - public static final class MappingConfig { - - private final Map> values = new HashMap<>(); - - @JsonAnyGetter - public Set getActivities(String value) { - return values.get(value); - } - - @JsonAnySetter - private void setActivities(String value, Set activities) { - values.put(value, activities); - } - - } - - @CommandLine.Command( - name = "facilities", - description = "Creates MATSim facilities from shape-file and network" - ) - public static class CreateMATSimFacilities implements MATSimAppCommand { - - private static final Logger log = LogManager.getLogger(CreateMATSimFacilities.class); - - /** - * Filter link types that don't have a facility associated. - */ - public static final Set IGNORED_LINK_TYPES = Set.of("motorway", "trunk", - "motorway_link", "trunk_link", "secondary_link", "primary_link"); - - @CommandLine.Option(names = "--network", required = true, description = "Path to car network") - private Path network; - - @CommandLine.Option(names = "--output", required = true, description = "Path to output facility file") - private Path output; - - @CommandLine.Mixin - private ShpOptions shp; - - public static void main(String[] args) { - new CreateMATSimFacilities().execute(args); - } - - @Override - public Integer call() throws Exception { - - if (shp.getShapeFile() == null) { - log.error("Shp file with facilities is required."); - return 2; - } - - Network completeNetwork = NetworkUtils.readNetwork(this.network.toString()); - TransportModeNetworkFilter filter = new TransportModeNetworkFilter(completeNetwork); - Network carOnlyNetwork = NetworkUtils.createNetwork(); - filter.filter(carOnlyNetwork, Set.of(TransportMode.car)); - - List fts = shp.readFeatures(); - - Map, Holder> data = new ConcurrentHashMap<>(); - - fts.parallelStream().forEach(ft -> processFeature(ft, carOnlyNetwork, data)); - - ActivityFacilities facilities = FacilitiesUtils.createActivityFacilities(); - - ActivityFacilitiesFactory f = facilities.getFactory(); - - for (Map.Entry, Holder> e : data.entrySet()) { - - Holder h = e.getValue(); - - Id id = Id.create(String.join("_", h.ids), ActivityFacility.class); - - // Create mean coordinate - OptionalDouble x = h.coords.stream().mapToDouble(Coord::getX).average(); - OptionalDouble y = h.coords.stream().mapToDouble(Coord::getY).average(); - - if (x.isEmpty() || y.isEmpty()) { - log.warn("Empty coordinate (Should never happen)"); - continue; - } - - ActivityFacility facility = f.createActivityFacility(id, roundCoord(new Coord(x.getAsDouble(), y.getAsDouble()))); - for (String act : h.activities) { - facility.addActivityOption(f.createActivityOption(act)); - } - - facilities.addActivityFacility(facility); - } - - log.info("Created {} facilities, writing to {}", facilities.getFacilities().size(), output); - - FacilitiesWriter writer = new FacilitiesWriter(facilities); - writer.write(output.toString()); - - return 0; - } - - /** - * Sample points and choose link with the nearest points. Aggregate everything so there is at most one facility per link. - */ - private void processFeature(SimpleFeature ft, Network network, Map, Holder> data) { - - // Actual id is the last part - String[] id = ft.getID().split("\\."); - - // Pairs of coords and corresponding links - List coords = samplePoints((MultiPolygon) ft.getDefaultGeometry(), 23); - List> links = coords.stream().map(coord -> NetworkUtils.getNearestLinkExactly(network, coord).getId()).toList(); - - Map, Long> map = links.stream() - .filter(l -> !IGNORED_LINK_TYPES.contains(NetworkUtils.getType(network.getLinks().get(l)))) - .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())); - - // Everything could be filtered and map empty - if (map.isEmpty()) - return; - - List, Long>> counts = map.entrySet().stream().sorted(Map.Entry.comparingByValue()) - .toList(); - - // The "main" link of the facility - Id link = counts.get(counts.size() - 1).getKey(); - - Holder holder = data.computeIfAbsent(link, k -> new Holder(ConcurrentHashMap.newKeySet(), ConcurrentHashMap.newKeySet(), Collections.synchronizedList(new ArrayList<>()))); - - holder.ids.add(id[id.length - 1]); - holder.activities.addAll(activities(ft)); - - // Search for the original drawn coordinate of the associated link - for (int i = 0; i < links.size(); i++) { - if (links.get(i).equals(link)) { - holder.coords.add(coords.get(i)); - break; - } - } - } - - /** - * Sample coordinates within polygon. - */ - private List samplePoints(MultiPolygon geometry, int n) { - - SplittableRandom rnd = new SplittableRandom(); - - List result = new ArrayList<>(); - Envelope bbox = geometry.getEnvelopeInternal(); - int max = n * 10; - for (int i = 0; i < max && result.size() < n; i++) { - - Coord coord = roundCoord(new Coord( - bbox.getMinX() + (bbox.getMaxX() - bbox.getMinX()) * rnd.nextDouble(), - bbox.getMinY() + (bbox.getMaxY() - bbox.getMinY()) * rnd.nextDouble() - )); - - try { - if (geometry.contains(MGC.coord2Point(coord))) { - result.add(coord); - } - } catch (TopologyException e) { - if (geometry.getBoundary().contains(MGC.coord2Point(coord))) { - result.add(coord); - } - } - - } - - if (result.isEmpty()) - result.add(MGC.point2Coord(geometry.getCentroid())); - - return result; - } - - private Set activities(SimpleFeature ft) { - Set act = new HashSet<>(); - - if (Boolean.TRUE == ft.getAttribute("work")) { - act.add("work"); - act.add("work_business"); - } - if (Boolean.TRUE == ft.getAttribute("shop")) { - act.add("shop_other"); - } - if (Boolean.TRUE == ft.getAttribute("shop_daily")) { - act.add("shop_other"); - act.add("shop_daily"); - } - if (Boolean.TRUE == ft.getAttribute("leisure")) - act.add("leisure"); - if (Boolean.TRUE == ft.getAttribute("dining")) - act.add("dining"); - if (Boolean.TRUE == ft.getAttribute("edu_higher")) - act.add("edu_higher"); - if (Boolean.TRUE == ft.getAttribute("edu_prim")) { - act.add("edu_primary"); - act.add("edu_secondary"); - } - if (Boolean.TRUE == ft.getAttribute("edu_kiga")) - act.add("edu_kiga"); - if (Boolean.TRUE == ft.getAttribute("edu_other")) - act.add("edu_other"); - if (Boolean.TRUE == ft.getAttribute("p_business") || Boolean.TRUE == ft.getAttribute("medical") || Boolean.TRUE == ft.getAttribute("religious")) { - act.add("personal_business"); - act.add("work_business"); - } - - return act; - } - - /** - * Temporary data holder for facilities. - */ - private record Holder(Set ids, Set activities, List coords) { - - } - - } } diff --git a/src/main/java/org/matsim/prepare/population/RunOpenBerlinCalibration.java b/src/main/java/org/matsim/prepare/RunOpenBerlinCalibration.java similarity index 99% rename from src/main/java/org/matsim/prepare/population/RunOpenBerlinCalibration.java rename to src/main/java/org/matsim/prepare/RunOpenBerlinCalibration.java index a00b6610..e1741bba 100644 --- a/src/main/java/org/matsim/prepare/population/RunOpenBerlinCalibration.java +++ b/src/main/java/org/matsim/prepare/RunOpenBerlinCalibration.java @@ -1,4 +1,4 @@ -package org.matsim.prepare.population; +package org.matsim.prepare; import com.google.inject.Inject; import com.google.inject.TypeLiteral; @@ -42,7 +42,6 @@ import org.matsim.core.scoring.SumScoringFunction; import org.matsim.core.scoring.functions.*; import org.matsim.core.utils.geometry.CoordUtils; -import org.matsim.prepare.*; import org.matsim.prepare.counts.CreateCountsFromGeoPortalBerlin; import org.matsim.prepare.counts.CreateCountsFromVMZ; import org.matsim.prepare.counts.CreateCountsFromVMZOld; @@ -52,6 +51,7 @@ import org.matsim.prepare.network.SampleNetwork; import org.matsim.prepare.opt.RunCountOptimization; import org.matsim.prepare.opt.SelectPlansFromIndex; +import org.matsim.prepare.population.*; import org.matsim.run.Activities; import org.matsim.run.RunOpenBerlinScenario; import org.matsim.simwrapper.SimWrapperConfigGroup; diff --git a/src/main/java/org/matsim/prepare/network/FreeSpeedOptimizer.java b/src/main/java/org/matsim/prepare/network/FreeSpeedOptimizer.java index 41f82c08..e4008b38 100644 --- a/src/main/java/org/matsim/prepare/network/FreeSpeedOptimizer.java +++ b/src/main/java/org/matsim/prepare/network/FreeSpeedOptimizer.java @@ -56,6 +56,7 @@ requireNetwork = true, requires = "features.csv" ) +@Deprecated public class FreeSpeedOptimizer implements MATSimAppCommand { private static final Logger log = LogManager.getLogger(FreeSpeedOptimizer.class); @@ -90,6 +91,9 @@ public static void main(String[] args) { @Override public Integer call() throws Exception { + // TODO: must be reusable class + // TODO: evaluate many factors (f) and write results to csv + network = input.getNetwork(); mapper = new ObjectMapper(); mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); diff --git a/src/main/java/org/matsim/prepare/network/PrepareNetworkParams.java b/src/main/java/org/matsim/prepare/network/PrepareNetworkParams.java index b4af1a60..00a9d978 100644 --- a/src/main/java/org/matsim/prepare/network/PrepareNetworkParams.java +++ b/src/main/java/org/matsim/prepare/network/PrepareNetworkParams.java @@ -31,6 +31,7 @@ requires = "features.csv", produces = "network.xml.gz" ) +@Deprecated public class PrepareNetworkParams implements MATSimAppCommand { private static final Logger log = LogManager.getLogger(PrepareNetworkParams.class); diff --git a/src/main/java/org/matsim/prepare/network/SampleNetwork.java b/src/main/java/org/matsim/prepare/network/SampleNetwork.java index 7f711d8a..aad34aaf 100644 --- a/src/main/java/org/matsim/prepare/network/SampleNetwork.java +++ b/src/main/java/org/matsim/prepare/network/SampleNetwork.java @@ -27,7 +27,7 @@ import org.matsim.core.router.util.LeastCostPathCalculator; import org.matsim.core.router.util.TravelTime; import org.matsim.core.utils.geometry.geotools.MGC; -import org.matsim.prepare.population.RunOpenBerlinCalibration; +import org.matsim.prepare.RunOpenBerlinCalibration; import org.matsim.vehicles.Vehicle; import picocli.CommandLine; @@ -37,11 +37,15 @@ import java.util.*; import java.util.stream.Collectors; +/** + * Now available in the contrib. + */ @CommandLine.Command( name = "sample-network", description = "Sample nodes and junctions ids from network" ) @CommandSpec(requireNetwork = true, produces = {"intersections.txt", "edges.txt", "routes.txt"}) +@Deprecated public class SampleNetwork implements MATSimAppCommand { private static final Logger log = LogManager.getLogger(SampleNetwork.class); diff --git a/src/main/java/org/matsim/prepare/opt/RunCountOptimization.java b/src/main/java/org/matsim/prepare/opt/RunCountOptimization.java index 84c1c401..f91db4d4 100644 --- a/src/main/java/org/matsim/prepare/opt/RunCountOptimization.java +++ b/src/main/java/org/matsim/prepare/opt/RunCountOptimization.java @@ -21,7 +21,7 @@ import org.matsim.counts.Counts; import org.matsim.counts.MatsimCountsReader; import org.matsim.counts.Volume; -import org.matsim.prepare.population.RunOpenBerlinCalibration; +import org.matsim.prepare.RunOpenBerlinCalibration; import org.optaplanner.core.api.solver.Solver; import org.optaplanner.core.api.solver.SolverFactory; import picocli.CommandLine; diff --git a/src/main/java/org/matsim/prepare/population/CreateBerlinPopulation.java b/src/main/java/org/matsim/prepare/population/CreateBerlinPopulation.java index 62be579e..9eca14ad 100644 --- a/src/main/java/org/matsim/prepare/population/CreateBerlinPopulation.java +++ b/src/main/java/org/matsim/prepare/population/CreateBerlinPopulation.java @@ -23,6 +23,7 @@ import org.matsim.core.utils.geometry.CoordinateTransformation; import org.matsim.core.utils.geometry.geotools.MGC; import org.matsim.core.utils.geometry.transformations.GeotoolsTransformation; +import org.matsim.prepare.RunOpenBerlinCalibration; import org.matsim.run.RunOpenBerlinScenario; import org.opengis.feature.simple.SimpleFeature; import picocli.CommandLine; diff --git a/src/main/java/org/matsim/prepare/population/InitLocationChoice.java b/src/main/java/org/matsim/prepare/population/InitLocationChoice.java index 085a8f34..682be2b0 100644 --- a/src/main/java/org/matsim/prepare/population/InitLocationChoice.java +++ b/src/main/java/org/matsim/prepare/population/InitLocationChoice.java @@ -29,6 +29,7 @@ import org.matsim.facilities.ActivityFacility; import org.matsim.facilities.FacilitiesUtils; import org.matsim.facilities.MatsimFacilitiesReader; +import org.matsim.prepare.RunOpenBerlinCalibration; import org.matsim.run.RunOpenBerlinScenario; import org.opengis.feature.simple.SimpleFeature; import picocli.CommandLine; diff --git a/src/main/java/org/matsim/prepare/population/RunActivitySampling.java b/src/main/java/org/matsim/prepare/population/RunActivitySampling.java index 18ff2263..c55072c8 100644 --- a/src/main/java/org/matsim/prepare/population/RunActivitySampling.java +++ b/src/main/java/org/matsim/prepare/population/RunActivitySampling.java @@ -19,6 +19,7 @@ import org.matsim.core.population.algorithms.ParallelPersonAlgorithmUtils; import org.matsim.core.population.algorithms.PersonAlgorithm; import org.matsim.core.router.TripStructureUtils; +import org.matsim.prepare.RunOpenBerlinCalibration; import picocli.CommandLine; import java.nio.file.Path; diff --git a/src/main/java/org/matsim/run/RunOpenBerlinScenario.java b/src/main/java/org/matsim/run/RunOpenBerlinScenario.java index 9731e330..aba79ba6 100644 --- a/src/main/java/org/matsim/run/RunOpenBerlinScenario.java +++ b/src/main/java/org/matsim/run/RunOpenBerlinScenario.java @@ -11,7 +11,7 @@ import org.matsim.core.controler.AbstractModule; import org.matsim.core.controler.Controler; import org.matsim.core.replanning.strategies.DefaultPlanStrategiesModule; -import org.matsim.prepare.population.RunOpenBerlinCalibration; +import org.matsim.prepare.RunOpenBerlinCalibration; import org.matsim.simwrapper.SimWrapperConfigGroup; import org.matsim.simwrapper.SimWrapperModule; import picocli.CommandLine;