diff --git a/core/src/main/java/org/eqasim/core/tools/schedule/ExtendSchedule.java b/core/src/main/java/org/eqasim/core/tools/schedule/ExtendSchedule.java index f8eb2838d..7f980fba3 100644 --- a/core/src/main/java/org/eqasim/core/tools/schedule/ExtendSchedule.java +++ b/core/src/main/java/org/eqasim/core/tools/schedule/ExtendSchedule.java @@ -9,36 +9,61 @@ import org.matsim.pt.transitSchedule.api.TransitRoute; import org.matsim.pt.transitSchedule.api.TransitSchedule; import org.matsim.pt.transitSchedule.api.TransitScheduleFactory; +import org.matsim.vehicles.Vehicle; +import org.matsim.vehicles.Vehicles; +import org.matsim.vehicles.VehiclesFactory; public class ExtendSchedule { - private final static String DEPATURE_PREFIX = "extension:"; - private final static double OFFSET = 24.0 * 3600.0; + private final static double H24 = 24 * 3600.0; - private final double time; + private final double endTime; - public ExtendSchedule(double time) { - this.time = time; + public ExtendSchedule(double endTime) { + this.endTime = endTime; } - public void process(TransitSchedule schedule) { - TransitScheduleFactory factory = schedule.getFactory(); + private Id prefixDeparture(Id baseId, int extension) { + return Id.create(baseId.toString() + ":ext:" + extension, Departure.class); + } + + private Id prefixVehicle(Id baseId, int extension) { + return Id.create(baseId.toString() + ":ext:" + extension, Vehicle.class); + } + + public void process(TransitSchedule schedule, Vehicles vehicles) { + TransitScheduleFactory scheduleFactory = schedule.getFactory(); + VehiclesFactory vehiclesFactory = vehicles.getFactory(); for (TransitLine transitLine : schedule.getTransitLines().values()) { for (TransitRoute transitRoute : transitLine.getRoutes().values()) { - List extensions = new LinkedList<>(); + List addedDepartures = new LinkedList<>(); for (Departure departure : transitRoute.getDepartures().values()) { - if (departure.getDepartureTime() <= time) { - Departure extension = factory.createDeparture( // - Id.create(DEPATURE_PREFIX + departure.getId().toString(), Departure.class), // - departure.getDepartureTime() + OFFSET); + double updatedDepartureTime = departure.getDepartureTime() + H24; + int extensionIndex = 1; + + while (updatedDepartureTime <= endTime) { + Departure updatedDeparture = scheduleFactory.createDeparture( // + prefixDeparture(departure.getId(), extensionIndex), // + updatedDepartureTime); + addedDepartures.add(updatedDeparture); + + Vehicle vehicle = vehicles.getVehicles().get(departure.getVehicleId()); + + Id updatedVehicleId = prefixVehicle(vehicle.getId(), extensionIndex); + updatedDeparture.setVehicleId(updatedVehicleId); + + if (!vehicles.getVehicles().containsKey(updatedVehicleId)) { + Vehicle updatedVehicle = vehiclesFactory.createVehicle(updatedVehicleId, vehicle.getType()); + vehicles.addVehicle(updatedVehicle); + } - extension.setVehicleId(departure.getVehicleId()); - extensions.add(extension); + extensionIndex++; + updatedDepartureTime += H24; } } - for (Departure extension : extensions) { + for (Departure extension : addedDepartures) { transitRoute.addDeparture(extension); } } diff --git a/core/src/main/java/org/eqasim/core/tools/schedule/RunExtendSchedule.java b/core/src/main/java/org/eqasim/core/tools/schedule/RunExtendSchedule.java index 8b94d5c85..380ae2009 100644 --- a/core/src/main/java/org/eqasim/core/tools/schedule/RunExtendSchedule.java +++ b/core/src/main/java/org/eqasim/core/tools/schedule/RunExtendSchedule.java @@ -8,17 +8,48 @@ import org.matsim.core.scenario.ScenarioUtils; import org.matsim.pt.transitSchedule.api.TransitScheduleReader; import org.matsim.pt.transitSchedule.api.TransitScheduleWriter; +import org.matsim.vehicles.MatsimVehicleReader; +import org.matsim.vehicles.MatsimVehicleWriter; public class RunExtendSchedule { static public void main(String[] args) throws ConfigurationException { CommandLine cmd = new CommandLine.Builder(args) // - .requireOptions("schedule-path", "output-path", "period") // + .requireOptions("input-schedule-path", "output-schedule-path", "input-vehicles-path", + "output-vehicles-path") // + .allowOptions("end-time", "hours", "days") // .build(); + boolean endTimeAvailable = cmd.hasOption("end-time"); + boolean hoursAvailable = cmd.hasOption("hours"); + boolean daysAvailable = cmd.hasOption("days"); + + if (!(endTimeAvailable ^ (hoursAvailable || daysAvailable))) { + throw new IllegalStateException( + "Either --end-time (in seconds), or --hours / --days (can be combined) need to be provided."); + } + + double endTime = 0.0; + if (endTimeAvailable) { + endTime = Double.parseDouble(cmd.getOptionStrict("end-time")); + } else { + if (hoursAvailable) { + endTime += 3600.0 * Double.parseDouble(cmd.getOptionStrict("hours")); + } + + if (daysAvailable) { + endTime += 24.0 * 3600.0 * Double.parseDouble(cmd.getOptionStrict("hours")); + } + } + Config config = ConfigUtils.createConfig(); Scenario scenario = ScenarioUtils.createScenario(config); - new TransitScheduleReader(scenario).readFile(cmd.getOptionStrict("schedule-path")); - new ExtendSchedule(Double.parseDouble(cmd.getOptionStrict("period"))).process(scenario.getTransitSchedule()); - new TransitScheduleWriter(scenario.getTransitSchedule()).writeFile(cmd.getOptionStrict("output-path")); + + new TransitScheduleReader(scenario).readFile(cmd.getOptionStrict("input-schedule-path")); + new MatsimVehicleReader(scenario.getTransitVehicles()).readFile(cmd.getOptionStrict("input-vehicles-path")); + + new ExtendSchedule(endTime).process(scenario.getTransitSchedule(), scenario.getTransitVehicles()); + + new TransitScheduleWriter(scenario.getTransitSchedule()).writeFile(cmd.getOptionStrict("output-schedule-path")); + new MatsimVehicleWriter(scenario.getTransitVehicles()).writeFile(cmd.getOptionStrict("output-vehicles-path")); } } \ No newline at end of file