Eclipse SUMO - Simulation of Urban MObility
MSDevice_ToC.cpp
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.org/sumo
3 // Copyright (C) 2013-2019 German Aerospace Center (DLR) and others.
4 // This program and the accompanying materials
5 // are made available under the terms of the Eclipse Public License v2.0
6 // which accompanies this distribution, and is available at
7 // http://www.eclipse.org/legal/epl-v20.html
8 // SPDX-License-Identifier: EPL-2.0
9 /****************************************************************************/
17 // The ToC Device controls the transition of control between automated and manual driving.
18 //
19 /****************************************************************************/
20 
21 // ===========================================================================
22 // included modules
23 // ===========================================================================
24 #include <config.h>
25 
26 #include <algorithm>
27 #include <memory>
32 #include <utils/common/RGBColor.h>
33 #include <microsim/MSNet.h>
34 #include <microsim/MSVehicle.h>
38 #include <microsim/MSDriverState.h>
39 #include "MSDevice_ToC.h"
40 
41 
42 // ===========================================================================
43 // debug constants
44 // ===========================================================================
45 //#define DEBUG_TOC
46 //#define DEBUG_DYNAMIC_TOC
47 
48 // ===========================================================================
49 // parameter defaults
50 // ===========================================================================
51 
52 // default value for the average response time, that a driver needs to take back control
53 #define DEFAULT_RESPONSE_TIME -1.0
54 // default value for the average rate at which the driver's awareness recovers to
55 // 1.0 after a ToC has been performed
56 #define DEFAULT_RECOVERY_RATE 0.1
57 // Default value of the awareness below which no lane-changes are performed
58 #define DEFAULT_LCABSTINENCE 0.0
59 // The default value for the average awareness a driver has initially after a ToC
60 #define DEFAULT_INITIAL_AWARENESS 0.5
61 // The default value for the deceleration rate applied during a 'minimum risk maneuver'
62 #define DEFAULT_MRM_DECEL 1.5
63 // The default value for the dynamic ToC threshold indicates that the dynamic ToCs are deactivated
64 #define DEFAULT_DYNAMIC_TOC_THRESHOLD 0.0
65 // The default value for the probability of an MRM to occur after a dynamically triggered ToC
66 // (Note that these MRMs will not induce full stops in most cases)
67 #define DEFAULT_MRM_PROBABILITY 0.05
68 
69 // The factor by which the dynamic ToC threshold time is multiplied to yield the lead time given for the corresponding ToC
70 #define DYNAMIC_TOC_LEADTIME_FACTOR 0.75
71 // A factor applied to the check for the dynamic ToC condition to resist aborting an ongoing dynamic ToC (and prevent oscillations)
72 #define DYNAMIC_TOC_ABORT_RESISTANCE_FACTOR 2.0
73 
74 
75 // The default values for the openGap parameters applied for gap creation in preparation for a ToC
76 #define DEFAULT_OPENGAP_TIMEGAP -1.0
77 #define DEFAULT_OPENGAP_SPACING 0.0
78 #define DEFAULT_OPENGAP_CHANGERATE 1.0
79 #define DEFAULT_OPENGAP_MAXDECEL 1.0
80 
81 
82 #define DEFAULT_MANUAL_TYPE ""
83 #define DEFAULT_AUTOMATED_TYPE ""
84 
85 // Maximal tries to sample a positive value from the gaussian distribution
86 // used for the driver response time when a TOR is issued. (the distribution is assumed truncated at zero)
87 #define MAX_RESPONSETIME_SAMPLE_TRIES 100
88 // Maximal variance of responsetimes (returned for pMRM outside lookup table, i.e. pMRM>0.5), see interpolateVariance()
89 #define MAX_RESPONSETIME_VARIANCE 10000
90 
91 
92 // ---------------------------------------------------------------------------
93 // static members
94 // ---------------------------------------------------------------------------
95 std::set<MSDevice_ToC*, ComparatorNumericalIdLess> MSDevice_ToC::myInstances = std::set<MSDevice_ToC*, ComparatorNumericalIdLess>();
96 std::set<std::string> MSDevice_ToC::createdOutputFiles;
97 int MSDevice_ToC::LCModeMRM = 768; // = 0b001100000000 - no autonomous changes, no speed adaptation
99 
100 
101 // ===========================================================================
102 // method definitions
103 // ===========================================================================
104 // ---------------------------------------------------------------------------
105 // static initialisation methods
106 // ---------------------------------------------------------------------------
107 void
109  oc.addOptionSubTopic("ToC Device");
110  insertDefaultAssignmentOptions("toc", "ToC Device", oc);
111 
112  oc.doRegister("device.toc.manualType", new Option_String());
113  oc.addDescription("device.toc.manualType", "ToC Device", "Vehicle type for manual driving regime.");
114  oc.doRegister("device.toc.automatedType", new Option_String());
115  oc.addDescription("device.toc.automatedType", "ToC Device", "Vehicle type for automated driving regime.");
116  oc.doRegister("device.toc.responseTime", new Option_Float(DEFAULT_RESPONSE_TIME));
117  oc.addDescription("device.toc.responseTime", "ToC Device", "Average response time needed by a driver to take back control.");
118  oc.doRegister("device.toc.recoveryRate", new Option_Float(DEFAULT_RECOVERY_RATE));
119  oc.addDescription("device.toc.recoveryRate", "ToC Device", "Recovery rate for the driver's awareness after a ToC.");
120  oc.doRegister("device.toc.lcAbstinence", new Option_Float(DEFAULT_LCABSTINENCE));
121  oc.addDescription("device.toc.lcAbstinence", "ToC Device", "Attention level below which a driver restrains from performing lane changes (value in [0,1]).");
122  oc.doRegister("device.toc.initialAwareness", new Option_Float(DEFAULT_INITIAL_AWARENESS));
123  oc.addDescription("device.toc.initialAwareness", "ToC Device", "Average awareness a driver has initially after a ToC (value in [0,1]).");
124  oc.doRegister("device.toc.mrmDecel", new Option_Float(DEFAULT_MRM_DECEL));
125  oc.addDescription("device.toc.mrmDecel", "ToC Device", "Deceleration rate applied during a 'minimum risk maneuver'.");
126  oc.doRegister("device.toc.dynamicToCThreshold", new Option_Float(DEFAULT_DYNAMIC_TOC_THRESHOLD));
127  oc.addDescription("device.toc.dynamicToCThreshold", "ToC Device", "Time, which the vehicle requires to have ahead to continue in automated mode. The default value of 0 indicates no dynamic triggering of ToCs.");
128  oc.doRegister("device.toc.dynamicMRMProbability", new Option_Float(DEFAULT_MRM_PROBABILITY));
129  oc.addDescription("device.toc.dynamicMRMProbability", "ToC Device", "Probability that a dynamically triggered TOR is not answered in time.");
130  oc.doRegister("device.toc.mrmKeepRight", new Option_Bool(false));
131  oc.addDescription("device.toc.mrmKeepRight", "ToC Device", "If true, the vehicle tries to change to the right during an MRM.");
132  oc.doRegister("device.toc.mrmSafeSpot", new Option_String());
133  oc.addDescription("device.toc.mrmSafeSpot", "ToC Device", "If set, the vehicle tries to reach the given named stopping place during an MRM.");
134  oc.doRegister("device.toc.mrmSafeSpotDuration", new Option_Float(60.));
135  oc.addDescription("device.toc.mrmSafeSpotDuration", "ToC Device", "Duration the vehicle stays at the safe spot after an MRM.");
136  oc.doRegister("device.toc.maxPreparationAccel", new Option_Float(0.0));
137  oc.addDescription("device.toc.maxPreparationAccel", "ToC Device", "Maximal acceleration that may be applied during the ToC preparation phase.");
138  oc.doRegister("device.toc.ogNewTimeHeadway", new Option_Float(-1.0));
139  oc.addDescription("device.toc.ogNewTimeHeadway", "ToC Device", "Timegap for ToC preparation phase.");
140  oc.doRegister("device.toc.ogNewSpaceHeadway", new Option_Float(-1.0));
141  oc.addDescription("device.toc.ogNewSpaceHeadway", "ToC Device", "Additional spacing for ToC preparation phase.");
142  oc.doRegister("device.toc.ogMaxDecel", new Option_Float(-1.0));
143  oc.addDescription("device.toc.ogMaxDecel", "ToC Device", "Maximal deceleration applied for establishing increased gap in ToC preparation phase.");
144  oc.doRegister("device.toc.ogChangeRate", new Option_Float(-1.0));
145  oc.addDescription("device.toc.ogChangeRate", "ToC Device", "Rate of adaptation towards the increased headway during ToC preparation.");
146  oc.doRegister("device.toc.useColorScheme", new Option_Bool(true));
147  oc.addDescription("device.toc.useColorScheme", "ToC Device", "Whether a coloring scheme shall by applied to indicate the different ToC stages.");
148  oc.doRegister("device.toc.file", new Option_String());
149  oc.addDescription("device.toc.file", "ToC Device", "Switches on output by specifying an output filename.");
150 }
151 
152 
153 void
154 MSDevice_ToC::buildVehicleDevices(SUMOVehicle& v, std::vector<MSVehicleDevice*>& into) {
156  if (equippedByDefaultAssignmentOptions(oc, "toc", v, false)) {
157  const std::string manualType = getStringParam(v, oc, "toc.manualType", DEFAULT_MANUAL_TYPE, true);
158  const std::string automatedType = getStringParam(v, oc, "toc.automatedType", DEFAULT_AUTOMATED_TYPE, true);
159  const SUMOTime responseTime = TIME2STEPS(getFloatParam(v, oc, "toc.responseTime", DEFAULT_RESPONSE_TIME, false));
160  const double recoveryRate = getFloatParam(v, oc, "toc.recoveryRate", DEFAULT_RECOVERY_RATE, false);
161  const double lcAbstinence = getFloatParam(v, oc, "toc.lcAbstinence", DEFAULT_LCABSTINENCE, false);
162  const double initialAwareness = getFloatParam(v, oc, "toc.initialAwareness", DEFAULT_INITIAL_AWARENESS, false);
163  const double mrmDecel = getFloatParam(v, oc, "toc.mrmDecel", DEFAULT_MRM_DECEL, false);
164  const bool useColoring = getBoolParam(v, oc, "toc.useColorScheme", "false", false);
165  const std::string deviceID = "toc_" + v.getID();
166  const std::string file = getOutputFilename(v, oc);
167  const OpenGapParams ogp = getOpenGapParams(v, oc);
168  const double dynamicToCThreshold = getFloatParam(v, oc, "toc.dynamicToCThreshold", DEFAULT_DYNAMIC_TOC_THRESHOLD, false);
169  const double dynamicMRMProbability = getDynamicMRMProbability(v, oc);
170  const bool mrmKeepRight = getBoolParam(v, oc, "toc.mrmKeepRight", false, false);
171  const std::string mrmSafeSpot = getStringParam(v, oc, "toc.mrmSafeSpot", "", false);
172  const SUMOTime mrmSafeSpotDuration = TIME2STEPS(getFloatParam(v, oc, "toc.mrmSafeSpotDuration", 60., false));
173  const double maxPreparationAccel = getFloatParam(v, oc, "toc.maxPreparationAccel", 0.0, false);
174  // build the device
175  MSDevice_ToC* device = new MSDevice_ToC(v, deviceID, file,
176  manualType, automatedType, responseTime, recoveryRate,
177  lcAbstinence, initialAwareness, mrmDecel, dynamicToCThreshold,
178  dynamicMRMProbability, maxPreparationAccel, mrmKeepRight,
179  mrmSafeSpot, mrmSafeSpotDuration, useColoring, ogp);
180  into.push_back(device);
181  }
182 }
183 
184 
185 std::string
187  // Default of "" means no output
188  std::string file = "";
189  if (v.getParameter().knowsParameter("device.toc.file")) {
190  try {
191  file = v.getParameter().getParameter("device.toc.file", file);
192  } catch (...) {
193  WRITE_WARNING("Invalid value '" + v.getParameter().getParameter("device.toc.file", file) + "'for vehicle parameter 'ssm.measures'");
194  }
195  } else if (v.getVehicleType().getParameter().knowsParameter("device.toc.file")) {
196  try {
197  file = v.getVehicleType().getParameter().getParameter("device.toc.file", file);
198  } catch (...) {
199  WRITE_WARNING("Invalid value '" + v.getVehicleType().getParameter().getParameter("device.toc.file", file) + "'for vType parameter 'ssm.measures'");
200  }
201  } else {
202  file = oc.getString("device.toc.file") == "" ? file : oc.getString("device.toc.file");
203  }
204  return file;
205 }
206 
207 
208 double
210  double pMRM = getFloatParam(v, oc, "toc.dynamicMRMProbability", DEFAULT_MRM_PROBABILITY, false);
211  if (pMRM < 0 || pMRM > 0.5) {
212  const double pMRMTrunc = MAX2(0.0, MIN2(0.5, pMRM));
213  WRITE_WARNING("Given value for ToC device parameter 'dynamicMRMProbability' (=" + toString(pMRM) + ") is not in the admissible range [0,0.5]. Truncated to " + toString(pMRMTrunc) + ".");
214  return pMRMTrunc;
215  }
216  return pMRM;
217 }
218 
219 
222  double timegap = getFloatParam(v, oc, "toc.ogNewTimeHeadway", -1.0, false);
223  double spacing = getFloatParam(v, oc, "toc.ogNewSpaceHeadway", -1.0, false);
224  double changeRate = getFloatParam(v, oc, "toc.ogChangeRate", -1.0, false);
225  double maxDecel = getFloatParam(v, oc, "toc.ogMaxDecel", -1.0, false);
226  bool specifiedAny = false;
227 
228  if (changeRate == -1.0) {
229  changeRate = DEFAULT_OPENGAP_CHANGERATE;
230  } else {
231  specifiedAny = true;
232  }
233  if (maxDecel == -1.0) {
234  maxDecel = DEFAULT_OPENGAP_MAXDECEL;
235  } else {
236  specifiedAny = true;
237  }
238  if (specifiedAny && timegap == -1 && spacing == -1) {
239  WRITE_ERROR("If any openGap parameters for the ToC model are specified, then at least one of toc.ogNewTimeHeadway and toc.ogNewSpaceHeadway must be defined.")
240  }
241  if (timegap == -1) {
242  timegap = DEFAULT_OPENGAP_TIMEGAP;
243  } else {
244  specifiedAny = true;
245  }
246  if (spacing == -1) {
247  spacing = DEFAULT_OPENGAP_SPACING;
248  } else {
249  specifiedAny = true;
250  }
251 #ifdef DEBUG_TOC
252  std::cout << "Parsed openGapParams: \n"
253  << " timegap=" << timegap
254  << ", spacing=" << spacing
255  << ", changeRate=" << changeRate
256  << ", maxDecel=" << maxDecel
257  << std::endl;
258 #endif
259  return OpenGapParams(timegap, spacing, changeRate, maxDecel, specifiedAny);
260 }
261 
262 // ---------------------------------------------------------------------------
263 // MSDevice_ToC-methods
264 // ---------------------------------------------------------------------------
265 MSDevice_ToC::MSDevice_ToC(SUMOVehicle& holder, const std::string& id, const std::string& outputFilename,
266  const std::string& manualType, const std::string& automatedType, SUMOTime responseTime, double recoveryRate,
267  double lcAbstinence, double initialAwareness, double mrmDecel,
268  double dynamicToCThreshold, double dynamicMRMProbability, double maxPreparationAccel,
269  bool mrmKeepRight, const std::string& mrmSafeSpot, SUMOTime mrmSafeSpotDuration, bool useColorScheme, OpenGapParams ogp) :
270  MSVehicleDevice(holder, id),
271  myManualTypeID(manualType),
272  myAutomatedTypeID(automatedType),
273  myResponseTime(responseTime),
274  myRecoveryRate(recoveryRate),
275  myLCAbstinence(lcAbstinence),
276  myInitialAwareness(initialAwareness),
277  myMRMDecel(mrmDecel),
278  myCurrentAwareness(1.),
279  myUseColorScheme(useColorScheme),
280  myTriggerMRMCommand(nullptr),
281  myTriggerToCCommand(nullptr),
282  myRecoverAwarenessCommand(nullptr),
283  myExecuteMRMCommand(nullptr),
284  myPrepareToCCommand(nullptr),
285  myOutputFile(nullptr),
286  myEvents(),
287  myEventLanes(),
288  myPreviousLCMode(-1),
289  myOpenGapParams(ogp),
290  myDynamicToCThreshold(dynamicToCThreshold),
291  myMRMProbability(dynamicMRMProbability),
292  myDynamicToCActive(dynamicToCThreshold > 0),
293  myIssuedDynamicToC(false),
294  myDynamicToCLane(-1),
295  myMRMKeepRight(mrmKeepRight),
296  myMRMSafeSpot(mrmSafeSpot),
297  myMRMSafeSpotDuration(mrmSafeSpotDuration),
298  myMaxPreparationAccel(maxPreparationAccel),
299  myOriginalMaxAccel(-1) {
300  // Take care! Holder is currently being constructed. Cast occurs before completion.
301  myHolderMS = static_cast<MSVehicle*>(&holder);
302 
303  if (outputFilename != "") {
304  myOutputFile = &OutputDevice::getDevice(outputFilename);
305  // TODO: make xsd, include header
306  // myOutputFile.writeXMLHeader("ToCDeviceLog", "ToCDeviceLog.xsd");
307  if (createdOutputFiles.count(outputFilename) == 0) {
308  myOutputFile->writeXMLHeader("ToCDeviceLog", "");
309  createdOutputFiles.insert(outputFilename);
310  }
311  }
312 
313  // Check if the given vTypes for the ToC Device are vTypeDistributions
315  const bool automatedVTypeIsDist = vehCtrl.hasVTypeDistribution(myAutomatedTypeID);
316  const bool manualVTypeIsDist = vehCtrl.hasVTypeDistribution(myManualTypeID);
317 
318  // Check if the vType of the holder matches one of the given vTypes
319  std::string holderVTypeID = holder.getVehicleType().getID();
320  if (holderVTypeID == myManualTypeID) {
321  myState = ToCState::MANUAL;
322  } else if (holderVTypeID == myAutomatedTypeID) {
323  myState = ToCState::AUTOMATED;
324  } else if (manualVTypeIsDist && vehCtrl.getVTypeDistributionMembership(holderVTypeID).count(myManualTypeID) > 0) {
325  // Holder type id is from the given manual type distribution.
326  myState = ToCState::MANUAL;
327  myManualTypeID = holderVTypeID;
328  } else if (automatedVTypeIsDist && vehCtrl.getVTypeDistributionMembership(holderVTypeID).count(myAutomatedTypeID) > 0) {
329  // Holder type id is from the given automated type distribution.
330  myState = ToCState::AUTOMATED;
331  myAutomatedTypeID = holderVTypeID;
332  } else {
333  throw ProcessError("Vehicle type of vehicle '" + holder.getID() + "' ('" +
334  holder.getVehicleType().getID() + "') must coincide with manualType ('" +
335  manualType + "') or automatedType ('" + automatedType +
336  "') specified for its ToC-device (or drawn from the specified vTypeDistributions).");
337  }
338  if (!vehCtrl.hasVType(myAutomatedTypeID)) {
339  throw ProcessError("The automated vehicle type '" + myAutomatedTypeID +
340  "' of vehicle '" + holder.getID() + "' is not known.");
341  }
342  if (!vehCtrl.hasVType(myManualTypeID)) {
343  throw ProcessError("The manual vehicle type '" + myManualTypeID +
344  "' of vehicle '" + holder.getID() + "' is not known.");
345  }
346 
347  // Eventually instantiate given vTypes from distributions
348  if (myState == ToCState::MANUAL && automatedVTypeIsDist) {
350  } else if (myState == ToCState::AUTOMATED && manualVTypeIsDist) {
352  }
353 
354  // register at static instance container
355  myInstances.insert(this);
356  initColorScheme();
357 
358 #ifdef DEBUG_TOC
359  std::cout << "initialized device '" << id << "' with "
360  << "outputFilename=" << outputFilename << ", "
361  << "myManualType=" << myManualTypeID << ", "
362  << "myAutomatedType=" << myAutomatedTypeID << ", "
363  << "myResponseTime=" << myResponseTime << ", "
364  << "myRecoveryRate=" << myRecoveryRate << ", "
365  << "myInitialAwareness=" << myInitialAwareness << ", "
366  << "myMRMDecel=" << myMRMDecel << ", "
367  << "ogTimeHeadway=" << myOpenGapParams.newTimeHeadway << ", "
368  << "ogSpaceHeadway=" << myOpenGapParams.newSpaceHeadway << ", "
369  << "ogChangeRate=" << myOpenGapParams.changeRate << ", "
370  << "ogMaxDecel=" << myOpenGapParams.maxDecel << ", "
371  << "ogActive=" << myOpenGapParams.active << ", "
372  << "myCurrentAwareness=" << myCurrentAwareness << ", "
373  << "myState=" << _2string(myState) << std::endl;
374 #endif
375 
376  assert(myInitialAwareness <= 1.0 && myInitialAwareness >= 0.0);
377 }
378 
379 
380 
381 void
383  //RGBColor(red, green, blue)
386  myColorScheme[PREPARING_TOC] = RGBColor(200, 200, 250); // light blue
387  myColorScheme[MRM] = RGBColor(250, 50, 50); // red
388  myColorScheme[RECOVERING] = RGBColor(250, 210, 150); // light yellow
389  myColorScheme[UNDEFINED] = RGBColor(150, 150, 150); // gray
390 }
391 
392 
394  // unregister from static instance container
395  myInstances.erase(this);
396  // deschedule commands associated to this device
397  if (myTriggerMRMCommand != nullptr) {
399  }
400  if (myTriggerToCCommand != nullptr) {
402  }
403  if (myRecoverAwarenessCommand != nullptr) {
405  }
406  if (myExecuteMRMCommand != nullptr) {
409  }
410  if (myPrepareToCCommand != nullptr) {
412  }
413 }
414 
415 void
417  if (value > 1.0 || value < 0.0) {
418  std::stringstream ss;
419  ss << "Truncating invalid value for awareness (" << value << ") to lie in [0,1].";
420  WRITE_WARNING(ss.str());
421  value = MAX2(0.0, MIN2(1.0, value));
422  }
424  // Awareness is now below LC abstinence level -> prevent deliberate LCs
426  } else if (myCurrentAwareness < myLCAbstinence && value >= myLCAbstinence) {
427  // Awareness is now above LC abstinence level -> allow deliberate LCs
429  }
430  myCurrentAwareness = value;
431  myHolderMS->getDriverState()->setAwareness(value);
432 }
433 
434 
435 void
437 #ifdef DEBUG_TOC
438  std::cout << SIMTIME << " MSDevice_ToC::setState()" << std::endl;
439 #endif
440  if (myState == state) {
441  // No state change
442  return;
443  }
444 
445  if (myState == MRM) {
446  // reset the vehicle's maxAccel
449  } else if (myState == PREPARING_TOC) {
450  if (myOpenGapParams.active) {
451  // Deactivate gap control at preparation phase end
453  }
454  if (state != MRM) {
455  // Aborting preparation
458  }
459  } else if (state == PREPARING_TOC || state == MRM) {
460 #ifdef DEBUG_TOC
461  std::cout << " Entering ToC preparation... " << std::endl;
462 #endif
463  // Prevent lane changing during takeover preparation
465  // Store original value of maxAccel for restoring it after preparation phase
467  // Impose acceleration limit during preparation
469  }
470 
471  if (myIssuedDynamicToC) {
472  // Reset dynamic ToC flag
473  myIssuedDynamicToC = false;
474  }
475 
476  myState = state;
477  if (myUseColorScheme) {
478  setVehicleColor();
479  }
480 }
481 
482 void
487 }
488 
489 void
491  // Remove any preparatory process
493  // .. and any recovery process
495  // ... and any pending ToC to manual
496  descheduleToC();
497  // Immediately trigger the MRM process
498  triggerMRM(0);
499 }
500 
501 
502 void
503 MSDevice_ToC::requestToC(SUMOTime timeTillMRM, SUMOTime responseTime) {
504 #ifdef DEBUG_TOC
505  std::cout << SIMTIME << " requestToC() for vehicle '" << myHolder.getID() << "', timeTillMRM=" << timeTillMRM << ", responseTime=" << responseTime << std::endl;
506 #endif
507  if (myState == AUTOMATED) {
508  // Initialize preparation phase
509  if (responseTime == -1000) {
510  // Sample response time from distribution
511  responseTime = TIME2STEPS(sampleResponseTime(STEPS2TIME(timeTillMRM)));
512  }
513 
514  // Schedule ToC Event
517 
518  assert(myExecuteMRMCommand == nullptr);
519  assert(myTriggerMRMCommand == nullptr);
520  if (responseTime > timeTillMRM && myState != MRM) {
521  // Schedule new MRM if driver response time is higher than permitted
524  }
525 
526  // Start ToC preparation process
530  if (myOpenGapParams.active) {
531  // Start gap controller
532  double originalTau = myHolderMS->getCarFollowModel().getHeadwayTime();
536  }
537  // Record event
538  if (generatesOutput()) {
539  myEvents.push(std::make_pair(SIMSTEP, "TOR"));
540  myEventLanes.push(std::make_pair(myHolder.getLane()->getID(), myHolder.getPositionOnLane())); // add lane and lanepos
541  }
542  } else {
543  // Switch to automated mode is performed immediately
544  if (timeTillMRM > 0.) {
545  std::stringstream ss;
546  ss << "[t=" << SIMTIME << "] Positive transition time (" << timeTillMRM / 1000. << "s.) for upward ToC of vehicle '" << myHolder.getID() << "' is ignored.";
547  WRITE_WARNING(ss.str());
548  }
550  }
551 }
552 
553 
554 SUMOTime
556 #ifdef DEBUG_TOC
557  std::cout << SIMTIME << " triggerMRM() for vehicle '" << myHolder.getID() << "'" << std::endl;
558 #endif
559  // Clear ongoing MRM
560  descheduleMRM();
561 
562  // Start MRM process
563  if (myMRMSafeSpot != "") {
566  if (s == nullptr) {
567  WRITE_WARNING("Ignoring unknown safe spot '" + myMRMSafeSpot + "' for vehicle '" + myHolder.getID() + "'.");
568  } else {
569  stop.parkingarea = myMRMSafeSpot;
570  stop.parking = true;
571  stop.lane = s->getLane().getID();
572  stop.endPos = s->getEndLanePosition();
573  stop.startPos = s->getBeginLanePosition();
576  std::string error;
577  if (!myHolder.addStop(stop, error)) {
578  WRITE_WARNING("Could not set safe spot '" + myMRMSafeSpot + "' for vehicle '" + myHolder.getID() + "'. " + error);
579  }
580  }
581  } else {
584  }
585  if (myState == MANUAL || myState == RECOVERING) {
587  }
588  setState(MRM);
589  setAwareness(1.);
590 
591  // Record event
592  if (generatesOutput()) {
593  myEvents.push(std::make_pair(SIMSTEP, "MRM"));
594  myEventLanes.push(std::make_pair(myHolder.getLane()->getID(), myHolder.getPositionOnLane())); // add lane and lanepos
595  }
596 
597  return 0;
598 }
599 
600 
601 SUMOTime
603 #ifdef DEBUG_TOC
604  std::cout << SIMTIME << " triggerUpwardToC() for vehicle '" << myHolder.getID() << "'" << std::endl;
605 #endif
606  descheduleToC();
607  // Eventually stop ToC preparation process
609  // Eventually abort MRM
610  descheduleMRM();
611  // Eventually abort awareness recovery process
613 
614  if (myState == MANUAL || myState == RECOVERING) {
616  }
617  setAwareness(1.);
619 
620  // Record event
621  if (generatesOutput()) {
622  myEvents.push(std::make_pair(SIMSTEP, "ToCup"));
623  myEventLanes.push(std::make_pair(myHolder.getLane()->getID(), myHolder.getPositionOnLane())); // add lane and lanepos
624  }
625 
626  return 0;
627 }
628 
629 
630 SUMOTime
632 #ifdef DEBUG_TOC
633  std::cout << SIMTIME << " triggerDownwardToC() for vehicle '" << myHolder.getID() << "'" << std::endl;
634 #endif
635  descheduleToC();
636  // Eventually stop ToC preparation process
638  // Eventually abort MRM
639  descheduleMRM();
640 
641 #ifdef DEBUG_TOC
642  std::cout << SIMTIME << " Initial awareness after ToC: " << myCurrentAwareness << std::endl;
643 #endif
644 
645  // Start awareness recovery process
649 
650  // @todo: Sample initial awareness
651  double initialAwareness = myInitialAwareness;
652  setAwareness(initialAwareness);
653 
655 
656  // Record event
657  if (generatesOutput()) {
658  myEvents.push(std::make_pair(SIMSTEP, "ToCdown"));
659  myEventLanes.push(std::make_pair(myHolder.getLane()->getID(), myHolder.getPositionOnLane())); // add lane and lanepos
660  }
661  return 0;
662 }
663 
664 void
666  // Eventually abort scheduled MRM
667  if (myTriggerMRMCommand != nullptr) {
669  myTriggerMRMCommand = nullptr;
670  }
671  // Eventually abort ongoing MRM
672  if (myExecuteMRMCommand != nullptr) {
675  myExecuteMRMCommand = nullptr;
676  }
677 }
678 
679 
680 void
682  if (myTriggerToCCommand != nullptr) {
684  myTriggerToCCommand = nullptr;
685  }
686 }
687 
688 void
690  // Eventually stop ToC preparation process
691  if (myPrepareToCCommand != nullptr) {
693  if (myState != MRM) {
695  }
696  myPrepareToCCommand = nullptr;
697  }
698 }
699 
700 void
702  // Eventually stop ToC preparation process
703  if (myRecoverAwarenessCommand != nullptr) {
705  myRecoverAwarenessCommand = nullptr;
706  }
707 }
708 
709 
710 void
711 MSDevice_ToC::switchHolderType(const std::string& targetTypeID) {
712 #ifdef DEBUG_TOC
713  std::cout << SIMTIME << " Switching type of vehicle '" << myHolder.getID() << "' to '" << targetTypeID << "'" << std::endl;
714 #endif
715  MSVehicleType* targetType = MSNet::getInstance()->getVehicleControl().getVType(targetTypeID);
716  if (targetType == nullptr) {
717  WRITE_ERROR("vType '" + targetType->getID() + "' for vehicle '" + myHolder.getID() + "' is not known.");
718  return;
719  }
720  myHolderMS->replaceVehicleType(targetType);
721 }
722 
723 
724 SUMOTime
726 #ifdef DEBUG_TOC
727  std::cout << SIMTIME << " ToC preparation step for vehicle '" << myHolder.getID() << "'" << std::endl;
728 #endif
729  if (myState == PREPARING_TOC) {
730  return DELTA_T;
731  } else {
732 #ifdef DEBUG_TOC
733  std::cout << SIMTIME << " Aborting ToC preparation for vehicle '" << myHolder.getID() << "'" << std::endl;
734 #endif
736  return 0;
737  }
738 }
739 
740 
741 SUMOTime
744  const double currentSpeed = myHolderMS->getSpeed();
745 #ifdef DEBUG_TOC
746  std::cout << SIMTIME << " MRM step for vehicle '" << myHolder.getID() << "', currentSpeed=" << currentSpeed << std::endl;
747 #endif
748 
749  // Induce slowdown with MRMDecel
750  std::vector<std::pair<SUMOTime, double> > speedTimeLine;
751  const double nextSpeed = MAX2(0., currentSpeed - ACCEL2SPEED(myMRMDecel));
752  speedTimeLine.push_back(std::make_pair(t - DELTA_T, currentSpeed));
753  speedTimeLine.push_back(std::make_pair(t, nextSpeed));
754  myHolderMS->getInfluencer().setSpeedTimeLine(speedTimeLine);
755 
756  if (myMRMKeepRight) {
757  // Try to change to the right
758  std::vector<std::pair<SUMOTime, int> > laneTimeLine;
759  laneTimeLine.push_back(std::make_pair(MSNet::getInstance()->getCurrentTimeStep(), 0));
760  laneTimeLine.push_back(std::make_pair(MSNet::getInstance()->getCurrentTimeStep() + 1, 0));
761  myHolderMS->getInfluencer().setLaneTimeLine(laneTimeLine);
762 // std::cout << "Keeping right..." << std::endl;
763  }
764 
765  if (myState == MRM) {
766  return DELTA_T;
767  } else {
768 #ifdef DEBUG_TOC
769  std::cout << SIMTIME << " Aborting MRM for vehicle '" << myHolder.getID() << "'" << std::endl;
770 #endif
772  return 0;
773  }
774 }
775 
776 
777 SUMOTime
779 #ifdef DEBUG_TOC
780  std::cout << SIMTIME << " Awareness recovery step for vehicle '" << myHolder.getID() << "'" << std::endl;
781 #endif
782  // Proceed with awareness recovery
783  if (myCurrentAwareness < 1.0) {
785  }
786 
787 #ifdef DEBUG_TOC
788  std::cout << SIMTIME << " currentAwareness = " << myCurrentAwareness << std::endl;
789 #endif
790 
791  const bool awarenessRecoveryCompleted = myCurrentAwareness == 1.0;
792  if (awarenessRecoveryCompleted) {
793 #ifdef DEBUG_TOC
794  std::cout << SIMTIME << " Awareness recovery completed for veh '" << myHolder.getID() << "'" << std::endl;
795 #endif
797  myRecoverAwarenessCommand = nullptr;
798  setState(MANUAL);
799  return 0;
800  }
801  return DELTA_T;
802 }
803 
804 bool
806  double /*oldPos*/,
807  double /*newPos*/,
808  double /*newSpeed*/) {
809  if (myState == AUTOMATED && checkDynamicToC()) {
810  // Initiate a ToC
811  // Record event
812  if (generatesOutput()) {
813  myEvents.push(std::make_pair(SIMSTEP, "DYNTOR"));
814  myEventLanes.push(std::make_pair(myHolder.getLane()->getID(), myHolder.getPositionOnLane())); // add lane and lanepos
815  }
816  // Leadtime for dynamic ToC is proportional to the time assumed for the dynamic ToC threshold
817  const double leadTime = myDynamicToCThreshold * 1000 * DYNAMIC_TOC_LEADTIME_FACTOR;
818  requestToC((SUMOTime) leadTime);
819  // TODO: Alter the response time according to the given lead time. Consider re-sampling it at each call of requestToC(). (Conditional to whether a non-negative response time was given in the configuration)
820  myIssuedDynamicToC = true;
822  } else if (myIssuedDynamicToC && myState == PREPARING_TOC && !checkDynamicToC()) {
823  // Abort dynamic ToC, FIXME: This could abort an externally requested ToC in rare occasions... (needs test)
824  // Record event
825  if (generatesOutput()) {
826  myEvents.push(std::make_pair(SIMSTEP, "DYNTOR"));
827  myEventLanes.push(std::make_pair(myHolder.getLane()->getID(), myHolder.getPositionOnLane())); // add lane and lanepos
828  }
829  // NOTE: This should not occur if lane changing is prevented during ToC preparation...
830  // TODO: Reset response time to the original value (unnecessary if re-sampling for each call to requestToC)
831  triggerUpwardToC(0);
832  }
833  return true;
834 }
835 
836 std::string
837 MSDevice_ToC::getParameter(const std::string& key) const {
838  if (key == "manualType") {
839  return myManualTypeID;
840  } else if (key == "automatedType") {
841  return myAutomatedTypeID;
842  } else if (key == "responseTime") {
844  } else if (key == "recoveryRate") {
845  return toString(myRecoveryRate);
846  } else if (key == "initialAwareness") {
848  } else if (key == "mrmDecel") {
849  return toString(myMRMDecel);
850  } else if (key == "currentAwareness") {
852  } else if (key == "lcAbstinence") {
853  return toString(myLCAbstinence);
854  } else if (key == "state") {
855  return _2string(myState);
856  } else if (key == "holder") {
857  return myHolder.getID();
858  } else if (key == "hasDynamicToC") {
860  } else if (key == "dynamicToCThreshold") {
862  } else if (key == "dynamicMRMProbability") {
863  return toString(myMRMProbability);
864  } else if (key == "mrmKeepRight") {
865  return toString(myMRMKeepRight);
866  } else if (key == "mrmSafeSpot") {
867  return myMRMSafeSpot;
868  } else if (key == "mrmSafeSpotDuration") {
870  } else if (key == "maxPreparationAccel") {
872  } else if (key == "ogNewTimeHeadway") {
874  } else if (key == "ogNewSpaceHeadway") {
876  } else if (key == "ogChangeRate") {
878  } else if (key == "ogMaxDecel") {
880  }
881  throw InvalidArgument("Parameter '" + key + "' is not supported for device of type '" + deviceName() + "'");
882 }
883 
884 
885 void
886 MSDevice_ToC::setParameter(const std::string& key, const std::string& value) {
887 #ifdef DEBUG_TOC
888  std::cout << SIMTIME << " MSDevice_ToC::setParameter(key=" << key << ", value=" << value << ")" << std::endl;
889 #endif
890  if (key == "manualType") {
891  myManualTypeID = value;
893  if (myState == MANUAL) {
894  switchHolderType(value);
895  }
896  } else if (key == "automatedType") {
897  myAutomatedTypeID = value;
899  if (myState == AUTOMATED || myState == PREPARING_TOC || myState == MRM) {
900  switchHolderType(value);
901  }
902  } else if (key == "responseTime") {
904  } else if (key == "recoveryRate") {
906  } else if (key == "initialAwareness") {
908  } else if (key == "lcAbstinence") {
910  if (isManuallyDriven()) {
911  setAwareness(myCurrentAwareness); // to eventually trigger LC-prevention
912  }
913  } else if (key == "currentAwareness") {
914  if (isManuallyDriven()) {
916  } else {
917  WRITE_WARNING("Setting device.toc.currentAwareness during automated mode has no effect.")
918  }
919  } else if (key == "mrmDecel") {
921  } else if (key == "requestToC") {
922  // setting this magic parameter gives the interface for inducing a ToC
923  const SUMOTime timeTillMRM = TIME2STEPS(StringUtils::toDouble(value));
924  requestToC(timeTillMRM, myResponseTime);
925  } else if (key == "requestMRM") {
926  // setting this magic parameter gives the interface for inducing an MRM
927  requestMRM();
928  } else if (key == "awareness") {
929  // setting this magic parameter gives the interface for setting the driverstate's awareness
931  } else if (key == "dynamicToCThreshold") {
932  const double newValue = StringUtils::toDouble(value);
933  if (newValue < 0) {
934  WRITE_WARNING("Value of dynamicToCThreshold must be non-negative. (Given value " + value + " for vehicle " + myHolderMS->getID() + " is ignored)");
935  } else if (newValue == 0) {
936  myDynamicToCThreshold = newValue;
937  myDynamicToCActive = false;
938  } else {
939  myDynamicToCThreshold = newValue;
940  myDynamicToCActive = true;
941  }
942  } else if (key == "dynamicMRMProbability") {
943  const double newValue = StringUtils::toDouble(value);
944  if (newValue < 0) {
945  WRITE_WARNING("Value of dynamicMRMProbability must be non-negative. (Given value " + value + " for vehicle " + myHolderMS->getID() + " is ignored)");
946  } else {
947  myMRMProbability = newValue;
948  }
949  } else if (key == "mrmKeepRight") {
950  const bool newValue = StringUtils::toBool(value);
951  myMRMKeepRight = newValue;
952  } else if (key == "mrmSafeSpot") {
953  myMRMSafeSpot = value;
954  } else if (key == "mrmSafeSpotDuration") {
956  } else if (key == "maxPreparationAccel") {
957  const double newValue = StringUtils::toDouble(value);
958  if (newValue < 0) {
959  WRITE_WARNING("Value of maxPreparationAccel must be non-negative. (Given value " + value + " for vehicle " + myHolderMS->getID() + " is ignored)");
960  } else {
961  myMaxPreparationAccel = newValue;
962  }
963  } else {
964  throw InvalidArgument("Parameter '" + key + "' is not supported for device of type '" + deviceName() + "'");
965  }
966 }
967 
968 
970 MSDevice_ToC::_2ToCState(const std::string& str) {
971  if (str == "UNDEFINED") {
972  return UNDEFINED;
973  } else if (str == "MANUAL") {
974  return MANUAL;
975  } else if (str == "AUTOMATED") {
976  return AUTOMATED;
977  } else if (str == "PREPARING_TOC") {
978  return PREPARING_TOC;
979  } else if (str == "MRM") {
980  return MRM;
981  } else if (str == "RECOVERING") {
982  return RECOVERING;
983  } else {
984  WRITE_WARNING("Unknown ToCState '" + str + "'");
985  return UNDEFINED;
986  }
987 }
988 
989 
990 std::string
992  if (state == UNDEFINED) {
993  return "UNDEFINED";
994  } else if (state == MANUAL) {
995  return "MANUAL";
996  } else if (state == AUTOMATED) {
997  return "AUTOMATED";
998  } else if (state == PREPARING_TOC) {
999  return "PREPARING_TOC";
1000  } else if (state == MRM) {
1001  return "MRM";
1002  } else if (state == RECOVERING) {
1003  return "RECOVERING";
1004  } else {
1005  WRITE_WARNING("Unknown ToCState '" + toString(state) + "'");
1006  return toString(state);
1007  }
1008 }
1009 
1010 
1011 void
1013  if (!generatesOutput()) {
1014  assert(myEvents.empty());
1015  return;
1016  }
1017  while (!myEvents.empty()) {
1018  std::pair<SUMOTime, std::string>& e = myEvents.front();
1019  std::pair<std::string, double>& l = myEventLanes.front();
1020  myOutputFile->openTag(e.second);
1021  myOutputFile->writeAttr("id", myHolder.getID()).writeAttr("t", STEPS2TIME(e.first));
1022  myOutputFile->writeAttr("lane", l.first).writeAttr("lanePos", STEPS2TIME(l.second));
1024  myEvents.pop();
1025  myEventLanes.pop();
1026  }
1027 }
1028 
1029 
1030 void
1032  // Close xml bodies for all existing files
1033  // TODO: Check if required
1034  for (auto& fn : createdOutputFiles) {
1036  file->closeTag();
1037  }
1038 }
1039 
1040 
1041 void
1043  if (myPreviousLCMode != -1) {
1045 #ifdef DEBUG_TOC
1046  std::cout << SIMTIME << " MSDevice_ToC::resetLCMode() restoring LC Mode of vehicle '" << myHolder.getID() << "' to " << myPreviousLCMode << std::endl;
1047 #endif
1048  }
1049  myPreviousLCMode = -1;
1050 }
1051 
1052 
1053 void
1055  const int lcModeHolder = myHolderMS->getInfluencer().getLaneChangeMode();
1056  if (lcModeHolder != LCModeMRM) {
1057  myPreviousLCMode = lcModeHolder;
1058 #ifdef DEBUG_TOC
1059  std::cout << SIMTIME << " MSDevice_ToC::setLCModeMRM() setting LC Mode of vehicle '" << myHolder.getID()
1060  << "' from " << myPreviousLCMode << " to " << LCModeMRM << std::endl;
1061 #endif
1063  }
1064 }
1065 
1066 bool
1068  return (myState == MANUAL || myState == RECOVERING);
1069 }
1070 
1071 bool
1073  return (myState == AUTOMATED || myState == PREPARING_TOC || myState == MRM);
1074 }
1075 
1076 bool
1078 #ifdef DEBUG_DYNAMIC_TOC
1079  std::cout << SIMTIME << " # MSDevice_ToC::checkDynamicToC() for veh '" << myHolder.getID() << "'" << std::endl;
1080 #endif
1081  if (!myDynamicToCActive) {
1082  return false;
1083  }
1084  // The vehicle's current lane
1085  const MSLane* currentLane = myHolderMS->getLane();
1086 
1087  if (currentLane->isInternal()) {
1088  // Don't start or abort dynamic ToCs on internal lanes
1089  return myIssuedDynamicToC;
1090  }
1091 
1092  if (myIssuedDynamicToC) {
1093 #ifdef DEBUG_DYNAMIC_TOC
1094  std::cout << SIMTIME << " Dynamic ToC is ongoing." << std::endl;
1095 #endif
1096  // Dynamic ToC in progress. Resist to aborting it if lane was not changed.
1097  if (myDynamicToCLane == currentLane->getNumericalID()) {
1098  return true;
1099  }
1100  }
1101  // Length for which the current route can be followed
1102  const std::vector<MSVehicle::LaneQ>& bestLanes = myHolderMS->getBestLanes();
1103  // Maximal distance for route continuation without LCs over the possible start lanes
1104  double maximalContinuationDistance = 0;
1105  // Distance for route continuation without LCs from the vehicle's current lane
1106  double continuationDistanceOnCurrent = 0;
1107  // Lane of the next stop
1108  const MSLane* nextStopLane = nullptr;
1109 
1110  if (myHolderMS->hasStops()) {
1111  nextStopLane = myHolderMS->getNextStop().lane;
1112  }
1113  for (auto& i : bestLanes) {
1114  maximalContinuationDistance = MAX2(maximalContinuationDistance, i.length);
1115  if (currentLane == i.lane) {
1116  if (myHolderMS->hasStops()) {
1117  // Check if the next stop lies on the route continuation from the current lane
1118  for (MSLane* l : i.bestContinuations) {
1119  if (l == nextStopLane) {
1120 #ifdef DEBUG_DYNAMIC_TOC
1121  std::cout << SIMTIME << " Stop found on the route continuation from the current lane. => No ToC" << std::endl;
1122 #endif
1123  // Stop found on the route continuation from the current lane => no ToC necessary
1124  return false;
1125  }
1126  }
1127  }
1128  continuationDistanceOnCurrent = i.length;
1129  }
1130  }
1131  if (continuationDistanceOnCurrent == maximalContinuationDistance) {
1132  // There is no better lane than the current, hence no desire to change lanes,
1133  // which the driver could pursue better than the automation => no reason for ToC.
1134  return false;
1135  }
1136  const double distFromCurrent = continuationDistanceOnCurrent - myHolderMS->getPositionOnLane();
1137  const double MRMDist = 0.5 * myHolderMS->getSpeed() * myHolderMS->getSpeed() / MAX2(myMRMDecel, 0.0001);
1138  double distThreshold = myHolderMS->getSpeed() * myDynamicToCThreshold + MRMDist;
1139 #ifdef DEBUG_DYNAMIC_TOC
1140  std::cout << " speed=" << myHolderMS->getSpeed()
1141  << ", distFromCurrent=" << distFromCurrent
1142  << ", maximal dist=" << maximalContinuationDistance - myHolderMS->getPositionOnLane()
1143  << ", distThreshold=" << distThreshold
1144  << std::endl;
1145 #endif
1146 
1147  if (myIssuedDynamicToC) {
1148  // In case of an ongoing ToC, add an additional resistance to abort it.
1149  // (The lane-check above does not capture lanes subsequent to the dynamic ToC lane)
1150  distThreshold *= DYNAMIC_TOC_ABORT_RESISTANCE_FACTOR;
1151  }
1152 
1153  if (distFromCurrent < distThreshold) {
1154  // TODO: Make this more sophisticated in dealing with low speeds/stops and route ends
1155 #ifdef DEBUG_DYNAMIC_TOC
1156  std::cout << SIMTIME << " * distAlongBest is below threshold! *" << std::endl;
1157 #endif
1158  return true;
1159  }
1160 
1161  return false;
1162 }
1163 
1164 double
1165 MSDevice_ToC::sampleResponseTime(double leadTime) const {
1166 #ifdef DEBUG_DYNAMIC_TOC
1167  std::cout << "sampleResponseTime() leadTime=" << leadTime << std::endl;
1168 #endif
1169  const double mean = responseTimeMean(leadTime);
1170  const double var = interpolateVariance(leadTime, myMRMProbability);
1171  std::normal_distribution<double> d(mean, var);
1172  double rt = d(myResponseTimeRNG);
1173 #ifdef DEBUG_DYNAMIC_TOC
1174  std::cout << " mean=" << mean << ", variance=" << var << " => sampled responseTime=" << rt << std::endl;
1175 #endif
1176  int it_count = 0;
1177  while (rt < 0 && it_count < MAX_RESPONSETIME_SAMPLE_TRIES) {
1178  rt = d(myResponseTimeRNG);
1179  it_count++;
1180  }
1181  if (rt < 0) {
1182  // Didn't generate a positive random response time => use mean
1183  rt = mean;
1184  }
1185  return rt;
1186 }
1187 
1188 double
1189 MSDevice_ToC::interpolateVariance(double leadTime, double pMRM) {
1190 #ifdef DEBUG_DYNAMIC_TOC
1191  std::cout << "interpolateVariance() leadTime=" << leadTime << ", pMRM=" << pMRM << std::endl;
1192 #endif
1193  // Calculate indices for surrounding values in lookup tables
1194 
1195  // Find largest p_{i-1} < pMRM < p_{i}
1196  const auto pi = std::lower_bound(lookupResponseTimeMRMProbs.begin(), lookupResponseTimeMRMProbs.end(), pMRM);
1197  if (pi == lookupResponseTimeMRMProbs.end()) {
1198  // requested probability lies outside lookup table.
1199  // => return maximal variance value
1201  }
1202  const size_t pi1 = pi - lookupResponseTimeMRMProbs.begin();
1203  assert(pi1 > 0);
1204  const size_t pi0 = pi1 - 1;
1205  const double cp = (pMRM - * (pi - 1)) / (*pi - * (pi - 1));
1206 
1207 #ifdef DEBUG_DYNAMIC_TOC
1208  std::cout << " p[=" << pi0 << "]=" << *(pi - 1) << ", p[=" << pi1 << "]=" << *pi << " => cp=" << cp << std::endl;
1209 #endif
1210 
1211  // Find largest p_{i-1} < pMRM < p_{i}
1212  auto li = std::lower_bound(lookupResponseTimeLeadTimes.begin(), lookupResponseTimeLeadTimes.end(), leadTime);
1213  if (li == lookupResponseTimeLeadTimes.begin()) {
1214  // Given lead time smaller than minimal lookup-value.
1215  // Use minimal value from lookup table instead
1216  leadTime = *li;
1217  li = lookupResponseTimeLeadTimes.begin() + 1;
1218  } else if (li == lookupResponseTimeLeadTimes.end()) {
1219  // Given leadTime exceeds values in lookup table
1220  // => induce extrapolation
1221  li--;
1222  }
1223  const size_t li1 = li - lookupResponseTimeLeadTimes.begin();
1224  const size_t li0 = li1 - 1;
1225  const double cl = (leadTime - * (li - 1)) / (*li - * (li - 1));
1226 
1227 #ifdef DEBUG_DYNAMIC_TOC
1228  std::cout << " l[=" << li0 << "]=" << *(li - 1) << ", l[=" << li1 << "]=" << *li << " => cp=" << cl << std::endl;
1229 #endif
1230 
1231  // 2D interpolation for variance
1232  // First, interpolate (or extrapolate) variances along leadTimes
1233  const double var00 = lookupResponseTimeVariances[pi0][li0];
1234  const double var01 = lookupResponseTimeVariances[pi0][li1];
1235  const double var10 = lookupResponseTimeVariances[pi1][li0];
1236  const double var11 = lookupResponseTimeVariances[pi1][li1];
1237  const double var_0 = var00 + (var01 - var00) * cl;
1238  const double var_1 = var10 + (var11 - var10) * cl;
1239  // From these, interpolate along the pMRM-axis
1240  const double var = var_0 + (var_1 - var_0) * cp;
1241 #ifdef DEBUG_DYNAMIC_TOC
1242  std::cout << " var00=" << var00 << ", var01=" << var01 << " var10=" << var10 << ", var11=" << var11
1243  << " var_0=" << var_0 << ", var_1=" << var_1 << ", var=" << var << std::endl;
1244 #endif
1245  return var;
1246 }
1247 
1248 // Grid of the response time distribution.
1249 // Generated by the script generateResponseTimeDistributions.py, see Appendix to TransAID Deliverable 3.1v2.
1250 // Probability for an MRM to occur (start with 0.0, end with 0.5)
1251 std::vector<double> MSDevice_ToC::lookupResponseTimeMRMProbs = {0.0, 0.05, 0.1, 0.15000000000000002, 0.2, 0.25, 0.30000000000000004, 0.35000000000000003, 0.4, 0.45, 0.5};
1252 // Lead time grid
1253 std::vector<double> MSDevice_ToC::lookupResponseTimeLeadTimes = {0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.7999999999999999, 0.8999999999999999, 0.9999999999999999, 1.0999999999999999, 1.2, 1.3, 1.4, 1.5, 1.5999999999999999, 1.7, 1.8, 1.9, 2.0, 2.25, 2.5, 2.75, 3.0, 3.25, 3.5, 3.75, 4.0, 4.25, 4.5, 4.75, 5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 9.5, 10.0, 10.5, 11.0, 11.5, 12.0, 12.5, 13.0, 13.5, 14.0, 14.5, 15.0, 15.5, 16.0, 16.5, 17.0, 17.5, 18.0, 18.5, 19.0, 19.5, 20.0, 21.0, 22.0, 23.0, 24.0, 25.0, 26.0, 27.0, 28.0, 29.0, 30.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 41.0, 42.0, 43.0, 44.0, 45.0, 46.0, 47.0, 48.0, 49.0, 50.0};
1254 
1255 // Variances of the response time distribution.
1256 std::vector<std::vector<double> > MSDevice_ToC::lookupResponseTimeVariances = {
1257  {0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001},
1258  {0.018238371642696278, 0.03647674328603705, 0.054715114926535656, 0.07295348656987645, 0.09119185821321724, 0.10943022985371582, 0.12766860149705656, 0.14590697314039733, 0.16414534478089599, 0.18238371642423673, 0.2006220880675775, 0.21886045971091828, 0.2370988313514169, 0.25533720299475765, 0.27357557463809845, 0.291813946278597, 0.3100523179219377, 0.32829068956527846, 0.3465290612057772, 0.36476743284911795, 0.4103633619560487, 0.45595929106297967, 0.5015552201670682, 0.5471511492739992, 0.59274707838093, 0.6383430074850186, 0.6839389365919495, 0.7295348656988803, 0.7751307948058112, 0.8207267239098999, 0.8663226530168309, 0.9119185821237615, 1.003110440334781, 1.0943022985486428, 1.1854941567596624, 1.2766860149735242, 1.3678778731845436, 1.4590697313984053, 1.622588042723657, 1.8236013818166044, 2.0271872430355344, 2.2329896377033402, 2.440681612959606, 2.6499766330096066, 2.8606328744048484, 3.0724517481497657, 3.285273075453899, 3.4989689745182173, 3.713437758931686, 3.928598499444084, 4.144386478335934, 4.360749535794346, 4.577645204319768, 4.795038495182951, 5.012900204026633, 5.231205620052272, 5.449933544477286, 5.669065543877604, 5.888585381094657, 6.108478580034079, 6.328732091514834, 6.5493340353396325, 6.991540386888257, 7.4350193801571836, 7.8797023900653835, 8.325528107903486, 8.772441019472117, 9.220390365425358, 9.66932940241786, 10.11921485679467, 10.570006505095746, 11.021666840703753, 11.474160800924851, 11.927455537955435, 12.381520222795276, 12.836325874663427, 13.291845210806684, 13.748052512926236, 14.204923507573522, 14.662435258383752, 15.120566068535554, 15.57929539219183, 16.03860375377652, 16.498472674274336, 16.958884603774735, 17.41982285960362, 17.881271569514066, 18.343215619413176, 18.805640605235663, 19.268532788517863, 19.731879055399546, 20.195666878723525},
1259  {0.023394708584543455, 0.04678941716973141, 0.07018412575207719, 0.09357883433726513, 0.11697354292245306, 0.14036825150764104, 0.16376296009282898, 0.18715766867517475, 0.2105523772603627, 0.23394708584555063, 0.25734179443073857, 0.2807365030130844, 0.3041312115982723, 0.3275259201834602, 0.3509206287686481, 0.37431533735099387, 0.3977100459361818, 0.42110475452136986, 0.4444994631065578, 0.46789417168890357, 0.5263809431504523, 0.5848677146120012, 0.6433544860735498, 0.7018412575350985, 0.7603280289966473, 0.8188148004581961, 0.8773015719197449, 0.9357883433784517, 0.9942751148400004, 1.0527618863015489, 1.111248657763098, 1.169735429224647, 1.2867089721477445, 1.4036825150708419, 1.520656057991097, 1.6376296009141948, 1.7546031438372918, 1.8715766867603902, 2.080324923070349, 2.3356056603653466, 2.592695753086048, 2.851065033244823, 3.110348235805368, 3.37030701064756, 3.630792243424829, 3.8917140872434826, 4.153020535352749, 4.414682984212653, 4.676686852454919, 4.939025633083471, 5.201697195938797, 5.4647015339779985, 5.728039423002128, 5.991711652753062, 6.255718611539178, 6.520060086487768, 6.784735192689795, 7.0497423770254475, 7.315079462951026, 7.580743715621537, 7.846731914823575, 8.113040428416943, 8.646602223970579, 9.181394311584102, 9.717379133745458, 10.25451769188949, 10.792770521511661, 11.332098388641393, 11.872462773672844, 12.41382619675905, 12.956152426938662, 13.499406606935544, 14.04355531739462, 14.588566598200957, 15.134409939740127, 15.681056253544272, 16.228477829207687, 16.776648282531472, 17.32554249848686, 17.875136571609353, 18.425407745596857, 18.976334353419617, 19.527895758814104, 20.080072299738145, 20.632845234156534, 21.18619668838177, 21.740109608063758, 22.294567711842525, 22.849555447666962, 23.405057951674344, 23.96106100953682, 24.517551020220964},
1260  {0.028809965676139145, 0.05761993135292278, 0.08642989702686427, 0.11523986270364789, 0.14404982838043154, 0.172859794054373, 0.20166975973115658, 0.23047972540794023, 0.2592896910818817, 0.2880996567586654, 0.31690962243544896, 0.34571958811223263, 0.37452955378617403, 0.4033395194629576, 0.4321494851397413, 0.4609594508136828, 0.4897694164904665, 0.51857938216725, 0.5473893478411916, 0.5761993135179752, 0.6482242277085132, 0.7202491418990512, 0.7922740560867471, 0.864298970277285, 0.9363238844678232, 1.0083487986555189, 1.0803737128460569, 1.152398627036595, 1.224423541227133, 1.296448455414829, 1.368473369605367, 1.4404982837959048, 1.584548112174139, 1.7285979405552145, 1.8726477689334486, 2.0166975973145242, 2.1607474256927586, 2.3047972540738346, 2.5572219533483644, 2.8623099438447785, 3.167154753839855, 3.4715923078311928, 3.775618300633292, 4.079301412505033, 4.3827364323759, 4.686020985499979, 4.989245061612653, 5.2924871133699085, 5.595813357348367, 5.89927852360174, 6.202927167199209, 6.506795109670751, 6.810910812533207, 7.115296603265157, 7.419969732096102, 7.724943265058281, 8.030226829842663, 8.33582723446787, 8.641748978492437, 8.947994674556652, 9.254565395777925, 9.561460961999748, 10.17622101728854, 10.792256328037844, 11.409539737303032, 12.02803871883203, 12.647717622463388, 13.268539213916304, 13.890465727714453, 14.513459582113466, 15.137483858085837, 15.76250261298258, 16.388481078046894, 17.015385774331957, 17.643184571383188, 18.271846706039163, 18.901342773672106, 19.531644700723955, 20.16272570482796, 20.79456024708863, 21.427123979740387, 22.06039369148417, 22.694347252144688, 23.32896355779389, 23.964222477085105, 24.600104799357926, 25.23659218482918, 25.873667117046345, 26.51131285772261, 27.149513403967962, 27.788253447896256, 28.427518338543063},
1261  {0.03496845765860337, 0.06993691531785123, 0.1049053729770991, 0.13987383063634692, 0.17484228829559478, 0.20981074595200053, 0.24477920361124836, 0.2797476612704962, 0.314716118929744, 0.34968457658899194, 0.38465303424823977, 0.41962149190748765, 0.4545899495638933, 0.48955840722314126, 0.5245268648823892, 0.5594953225416369, 0.5944637802008848, 0.6294322378601326, 0.6644006955193805, 0.6993691531757862, 0.7867902973239058, 0.8742114414720256, 0.961632585617303, 1.0490537297654225, 1.1364748739135424, 1.2238960180588196, 1.3113171622069395, 1.3987383063550594, 1.4861594505003368, 1.5735805946484562, 1.6610017387965759, 1.748422882941853, 1.9232651712352506, 2.0981074595314895, 2.272949747824887, 2.4477920361182846, 2.6226343244145234, 2.7974766127079205, 3.0926745755509586, 3.44395841916428, 3.7929654946149927, 4.140199155580832, 4.48610487276643, 4.8310499148399675, 5.175327720605737, 5.519169410160118, 5.862755881539858, 6.20622837304298, 6.549697059107542, 6.893247832651301, 7.236947584569466, 7.580848293751031, 7.924990195098607, 8.2694042393908, 8.614114010475241, 8.959137226336916, 9.30448692001335, 9.650172373181427, 9.996199857775714, 10.342573227835842, 10.689294393844476, 11.036363704475946, 11.73154213703699, 12.428090426873897, 13.125980076789245, 13.825176212794954, 14.52564028426291, 15.227331883606062, 15.930209972250445, 16.634233702118422, 17.339362959284276, 18.045558715641334, 18.752783247333983, 19.461000260660008, 20.170174953762714, 20.880274034013603, 21.591265705145904, 22.303119634055196, 23.015806904341318, 23.7292999616137, 24.443572554090043, 25.158599671023588, 25.874357480669964, 26.590823269047004, 27.30797538027189, 28.025793159035764, 28.74425689552527, 29.46334777297606, 30.183047817969005, 30.903339853423454, 31.624207454305022, 32.345634905899644},
1262  {0.04208452197242317, 0.08416904394549082, 0.12625356591855852, 0.16833808789162616, 0.21042260986469383, 0.25250713183776147, 0.294591653807987, 0.33667617578105463, 0.3787606977541223, 0.42084521972719, 0.46292974170025764, 0.5050142636733252, 0.5470987856463931, 0.5891833076194606, 0.6312678295925284, 0.6733523515627537, 0.7154368735358214, 0.7575213955088891, 0.7996059174819568, 0.8416904394550245, 0.9469017443876938, 1.0521130493203628, 1.1573243542501899, 1.2625356591828591, 1.3677469641155282, 1.472958269045355, 1.5781695739780248, 1.6833808789106937, 1.7885921838433625, 1.8938034887731896, 1.9990147937058587, 2.104226098638527, 2.314648708501024, 2.5250713183663627, 2.7354939282288586, 2.9459165380941967, 3.1563391479566936, 3.3667617578220317, 3.703839316684887, 4.098607599735211, 4.490071039515135, 4.879192386567447, 5.266673871161598, 5.6530296960510835, 6.038639278868162, 6.423784955842712, 6.808678484059117, 7.1934797498117895, 7.578310096881422, 7.9632619279700085, 8.348405702022065, 8.733795092290785, 9.119470830182808, 9.505463599150936, 9.891796234154242, 10.278485408041451, 10.665542934966393, 11.05297678524097, 11.440791880843797, 11.828990722803214, 12.217573888696098, 12.606540429161571, 13.385614043672865, 14.166184035906006, 14.948213302277296, 15.731659164963906, 16.51647601334669, 17.302617053034968, 18.09003546045466, 18.87868513730469, 19.66852119352658, 20.459500245021562, 21.251580584675224, 22.044722266798285, 22.838887132598156, 23.634038796019215, 24.430142603281702, 25.22716557558935, 26.025076341551085, 26.823845063912813, 27.62344336382784, 28.423844244828874, 29.22502201803638, 30.026952229552563, 30.82961159071451, 31.63297791152784, 32.43703003753926, 33.24174779014256, 34.047111910360435, 34.85310400598881, 35.65970650197814, 36.46690259392711},
1263  {0.05029020480396514, 0.10058040960573261, 0.15087061441034225, 0.2011608192121097, 0.2514510240167194, 0.301741228821329, 0.35203143362309647, 0.40232163842770624, 0.45261184322947356, 0.5029020480340831, 0.5531922528358507, 0.6034824576404602, 0.6537726624450699, 0.7040628672468374, 0.7543530720514469, 0.8046432768532146, 0.8549334816578241, 0.9052236864595916, 0.9555138912642014, 1.0058040960688106, 1.1315296080760717, 1.2572551200833324, 1.382980632093436, 1.5087061441006968, 1.6344316561107992, 1.7601571681180603, 1.8858826801253215, 2.0116081921354243, 2.137333704142684, 2.263059216152788, 2.3887847281600485, 2.514510240170152, 2.765961264184674, 3.017412288202038, 3.2688633122194015, 3.520314336236765, 3.7717653602541295, 4.023216384271493, 4.402923686706604, 4.840923169412718, 5.275628140231794, 5.708106387011112, 6.139096012777341, 6.569117835239806, 6.998545742885471, 7.427651941064436, 7.856636809801444, 8.28564907733453, 8.714799743029685, 9.144171870687785, 9.573827594895418, 10.00381321001211, 10.43416291693517, 10.864901615202994, 11.296047006509264, 11.72761119486633, 12.159601914603718, 12.592023480161025, 13.024877525833228, 13.458163585558754, 13.891879549849177, 14.326022027631314, 15.195568219985953, 16.066758980781113, 16.93954397110994, 17.813869202173244, 18.68967930447209, 19.566918991345418, 20.44553399181503, 21.325471630737475, 22.206681173178218, 23.089114010781095, 23.972723742457497, 24.857466184805716, 25.743299336515662, 26.63018331333154, 27.518080264958197, 28.4069542817556, 29.296771296561822, 30.187498985305254, 31.07910666877645, 31.97156521721369, 32.86484695863455, 33.75892559154721, 34.653776102328635, 35.54937468734068, 36.44569867980954, 37.34272648128694, 38.24043749755077, 39.13881207875172, 40.03783146350794, 40.937477726773984},
1264  {0.05974016468300759, 0.11948032936381749, 0.17922049404462742, 0.23896065872827943, 0.29870082340908927, 0.35844098808989927, 0.4181811527735513, 0.47792131745436117, 0.5376614821380133, 0.5974016468188231, 0.657141811499633, 0.7168819761832851, 0.7766221408640949, 0.8363623055449051, 0.8961024702285572, 0.955842634909367, 1.0155827995930191, 1.0753229642738293, 1.135063128954639, 1.1948032936382913, 1.344153705341737, 1.493504117048025, 1.6428545287514704, 1.7922049404549163, 1.9415553521612046, 2.0909057638646504, 2.2402561755709387, 2.389606587274385, 2.5389569989806726, 2.688307410684118, 2.8376578223904056, 2.987008234093852, 3.2857090575035857, 3.58440988091332, 3.8831107043230535, 4.181811527729945, 4.48051235113968, 4.779213174549414, 5.204876111923692, 5.688848562937568, 6.170159044583231, 6.6497495644421285, 7.128261753669921, 7.606142949678828, 8.083710709627423, 8.561193555361694, 9.038757543068261, 9.516524068724227, 9.99458208377549, 10.47299664830626, 10.951815027051936, 11.431071102373838, 11.910788612986488, 12.39098355983018, 12.871666012589971, 13.352841479046571, 13.834511951858257, 14.316676714667919, 14.799332966945224, 15.282476311040416, 15.766101133711286, 16.250200906162327, 17.219795978620663, 18.1911988298489, 19.164342959599296, 20.139160814458737, 21.115585503946967, 22.093551853025446, 23.07299702417972, 24.053860858945782, 25.036086036434696, 26.019618113131642, 27.004405486541614, 27.990399311257423, 28.977553386435417, 29.965824027565322, 30.95516993094154, 31.94555203660525, 32.93693339332716, 33.92927902800424, 34.92255582087156, 35.91673238727074, 36.91177896637648, 37.907667316880286, 38.90437061956949, 39.90186338652862, 40.90012137664726, 41.899121517093974, 42.89884183037187, 43.8992613666098, 44.90036014068208, 45.90211907383619},
1265  {0.07067515415184052, 0.14135030830148337, 0.2120254624511261, 0.2827006166036112, 0.35337577075325394, 0.4240509249028968, 0.49472607905538185, 0.5654012332050246, 0.6360763873575095, 0.7067515415071527, 0.7774266956567951, 0.8481018498092803, 0.9187770039589231, 0.9894521581085659, 1.060127312261051, 1.1308024664106937, 1.2014776205603366, 1.2721527747128218, 1.3428279288624643, 1.41350308301495, 1.5901909683904774, 1.7668788537660056, 1.943566739144376, 2.120254624519904, 2.2969425098982743, 2.473630395273803, 2.6503182806493313, 2.8270061660277013, 3.0036940514032295, 3.1803819367816004, 3.3570698221571273, 3.5337577075354982, 3.8871334782865548, 4.240509249040453, 4.593885019794351, 4.947260790548251, 5.300636561302148, 5.654012332053204, 6.131630444292413, 6.6672022906208355, 7.200987739963464, 7.733716006955079, 8.265882445019285, 8.797830454475601, 9.32980159851235, 9.861967438834494, 10.394450401173598, 10.927337816806162, 11.460691587201293, 11.994554966496775, 12.528957402009762, 13.06391803975272, 13.599448295828148, 14.135553763816139, 14.672235643520898, 15.209491820318211, 15.747317686564726, 16.285706770680626, 16.82465122144653, 17.364142182462015, 17.904170082649248, 18.444724862108774, 19.52737339128757, 20.612003289072593, 21.69853012990063, 22.786871401229217, 23.87694757433194, 24.968682680039276, 26.062004572321317, 27.156844995848896, 28.253139532174295, 29.350827472729005, 30.449851649907924, 31.55015824661291, 32.651696597281045, 33.75441898881355, 34.85828046658357, 35.96323864863796, 37.06925354984671, 38.176287416815526, 39.2843045737864, 40.39327127936956, 41.50315559373177, 42.613927255723794, 43.72555756930443, 44.838019298684486, 45.951286571522466, 47.065334789581065, 48.18014054623036, 49.29568155028052, 50.41193655559852, 51.52888529603219},
1266  {0.0834623671324666, 0.16692473426273555, 0.2503871013958466, 0.33384946852611547, 0.4173118356592266, 0.5007742027894957, 0.5842365699226064, 0.6676989370528754, 0.7511613041859866, 0.8346236713162553, 0.9180860384493664, 1.0015484055796355, 1.0850107727127467, 1.1684731398430155, 1.2519355069761264, 1.3353978741063957, 1.4188602412395066, 1.5023226083697758, 1.5857849755028866, 1.6692473426331556, 1.8779032604630912, 2.0865591782930264, 2.29521509612012, 2.5038710139500555, 2.7125269317799905, 2.921182849609927, 3.1298387674370196, 3.338494685266956, 3.547150603096892, 3.7558065209268268, 3.96446243875392, 4.173118356583855, 4.590430192243725, 5.007742027900754, 5.425053863557784, 5.842365699217655, 6.259677534874682, 6.676989370534554, 7.215284811865045, 7.810942636066625, 8.405713438558344, 9.000109193262631, 9.594476065866042, 10.189051324756685, 10.783998757795331, 11.379431470741277, 11.975426983124095, 12.572037465005534, 13.169296821117609, 13.767225679430393, 14.365834957075359, 14.965128442509108, 15.565104686191797, 16.165758398192054, 16.767081489665355, 17.369063854126264, 17.971693956723634, 18.574959280506526, 19.178846665295886, 19.78334256540095, 20.38843324553279, 20.994104929469565, 22.20713664504607, 23.42233029997001, 24.63958259994195, 25.858795291719396, 27.079875555554814, 28.302736078822026, 29.527294941445533, 30.75347539415742, 31.981205580215, 33.21041823195959, 34.44105036161415, 35.67304295805245, 36.90634069627536, 38.14089166337484, 39.3766471025938, 40.61356117597085, 41.851590745280404, 43.090695170440334, 44.33083612445286, 45.57197742365028, 46.814084872185866, 48.05712611949615, 49.301070529748834, 50.54588906213925, 51.79155416112571, 53.0380396556748, 54.285320666751495, 55.533373522224736, 56.782175678619716, 58.031705649011975},
1267  {0.09864342769295685, 0.19728685538371601, 0.2959302830773173, 0.39457371076807657, 0.49321713846167803, 0.5918605661524371, 0.6905039938460386, 0.7891474215367978, 0.887790849230399, 0.9864342769211584, 1.0850777046147597, 1.1837211323055188, 1.2823645599991202, 1.38100798768988, 1.4796514153834808, 1.5782948430742403, 1.6769382707678415, 1.7755816984586006, 1.874225126152202, 1.972868553842961, 2.219477123074122, 2.4660856923052834, 2.7126942615364444, 2.9593028307647646, 3.2059113999959257, 3.4525199692270867, 3.6991285384582473, 3.945737107686567, 4.192345676917727, 4.438954246148888, 4.68556281538005, 4.932171384608369, 5.425388523070691, 5.918605661530172, 6.411822799992494, 6.905039938451975, 7.398257076914296, 7.891474215373778, 8.502335361374866, 9.169831074405188, 9.837265003168877, 10.504960425335845, 11.173131332846934, 11.841919360545138, 12.511417180930938, 13.181683762841976, 13.85275456878272, 14.524648510968875, 15.197372779403622, 15.870926242469201, 16.545301871890324, 17.220488489846183, 17.896472038316816, 18.573236507380663, 19.250764617377587, 19.929038321651447, 20.608039177427425, 21.287748619021162, 21.968148158299684, 22.64921953063529, 23.330944799863957, 24.013306432352234, 25.37987095153259, 26.74878238692951, 28.119918223260417, 29.4931641334551, 30.8684136985658, 32.245567980998565, 33.624535031317535, 35.005229375702534, 36.38757151118004, 37.77148742362557, 39.156908136182956, 40.54376929127801, 41.93201076678101, 43.32157632534552, 44.712413295099445, 46.1044722794653, 47.497706893719666, 48.892073525949804, 50.2875311201024, 51.68404097903562, 53.081566585544806, 54.48007343965984, 55.87952891050276, 57.27990210130182, 58.68116372625177, 60.08328599798667, 61.48624252468206, 62.890008215820075, 64.29455919573915, 65.6998727243063},
1268 };
1269 
1270 
1271 /****************************************************************************/
1272 
MSVehicleType
The car-following model and parameter.
Definition: MSVehicleType.h:65
DEFAULT_INITIAL_AWARENESS
#define DEFAULT_INITIAL_AWARENESS
Definition: MSDevice_ToC.cpp:60
MSStoppingPlace::getLane
const MSLane & getLane() const
Returns the lane this stop is located at.
Definition: MSStoppingPlace.cpp:57
MSDevice_ToC::OpenGapParams::newTimeHeadway
double newTimeHeadway
Definition: MSDevice_ToC.h:62
MSDevice_ToC::myUseColorScheme
bool myUseColorScheme
Whether a coloring scheme shall by applied to indicate the different toc stages,.
Definition: MSDevice_ToC.h:291
SUMOTrafficObject
Representation of a vehicle or person.
Definition: SUMOTrafficObject.h:47
MSDevice_ToC::myEvents
std::queue< std::pair< SUMOTime, std::string > > myEvents
Storage for events to be written to the output.
Definition: MSDevice_ToC.h:315
MSDevice_ToC::myManualTypeID
std::string myManualTypeID
vehicle type ID for manual driving
Definition: MSDevice_ToC.h:267
MSNet::getStoppingPlace
MSStoppingPlace * getStoppingPlace(const std::string &id, const SumoXMLTag category) const
Returns the named stopping place of the given category.
Definition: MSNet.cpp:911
MSVehicleType::getID
const std::string & getID() const
Returns the name of the vehicle type.
Definition: MSVehicleType.h:93
MSDevice_ToC::myMRMSafeSpot
std::string myMRMSafeSpot
stop vehicle tries to reach during MRM
Definition: MSDevice_ToC.h:346
MSStoppingPlace
A lane area vehicles can halt at.
Definition: MSStoppingPlace.h:59
MSCFModel::getMaxAccel
double getMaxAccel() const
Get the vehicle type's maximum acceleration [m/s^2].
Definition: MSCFModel.h:209
MSDevice_ToC::isAutomated
bool isAutomated()
Whether the current operation mode is automated.
Definition: MSDevice_ToC.cpp:1072
MIN2
T MIN2(T a, T b)
Definition: StdDefs.h:73
MSDevice_ToC::ToCState
ToCState
Enum describing the different regimes for the device,.
Definition: MSDevice_ToC.h:110
SUMOVehicleParameter::parametersSet
int parametersSet
Information for the router which parameter were set, TraCI may modify this (whe changing color)
Definition: SUMOVehicleParameter.h:671
MSEventControl::addEvent
virtual void addEvent(Command *operation, SUMOTime execTimeStep=-1)
Adds an Event.
Definition: MSEventControl.cpp:52
StringUtils::toBool
static bool toBool(const std::string &sData)
converts a string into the bool value described by it by calling the char-type converter
Definition: StringUtils.cpp:374
WRITE_WARNING
#define WRITE_WARNING(msg)
Definition: MsgHandler.h:275
MSVehicle::getBestLanes
const std::vector< LaneQ > & getBestLanes() const
Returns the description of best lanes to use in order to continue the route.
Definition: MSVehicle.cpp:4692
MSNet.h
MSDevice_ToC::myPreviousLCMode
int myPreviousLCMode
LC mode overridden during MRM, stored for restoration.
Definition: MSDevice_ToC.h:321
MSLane
Representation of a lane in the micro simulation.
Definition: MSLane.h:82
MSDevice_ToC::descheduleMRM
void descheduleMRM()
Break MRM Process or remove MRM-Trigger command from the event-queue.
Definition: MSDevice_ToC.cpp:665
MSDevice_ToC::triggerUpwardToC
SUMOTime triggerUpwardToC(SUMOTime t)
Trigger execution of a ToC X-->AUTOMATED ("upwards")
Definition: MSDevice_ToC.cpp:602
MSDevice_ToC::OpenGapParams::maxDecel
double maxDecel
Definition: MSDevice_ToC.h:65
Option_Bool
Definition: Option.h:538
MSDevice_ToC::OpenGapParams
Definition: MSDevice_ToC.h:61
SUMOVehicleParameter::Stop::lane
std::string lane
The lane to stop at.
Definition: SUMOVehicleParameter.h:586
DEFAULT_OPENGAP_MAXDECEL
#define DEFAULT_OPENGAP_MAXDECEL
Definition: MSDevice_ToC.cpp:79
MSDevice_ToC::generatesOutput
bool generatesOutput()
Whether this device requested to write output.
Definition: MSDevice_ToC.h:174
SUMOVehicleParameter::color
RGBColor color
The vehicle's color, TraCI may change this.
Definition: SUMOVehicleParameter.h:477
MSVehicleControl::getVType
MSVehicleType * getVType(const std::string &id=DEFAULT_VTYPE_ID, std::mt19937 *rng=nullptr)
Returns the named vehicle type or a sample from the named distribution.
Definition: MSVehicleControl.cpp:353
SUMOVehicle::getParameter
virtual const SUMOVehicleParameter & getParameter() const =0
Returns the vehicle's parameter (including departure definition)
MSStoppingPlace::getEndLanePosition
double getEndLanePosition() const
Returns the end position of this stop.
Definition: MSStoppingPlace.cpp:69
OutputDevice
Static storage of an output device and its base (abstract) implementation.
Definition: OutputDevice.h:63
DEFAULT_OPENGAP_TIMEGAP
#define DEFAULT_OPENGAP_TIMEGAP
Definition: MSDevice_ToC.cpp:76
DELTA_T
SUMOTime DELTA_T
Definition: SUMOTime.cpp:36
MSDevice_ToC::myHolderMS
MSVehicle * myHolderMS
The holder vehicle casted to MSVehicle*.
Definition: MSDevice_ToC.h:299
MSDevice_ToC::sampleResponseTime
double sampleResponseTime(double leadTime) const
Samples a random driver response time from a truncated Gaussian with parameters according to the look...
Definition: MSDevice_ToC.cpp:1165
MSDevice_ToC::MRM
Definition: MSDevice_ToC.h:115
MSDevice_ToC::myExecuteMRMCommand
WrappingCommand< MSDevice_ToC > * myExecuteMRMCommand
Definition: MSDevice_ToC.h:307
OptionsCont.h
SUMOTrafficObject::getVehicleType
virtual const MSVehicleType & getVehicleType() const =0
Returns the vehicle's type.
StringUtils::toDouble
static double toDouble(const std::string &sData)
converts a string into the double value described by it by calling the char-type converter
Definition: StringUtils.cpp:345
ACCEL2SPEED
#define ACCEL2SPEED(x)
Definition: SUMOTime.h:52
MSNet::getBeginOfTimestepEvents
MSEventControl * getBeginOfTimestepEvents()
Returns the event control for events executed at the begin of a time step.
Definition: MSNet.h:429
MSDevice_ToC::myMRMSafeSpotDuration
SUMOTime myMRMSafeSpotDuration
duration at stop vehicle tries to reach during MRM
Definition: MSDevice_ToC.h:349
SUMOTrafficObject::getID
virtual const std::string & getID() const =0
Get the vehicle's ID.
MSDevice_ToC::triggerDownwardToC
SUMOTime triggerDownwardToC(SUMOTime t)
Trigger execution of a ToC X-->MANUAL ("downwards")
Definition: MSDevice_ToC.cpp:631
MSDevice_ToC::requestToC
void requestToC(SUMOTime timeTillMRM, SUMOTime responseTime=-1000)
Request a ToC. If the device is in AUTOMATED or MRM state, a driver response time is sampled and the ...
Definition: MSDevice_ToC.cpp:503
MSStoppingPlace::getBeginLanePosition
double getBeginLanePosition() const
Returns the begin position of this stop.
Definition: MSStoppingPlace.cpp:63
WrappingCommand.h
MSDevice_ToC::myCurrentAwareness
double myCurrentAwareness
Current awareness-level of the driver in [0,1].
Definition: MSDevice_ToC.h:285
MSDevice_ToC::myEventLanes
std::queue< std::pair< std::string, double > > myEventLanes
Storage for events to be written to the output.
Definition: MSDevice_ToC.h:318
MSVehicle::Influencer::setLaneTimeLine
void setLaneTimeLine(const std::vector< std::pair< SUMOTime, int > > &laneTimeLine)
Sets a new lane timeline.
Definition: MSVehicle.cpp:407
MSDevice_ToC::descheduleRecovery
void descheduleRecovery()
Remove ongoing awareness recovery process from the event-queue.
Definition: MSDevice_ToC.cpp:701
OptionsCont::getString
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
Definition: OptionsCont.cpp:201
WrappingCommand::deschedule
void deschedule()
Marks this Command as being descheduled.
Definition: WrappingCommand.h:78
MSDevice_ToC::deviceName
const std::string deviceName() const override
return the name for this type of device
Definition: MSDevice_ToC.h:135
MSDevice_ToC::myMaxPreparationAccel
double myMaxPreparationAccel
Maximal acceleration that may be applied during the ToC preparation phase TODO: Make effective.
Definition: MSDevice_ToC.h:353
SUMOTime
long long int SUMOTime
Definition: SUMOTime.h:34
SUMOVehicle
Representation of a vehicle.
Definition: SUMOVehicle.h:60
MSDevice_ToC::responseTimeMean
static double responseTimeMean(double leadTime)
Mean of the response time distribution. (Only depends on given lead time)
Definition: MSDevice_ToC.h:362
WrappingCommand< MSDevice_ToC >
MSVehicle::Influencer::activateGapController
void activateGapController(double originalTau, double newTimeHeadway, double newSpaceHeadway, double duration, double changeRate, double maxDecel, MSVehicle *refVeh=nullptr)
Activates the gap control with the given parameters,.
Definition: MSVehicle.cpp:392
OptionsCont::getOptions
static OptionsCont & getOptions()
Retrieves the options.
Definition: OptionsCont.cpp:57
MSDevice_ToC::myResponseTimeRNG
static std::mt19937 myResponseTimeRNG
Random generator for ToC devices.
Definition: MSDevice_ToC.h:371
MSDevice_ToC::MSDevice_ToC
MSDevice_ToC(SUMOVehicle &holder, const std::string &id, const std::string &outputFilename, const std::string &manualType, const std::string &automatedType, SUMOTime responseTime, double recoveryRate, double lcAbstinence, double initialAwareness, double mrmDecel, double dynamicToCThreshold, double dynamicMRMProbability, double maxPreparationAccel, bool mrmKeepRight, const std::string &mrmSafeSpot, SUMOTime mrmSafeSpotDuration, bool useColorScheme, OpenGapParams ogp)
Constructor.
Definition: MSDevice_ToC.cpp:265
SUMOVehicleParameter::Stop::parkingarea
std::string parkingarea
(Optional) parking area if one is assigned to the stop
Definition: SUMOVehicleParameter.h:595
SUMOVehicleParameter
Structure representing possible vehicle parameter.
Definition: SUMOVehicleParameter.h:297
MSDevice_ToC::_2ToCState
static ToCState _2ToCState(const std::string &)
Definition: MSDevice_ToC.cpp:970
MSDevice_ToC::setVehicleColor
void setVehicleColor()
Definition: MSDevice_ToC.cpp:483
MSVehicleDevice::myHolder
SUMOVehicle & myHolder
The vehicle that stores the device.
Definition: MSVehicleDevice.h:84
MSDevice_ToC::buildVehicleDevices
static void buildVehicleDevices(SUMOVehicle &v, std::vector< MSVehicleDevice * > &into)
Build devices for the given vehicle, if needed.
Definition: MSDevice_ToC.cpp:154
MSVehicle::getNextStop
Stop & getNextStop()
Definition: MSVehicle.cpp:5890
DEFAULT_RESPONSE_TIME
#define DEFAULT_RESPONSE_TIME
Definition: MSDevice_ToC.cpp:53
MSVehicle::getCarFollowModel
const MSCFModel & getCarFollowModel() const
Returns the vehicle's car following model definition.
Definition: MSVehicle.h:893
MSDevice_ToC::getDynamicMRMProbability
static double getDynamicMRMProbability(const SUMOVehicle &v, const OptionsCont &oc)
Definition: MSDevice_ToC.cpp:209
MSDevice_ToC::UNDEFINED
Definition: MSDevice_ToC.h:111
MSDevice_ToC::setState
void setState(ToCState state)
Set the ToC device's state.
Definition: MSDevice_ToC.cpp:436
RGBColor.h
Parameterised::getParameter
const std::string getParameter(const std::string &key, const std::string &defaultValue="") const
Returns the value for a given key.
Definition: Parameterised.cpp:72
MSVehicle.h
OutputDevice::closeTag
bool closeTag(const std::string &comment="")
Closes the most recently opened tag and optionally adds a comment.
Definition: OutputDevice.cpp:253
MSDevice_ToC::initColorScheme
void initColorScheme()
Initialize vehicle colors for different states.
Definition: MSDevice_ToC.cpp:382
MSDevice_ToC::resetDeliberateLCs
void resetDeliberateLCs()
Resets the holder's LC mode to the last differing to LCModeMRM.
Definition: MSDevice_ToC.cpp:1042
MSDevice_ToC::OpenGapParams::active
bool active
Definition: MSDevice_ToC.h:66
MAX2
T MAX2(T a, T b)
Definition: StdDefs.h:79
MSDevice_ToC
The ToC Device controls transition of control between automated and manual driving.
Definition: MSDevice_ToC.h:54
MSDevice_ToC::~MSDevice_ToC
~MSDevice_ToC()
Destructor.
Definition: MSDevice_ToC.cpp:393
OutputDevice::writeAttr
OutputDevice & writeAttr(const SumoXMLAttr attr, const T &val)
writes a named attribute
Definition: OutputDevice.h:255
RGBColor
Definition: RGBColor.h:39
SUMOVehicle.h
MSDevice_ToC::lookupResponseTimeLeadTimes
static std::vector< double > lookupResponseTimeLeadTimes
Definition: MSDevice_ToC.h:360
OptionsCont::addDescription
void addDescription(const std::string &name, const std::string &subtopic, const std::string &description)
Adds a description for an option.
Definition: OptionsCont.cpp:469
MSDevice_ToC::switchHolderType
void switchHolderType(const std::string &targetTypeID)
Switch the device holder's vehicle type.
Definition: MSDevice_ToC.cpp:711
SIMTIME
#define SIMTIME
Definition: SUMOTime.h:63
MSVehicle::getPositionOnLane
double getPositionOnLane() const
Get the vehicle's position along the lane.
Definition: MSVehicle.h:392
MSVehicleControl::getVTypeDistributionMembership
const std::set< std::string > getVTypeDistributionMembership(const std::string &id) const
Return the distribution IDs the vehicle type is a member of.
Definition: MSVehicleControl.cpp:384
MSDevice_ToC::myDynamicToCThreshold
double myDynamicToCThreshold
Duration in s. for which the vehicle needs to be able to follow its route without a lane change to co...
Definition: MSDevice_ToC.h:331
MSVehicle::getDriverState
std::shared_ptr< MSSimpleDriverState > getDriverState() const
Returns the vehicle driver's state.
Definition: MSVehicle.cpp:6212
MSVehicleType::getCarFollowModel
const MSCFModel & getCarFollowModel() const
Returns the vehicle type's car following model definition (const version)
Definition: MSVehicleType.h:140
MSDevice_ToC::lookupResponseTimeMRMProbs
static std::vector< double > lookupResponseTimeMRMProbs
Grid of the response time distribution.
Definition: MSDevice_ToC.h:359
MSDevice_ToC::RECOVERING
Definition: MSDevice_ToC.h:116
MSDevice::insertDefaultAssignmentOptions
static void insertDefaultAssignmentOptions(const std::string &deviceName, const std::string &optionsTopic, OptionsCont &oc, const bool isPerson=false)
Adds common command options that allow to assign devices to vehicles.
Definition: MSDevice.cpp:126
MSVehicleControl::hasVTypeDistribution
bool hasVTypeDistribution(const std::string &id) const
Asks for a vehicle type distribution.
Definition: MSVehicleControl.cpp:347
TIME2STEPS
#define TIME2STEPS(x)
Definition: SUMOTime.h:58
MSDevice_ToC::triggerMRM
SUMOTime triggerMRM(SUMOTime t)
Trigger execution of an MRM.
Definition: MSDevice_ToC.cpp:555
MSDevice_ToC::myMRMProbability
double myMRMProbability
Probability of an MRM to occur after a dynamically triggered ToC.
Definition: MSDevice_ToC.h:334
TS
#define TS
Definition: SUMOTime.h:43
VEHPARS_COLOR_SET
const int VEHPARS_COLOR_SET
Definition: SUMOVehicleParameter.h:45
MSDevice_ToC::myInitialAwareness
double myInitialAwareness
Average awareness the driver has initially after a ToC.
Definition: MSDevice_ToC.h:279
SUMOVehicle::getLane
virtual MSLane * getLane() const =0
Returns the lane the vehicle is on.
STEPS2TIME
#define STEPS2TIME(x)
Definition: SUMOTime.h:56
MSVehicle::Influencer::setSpeedTimeLine
void setSpeedTimeLine(const std::vector< std::pair< SUMOTime, double > > &speedTimeLine)
Sets a new velocity timeline.
Definition: MSVehicle.cpp:386
MSDevice_ToC::myColorScheme
std::map< ToCState, RGBColor > myColorScheme
Coloring scheme,.
Definition: MSDevice_ToC.h:288
MSDevice_ToC::interpolateVariance
static double interpolateVariance(double leadTime, double pMRM)
Two-dimensional interpolation of variance from lookup table assumes pMRM >= 0, leadTime >= 0.
Definition: MSDevice_ToC.cpp:1189
MSDevice_ToC::lookupResponseTimeVariances
static std::vector< std::vector< double > > lookupResponseTimeVariances
Variances of the response time distribution. Given the lead time and the MRM probability the variance...
Definition: MSDevice_ToC.h:364
SUMO_TAG_PARKING_AREA
A parking area.
Definition: SUMOXMLDefinitions.h:107
MSVehicleType::getColor
const RGBColor & getColor() const
Returns this type's color.
Definition: MSVehicleType.h:201
MSDevice_ToC::myState
ToCState myState
Current state of the device.
Definition: MSDevice_ToC.h:294
OptionsCont::doRegister
void doRegister(const std::string &name, Option *v)
Adds an option under the given name.
Definition: OptionsCont.cpp:74
ProcessError
Definition: UtilExceptions.h:39
MSDevice_ToC::AUTOMATED
Definition: MSDevice_ToC.h:113
DEFAULT_OPENGAP_CHANGERATE
#define DEFAULT_OPENGAP_CHANGERATE
Definition: MSDevice_ToC.cpp:78
MSDevice_ToC::setAwareness
void setAwareness(double value)
Set the awareness to the given value.
Definition: MSDevice_ToC.cpp:416
MSDevice_ToC::myOutputFile
OutputDevice * myOutputFile
The file the devices output goes to.
Definition: MSDevice_ToC.h:312
Option_String
Definition: Option.h:399
MSDevice_ToC::myOriginalMaxAccel
double myOriginalMaxAccel
Storage for original maximal acceleration of vehicle.
Definition: MSDevice_ToC.h:356
MSVehicle::Stop::lane
const MSLane * lane
The lane to stop at.
Definition: MSVehicle.h:926
DEFAULT_MRM_PROBABILITY
#define DEFAULT_MRM_PROBABILITY
Definition: MSDevice_ToC.cpp:67
OptionsCont
A storage for options typed value containers)
Definition: OptionsCont.h:89
MSCFModel::setMaxAccel
virtual void setMaxAccel(double accel)
Sets a new value for maximum acceleration [m/s^2].
Definition: MSCFModel.h:467
SUMOVehicleParameter::Stop::endPos
double endPos
The stopping position end.
Definition: SUMOVehicleParameter.h:604
SIMSTEP
#define SIMSTEP
Definition: SUMOTime.h:62
MSVehicleType::setDecel
void setDecel(double decel)
Set a new value for this type's deceleration.
Definition: MSVehicleType.cpp:407
MSDevice_ToC::ToCPreparationStep
SUMOTime ToCPreparationStep(SUMOTime t)
Continue the ToC preparation for one time step.
Definition: MSDevice_ToC.cpp:725
MSLane::getNumericalID
int getNumericalID() const
Returns this lane's numerical id.
Definition: MSLane.h:469
MSDevice::getFloatParam
static double getFloatParam(const SUMOVehicle &v, const OptionsCont &oc, std::string paramName, double deflt, bool required)
Definition: MSDevice.cpp:186
DEFAULT_RECOVERY_RATE
#define DEFAULT_RECOVERY_RATE
Definition: MSDevice_ToC.cpp:56
DEFAULT_DYNAMIC_TOC_THRESHOLD
#define DEFAULT_DYNAMIC_TOC_THRESHOLD
Definition: MSDevice_ToC.cpp:64
MSDevice_ToC::MRMExecutionStep
SUMOTime MRMExecutionStep(SUMOTime t)
Continue the MRM for one time step.
Definition: MSDevice_ToC.cpp:742
MSDevice_ToC::myMRMKeepRight
bool myMRMKeepRight
Whether vehicle tries to change to the right during an MRM.
Definition: MSDevice_ToC.h:343
MSDevice_ToC::descheduleToCPreparation
void descheduleToCPreparation()
Remove ongoing ToC-Preparation process from the event-queue.
Definition: MSDevice_ToC.cpp:689
MSDevice_ToC::myInstances
static std::set< MSDevice_ToC *, ComparatorNumericalIdLess > myInstances
Definition: MSDevice_ToC.h:57
OptionsCont::addOptionSubTopic
void addOptionSubTopic(const std::string &topic)
Adds an option subtopic.
Definition: OptionsCont.cpp:519
SUMOVehicleParameter::Stop::startPos
double startPos
The stopping position start.
Definition: SUMOVehicleParameter.h:601
MSVehicle::getLane
MSLane * getLane() const
Returns the lane the vehicle is on.
Definition: MSVehicle.h:560
MSDevice_ToC::insertOptions
static void insertOptions(OptionsCont &oc)
Inserts MSDevice_ToC-options.
Definition: MSDevice_ToC.cpp:108
DEFAULT_MANUAL_TYPE
#define DEFAULT_MANUAL_TYPE
Definition: MSDevice_ToC.cpp:82
MSVehicle::getInfluencer
Influencer & getInfluencer()
Returns the velocity/lane influencer.
Definition: MSVehicle.cpp:5900
OutputDevice::openTag
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
Definition: OutputDevice.cpp:239
toString
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition: ToString.h:47
StringUtils.h
MSDevice_ToC::descheduleToC
void descheduleToC()
Remove scheduled ToC-Trigger command from the event-queue.
Definition: MSDevice_ToC.cpp:681
MSDriverState.h
OutputDevice::getDevice
static OutputDevice & getDevice(const std::string &name)
Returns the described OutputDevice.
Definition: OutputDevice.cpp:54
MSDevice_ToC::notifyMove
bool notifyMove(SUMOTrafficObject &veh, double oldPos, double newPos, double newSpeed) override
Return value indicates whether the device still wants to be notified about the vehicle movement.
Definition: MSDevice_ToC.cpp:805
MSNet::getInstance
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
Definition: MSNet.cpp:167
MSDevice::equippedByDefaultAssignmentOptions
static bool equippedByDefaultAssignmentOptions(const OptionsCont &oc, const std::string &deviceName, DEVICEHOLDER &v, bool outputOptionSet, const bool isPerson=false)
Determines whether a vehicle should get a certain device.
Definition: MSDevice.h:203
MSDevice_ToC::isManuallyDriven
bool isManuallyDriven()
Whether the current operation mode is manual.
Definition: MSDevice_ToC.cpp:1067
MSCFModel::getHeadwayTime
virtual double getHeadwayTime() const
Get the driver's desired headway [s].
Definition: MSCFModel.h:258
DEFAULT_LCABSTINENCE
#define DEFAULT_LCABSTINENCE
Definition: MSDevice_ToC.cpp:58
MSDevice_ToC::_2string
static std::string _2string(ToCState state)
Definition: MSDevice_ToC.cpp:991
MSDevice_ToC::checkDynamicToC
bool checkDynamicToC()
Check if the vehicle should induce a ToC due to internal reasons. That is, if the route cannot be fol...
Definition: MSDevice_ToC.cpp:1077
InvalidArgument
Definition: UtilExceptions.h:56
MSDevice_ToC::getOpenGapParams
static OpenGapParams getOpenGapParams(const SUMOVehicle &v, const OptionsCont &oc)
Definition: MSDevice_ToC.cpp:221
Option_Float
Definition: Option.h:470
MSVehicle::Influencer::setLaneChangeMode
void setLaneChangeMode(int value)
Sets lane changing behavior.
Definition: MSVehicle.cpp:767
MSRouteHandler::getParsingRNG
static std::mt19937 * getParsingRNG()
get parsing RNG
Definition: MSRouteHandler.h:62
MSDevice::getStringParam
static std::string getStringParam(const SUMOVehicle &v, const OptionsCont &oc, std::string paramName, std::string deflt, bool required)
Definition: MSDevice.cpp:153
SUMOVehicle::addStop
virtual bool addStop(const SUMOVehicleParameter::Stop &stopPar, std::string &errorMsg, SUMOTime untilOffset=0, bool collision=false, ConstMSEdgeVector::const_iterator *searchStart=0)=0
Adds a stop.
MSDevice_ToC::MANUAL
Definition: MSDevice_ToC.h:112
MSBaseVehicle::getSingularType
MSVehicleType & getSingularType()
Replaces the current vehicle type with a new one used by this vehicle only.
Definition: MSBaseVehicle.cpp:736
MSVehicleType::getParameter
const SUMOVTypeParameter & getParameter() const
Definition: MSVehicleType.h:560
MAX_RESPONSETIME_SAMPLE_TRIES
#define MAX_RESPONSETIME_SAMPLE_TRIES
Definition: MSDevice_ToC.cpp:87
MSDevice_ToC::getParameter
std::string getParameter(const std::string &key) const override
try to retrieve the given parameter from this device. Throw exception for unsupported key
Definition: MSDevice_ToC.cpp:837
MSBaseVehicle::getID
const std::string & getID() const
Returns the name of the vehicle.
Definition: MSBaseVehicle.cpp:138
MSVehicle::Influencer::getLaneChangeMode
int getLaneChangeMode() const
return the current lane change mode
Definition: MSVehicle.cpp:436
MSDevice_ToC::requestMRM
void requestMRM()
Request an MRM to be initiated immediately. No downward ToC will be scheduled.
Definition: MSDevice_ToC.cpp:490
DYNAMIC_TOC_LEADTIME_FACTOR
#define DYNAMIC_TOC_LEADTIME_FACTOR
Definition: MSDevice_ToC.cpp:70
MSDevice_ToC::deactivateDeliberateLCs
void deactivateDeliberateLCs()
Resets the holder's LC mode to the operational LC-mode of the ToC Device (.
Definition: MSDevice_ToC.cpp:1054
config.h
MSVehicleControl
The class responsible for building and deletion of vehicles.
Definition: MSVehicleControl.h:71
DEFAULT_AUTOMATED_TYPE
#define DEFAULT_AUTOMATED_TYPE
Definition: MSDevice_ToC.cpp:83
MSLane::isInternal
bool isInternal() const
Definition: MSLane.cpp:2010
MSDevice_ToC::createdOutputFiles
static std::set< std::string > createdOutputFiles
Definition: MSDevice_ToC.h:59
MSDevice_ToC::myDynamicToCLane
int myDynamicToCLane
Lane, on which the ongoing dynamic ToC was issued. It can only be aborted if the lane was changed.
Definition: MSDevice_ToC.h:340
MSVehicle::getSpeed
double getSpeed() const
Returns the vehicle's current speed.
Definition: MSVehicle.h:476
MSDevice_ToC::getOutputFilename
static std::string getOutputFilename(const SUMOVehicle &v, const OptionsCont &oc)
Definition: MSDevice_ToC.cpp:186
MSDevice_ToC::myPrepareToCCommand
WrappingCommand< MSDevice_ToC > * myPrepareToCCommand
Definition: MSDevice_ToC.h:308
MSDevice_ToC::myTriggerMRMCommand
WrappingCommand< MSDevice_ToC > * myTriggerMRMCommand
Definition: MSDevice_ToC.h:304
MSDevice_ToC::PREPARING_TOC
Definition: MSDevice_ToC.h:114
fn
static double fn[10]
Definition: odrSpiral.cpp:82
MSVehicleControl::hasVType
bool hasVType(const std::string &id) const
Asks for existence of a vehicle type.
Definition: MSVehicleControl.cpp:341
MSVehicle::Influencer::deactivateGapController
void deactivateGapController()
Deactivates the gap control.
Definition: MSVehicle.cpp:400
MSDevice_ToC::OpenGapParams::changeRate
double changeRate
Definition: MSDevice_ToC.h:64
MSDevice_ToC::myOpenGapParams
OpenGapParams myOpenGapParams
Parameters for the openGap mechanism applied during ToC preparation phase.
Definition: MSDevice_ToC.h:327
MSDevice_ToC::myMRMDecel
double myMRMDecel
Deceleration rate applied during MRM.
Definition: MSDevice_ToC.h:282
MSEventControl.h
OutputDevice::writeXMLHeader
bool writeXMLHeader(const std::string &rootElement, const std::string &schemaFile, std::map< SumoXMLAttr, std::string > attrs=std::map< SumoXMLAttr, std::string >())
Writes an XML header with optional configuration.
Definition: OutputDevice.cpp:227
MSDevice_ToC::myAutomatedTypeID
std::string myAutomatedTypeID
vehicle type ID for automated driving
Definition: MSDevice_ToC.h:269
SUMOVehicleParameter::Stop::duration
SUMOTime duration
The stopping duration.
Definition: SUMOVehicleParameter.h:607
SUMOTrafficObject::getPositionOnLane
virtual double getPositionOnLane() const =0
Get the vehicle's position along the lane.
MAX_RESPONSETIME_VARIANCE
#define MAX_RESPONSETIME_VARIANCE
Definition: MSDevice_ToC.cpp:89
DEFAULT_MRM_DECEL
#define DEFAULT_MRM_DECEL
Definition: MSDevice_ToC.cpp:62
MSDevice_ToC::myRecoveryRate
double myRecoveryRate
Recovery rate for the driver's awareness after a ToC.
Definition: MSDevice_ToC.h:275
MSDevice_ToC::setParameter
void setParameter(const std::string &key, const std::string &value) override
try to set the given parameter for this device. Throw exception for unsupported key
Definition: MSDevice_ToC.cpp:886
MSDevice_ToC::myDynamicToCActive
bool myDynamicToCActive
Switch for considering dynamic ToCs,.
Definition: MSDevice_ToC.h:336
MSDevice_ToC::myRecoverAwarenessCommand
WrappingCommand< MSDevice_ToC > * myRecoverAwarenessCommand
Definition: MSDevice_ToC.h:306
MSRouteHandler.h
MSDevice_ToC::writeOutput
void writeOutput()
Write output to file given by option device.toc.file.
Definition: MSDevice_ToC.cpp:1012
SUMOVehicleParameter::Stop::parking
bool parking
whether the vehicle is removed from the net while stopping
Definition: SUMOVehicleParameter.h:622
MSVehicleControl.h
Named::getID
const std::string & getID() const
Returns the id.
Definition: Named.h:76
WRITE_ERROR
#define WRITE_ERROR(msg)
Definition: MsgHandler.h:283
MSDevice_ToC::myTriggerToCCommand
WrappingCommand< MSDevice_ToC > * myTriggerToCCommand
Definition: MSDevice_ToC.h:305
MSDevice_ToC::OpenGapParams::newSpaceHeadway
double newSpaceHeadway
Definition: MSDevice_ToC.h:63
MSDevice_ToC::LCModeMRM
static int LCModeMRM
LC mode operational during an MRM.
Definition: MSDevice_ToC.h:324
MSNet::getVehicleControl
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
Definition: MSNet.h:336
MSDevice_ToC.h
MSDevice_ToC::cleanup
static void cleanup()
Closes root tags of output files.
Definition: MSDevice_ToC.cpp:1031
MSDevice::getBoolParam
static bool getBoolParam(const SUMOVehicle &v, const OptionsCont &oc, std::string paramName, bool deflt, bool required)
Definition: MSDevice.cpp:219
Parameterised::knowsParameter
bool knowsParameter(const std::string &key) const
Returns whether the parameter is known.
Definition: Parameterised.cpp:66
SUMOVehicleParameter::Stop
Definition of vehicle stop (position and duration)
Definition: SUMOVehicleParameter.h:572
MSDevice_ToC::awarenessRecoveryStep
SUMOTime awarenessRecoveryStep(SUMOTime t)
Continue the awareness recovery for one time step.
Definition: MSDevice_ToC.cpp:778
MSDevice_ToC::myIssuedDynamicToC
bool myIssuedDynamicToC
Flag to indicate that a dynamically triggered ToC is in preparation.
Definition: MSDevice_ToC.h:338
DYNAMIC_TOC_ABORT_RESISTANCE_FACTOR
#define DYNAMIC_TOC_ABORT_RESISTANCE_FACTOR
Definition: MSDevice_ToC.cpp:72
MSBaseVehicle::replaceVehicleType
void replaceVehicleType(MSVehicleType *type)
Replaces the current vehicle type by the one given.
Definition: MSBaseVehicle.cpp:726
MSVehicle::hasStops
bool hasStops() const
Returns whether the vehicle has to stop somewhere.
Definition: MSVehicle.h:997
DEFAULT_OPENGAP_SPACING
#define DEFAULT_OPENGAP_SPACING
Definition: MSDevice_ToC.cpp:77
MSDevice_ToC::myResponseTime
SUMOTime myResponseTime
Average response time needed by the driver to take back control.
Definition: MSDevice_ToC.h:273
MSVehicleDevice
Abstract in-vehicle device.
Definition: MSVehicleDevice.h:54
MSDevice_ToC::myLCAbstinence
double myLCAbstinence
Level of the awareness below which no lane-changes are performed.
Definition: MSDevice_ToC.h:277