20 package org.matsim.core.trafficmonitoring;
22 import com.google.inject.Inject;
23 import org.apache.logging.log4j.LogManager;
24 import org.apache.logging.log4j.Logger;
53 import java.util.HashSet;
56 import java.util.concurrent.ConcurrentHashMap;
74 private static final String
ERROR_STUCK_AND_LINKTOLINK =
"Using the stuck feature with turning move travel times is not available. As the next link of a stucked" +
75 "agent is not known the turning move travel time cannot be calculated!";
79 TimeSlotComputation aggregator;
98 TravelTimeGetter travelTimeGetter ;
112 calculator.travelTimeGetter =
new AveragingTravelTimeGetter( calculator.aggregator );
114 case "linearinterpolation":
115 calculator.travelTimeGetter =
new LinearInterpolatingTravelTimeGetter( calculator.
numSlots, calculator.
timeSlice, calculator.aggregator );
152 private boolean calculateLinkTravelTimes = true ;
153 private boolean calculateLinkToLinkTravelTimes = false ;
155 private Set<String> analyzedModes = null ;
193 this.toBeConfigured = true ;
199 if( toBeConfigured ){
208 boolean calculateLinkTravelTimes,
boolean calculateLinkToLinkTravelTimes,
boolean filterModes, Set<String> analyzedModes) {
216 this.aggregator =
new TimeSlotComputation(this.numSlots, this.timeSlice);
217 this.travelTimeGetter =
new AveragingTravelTimeGetter( this.aggregator ) ;
218 if (this.calculateLinkTravelTimes) {
221 if (this.calculateLinkToLinkTravelTimes){
223 this.linkToLinkData =
new ConcurrentHashMap<>((int) (network.
getLinks().size() * 1.4 * 2));
225 this.linkEnterEvents =
new ConcurrentHashMap<>();
229 this.vehiclesToIgnore =
new HashSet<>();
238 if (filterAnalyzedModes && vehiclesToIgnore.contains(e.
getVehicleId()))
return;
244 double enterTime = oldEvent.
getTime();
246 final int timeSlot = this.aggregator.getTimeSlotIndex(enterTime );
247 data.addTravelTime(timeSlot, e.
getTime() - enterTime );
248 data.setNeedsConsolidation(
true );
254 if (this.calculateLinkTravelTimes) {
256 if (oldEvent != null) {
258 double enterTime = oldEvent.
getTime();
260 final int timeSlot = this.aggregator.getTimeSlotIndex(enterTime );
261 data.addTravelTime(timeSlot, e.
getTime() - enterTime );
262 data.setNeedsConsolidation(
true );
272 if (filterAnalyzedModes && !analyzedModes.contains(event.
getNetworkMode())) {
285 if (filterAnalyzedModes) this.vehiclesToIgnore.remove(event.
getVehicleId());
301 data.setNeedsConsolidation(
true );
306 if (this.calculateLinkToLinkTravelTimes
307 && event.
getTime() < qsimConfig.getEndTime().seconds()
310 log.error(ERROR_STUCK_AND_LINKTOLINK);
311 throw new IllegalStateException(ERROR_STUCK_AND_LINKTOLINK);
316 if (filterAnalyzedModes) this.vehiclesToIgnore.remove(event.
getVehicleId());
319 private TravelTimeDataArray
getTravelTimeData(
final Id<Link> linkId,
final boolean createIfMissing) {
320 TravelTimeDataArray data = this.linkData.
get(linkId);
321 if ((null == data) && createIfMissing) {
323 this.linkData.
put(linkId, data);
329 TravelTimeDataArray data = this.linkToLinkData.get(fromLinkToLink);
330 if ( null == data ) {
332 this.linkToLinkData.put(fromLinkToLink, data);
338 return new TravelTimeDataArray(this.network.
getLinks().get(linkId), this.
numSlots);
342 if (this.calculateLinkTravelTimes) {
345 if ( data.isNeedingConsolidation() ) {
348 return this.travelTimeGetter.getTravelTime( data, time );
350 throw new IllegalStateException(
"No link travel time is available " +
351 "if calculation is switched off by config option!");
355 if (!this.calculateLinkToLinkTravelTimes) {
356 throw new IllegalStateException(
"No link to link travel time is available " +
357 "if calculation is switched off by config option!");
360 if ( data.isNeedingConsolidation() ) {
363 return this.travelTimeGetter.getTravelTime( data, time );
368 if (this.calculateLinkTravelTimes) {
369 for (TravelTimeData data : this.linkData.
values()){
370 data.resetTravelTimes();
371 data.setNeedsConsolidation(
false );
374 if (this.calculateLinkToLinkTravelTimes){
375 for (TravelTimeData data : this.linkToLinkData.values()){
376 data.resetTravelTimes();
377 data.setNeedsConsolidation(
false );
380 this.linkEnterEvents.clear();
381 this.vehiclesToIgnore.clear();
404 if ( data.isNeedingConsolidation() ) {
408 double prevTravelTime = data.getTravelTime(0, 0.0 );
414 for (
int i = 1; i < this.
numSlots; i++) {
417 double travelTime = data.getTravelTime(i, i * this.timeSlice );
420 double minTravelTime = prevTravelTime - this.
timeSlice;
423 if (travelTime < minTravelTime) {
425 travelTime = minTravelTime;
426 data.setTravelTime(i, travelTime);
428 prevTravelTime = travelTime;
430 data.setNeedsConsolidation(
false );
435 private static int cnt = 0 ;
445 double linkTtimeFromVehicle = 0. ;
446 if ( vehicle!=null ){
448 if ( vehicleType==null ){
451 log.warn(
"encountered vehicle where vehicle.getType() returns null. That should be repaired (whereever it comes from)." );
459 return Math.max( linkTtimeFromVehicle, linkTTimeFromObservation) ;
475 double linkTtimeFromVehicle = 0. ;
476 if ( vehicle!=null ){
478 if ( vehicleType==null ){
481 log.warn(
"encountered vehicle where vehicle.getType() returns null. That should be repaired (whereever it comes from)." );
490 return Math.max(linkTTimeFromObservation, linkTtimeFromVehicle);
void handleEvent(VehicleArrivesAtFacilityEvent event)
static final String ONLYONCE
TravelTimeCalculator build()
double getLinkToLinkTravelTime(final Id< Link > fromLinkId, final Id< Link > toLinkId, double time)
TravelTimeDataArray createTravelTimeData(Id< Link > linkId)
boolean isCalculateLinkToLinkTravelTimes()
static Set< String > stringToSet(final String values)
void setTimeslice(double timeslice)
final boolean calculateLinkTravelTimes
boolean isCalculateLinkTravelTimes()
final Set< String > analyzedModes
TravelTimeCalculator(final Network network, TravelTimeCalculatorConfigGroup ttconfigGroup)
String getAnalyzedModesAsString()
void configure(TravelTimeCalculatorConfigGroup ttcConfig)
final double getMaximumVelocity()
void handleEvent(VehicleEntersTrafficEvent event)
static TravelTimeCalculator configure(TravelTimeCalculator calculator, TravelTimeCalculatorConfigGroup config, Network network)
IdMap< Link, TravelTimeDataArray > linkData
boolean calculateLinkTravelTimes
void handleEvent(VehicleAbortsEvent event)
void reset(int iteration)
void addHandler(final EventHandler handler)
LinkToLinkTravelTime getLinkToLinkTravelTimes()
Id< Vehicle > getVehicleId()
final Map< Id< Vehicle >, LinkEnterEvent > linkEnterEvents
void setCalculateLinkTravelTimes(boolean calculateLinkTravelTimes)
Map< Tuple< Id< Link >, Id< Link > >, TravelTimeDataArray > linkToLinkData
void handleEvent(final LinkLeaveEvent e)
final Set< Id< Vehicle > > vehiclesToIgnore
TravelTimeDataArray getTravelTimeData(final Id< Link > linkId, final boolean createIfMissing)
final double getTraveltimeBinSize()
Id< Vehicle > getVehicleId()
Id< Vehicle > getVehicleId()
TravelTimeDataArray getLinkToLinkTravelTimeData(Tuple< Id< Link >, Id< Link >> fromLinkToLink)
void setCalculateLinkToLinkTravelTimes(boolean calculateLinkToLinkTravelTimes)
final boolean calculateLinkToLinkTravelTimes
void handleEvent(final LinkEnterEvent e)
void setAnalyzedModes(Set< String > analyzedModes)
double getLinkTravelTime(final Id< Link > linkId, final double time)
static TravelTimeCalculator create(Network network, TravelTimeCalculatorConfigGroup group)
Map< Id< Link >, ? extends Link > getLinks()
void setFilterModes(boolean filterModes)
TravelTimeCalculator(final Network network, final double timeslice, final int maxTime, boolean calculateLinkTravelTimes, boolean calculateLinkToLinkTravelTimes, boolean filterModes, Set< String > analyzedModes)
static final String ERROR_STUCK_AND_LINKTOLINK
TravelTime getLinkTravelTimes()
boolean calculateLinkToLinkTravelTimes
void setMaxTime(int maxTime)
Set< String > analyzedModes
QSimConfigGroup qsimConfig
static int getTimeBinCount(int maxTime, double travelTimeBinSize)
Id< Vehicle > getVehicleId()
final boolean filterAnalyzedModes
void consolidateData(final TravelTimeData data)
V put(Id< T > key, V value)
TravelTimeCalculator(final Network network, final double timeslice, final int maxTime, TravelTimeCalculatorConfigGroup ttconfigGroup)
TravelTimeCalculatorConfigGroup ttcConfig
Id< Vehicle > getVehicleId()
Id< Vehicle > getVehicleId()
void handleEvent(final VehicleLeavesTrafficEvent event)
String getTravelTimeGetterType()