Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

debug analysis required for dashboards #82

Merged
merged 17 commits into from
Jun 25, 2024
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
re-arrange tables
simei94 committed Jun 19, 2024
commit 7935cf05793de23653a115a4f2b9f9f19830efef
Original file line number Diff line number Diff line change
@@ -17,6 +17,8 @@
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.time.LocalTime;
import java.util.*;

@@ -25,11 +27,7 @@
@CommandLine.Command(name = "average-drt", description = "Calculates average drt stats based on several sim runs with different random seeds.")
@CommandSpec(
requires = {"runs", "mode"},
produces = {"rides_per_veh_avg_demand_stats.csv", "avg_wait_time_avg_demand_stats.csv", "requests_avg_demand_stats.csv", "avg_total_travel_time_avg_demand_stats.csv",
"rides_avg_demand_stats.csv", "avg_direct_distance_[km]_avg_demand_stats.csv", "rejections_avg_demand_stats.csv", "95th_percentile_wait_time_avg_demand_stats.csv",
"avg_in-vehicle_time_avg_demand_stats.csv", "avg_ride_distance_[km]_avg_demand_stats.csv", "rejection_rate_avg_demand_stats.csv",
"avg_fare_[MoneyUnit]_avg_demand_stats.csv", "total_service_hours_avg_supply_stats.csv", "pooling_ratio_avg_supply_stats.csv", "detour_ratio_avg_supply_stats.csv",
"total_vehicle_mileage_[km]_avg_supply_stats.csv", "empty_ratio_avg_supply_stats.csv", "number_of_stops_avg_supply_stats.csv", "total_pax_distance_[km]_avg_supply_stats.csv", "vehicles_avg_supply_stats.csv"}
produces = {"avg_demand_stats.csv", "avg_supply_stats.csv"}
)
public class DrtPostProcessingAverageAnalysis implements MATSimAppCommand {

@@ -44,7 +42,6 @@ public class DrtPostProcessingAverageAnalysis implements MATSimAppCommand {
private final Map<String, List<Double>> supplyStats = new HashMap<>();
private final Map<String, Double[]> demandAvgs = new HashMap<>();
private final Map<String, Double[]> supplyAvgs = new HashMap<>();
Map<String, List<String>> params = new HashMap<>();

private final CsvOptions csv = new CsvOptions();

@@ -70,11 +67,11 @@ public Integer call() throws Exception {

Table demand = Table.read().csv(CsvReadOptions.builder(IOUtils.getBufferedReader(demandKpiCsv))
.sample(false)
.separator(csv.detectDelimiter(demandKpiCsv)).build());
.separator(CsvOptions.detectDelimiter(demandKpiCsv)).build());

Table supply = Table.read().csv(CsvReadOptions.builder(IOUtils.getBufferedReader(supplyKpiCsv))
.sample(false)
.separator(csv.detectDelimiter(supplyKpiCsv)).build());
.separator(CsvOptions.detectDelimiter(supplyKpiCsv)).build());

// get all demand stats
for (int i = 0; i < demand.rowCount(); i++) {
@@ -113,38 +110,30 @@ public Integer call() throws Exception {
fillAvgMap(demandStats, demandAvgs);
fillAvgMap(supplyStats, supplyAvgs);

params.put("avg_demand_stats.csv", List.of("rides_per_veh", "avg_wait_time", "requests", "avg_total_travel_time", "rides", "avg_direct_distance_[km]",
"rejections", "95th_percentile_wait_time", "avg_in-vehicle_time", "avg_ride_distance_[km]", "rejection_rate", "avg_fare_[MoneyUnit]"));
params.put("avg_supply_stats.csv", List.of("total_service_hours", "pooling_ratio", "detour_ratio", "total_vehicle_mileage_[km]", "empty_ratio", "number_of_stops",
"total_pax_distance_[km]", "vehicles"));
// ordered list of params to display them in same order as in single-run DrtDashboard
List<String> orderedDemandParams = List.of("Requests", "Rides", "Rides per veh", "Rides per veh-h", "Rides per veh-km", "Rejections",
"Rejection rate", "Avg. total travel time", "Avg. in-vehicle time", "Avg. wait time", "95th percentile wait time", "Avg. ride distance [km]",
"Avg. direct distance [km]", "Avg. fare [MoneyUnit]");
List<String> orderedSupplyParams = List.of("Number of stops", "Vehicles", "Total vehicle mileage [km]", "Empty ratio", "Total pax distance [km]",
"Pooling ratio", "Detour ratio", "Total service hours");

for (Map.Entry<String, List<String>> e : params.entrySet()) {
for (String param : params.get(e.getKey())) {
if (e.getKey().contains("demand")) {
writeFile(e.getKey(), demandAvgs, param);
} else {
writeFile(e.getKey(), supplyAvgs, param);
}
}
}
writeFile("avg_demand_stats.csv", demandAvgs, orderedDemandParams);
writeFile("avg_supply_stats.csv", supplyAvgs, orderedSupplyParams);

return 0;
}

private void writeFile(String fileName, Map<String, Double[]> values, String param) throws IOException {
try (CSVPrinter printer = new CSVPrinter(Files.newBufferedWriter(output.getPath(param + "_" + fileName)), CSVFormat.DEFAULT)) {
private void writeFile(String fileName, Map<String, Double[]> values, List<String> orderedParams) throws IOException {
try (CSVPrinter printer = new CSVPrinter(Files.newBufferedWriter(output.getPath(fileName)), CSVFormat.DEFAULT)) {
DecimalFormat df = new DecimalFormat("#,###.##", new DecimalFormatSymbols(Locale.US));

printer.printRecord("info", value);
// as of 19.06.24 min and max values are not printed anymore. they will still be calculated though.
// if one wants to include them to dashboard tables one just has to re-include them in this print method. -sme0624
printer.printRecord("parameter", "mean", "median", "standard deviation");

for (Map.Entry<String, Double[]> e : values.entrySet()) {
String transformed = e.getKey().toLowerCase().replace(".", "").replace(" ", "_");
if (transformed.contains(param)) {
printer.printRecord("mean-" + e.getKey(), e.getValue()[0]);
printer.printRecord("median-" + e.getKey(), e.getValue()[1]);
printer.printRecord("sd-" + e.getKey(), e.getValue()[2]);
printer.printRecord("min-" + e.getKey(), e.getValue()[3]);
printer.printRecord("max-" + e.getKey(), e.getValue()[4]);
}

for (String param : orderedParams) {
printer.printRecord(param, df.format(values.get(param)[0]), df.format(values.get(param)[1]), df.format(values.get(param)[2]));
}
}
}
134 changes: 6 additions & 128 deletions src/main/java/org/matsim/dashboard/AverageDrtDashboard.java
Original file line number Diff line number Diff line change
@@ -40,141 +40,19 @@ public void configure(Header header, Layout layout) {
" simulation runs. For the results of the specific runs please choose the according directory next to this dashboard.yaml.";

// DEMAND
layout.row("one")
layout.row("demand")
.el(Table.class, (viz, data) -> {
viz.title = "Rides per vehicle";
viz.dataset = postProcess(data, "rides_per_veh_avg_demand_stats.csv");
viz.showAllRows = true;
viz.width = 1.;
})
.el(Table.class, (viz, data) -> {
viz.title = "Avg wait time";
viz.dataset = postProcess(data, "avg_wait_time_avg_demand_stats.csv");
viz.showAllRows = true;
viz.width = 1.;
})
.el(Table.class, (viz, data) -> {
viz.title = "Requests";
viz.dataset = postProcess(data, "requests_avg_demand_stats.csv");
viz.showAllRows = true;
viz.width = 1.;
});

layout.row("two")
.el(Table.class, (viz, data) -> {
viz.title = "Avg total travel time";
viz.dataset = postProcess(data, "avg_total_travel_time_avg_demand_stats.csv");
viz.showAllRows = true;
viz.width = 1.;
})
.el(Table.class, (viz, data) -> {
viz.title = "Rides";
viz.dataset = postProcess(data, "rides_avg_demand_stats.csv");
viz.showAllRows = true;
viz.width = 1.;
})
.el(Table.class, (viz, data) -> {
viz.title = "Avg direct distance [km]";
viz.dataset = postProcess(data, "avg_direct_distance_[km]_avg_demand_stats.csv");
viz.showAllRows = true;
viz.width = 1.;
});

layout.row("three")
.el(Table.class, (viz, data) -> {
viz.title = "Rejections";
viz.dataset = postProcess(data, "rejections_avg_demand_stats.csv");
viz.showAllRows = true;
viz.width = 1.;
})
.el(Table.class, (viz, data) -> {
viz.title = "95th percentile wait time";
viz.dataset = postProcess(data, "95th_percentile_wait_time_avg_demand_stats.csv");
viz.showAllRows = true;
viz.width = 1.;
})
.el(Table.class, (viz, data) -> {
viz.title = "Avg in-vehicle time";
viz.dataset = postProcess(data, "avg_in-vehicle_time_avg_demand_stats.csv");
viz.showAllRows = true;
viz.width = 1.;
});

layout.row("four")
.el(Table.class, (viz, data) -> {
viz.title = "Avg ride distance [km]";
viz.dataset = postProcess(data, "avg_ride_distance_[km]_avg_demand_stats.csv");
viz.showAllRows = true;
viz.width = 1.;
})
.el(Table.class, (viz, data) -> {
viz.title = "Rejection rate";
viz.dataset = postProcess(data, "rejection_rate_avg_demand_stats.csv");
viz.showAllRows = true;
viz.width = 1.;
})
.el(Table.class, (viz, data) -> {
viz.title = "Avg fare [MoneyUnit]";
viz.dataset = postProcess(data, "avg_fare_[MoneyUnit]_avg_demand_stats.csv");
viz.title = "Average demand results";
viz.dataset = postProcess(data, "avg_demand_stats.csv");
viz.showAllRows = true;
viz.width = 1.;
});

// SUPPLY
supplyTabs(layout);
}

private void supplyTabs(Layout layout) {
layout.row("six")
.el(Table.class, (viz, data) -> {
viz.title = "Total service hours";
viz.dataset = postProcess(data, "total_service_hours_avg_supply_stats.csv");
viz.showAllRows = true;
viz.width = 1.;
})
.el(Table.class, (viz, data) -> {
viz.title = "Pooling ratio";
viz.dataset = postProcess(data, "pooling_ratio_avg_supply_stats.csv");
viz.showAllRows = true;
viz.width = 1.;
})
.el(Table.class, (viz, data) -> {
viz.title = "Detour ratio";
viz.dataset = postProcess(data, "detour_ratio_avg_supply_stats.csv");
viz.showAllRows = true;
viz.width = 1.;
});

layout.row("seven")
.el(Table.class, (viz, data) -> {
viz.title = "Total vehicle mileage [km]";
viz.dataset = postProcess(data, "total_vehicle_mileage_[km]_avg_supply_stats.csv");
viz.showAllRows = true;
viz.width = 1.;
})
.el(Table.class, (viz, data) -> {
viz.title = "Empty ratio";
viz.dataset = postProcess(data, "empty_ratio_avg_supply_stats.csv");
viz.showAllRows = true;
viz.width = 1.;
})
.el(Table.class, (viz, data) -> {
viz.title = "Number of stops";
viz.dataset = postProcess(data, "number_of_stops_avg_supply_stats.csv");
viz.showAllRows = true;
viz.width = 1.;
});

layout.row("eight")
.el(Table.class, (viz, data) -> {
viz.title = "Total pax distance [km]";
viz.dataset = postProcess(data, "total_pax_distance_[km]_avg_supply_stats.csv");
viz.showAllRows = true;
viz.width = 1.;
})
layout.row("supply")
.el(Table.class, (viz, data) -> {
viz.title = "Vehicles";
viz.dataset = postProcess(data, "vehicles_avg_supply_stats.csv");
viz.title = "Average service results";
viz.dataset = postProcess(data, "avg_supply_stats.csv");
viz.showAllRows = true;
viz.width = 1.;
});