MATSIM
TimeInterpretation.java
Go to the documentation of this file.
1 package org.matsim.core.utils.timing;
2 
3 import java.util.List;
4 
13 
14 import com.google.common.base.Preconditions;
15 
16 public class TimeInterpretation {
18 
19  private final double simulationStartTime;
20  private final boolean onlyAdvance;
21 
22  static public TimeInterpretation create(Config config) {
23  return new TimeInterpretation( //
25  config.plans().getTripDurationHandling(), //
26  config.qsim().getStartTime().orElse(0.0));
27  // Value of 0.0 corresponds to QSim::initSimTimer if not set from configuration
28  }
29 
31  TripDurationHandling tripDurationHandling, double simulationStartTime) {
32  return new TimeInterpretation(interpretation, tripDurationHandling, simulationStartTime);
33  }
34 
36  TripDurationHandling tripDurationHandling) {
37  return new TimeInterpretation(interpretation, tripDurationHandling, 0.0);
38  // Value of 0.0 corresponds to QSim::initSimTimer if not set from configuration
39  }
40 
41  private TimeInterpretation(ActivityDurationInterpretation activityDurationInterpretation,
42  TripDurationHandling tripDurationHandling, double simulationStartTime) {
43  this.activityDurationInterpretation = activityDurationInterpretation;
44  this.simulationStartTime = simulationStartTime;
45 
46  boolean onlyAdvance = false;
47 
48  switch (tripDurationHandling) {
49  case ignoreDelays:
50  onlyAdvance = false;
51  break;
52  case shiftActivityEndTimes:
53  onlyAdvance = true;
54  break;
55  default:
56  throw new IllegalStateException();
57  }
58 
59  this.onlyAdvance = onlyAdvance;
60  }
61 
62  private OptionalTime checkAdvance(OptionalTime time, double startTime) {
63  if (time.isDefined() && onlyAdvance) {
64  return OptionalTime.defined(Math.max(startTime, time.seconds()));
65  }
66 
67  return time;
68  }
69 
80  int activityIndex = plan.getPlanElements().indexOf(activity);
81 
82  if (activityIndex == -1) {
83  throw new IllegalStateException(
84  "Activity " + activity + " not found in plan of agent " + plan.getPerson().getId());
85  }
86 
87  return decideOnElementsEndTime(plan.getPlanElements().subList(0, activityIndex + 1), simulationStartTime);
88  }
89 
96  public OptionalTime decideOnActivityEndTime(Activity activity, double startTime) {
97  Preconditions.checkArgument(Double.isFinite(startTime));
98 
99  switch (activityDurationInterpretation) {
100  case endTimeOnly:
101  return activity.getEndTime();
102 
103  case tryEndTimeThenDuration:
104  if (activity.getEndTime().isDefined()) {
105  return checkAdvance(activity.getEndTime(), startTime);
106  } else if (activity.getMaximumDuration().isDefined()) {
107  return OptionalTime.defined(startTime + activity.getMaximumDuration().seconds());
108  } else {
109  return OptionalTime.undefined();
110  }
111 
112  case minOfDurationAndEndTime:
113  if (activity.getEndTime().isUndefined() && activity.getMaximumDuration().isUndefined()) {
114  return OptionalTime.undefined();
115  } else if (activity.getMaximumDuration().isUndefined()) {
116  return checkAdvance(activity.getEndTime(), startTime);
117  } else if (activity.getEndTime().isUndefined()) {
118  double durationBasedEndTime = startTime + activity.getMaximumDuration().seconds();
119  return OptionalTime.defined(durationBasedEndTime);
120  } else {
121  double durationBasedEndTime = startTime + activity.getMaximumDuration().seconds();
122  return checkAdvance(activity.getEndTime().seconds() <= durationBasedEndTime ? activity.getEndTime()
123  : OptionalTime.defined(durationBasedEndTime), startTime);
124  }
125 
126  default:
127  throw new IllegalArgumentException(
128  "Unsupported 'activityDurationInterpretation' enum type: " + activityDurationInterpretation);
129  }
130  }
131 
137  if (leg.getRoute() == null) {
138  return leg.getTravelTime();
139  } else {
140  return leg.getRoute().getTravelTime().or(leg.getTravelTime());
141  }
142  }
143 
148  public OptionalTime decideOnElementEndTime(PlanElement element, double startTime) {
149  if (element instanceof Activity) {
150  return decideOnActivityEndTime((Activity) element, startTime);
151  } else {
152  OptionalTime travelTime = decideOnLegTravelTime((Leg) element);
153 
154  if (travelTime.isDefined()) {
155  return OptionalTime.defined(startTime + travelTime.seconds());
156  } else {
157  return OptionalTime.undefined();
158  }
159  }
160  }
161 
167  public OptionalTime decideOnElementsEndTime(List<? extends PlanElement> elements, final double startTime) {
168  double now = startTime;
169 
170  for (PlanElement element : elements) {
171  OptionalTime endTime = decideOnElementEndTime(element, now);
172 
173  if (endTime.isDefined()) {
174  now = endTime.seconds();
175  } else {
176  return OptionalTime.undefined();
177  }
178  }
179 
180  return OptionalTime.defined(now);
181  }
182 
186  public double getSimulationStartTime() {
187  return simulationStartTime;
188  }
189 }
OptionalTime decideOnActivityEndTime(Activity activity, double startTime)
final ActivityDurationInterpretation activityDurationInterpretation
static TimeInterpretation create(ActivityDurationInterpretation interpretation, TripDurationHandling tripDurationHandling, double simulationStartTime)
PlansConfigGroup.TripDurationHandling getTripDurationHandling()
TimeInterpretation(ActivityDurationInterpretation activityDurationInterpretation, TripDurationHandling tripDurationHandling, double simulationStartTime)
static TimeInterpretation create(Config config)
OptionalTime decideOnActivityEndTimeAlongPlan(Activity activity, Plan plan)
static TimeInterpretation create(ActivityDurationInterpretation interpretation, TripDurationHandling tripDurationHandling)
List< PlanElement > getPlanElements()
final PlansConfigGroup plans()
Definition: Config.java:415
QSimConfigGroup qsim()
Definition: Config.java:447
static OptionalTime defined(double seconds)
OptionalTime checkAdvance(OptionalTime time, double startTime)
OptionalTime decideOnElementsEndTime(List<? extends PlanElement > elements, final double startTime)
OptionalTime decideOnElementEndTime(PlanElement element, double startTime)
PlansConfigGroup.ActivityDurationInterpretation getActivityDurationInterpretation()
OptionalTime or(OptionalTime optionalTime)