MATSIM
Public Member Functions | Private Member Functions | Static Private Member Functions | Private Attributes | Static Private Attributes | List of all members
org.matsim.analysis.TravelDistanceStats Class Reference

Public Member Functions

void addIteration (int iteration, IdMap< Person, Plan > map)
 
void close ()
 

Private Member Functions

 TravelDistanceStats (ControllerConfigGroup controllerConfigGroup, String travelDistanceStatsFileName, String legStatsPngName, String tripStatsPngName, String delimiter)
 
void initWriter (String travelDistanceStatsFileName)
 
void initStats (ControllerConfigGroup controllerConfigGroup)
 
void writeCsvHeader () throws IOException
 
void writeCsvEntry (int iteration)
 
void writeTripStatsPng (int iteration)
 
void writeLegStatsPng (int iteration)
 

Static Private Member Functions

static DoubleSummaryStatistics getTripStats (IdMap< Person, Plan > map)
 
static DoubleSummaryStatistics getLegStats (IdMap< Person, Plan > map)
 

Private Attributes

final ControllerConfigGroup controllerConfigGroup
 
BufferedWriter out
 
final String legStatsPngName
 
final String tripStatsPngName
 
final String delimiter
 
Map< Integer, DoubleSummaryStatistics > legStats
 
Map< Integer, DoubleSummaryStatistics > tripStats
 

Static Private Attributes

static final int MAX_ITERATIONS_IN_GRAPH = 5000
 
static final Logger log = LogManager.getLogger(TravelDistanceStats.class)
 

Detailed Description

Calculates at the end of each iteration the following statistics:

Is used by the standard Controler and fed the "really executed" "plans" which are generated from Events during the simulation and which are also used by the scoring. But you can also use it on other kinds of plans from your own code.

Author
anhorni, michaz, jbischoff

Definition at line 58 of file TravelDistanceStats.java.

Constructor & Destructor Documentation

◆ TravelDistanceStats()

org.matsim.analysis.TravelDistanceStats.TravelDistanceStats ( ControllerConfigGroup  controllerConfigGroup,
String  travelDistanceStatsFileName,
String  legStatsPngName,
String  tripStatsPngName,
String  delimiter 
)
private

Definition at line 81 of file TravelDistanceStats.java.

References org.matsim.analysis.TravelDistanceStats.controllerConfigGroup, org.matsim.analysis.TravelDistanceStats.delimiter, org.matsim.analysis.TravelDistanceStats.initStats(), org.matsim.analysis.TravelDistanceStats.initWriter(), org.matsim.analysis.TravelDistanceStats.legStatsPngName, and org.matsim.analysis.TravelDistanceStats.tripStatsPngName.

82  {
86  this.delimiter = delimiter;
88  initWriter(travelDistanceStatsFileName);
89  }
final ControllerConfigGroup controllerConfigGroup
void initStats(ControllerConfigGroup controllerConfigGroup)
void initWriter(String travelDistanceStatsFileName)
Here is the call graph for this function:

Member Function Documentation

◆ initWriter()

void org.matsim.analysis.TravelDistanceStats.initWriter ( String  travelDistanceStatsFileName)
private

Definition at line 91 of file TravelDistanceStats.java.

References org.matsim.core.utils.io.IOUtils.getBufferedWriter(), and org.matsim.analysis.TravelDistanceStats.writeCsvHeader().

Referenced by org.matsim.analysis.TravelDistanceStats.TravelDistanceStats().

91  {
92  if (travelDistanceStatsFileName.toLowerCase(Locale.ROOT).endsWith(".csv")) {
93  this.out = IOUtils.getBufferedWriter(travelDistanceStatsFileName);
94  } else {
95  this.out = IOUtils.getBufferedWriter(travelDistanceStatsFileName + ".csv");
96  }
97 
98  try {
100  } catch (IOException e) {
101  throw new UncheckedIOException(e);
102  }
103  }
Here is the call graph for this function:

◆ initStats()

void org.matsim.analysis.TravelDistanceStats.initStats ( ControllerConfigGroup  controllerConfigGroup)
private

Definition at line 105 of file TravelDistanceStats.java.

References org.matsim.core.config.groups.ControllerConfigGroup.getFirstIteration(), and org.matsim.core.config.groups.ControllerConfigGroup.getLastIteration().

Referenced by org.matsim.analysis.TravelDistanceStats.TravelDistanceStats().

105  {
107  this.legStats = new HashMap<>(expectedIterations+1);
108  this.tripStats = new HashMap<>(expectedIterations+1);
109  }
final ControllerConfigGroup controllerConfigGroup
Map< Integer, DoubleSummaryStatistics > legStats
Map< Integer, DoubleSummaryStatistics > tripStats
Here is the call graph for this function:

◆ addIteration()

void org.matsim.analysis.TravelDistanceStats.addIteration ( int  iteration,
IdMap< Person, Plan map 
)

Definition at line 111 of file TravelDistanceStats.java.

References org.matsim.analysis.TravelDistanceStats.getLegStats(), org.matsim.analysis.TravelDistanceStats.getTripStats(), org.matsim.analysis.TravelDistanceStats.MAX_ITERATIONS_IN_GRAPH, org.matsim.api.core.v01.IdMap< T, V >.size, and org.matsim.analysis.TravelDistanceStats.writeCsvEntry().

111  {
112  DoubleSummaryStatistics legStats = getLegStats(map);
113  DoubleSummaryStatistics tripStats = getTripStats(map);
114 
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.)");// TODO: still valid?
121 
122  this.legStats.put(iteration, legStats);
123  this.tripStats.put(iteration, tripStats);
124 
125  assert this.legStats.size() == this.tripStats.size();
126  }
static DoubleSummaryStatistics getTripStats(IdMap< Person, Plan > map)
static DoubleSummaryStatistics getLegStats(IdMap< Person, Plan > map)
Map< Integer, DoubleSummaryStatistics > legStats
Map< Integer, DoubleSummaryStatistics > tripStats
Here is the call graph for this function:

◆ writeCsvHeader()

void org.matsim.analysis.TravelDistanceStats.writeCsvHeader ( ) throws IOException
private

Definition at line 136 of file TravelDistanceStats.java.

Referenced by org.matsim.analysis.TravelDistanceStats.initWriter().

136  {
137  this.out.write("ITERATION" + this.delimiter + "avg. Average Leg distance" + this.delimiter + "avg. Average Trip distance\n");
138  this.out.flush();
139  }

◆ writeCsvEntry()

void org.matsim.analysis.TravelDistanceStats.writeCsvEntry ( int  iteration)
private

Definition at line 141 of file TravelDistanceStats.java.

References org.matsim.analysis.TravelDistanceStats.writeLegStatsPng(), and org.matsim.analysis.TravelDistanceStats.writeTripStatsPng().

Referenced by org.matsim.analysis.TravelDistanceStats.addIteration().

141  {
142  DoubleSummaryStatistics legStats = this.legStats.get(iteration);
143  DoubleSummaryStatistics tripStats = this.tripStats.get(iteration);
144 
145  try {
146  this.out.write(iteration + this.delimiter + legStats.getAverage() + this.delimiter + tripStats.getAverage() + "\n");
147  this.out.flush();
148  } catch (IOException e) {
149  e.printStackTrace();
150  }
151  }
Map< Integer, DoubleSummaryStatistics > legStats
Map< Integer, DoubleSummaryStatistics > tripStats
Here is the call graph for this function:

◆ writeTripStatsPng()

void org.matsim.analysis.TravelDistanceStats.writeTripStatsPng ( int  iteration)
private

Definition at line 158 of file TravelDistanceStats.java.

References org.matsim.core.utils.charts.ChartUtil.addMatsimLogo(), org.matsim.core.utils.charts.XYLineChart.addSeries(), org.matsim.core.config.groups.ControllerConfigGroup.getFirstIteration(), and org.matsim.core.utils.charts.ChartUtil.saveAsPng().

Referenced by org.matsim.analysis.TravelDistanceStats.writeCsvEntry().

158  {
159  if (iteration == controllerConfigGroup.getFirstIteration()){
160  return;
161  }
162 
163  // create chart when data of more than one iteration is available.
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];
167 
168  for (int i = 0; i <= iteration; i++) {
169  iterations[i] = i + controllerConfigGroup.getFirstIteration();
170  values[i] = Optional.ofNullable(this.tripStats.get(i)).map(DoubleSummaryStatistics::getAverage).orElse(0.);
171  }
172 
173  chart.addSeries("executed plan", iterations, values);
174  chart.addMatsimLogo();
175  chart.saveAsPng(this.tripStatsPngName + ".png", 800, 600);
176  }
final ControllerConfigGroup controllerConfigGroup
Map< Integer, DoubleSummaryStatistics > tripStats
Here is the call graph for this function:

◆ writeLegStatsPng()

void org.matsim.analysis.TravelDistanceStats.writeLegStatsPng ( int  iteration)
private

Definition at line 178 of file TravelDistanceStats.java.

References org.matsim.core.utils.charts.ChartUtil.addMatsimLogo(), org.matsim.core.utils.charts.XYLineChart.addSeries(), org.matsim.core.config.groups.ControllerConfigGroup.getFirstIteration(), and org.matsim.core.utils.charts.ChartUtil.saveAsPng().

Referenced by org.matsim.analysis.TravelDistanceStats.writeCsvEntry().

178  {
179  if (iteration == controllerConfigGroup.getFirstIteration()){
180  return;
181  }
182 
183  // create chart when data of more than one iteration is available.
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];
187 
188  for (int i = 0; i <= iteration; i++) {
189  iterations[i] = i + controllerConfigGroup.getFirstIteration();
190  values[i] = Optional.ofNullable(this.legStats.get(i)).map(DoubleSummaryStatistics::getAverage).orElse(0.);
191 
192  }
193 
194  chart.addSeries("executed plan", iterations, values);
195  chart.addMatsimLogo();
196  chart.saveAsPng(this.legStatsPngName + ".png", 800, 600);
197  }
final ControllerConfigGroup controllerConfigGroup
Map< Integer, DoubleSummaryStatistics > legStats
Here is the call graph for this function:

◆ getTripStats()

static DoubleSummaryStatistics org.matsim.analysis.TravelDistanceStats.getTripStats ( IdMap< Person, Plan map)
staticprivate

Definition at line 199 of file TravelDistanceStats.java.

References org.matsim.core.router.TripStructureUtils.Trip.getTripElements(), org.matsim.core.router.TripStructureUtils.getTrips(), and org.matsim.api.core.v01.IdMap< T, V >.values().

Referenced by org.matsim.analysis.TravelDistanceStats.addIteration().

199  {
200  return map.values()
201  .parallelStream()
202  .flatMap(plan -> TripStructureUtils.getTrips(plan).stream())
203  .mapToDouble(t -> {
204  Trip trip = (Trip) t;
205  return trip.getTripElements()
206  .stream()
207  .filter(Leg.class::isInstance)
208  .collect(Collectors.summingDouble(l -> {
209  Leg leg = (Leg) l;
210  // TODO NaN handling of Collectors.summingDouble will lead to many NaNs... rethink
211  return leg.getRoute() != null ? leg.getRoute().getDistance() : Double.NaN;
212  }));
213  })
214  // the following means trips with infinite distance are silently ignored.
215  .filter(Double::isFinite)
216  .summaryStatistics();
217  }
Here is the call graph for this function:

◆ getLegStats()

static DoubleSummaryStatistics org.matsim.analysis.TravelDistanceStats.getLegStats ( IdMap< Person, Plan map)
staticprivate

Definition at line 219 of file TravelDistanceStats.java.

References org.matsim.api.core.v01.population.Route.getDistance(), org.matsim.api.core.v01.population.Leg.getRoute(), and org.matsim.api.core.v01.IdMap< T, V >.values().

Referenced by org.matsim.analysis.TravelDistanceStats.addIteration().

219  {
220  return map.values()
221  //TODO: This probably doesn't control how many threads parallelStream is using despite the number of threads setting in config
222  .parallelStream()
223  .flatMap(plan -> plan.getPlanElements().stream())
224  .filter(Leg.class::isInstance)
225  .mapToDouble(l -> {
226  Leg leg = (Leg) l;
227  return leg.getRoute() != null ? leg.getRoute().getDistance() : Double.NaN;
228  })
229  // the following means legs with infinite distance are ignored
230  .filter(Double::isFinite)
231  .summaryStatistics();
232  }
Here is the call graph for this function:

◆ close()

void org.matsim.analysis.TravelDistanceStats.close ( )

Definition at line 234 of file TravelDistanceStats.java.

234  {
235  try {
236  this.out.close();
237  } catch (IOException e) {
238  e.printStackTrace();
239  }
240 
241  }

Member Data Documentation

◆ MAX_ITERATIONS_IN_GRAPH

final int org.matsim.analysis.TravelDistanceStats.MAX_ITERATIONS_IN_GRAPH = 5000
staticprivate

◆ controllerConfigGroup

final ControllerConfigGroup org.matsim.analysis.TravelDistanceStats.controllerConfigGroup
private

◆ out

BufferedWriter org.matsim.analysis.TravelDistanceStats.out
private

Definition at line 63 of file TravelDistanceStats.java.

◆ legStatsPngName

final String org.matsim.analysis.TravelDistanceStats.legStatsPngName
private

◆ tripStatsPngName

final String org.matsim.analysis.TravelDistanceStats.tripStatsPngName
private

◆ delimiter

final String org.matsim.analysis.TravelDistanceStats.delimiter
private

◆ legStats

Map<Integer, DoubleSummaryStatistics> org.matsim.analysis.TravelDistanceStats.legStats
private

Definition at line 68 of file TravelDistanceStats.java.

◆ tripStats

Map<Integer, DoubleSummaryStatistics> org.matsim.analysis.TravelDistanceStats.tripStats
private

Definition at line 69 of file TravelDistanceStats.java.

◆ log

final Logger org.matsim.analysis.TravelDistanceStats.log = LogManager.getLogger(TravelDistanceStats.class)
staticprivate

Definition at line 71 of file TravelDistanceStats.java.


The documentation for this class was generated from the following file: