21 package org.matsim.analysis;
23 import org.apache.logging.log4j.LogManager;
24 import org.apache.logging.log4j.Logger;
37 import jakarta.inject.Inject;
38 import java.io.BufferedWriter;
39 import java.io.IOException;
40 import java.io.UncheckedIOException;
42 import java.util.stream.Collectors;
63 private BufferedWriter
out;
68 private Map<Integer, DoubleSummaryStatistics>
legStats;
69 private Map<Integer, DoubleSummaryStatistics>
tripStats;
82 String tripStatsPngName, String delimiter) {
91 private void initWriter(String travelDistanceStatsFileName) {
92 if (travelDistanceStatsFileName.toLowerCase(Locale.ROOT).endsWith(
".csv")) {
100 }
catch (IOException e) {
101 throw new UncheckedIOException(e);
107 this.legStats =
new HashMap<>(expectedIterations+1);
108 this.tripStats =
new HashMap<>(expectedIterations+1);
112 DoubleSummaryStatistics legStats =
getLegStats(map);
115 log.info(
"-- average leg distance per plan (executed plans only): " + legStats.getAverage() +
" meters");
116 log.info(
"average leg distance per Person (executed plans only): " + legStats.getSum() / map.
size() +
" meters (statistic on all " + legStats.getCount() +
" legs which have a finite distance)");
117 log.info(
"-- average trip distance per plan (executed plans only): " + tripStats.getAverage() +
" meters");
118 log.info(
"average trip distance per Person (executed plans only): " + tripStats.getSum() / map.
size() +
" meters (statistic on all " + tripStats.getCount() +
" trips which have a finite distance)");
119 log.info(
"(TravelDistanceStats takes an average over all legs where the simulation reports travelled (network) distances");
120 log.info(
"(and teleported legs whose route contains a distance.)");
122 this.legStats.put(iteration, legStats);
123 this.tripStats.put(iteration, tripStats);
125 assert this.legStats.size() == this.tripStats.size();
128 void writeOutput(
int iteration,
boolean writePngs){
132 writePngs(iteration);
137 this.out.write(
"ITERATION" + this.delimiter +
"avg. Average Leg distance" + this.delimiter +
"avg. Average Trip distance\n");
142 DoubleSummaryStatistics legStats = this.legStats.get(iteration);
143 DoubleSummaryStatistics tripStats = this.tripStats.get(iteration);
146 this.out.write(iteration + this.delimiter + legStats.getAverage() + this.delimiter + tripStats.getAverage() +
"\n");
148 }
catch (IOException e) {
153 void writePngs(
int iteration){
164 XYLineChart chart =
new XYLineChart(
"Trip Travel Distance Statistics",
"iteration",
"average of the average trip distance per plan ");
165 double[] iterations =
new double[iteration + 1];
166 double[] values =
new double[iteration + 1];
168 for (
int i = 0; i <= iteration; i++) {
170 values[i] = Optional.ofNullable(this.tripStats.get(i)).map(DoubleSummaryStatistics::getAverage).orElse(0.);
173 chart.
addSeries(
"executed plan", iterations, values);
175 chart.
saveAsPng(this.tripStatsPngName +
".png", 800, 600);
184 XYLineChart chart =
new XYLineChart(
"Leg Travel Distance Statistics",
"iteration",
"average of the average leg distance per plan ");
185 double[] iterations =
new double[iteration + 1];
186 double[] values =
new double[iteration + 1];
188 for (
int i = 0; i <= iteration; i++) {
190 values[i] = Optional.ofNullable(this.legStats.get(i)).map(DoubleSummaryStatistics::getAverage).orElse(0.);
194 chart.
addSeries(
"executed plan", iterations, values);
196 chart.
saveAsPng(this.legStatsPngName +
".png", 800, 600);
207 .filter(
Leg.class::isInstance)
208 .collect(Collectors.summingDouble(l -> {
211 return leg.getRoute() != null ? leg.getRoute().getDistance() : Double.NaN;
215 .filter(Double::isFinite)
216 .summaryStatistics();
223 .flatMap(plan -> plan.getPlanElements().stream())
224 .filter(
Leg.class::isInstance)
230 .filter(Double::isFinite)
231 .summaryStatistics();
237 }
catch (IOException e) {
void writeLegStatsPng(int iteration)
void writeTripStatsPng(int iteration)
static DoubleSummaryStatistics getTripStats(IdMap< Person, Plan > map)
final ControllerConfigGroup controllerConfigGroup
TravelDistanceStats(ControllerConfigGroup controllerConfigGroup, String travelDistanceStatsFileName, String legStatsPngName, String tripStatsPngName, String delimiter)
static DoubleSummaryStatistics getLegStats(IdMap< Person, Plan > map)
static final int MAX_ITERATIONS_IN_GRAPH
static BufferedWriter getBufferedWriter(URL url, Charset charset, boolean append)
Map< Integer, DoubleSummaryStatistics > legStats
final void addSeries(final String title, final double[] xs, final double[] ys)
void writeCsvEntry(int iteration)
final String legStatsPngName
static List< Trip > getTrips(final Plan plan)
void initStats(ControllerConfigGroup controllerConfigGroup)
Map< Integer, DoubleSummaryStatistics > tripStats
void saveAsPng(final String filename, final int width, final int height)
void initWriter(String travelDistanceStatsFileName)
final String getOutputFilename(final String filename)
void addIteration(int iteration, IdMap< Person, Plan > map)
final String tripStatsPngName
List< PlanElement > getTripElements()
String getDefaultDelimiter()