21 package org.matsim.analysis.linkpaxvolumes;
23 import org.apache.logging.log4j.LogManager;
24 import org.apache.logging.log4j.Logger;
68 final boolean observeNetworkModes;
69 final boolean observePassengerModes;
70 final boolean observeVehicleTypes;
88 final Vehicles transitVehicles,
boolean observeNetworkModes,
boolean observePassengerModes,
89 boolean observeVehicleTypes) {
92 this.maxSlotIndex = (this.maxTime/this.
timeBinSize) + 1;
104 this.observeNetworkModes = observeNetworkModes;
105 if (this.observeNetworkModes) {
106 this.linkVehicleVolumesPerNetworkMode =
new IdMap<>(
Link.class);
107 this.linkPaxVolumesPerNetworkMode =
new IdMap<>(
Link.class);
109 this.linkVehicleVolumesPerNetworkMode = null;
110 this.linkPaxVolumesPerNetworkMode = null;
112 this.observePassengerModes = observePassengerModes;
113 if (this.observePassengerModes) {
114 this.linkVehicleVolumesPerPassengerMode =
new IdMap<>(
Link.class);
115 this.linkPaxVolumesPerPassengerMode =
new IdMap<>(
Link.class);
117 this.linkVehicleVolumesPerPassengerMode = null;
118 this.linkPaxVolumesPerPassengerMode = null;
120 this.observeVehicleTypes = observeVehicleTypes;
121 if (this.observeVehicleTypes) {
122 this.linkVehicleVolumesPerVehicleType =
new IdMap<>(
Link.class);
123 this.linkPaxVolumesPerVehicleType =
new IdMap<>(
Link.class);
125 this.linkVehicleVolumesPerVehicleType = null;
126 this.linkPaxVolumesPerVehicleType = null;
132 this.person2passengerMode.
put(event.
getPersonId(),
event.getLegMode());
138 if (vehicleData == null) {
140 if (vehicle == null) {
146 event.getPersonId());
149 String passengerMode = person2passengerMode.
get(event.
getPersonId());
150 Map<String, Integer> passengersByMode = this.vehiclesData.
get(event.
getVehicleId()).passengerMode2currentPax;
151 passengersByMode.put(passengerMode, passengersByMode.getOrDefault(passengerMode, 0) + 1);
164 this.vehicleType2numberSeen.computeIfAbsent(vehicleData.
vehicleTypeId, k -> 0) + 1);
170 int[] vehicleVolumesAll = this.linkVehicleVolumes.
get(event.
getLinkId());
171 if (vehicleVolumesAll == null) {
172 vehicleVolumesAll =
new int[this.maxSlotIndex + 1];
173 this.linkVehicleVolumes.
put(event.
getLinkId(), vehicleVolumesAll);
176 vehicleVolumesAll[timeslot]++;
179 int currentPaxAllPassengerModes = 0;
181 currentPaxAllPassengerModes += i;
184 int[] passengerVolumesAll = this.linkPaxVolumes.
get(event.
getLinkId());
185 if (passengerVolumesAll == null) {
186 passengerVolumesAll =
new int[this.maxSlotIndex + 1];
187 this.linkPaxVolumes.
put(event.
getLinkId(), passengerVolumesAll);
189 passengerVolumesAll[timeslot] += currentPaxAllPassengerModes;
191 if (this.observeNetworkModes) {
194 Map<String, int[]> modeVehicleVolumes = this.linkVehicleVolumesPerNetworkMode.
195 computeIfAbsent(event.
getLinkId(), k ->
new HashMap<>());
196 int[] vehicleVolumes = modeVehicleVolumes.get(mode);
197 if (vehicleVolumes == null) {
198 vehicleVolumes =
new int[this.maxSlotIndex + 1];
199 modeVehicleVolumes.put(mode, vehicleVolumes);
201 vehicleVolumes[timeslot]++;
203 Map<String, int[]> modePassengerVolumes = this.linkPaxVolumesPerNetworkMode.
204 computeIfAbsent(event.
getLinkId(), k ->
new HashMap<>());
205 int[] passengerVolumes = modePassengerVolumes.get(mode);
206 if (passengerVolumes == null) {
207 passengerVolumes =
new int[this.maxSlotIndex + 1];
208 modePassengerVolumes.put(mode, passengerVolumes);
210 passengerVolumes[timeslot] += currentPaxAllPassengerModes;
213 if (this.observePassengerModes) {
218 Map<String, int[]> modeVehicleVolumes = this.linkVehicleVolumesPerPassengerMode.
219 computeIfAbsent(event.
getLinkId(), k ->
new HashMap<>());
220 int[] vehicleVolumes = modeVehicleVolumes.get(passengerMode2modePax.getKey());
221 if (vehicleVolumes == null) {
222 vehicleVolumes =
new int[this.maxSlotIndex + 1];
223 modeVehicleVolumes.put(passengerMode2modePax.getKey(), vehicleVolumes);
225 vehicleVolumes[timeslot]++;
227 Map<String, int[]> modePassengerVolumes = this.linkPaxVolumesPerPassengerMode.
228 computeIfAbsent(event.
getLinkId(), k ->
new HashMap<>());
229 int[] passengerVolumes = modePassengerVolumes.get(passengerMode2modePax.getKey());
230 if (passengerVolumes == null) {
231 passengerVolumes =
new int[this.maxSlotIndex + 1];
232 modePassengerVolumes.put(passengerMode2modePax.getKey(), passengerVolumes);
234 passengerVolumes[timeslot] += passengerMode2modePax.getValue();
238 if (this.observeVehicleTypes) {
243 int[] vehicleVolumes = typeVehicleVolumes.
get(vehicleType);
244 if (vehicleVolumes == null) {
245 vehicleVolumes =
new int[this.maxSlotIndex + 1];
246 typeVehicleVolumes.
put(vehicleType, vehicleVolumes);
248 vehicleVolumes[timeslot]++;
252 int[] passengerVolumes = modePassengerVolumes.
get(vehicleType);
253 if (passengerVolumes == null) {
254 passengerVolumes =
new int[this.maxSlotIndex + 1];
255 modePassengerVolumes.
put(vehicleType, passengerVolumes);
257 passengerVolumes[timeslot] += currentPaxAllPassengerModes;
263 String passengerMode = person2passengerMode.
get(event.
getPersonId());
264 Map<String, Integer> passengersByMode = this.vehiclesData.
get(event.
getVehicleId()).passengerMode2currentPax;
265 passengersByMode.put(passengerMode, passengersByMode.get(passengerMode) - 1);
271 for (
int i: passengersByMode.values()) {
286 this.vehicleType2timeOnNetwork.getOrDefault(vehicleData.
vehicleTypeId, 0.0) +
291 if (time > this.maxTime) {
294 return ((
int)time / this.timeBinSize);
302 int[] getVehicleVolumesForLink(
final Id<Link> linkId) {
303 return this.linkVehicleVolumes.
get(linkId);
312 int[] getVehicleVolumesForLinkPerNetworkMode(
final Id<Link> linkId, String networkMode) {
313 if (observeNetworkModes) {
314 Map<String, int[]> modeVolumes = this.linkVehicleVolumesPerNetworkMode.
get(linkId);
315 if (modeVolumes != null)
return modeVolumes.get(networkMode);
326 int[] getVehicleVolumesForLinkPerPassengerMode(
final Id<Link> linkId, String passengerMode) {
327 if (observePassengerModes) {
328 Map<String, int[]> modeVolumes = this.linkVehicleVolumesPerPassengerMode.
get(linkId);
329 if (modeVolumes != null)
return modeVolumes.get(passengerMode);
341 if (observeVehicleTypes) {
343 if (typeVolumes != null)
return typeVolumes.
get(vehicleType);
354 return this.linkPaxVolumes.
get(linkId);
363 int[] getPaxVolumesForLinkPerNetworkMode(
final Id<Link> linkId, String networkMode) {
364 if (observeNetworkModes) {
365 Map<String, int[]> modeVolumes = this.linkPaxVolumesPerNetworkMode.
get(linkId);
366 if (modeVolumes != null)
return modeVolumes.get(networkMode);
377 int[] getPaxVolumesForLinkPerPassengerMode(
final Id<Link> linkId, String passengerMode) {
378 if (observePassengerModes) {
379 Map<String, int[]> modeVolumes = this.linkPaxVolumesPerPassengerMode.
get(linkId);
380 if (modeVolumes != null)
return modeVolumes.get(passengerMode);
392 if (observeVehicleTypes) {
394 if (typeVolumes != null)
return typeVolumes.
get(vehicleType);
404 int getVolumesArraySize() {
405 return this.maxSlotIndex + 1;
428 int[] getVolumePerHourFromTimeBinArray(
int[] volumesForLink) {
429 if (3600.0 % this.timeBinSize != 0) log.error(
"Volumes per hour and per link probably not correct!");
431 int[] volumes =
new int[30];
432 if (volumesForLink == null)
return volumes;
434 int slotsPerHour = (int)(3600.0 / this.timeBinSize);
435 for (
int hour = 0; hour < 30; hour++) {
436 double time = hour * 3600.0;
437 for (
int i = 0; i < slotsPerHour; i++) {
445 int getVolumePerDayFromTimeBinArray(
int[] volumesForLink) {
448 volumePerDay += volumesForLink[i];
453 Map<Id<VehicleType>, Integer> getVehicleType2numberSeen() {
454 return Collections.unmodifiableMap(vehicleType2numberSeen);
457 Map<Id<VehicleType>, Double> getVehicleType2timeOnNetwork() {
458 return Collections.unmodifiableMap(vehicleType2timeOnNetwork);
464 Set<String> getNetworkModes() {
465 Set<String> modes =
new TreeSet<>();
467 for (Map<String,
int[]> map : this.linkVehicleVolumesPerNetworkMode.
values()) {
468 modes.addAll(map.keySet());
477 Set<String> getPassengerModes() {
478 Set<String> modes =
new TreeSet<>();
480 for (Map<String,
int[]> map : this.linkVehicleVolumesPerPassengerMode.
values()) {
481 modes.addAll(map.keySet());
494 vehicleTypes.
addAll(map.keySet());
503 Set<Id<Link>> getLinkIds() {
504 return this.linkVehicleVolumes.
keySet();
507 int getNumberOfHours() {
508 return maxSlotIndex * timeBinSize / 3600;
512 public void reset(
final int iteration) {
513 this.linkVehicleVolumes.
clear();
514 this.linkPaxVolumes.
clear();
515 this.person2passengerMode.
clear();
516 this.vehiclesAboutToLeave.
clear();
517 this.vehiclesData.
clear();
518 this.vehicleIdsSeen.
clear();
519 this.vehicleType2numberSeen.
clear();
520 this.vehicleType2timeOnNetwork.
clear();
522 if (observeNetworkModes) {
523 this.linkVehicleVolumesPerNetworkMode.
clear();
524 this.linkPaxVolumesPerNetworkMode.
clear();
526 if (this.observePassengerModes) {
527 this.linkVehicleVolumesPerPassengerMode.
clear();
528 this.linkPaxVolumesPerPassengerMode.
clear();
530 if (this.observeVehicleTypes) {
531 this.linkVehicleVolumesPerVehicleType.
clear();
532 this.linkPaxVolumesPerVehicleType.
clear();
Id< Vehicle > getVehicleId()
VehicleData(Id< Vehicle > vehicleId, Id< VehicleType > vehicleTypeId, Id< Person > driverId)
int getTimeSlotIndex(final double time)
void handleEvent(PersonDepartureEvent event)
final IdMap< Link, Map< String, int[]> > linkPaxVolumesPerNetworkMode
final IdMap< Person, String > person2passengerMode
final IdMap< Link, int[]> linkPaxVolumes
boolean contains(Object key)
final Id< VehicleType > nullVehicleType
Id< Person > getPersonId()
final IdMap< VehicleType, Double > vehicleType2timeOnNetwork
final IdMap< Link, IdMap< VehicleType, int[]> > linkVehicleVolumesPerVehicleType
void handleEvent(PersonLeavesVehicleEvent event)
void handleEvent(VehicleEntersTrafficEvent event)
void handleEvent(VehicleLeavesTrafficEvent event)
Id< Person > getPersonId()
Id< Vehicle > getVehicleId()
static< T > Id< T > create(final long key, final Class< T > type)
final Vehicles transitVehicles
final IdMap< VehicleType, Integer > vehicleType2numberSeen
final IdSet< Vehicle > vehiclesAboutToLeave
final IdMap< Link, Map< String, int[]> > linkVehicleVolumesPerPassengerMode
void handleEvent(PersonEntersVehicleEvent event)
final IdMap< Link, Map< String, int[]> > linkVehicleVolumesPerNetworkMode
final IdMap< Link, int[]> linkVehicleVolumes
Id< Vehicle > getVehicleId()
boolean remove(Object key)
Map< String, Integer > passengerMode2currentPax
final IdSet< Vehicle > vehicleIdsSeen
double enteredNetworkTime
final Id< VehicleType > vehicleTypeId
boolean addAll(Collection<? extends Id< T >> c)
void handleEvent(final LinkEnterEvent event)
final IdMap< Link, Map< String, int[]> > linkPaxVolumesPerPassengerMode
void reset(final int iteration)
final IdMap< Vehicle, VehicleData > vehiclesData
final Id< VehicleType > getId()
boolean add(Id< T > value)
Map< Id< Vehicle >, Vehicle > getVehicles()
int [] getPaxVolumesForLink(final Id< Link > linkId)
Id< Vehicle > getVehicleId()
V put(Id< T > key, V value)
Id< Vehicle > getVehicleId()
LinkPaxVolumesAnalysis(Vehicles vehicles, Vehicles transitVehicles)
final Id< Person > driverId
final IdMap< Link, IdMap< VehicleType, int[]> > linkPaxVolumesPerVehicleType
Id< Person > getPersonId()
final Id< Vehicle > vehicleId