Skip to content

Commit

Permalink
Introduce solver instance id to specify output directory and file names
Browse files Browse the repository at this point in the history
  • Loading branch information
munterfi committed Jun 11, 2024
1 parent 9f23b9d commit 00672e9
Show file tree
Hide file tree
Showing 17 changed files with 56 additions and 35 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ public class RunExample {
.setInputDirectory("path/to/input/directory")
.setOutputDirectory("path/to/output/directory")
.setRunId("runId")
.setInstanceId("rss001")
// optionally set transit line filter, default is no filtering
.setFilterStrategy(scenario -> {
// implementation...
Expand Down
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ public class RsschedRequestConfig {
private final Shunting shunting = new Shunting();
private final Maintenance maintenance = new Maintenance();
private final Costs costs = new Costs();
private String instanceId;
private String runId;
private String inputDirectory;
private String outputDirectory;
Expand All @@ -48,6 +49,11 @@ public static class Builder {
private final Set<String> depotLocations = new HashSet<>();
private final Map<String, Depot.Facility> depots = new HashMap<>();

public Builder setInstanceId(String instanceId) {
config.instanceId = instanceId;
return this;
}

public Builder setRunId(String runId) {
config.runId = runId;
return this;
Expand Down Expand Up @@ -111,9 +117,9 @@ public Builder addMaintenanceSlot(String id, String locationId, LocalDateTime st
* @return The fully configured RequestConfig instance.
*/
public RsschedRequestConfig buildWithDefaults() {
if (config.runId == null || config.inputDirectory == null || config.outputDirectory == null) {
if (config.instanceId == null || config.runId == null || config.inputDirectory == null || config.outputDirectory == null) {
throw new IllegalStateException(
"Mandatory fields (runId, inputDirectory, outputDirectory) must be set.");
"Mandatory fields (instanceId, runId, inputDirectory, outputDirectory) must be set.");
}
return config;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,6 @@ public RsschedRequestConfig readExcelFile(String filePath) throws IOException {
private void parseScenarioInfoSheet(Sheet sheet) {
checkIfSheetExists(sheet, Sheets.SCENARIO_INFO);

String instanceId = "";

for (Row row : sheet) {
Cell groupCell = row.getCell(0);
Cell parameterCell = row.getCell(1);
Expand All @@ -66,7 +64,8 @@ private void parseScenarioInfoSheet(Sheet sheet) {
case "global":
switch (parameter) {
case "instanceId":
instanceId = valueCell.getStringCellValue();
String instanceId = valueCell.getStringCellValue();
builder.setInstanceId(instanceId);
break;
case "matsimRunId":
builder.setRunId(valueCell.getStringCellValue());
Expand All @@ -75,7 +74,7 @@ private void parseScenarioInfoSheet(Sheet sheet) {
builder.setInputDirectory(valueCell.getStringCellValue());
break;
case "outputDirectory":
builder.setOutputDirectory(valueCell.getStringCellValue() + "/" + instanceId);
builder.setOutputDirectory(valueCell.getStringCellValue());
break;
case "sampleSize":
builder.config.getGlobal().setSampleSize(valueCell.getNumericCellValue());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,16 @@ class PassengerCSVWriter implements ResultSink<PassengerPipe> {
private static final String PASSENGER_FILE = "passenger.csv";
private static final String[] HEADER = {"transit_line_id", "transit_route_id", "departure_id", "stop_id", "stop_name", "arrival", "departure", "egress", "access", "to_stop_id", "to_stop_name", "passengers", "seats"};
private final String outputDirectory;
private final String instanceId;

/**
* Constructs a PassengerExporter with the specified output directory.
*
* @param outputDirectory the directory to export the passenger file to.
*/
public PassengerCSVWriter(String outputDirectory) {
public PassengerCSVWriter(String outputDirectory, String instanceId) {
this.outputDirectory = outputDirectory;
this.instanceId = instanceId;
}

public static void writeCsv(List<EventAnalysis.Entry> entries, String filename) throws UncheckedIOException {
Expand Down Expand Up @@ -80,7 +82,7 @@ public static void writeCsv(List<EventAnalysis.Entry> entries, String filename)

@Override
public void process(PassengerPipe pipe) {
String passengerFilePath = new OutputDirectoryManager(outputDirectory, pipe.runId()).buildFilePath(
String passengerFilePath = new OutputDirectoryManager(outputDirectory, pipe.runId(), instanceId).buildFilePath(
PASSENGER_FILE);
log.info("Exporting passenger file to {}", passengerFilePath);
writeCsv(pipe.entries(), passengerFilePath);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,18 +13,19 @@ public class PassengerPipeline extends Pipeline<PassengerPipe> {
/**
* Constructs a RepPipeline with the specified parameters.
*
* @param instanceId the ID of the RSSched instance (=request) to solve
* @param runId the ID of the scenario run
* @param inputDirectory the input directory containing the scenario data (output files of the simulation)
* @param outputDirectory the output directory to export the processed scenario files
* @param filterStrategy the filter strategy for filtering transit lines
*/
public PassengerPipeline(String runId, String inputDirectory, String outputDirectory, FilterStrategy filterStrategy, double sampleSize, int seatDurationThreshold) {
public PassengerPipeline(String instanceId, String runId, String inputDirectory, String outputDirectory, FilterStrategy filterStrategy, double sampleSize, int seatDurationThreshold) {
// set source
super(new EventSource(runId, inputDirectory));
// add filters
addFilter(new TransitLineFilter(filterStrategy));
addFilter(new EventAnalysisFilter(sampleSize, seatDurationThreshold));
// add sink
addSink(new PassengerCSVWriter(outputDirectory));
addSink(new PassengerCSVWriter(outputDirectory, instanceId));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,17 @@
public class RequestJSONWriter implements ResultSink<RequestPipe> {
private static final String REQUEST_FILE_NAME = "scheduler_request.json";
private final String outputDirectory;
private final String instanceId;

public RequestJSONWriter(String outputDirectory) {
public RequestJSONWriter(String outputDirectory, String instanceId) {
this.outputDirectory = outputDirectory;
this.instanceId = instanceId;
}

@Override
public void process(RequestPipe pipe) {
String filePath = new OutputDirectoryManager(outputDirectory, pipe.getRunId()).buildFilePath(REQUEST_FILE_NAME);
String filePath = new OutputDirectoryManager(outputDirectory, pipe.getRunId(), instanceId).buildFilePath(
REQUEST_FILE_NAME);
log.info("Exporting request JSON to {}", filePath);
try (FileWriter fileWriter = new FileWriter(filePath)) {
fileWriter.write(pipe.getRequest().toJSON());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,14 @@ public class RequestPipeline extends Pipeline<RequestPipe> {
public RequestPipeline(RsschedRequestConfig config) {
// set source
super(new ScenarioPassengerCollector(config.getRunId(),
new ScenarioPipeline(config.getRunId(), config.getInputDirectory(), config.getOutputDirectory(),
config.getGlobal().getFilterStrategy()),
new PassengerPipeline(config.getRunId(), config.getInputDirectory(), config.getOutputDirectory(),
config.getGlobal().getFilterStrategy(), config.getGlobal().getSampleSize(),
config.getGlobal().getSeatDurationThreshold())));
new ScenarioPipeline(config.getInstanceId(), config.getRunId(), config.getInputDirectory(),
config.getOutputDirectory(), config.getGlobal().getFilterStrategy()),
new PassengerPipeline(config.getInstanceId(), config.getRunId(), config.getInputDirectory(),
config.getOutputDirectory(), config.getGlobal().getFilterStrategy(),
config.getGlobal().getSampleSize(), config.getGlobal().getSeatDurationThreshold())));
// add filter
addFilter(new RequestComposer(config));
// add sink
addSink(new RequestJSONWriter(config.getOutputDirectory()));
addSink(new RequestJSONWriter(config.getOutputDirectory(), config.getInstanceId()));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,16 @@
public class ResponseJSONWriter implements ResultSink<ResponsePipe> {
private static final String RESPONSE_FILE_NAME = "scheduler_response.json";
private final String outputDirectory;
private final String instanceId;

public ResponseJSONWriter(String outputDirectory) {
public ResponseJSONWriter(String outputDirectory, String instanceId) {
this.outputDirectory = outputDirectory;
this.instanceId = instanceId;
}

@Override
public void process(ResponsePipe pipe) {
String filePath = new OutputDirectoryManager(outputDirectory, pipe.getRunId()).buildFilePath(
String filePath = new OutputDirectoryManager(outputDirectory, pipe.getRunId(), instanceId).buildFilePath(
RESPONSE_FILE_NAME);
log.info("Exporting response JSON to {}", filePath);
try (FileWriter fileWriter = new FileWriter(filePath)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ public ResponsePipeline(RsschedRequestConfig config, String baseUrl, int port) {
// add filter
addFilter(new RequestSender(baseUrl, port));
// add sink
addSink(new ResponseJSONWriter(config.getOutputDirectory()));
addSink(new ResponseJSONWriter(config.getOutputDirectory(), config.getInstanceId()));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,16 @@ class LineSelectionCSVWriter implements ResultSink<ScenarioPipe> {
private static final String LINE_SELECTION_FILE = "line_selection.csv";
private static final String[] HEADER = {"group", "transit_line_id", "transit_route_id"};
private final String outputDirectory;
private final String instanceId;

/**
* Constructs a PassengerExporter with the specified output directory.
*
* @param outputDirectory the directory to export the passenger file to.
*/
public LineSelectionCSVWriter(String outputDirectory) {
public LineSelectionCSVWriter(String outputDirectory, String instanceId) {
this.outputDirectory = outputDirectory;
this.instanceId = instanceId;
}

public static void writeCsv(TransitLineSelection selection, String filename) throws UncheckedIOException {
Expand All @@ -48,7 +50,8 @@ public static void writeCsv(TransitLineSelection selection, String filename) thr

@Override
public void process(ScenarioPipe pipe) {
String filePath = new OutputDirectoryManager(outputDirectory, pipe.runId).buildFilePath(LINE_SELECTION_FILE);
String filePath = new OutputDirectoryManager(outputDirectory, pipe.runId, instanceId).buildFilePath(
LINE_SELECTION_FILE);
log.info("Exporting line selection file to {}", filePath);
writeCsv(pipe.selection, filePath);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,16 @@ class ScenarioExporter implements ResultSink<ScenarioPipe> {
private static final String TRANSIT_SCHEDULE_FILE = "transitSchedule.xml.gz";
private static final String TRANSIT_VEHICLES_FILE = "transitVehicles.xml.gz";
private final String outputDirectory;
private final String instanceId;

/**
* Constructs a ScenarioExporter with the specified output directory.
*
* @param outputDirectory the directory to export the scenario files to
*/
public ScenarioExporter(String outputDirectory) {
public ScenarioExporter(String outputDirectory, String instanceId) {
this.outputDirectory = outputDirectory;
this.instanceId = instanceId;
}

@Override
Expand All @@ -37,7 +39,7 @@ public void process(ScenarioPipe pipe) {
}

private void export(Scenario scenario, String runId) {
var directoryUtil = new OutputDirectoryManager(outputDirectory, runId);
var directoryUtil = new OutputDirectoryManager(outputDirectory, runId, instanceId);
new NetworkWriter(scenario.getNetwork()).write(directoryUtil.buildFilePath(NETWORK_FILE));
new TransitScheduleWriter(scenario.getTransitSchedule()).writeFile(
directoryUtil.buildFilePath(TRANSIT_SCHEDULE_FILE));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,13 @@ public class ScenarioPipeline extends Pipeline<ScenarioPipe> {
/**
* Constructs a RepPipeline with the specified parameters.
*
* @param instanceId the ID of the RSSched instance (=request) to solve
* @param runId the ID of the scenario run
* @param inputDirectory the input directory containing the scenario data (output files of the simulation)
* @param outputDirectory the output directory to export the processed scenario files
* @param filterStrategy the strategy for filtering transit lines
*/
public ScenarioPipeline(String runId, String inputDirectory, String outputDirectory, FilterStrategy filterStrategy) {
public ScenarioPipeline(String instanceId, String runId, String inputDirectory, String outputDirectory, FilterStrategy filterStrategy) {
// set source
super(new ScenarioSource(runId, inputDirectory));
// filter transit lines
Expand All @@ -34,7 +35,7 @@ public ScenarioPipeline(String runId, String inputDirectory, String outputDirect
// clear attributes
addFilter(new AttributeRemover());
// add sink
addSink(new LineSelectionCSVWriter(outputDirectory));
addSink(new ScenarioExporter(outputDirectory));
addSink(new LineSelectionCSVWriter(outputDirectory, instanceId));
addSink(new ScenarioExporter(outputDirectory, instanceId));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,12 @@ public class OutputDirectoryManager {
private static final String DIRECTORY_PREFIX = "rssched";
@Getter
private final String path;
private final String instanceId;
private final String runId;

public OutputDirectoryManager(String outputDirectory, String runId) {
this.path = String.format("%s/%s_%s", outputDirectory, DIRECTORY_PREFIX, runId);
public OutputDirectoryManager(String outputDirectory, String runId, String instanceId) {
this.instanceId = instanceId;
this.path = String.format("%s/%s_%s/%s", outputDirectory, DIRECTORY_PREFIX, runId, instanceId);
this.runId = runId;
createDirectory(path);
}
Expand All @@ -34,7 +36,7 @@ private static void createDirectory(String path) {
}

public String buildFilePath(String fileName) {
return String.format("%s/%s.%s", path, runId, fileName);
return String.format("%s/%s.%s.%s", path, instanceId, runId, fileName);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ void testWithConfigBuilder() {
};

// build request config
RsschedRequestConfig.Builder builder = RsschedRequestConfig.builder()
RsschedRequestConfig.Builder builder = RsschedRequestConfig.builder().setInstanceId("it_builder")
.setInputDirectory(MatsimRun.INPUT_DIRECTORY).setOutputDirectory(MatsimRun.OUTPUT_DIRECTORY)
.setRunId(MatsimRun.ID).setFilterStrategy(filterStrategy);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package ch.sbb.rssched.client.config;

import ch.sbb.rssched.client.config.RsschedRequestConfig;
import ch.sbb.rssched.client.config.RsschedRequestConfigReader;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

Expand All @@ -26,9 +24,10 @@ void shouldReadConfigFile() throws IOException {
RsschedRequestConfig config = reader.readExcelFile(filePath.getPath());

assertNotNull(config);
assertEquals("rss001", config.getInstanceId());
assertEquals("run_1", config.getRunId());
assertEquals("input/folder/path", config.getInputDirectory());
assertEquals("output/folder/path/rss001", config.getOutputDirectory());
assertEquals("output/folder/path", config.getOutputDirectory());

// global settings
assertEquals(0.1, config.getGlobal().getSampleSize());
Expand Down
Binary file not shown.

0 comments on commit 00672e9

Please sign in to comment.