97#define DEBUG_COND (isSelected())
98#define DEBUG_COND2(obj) ((obj != nullptr && (obj)->isSelected()))
144 for (
auto p : persons) {
173 if (nextIsMyVehicles()) {
174 if (myI1 != myI1End) {
176 }
else if (myI3 != myI3End) {
190 if (nextIsMyVehicles()) {
191 if (myI1 != myI1End) {
192 return myLane->myVehicles[myI1];
193 }
else if (myI3 != myI3End) {
194 return myLane->myTmpVehicles[myI3];
196 assert(myI2 == myI2End);
200 return myLane->myPartialVehicles[myI2];
208 if (
DEBUG_COND2(myLane)) std::cout <<
SIMTIME <<
" AnyVehicleIterator::nextIsMyVehicles lane=" << myLane->getID()
209 <<
" myDownstream=" << myDownstream
211 <<
" myI1End=" << myI1End
213 <<
" myI2End=" << myI2End
215 <<
" myI3End=" << myI3End
218 if (myI1 == myI1End && myI3 == myI3End) {
219 if (myI2 != myI2End) {
225 if (myI2 == myI2End) {
228 MSVehicle* cand = myI1 == myI1End ? myLane->myTmpVehicles[myI3] : myLane->myVehicles[myI1];
231 <<
" veh1=" << cand->
getID()
232 <<
" isTmp=" << (myI1 == myI1End)
233 <<
" veh2=" << myLane->myPartialVehicles[myI2]->getID()
235 <<
" pos2=" << myLane->myPartialVehicles[myI2]->getPositionOnLane(myLane)
238 if (cand->
getPositionOnLane() < myLane->myPartialVehicles[myI2]->getPositionOnLane(myLane)) {
241 return !myDownstream;
253#pragma warning(disable: 4355)
259 int index,
bool isRampAccel,
260 const std::string& type,
291 mySimulationTask(*this, 0),
296 assert(
myRNGs.size() > 0);
298 if (outlineShape.size() > 0) {
366 veh->addReminder(rem);
379 veh->removeReminder(rem);
391 std::cout <<
SIMTIME <<
" setPartialOccupation. lane=" <<
getID() <<
" veh=" << v->
getID() <<
"\n";
411 std::cout <<
SIMTIME <<
" resetPartialOccupation. lane=" <<
getID() <<
" veh=" << v->
getID() <<
"\n";
429#ifdef DEBUG_MANEUVER_RESERVATIONS
431 std::cout <<
SIMTIME <<
" setManeuverReservation. lane=" <<
getID() <<
" veh=" << v->
getID() <<
"\n";
440#ifdef DEBUG_MANEUVER_RESERVATIONS
442 std::cout <<
SIMTIME <<
" resetManeuverReservation(): lane=" <<
getID() <<
" veh=" << v->
getID() <<
"\n";
487 if (leader ==
nullptr) {
492 leader = leaderInfo.first;
498 if (leader ==
nullptr) {
504 if (leaderBack >= frontGapNeeded) {
505 pos =
MIN2(pos, leaderBack - frontGapNeeded);
531 if (missingRearGap > 0) {
532 if (minPos + missingRearGap <= maxPos) {
539 return isInsertionSuccess(&veh, mspeed, minPos + missingRearGap, posLat,
true, notification);
550 const double speed = leader->
getSpeed();
552 if (leaderPos >= frontGapNeeded) {
562 MSLane::VehCont::iterator predIt =
myVehicles.begin();
573 double speed = mspeed;
574 if (leader !=
nullptr) {
579 double frontMax = maxPos;
580 if (leader !=
nullptr) {
583 frontMax =
MIN2(maxPos, leaderRearPos - frontGapNeeded);
591 if (frontMax > minPos && backMin + POSITION_EPS < frontMax) {
593 if (
isInsertionSuccess(&veh, speed, backMin + POSITION_EPS, posLat,
true, notification)) {
642 if (last !=
nullptr) {
694 bool patchSpeed =
true;
711 for (
int i = 0; i < 10; i++) {
766 for (
int i = 0; i < 10; i++) {
793#ifdef DEBUG_EXTRAPOLATE_DEPARTPOS
802 double dist = speed *
STEPS2TIME(relevantDelay);
804 if (leaderInfo.first !=
nullptr) {
808 dist =
MIN2(dist, leaderInfo.second - frontGapNeeded);
820 if (nspeed < speed) {
822 speed =
MIN2(nspeed, speed);
824 }
else if (speed > 0) {
831 if (emergencyBrakeGap <= dist) {
839 if (errorMsg !=
"") {
840 WRITE_ERRORF(
TL(
"Vehicle '%' will not be able to depart on lane '%' with speed % (%), time=%."),
853 double speed,
double pos,
double posLat,
bool patchSpeed,
858 WRITE_WARNINGF(
TL(
"Invalid departPos % given for vehicle '%', time=%. Inserting at lane end instead."),
863#ifdef DEBUG_INSERTION
865 std::cout <<
"\nIS_INSERTION_SUCCESS\n"
867 <<
" veh '" << aVehicle->
getID()
870 <<
" speed=" << speed
871 <<
" patchSpeed=" << patchSpeed
880 std::vector<MSLane*>::const_iterator ri = bestLaneConts.begin();
883 const bool isRail = aVehicle->
isRail();
890 bool dwBlocked =
false;
891#ifdef DEBUG_INSERTION
896#ifdef DEBUG_INSERTION
898 std::cout <<
" foe of driveway " + dw->
getID() +
" has occupied edges " +
toString(occupied) <<
"\n";
903#ifdef DEBUG_INSERTION
905 std::cout <<
" insertion on driveway " + dw->
getID() +
" would cause deadlock\n";
909#ifdef DEBUG_INSERTION
920#ifdef DEBUG_INSERTION
922 std::cout <<
" bidi-lane occupied\n";
928 double backLength = aVehicle->
getLength() - pos;
932 while (backLength > 0 && bidi !=
nullptr) {
934#ifdef DEBUG_INSERTION
936 std::cout <<
" bidi-lane furtherLanes occupied\n";
943 bidi = pred ==
nullptr ? nullptr : pred->
getBidiLane();
947 MSLink* firstRailSignal =
nullptr;
948 double firstRailSignalDist = -1;
956 if (nextStop.
lane ==
this) {
957 std::stringstream msg;
958 double distToStop, safeSpeed;
960 msg <<
"scheduled waypoint on lane '" <<
myID <<
"' too close";
964 msg <<
"scheduled stop on lane '" <<
myID <<
"' too close";
981#ifdef DEBUG_INSERTION
983 std::cout <<
SIMTIME <<
" isInsertionSuccess lane=" <<
getID()
984 <<
" veh=" << aVehicle->
getID()
986 <<
" posLat=" << posLat
987 <<
" patchSpeed=" << patchSpeed
988 <<
" speed=" << speed
989 <<
" nspeed=" << nspeed
990 <<
" leaders=" << leaders.
toString()
991 <<
" failed (@700)!\n";
996#ifdef DEBUG_INSERTION
998 std::cout <<
SIMTIME <<
" speed = " << speed <<
" nspeed = " << nspeed <<
" leaders=" << leaders.
toString() <<
"\n";
1004 int nRouteSuccs = 1;
1005 MSLane* currentLane =
this;
1008 while ((seen < dist || (isRail && firstRailSignal ==
nullptr)) && ri != bestLaneConts.end()) {
1010 std::vector<MSLink*>::const_iterator link =
succLinkSec(*aVehicle, nRouteSuccs, *currentLane, bestLaneConts);
1042 if (isRail && firstRailSignal ==
nullptr) {
1043 std::string constraintInfo;
1044 bool isInsertionOrder;
1046 setParameter((isInsertionOrder ?
"insertionOrder" :
"insertionConstraint:")
1047 + aVehicle->
getID(), constraintInfo);
1048#ifdef DEBUG_INSERTION
1050 std::cout <<
" insertion constraint at link " << (*link)->getDescription() <<
" not cleared \n";
1058 if (firstRailSignal ==
nullptr && (*link)->
getTLLogic() !=
nullptr) {
1059 firstRailSignal = *link;
1060 firstRailSignalDist = seen;
1062 nextLane = (*link)->getViaLaneOrLane();
1064 cfModel.
getMaxDecel(), 0, posLat,
nullptr,
false, aVehicle)
1065 || (*link)->railSignalWasPassed()
1066 || !(*link)->havePriority()
1069 std::string errorMsg =
"";
1070 const LinkState state = (*link)->getState();
1076 errorMsg =
"unpriorised junction too close";
1077 }
else if ((*link)->getTLLogic() !=
nullptr && !(*link)->getTLLogic()->getsMajorGreen((*link)->getTLIndex())) {
1079 errorMsg =
"tlLogic '" + (*link)->getTLLogic()->
getID() +
"' link " +
toString((*link)->getTLIndex()) +
" never switches to 'G'";
1083 const double remaining = seen - laneStopOffset;
1087#ifdef DEBUG_INSERTION
1089 std::cout <<
SIMTIME <<
" isInsertionSuccess lane=" <<
getID()
1090 <<
" veh=" << aVehicle->
getID()
1091 <<
" patchSpeed=" << patchSpeed
1092 <<
" speed=" << speed
1093 <<
" remaining=" << remaining
1097 <<
" failed (@926)!\n";
1102#ifdef DEBUG_INSERTION
1104 std::cout <<
"trying insertion before minor link: "
1105 <<
"insertion speed = " << speed <<
" dist=" << dist
1114 bool dummyReq =
true;
1115#ifdef DEBUG_INSERTION
1117 std::cout <<
"checking linkLeader for lane '" << nextLane->
getID() <<
"'\n";
1121 double nSpeed = speed;
1123#ifdef DEBUG_INSERTION
1128#ifdef DEBUG_INSERTION
1130 std::cout <<
" linkLeader nSpeed=" << nSpeed <<
" failed (@1058)!\n";
1137 if (nextLane !=
nullptr) {
1142#ifdef DEBUG_INSERTION
1144 std::cout <<
" nextLane=" << nextLane->
getID() <<
" occupiedBidi\n";
1155 if (nextStop.
lane == nextLane) {
1156 std::stringstream msg;
1157 msg <<
"scheduled stop on lane '" << nextStop.
lane->
getID() <<
"' too close";
1158 const double distToStop = seen + nextStop.
pars.
endPos;
1170 const double nextLaneSpeed = nextLane->
safeInsertionSpeed(aVehicle, seen, nextLeaders, speed);
1171#ifdef DEBUG_INSERTION
1173 std::cout <<
SIMTIME <<
" leader on lane '" << nextLane->
getID() <<
"': " << nextLeaders.
toString() <<
" nspeed=" << nextLaneSpeed <<
"\n";
1178#ifdef DEBUG_INSERTION
1180 std::cout <<
" isInsertionSuccess lane=" <<
getID()
1181 <<
" veh=" << aVehicle->
getID()
1183 <<
" posLat=" << posLat
1184 <<
" patchSpeed=" << patchSpeed
1185 <<
" speed=" << speed
1186 <<
" nspeed=" << nextLaneSpeed
1187 <<
" nextLane=" << nextLane->
getID()
1188 <<
" lead=" << nextLeaders.
toString()
1189 <<
" failed (@641)!\n";
1200 if (freeSpeed < speed) {
1201 if (patchSpeedSpecial) {
1207 WRITE_WARNINGF(
TL(
"Vehicle '%' is inserted too fast and will violate the speed limit on a lane '%', time=%."),
1222 if ((*link)->hasApproachingFoe(arrivalTime, leaveTime, speed, cfModel.
getMaxDecel())) {
1230 currentLane = nextLane;
1231 if ((*link)->getViaLane() ==
nullptr) {
1240 for (
int i = 0; i < followers.
numSublanes(); ++i) {
1241 const MSVehicle* follower = followers[i].first;
1242 if (follower !=
nullptr) {
1244 if (followers[i].second < backGapNeeded
1248#ifdef DEBUG_INSERTION
1250 std::cout <<
SIMTIME <<
" isInsertionSuccess lane=" <<
getID()
1251 <<
" veh=" << aVehicle->
getID()
1253 <<
" posLat=" << posLat
1254 <<
" speed=" << speed
1255 <<
" nspeed=" << nspeed
1256 <<
" follower=" << follower->
getID()
1257 <<
" backGapNeeded=" << backGapNeeded
1258 <<
" gap=" << followers[i].second
1259 <<
" failure (@719)!\n";
1272#ifdef DEBUG_INSERTION
1277 if (shadowLane !=
nullptr) {
1279 for (
int i = 0; i < shadowFollowers.
numSublanes(); ++i) {
1280 const MSVehicle* follower = shadowFollowers[i].first;
1281 if (follower !=
nullptr) {
1283 if (shadowFollowers[i].second < backGapNeeded
1287#ifdef DEBUG_INSERTION
1290 <<
" isInsertionSuccess shadowlane=" << shadowLane->
getID()
1291 <<
" veh=" << aVehicle->
getID()
1293 <<
" posLat=" << posLat
1294 <<
" speed=" << speed
1295 <<
" nspeed=" << nspeed
1296 <<
" follower=" << follower->
getID()
1297 <<
" backGapNeeded=" << backGapNeeded
1298 <<
" gap=" << shadowFollowers[i].second
1299 <<
" failure (@812)!\n";
1309 if (veh !=
nullptr) {
1316#ifdef DEBUG_INSERTION
1319 <<
" isInsertionSuccess shadowlane=" << shadowLane->
getID()
1320 <<
" veh=" << aVehicle->
getID()
1322 <<
" posLat=" << posLat
1323 <<
" speed=" << speed
1324 <<
" nspeed=" << nspeed
1325 <<
" leader=" << veh->
getID()
1326 <<
" gapNeeded=" << gapNeeded
1328 <<
" failure (@842)!\n";
1340 if (missingRearGap > 0
1343#ifdef DEBUG_INSERTION
1346 <<
" isInsertionSuccess lane=" <<
getID()
1347 <<
" veh=" << aVehicle->
getID()
1349 <<
" posLat=" << posLat
1350 <<
" speed=" << speed
1351 <<
" nspeed=" << nspeed
1352 <<
" missingRearGap=" << missingRearGap
1353 <<
" failure (@728)!\n";
1360 speed =
MAX2(0.0, speed);
1364#ifdef DEBUG_INSERTION
1367 <<
" isInsertionSuccess lane=" <<
getID()
1368 <<
" veh=" << aVehicle->
getID()
1370 <<
" posLat=" << posLat
1371 <<
" speed=" << speed
1372 <<
" nspeed=" << nspeed
1373 <<
" failed (@733)!\n";
1380 if (extraReservation > 0) {
1381 std::stringstream msg;
1382 msg <<
"too many lane changes required on lane '" <<
myID <<
"'";
1385 if (distToStop >= 0) {
1387#ifdef DEBUG_INSERTION
1389 std::cout <<
"\nIS_INSERTION_SUCCESS\n"
1390 <<
SIMTIME <<
" veh=" << aVehicle->
getID() <<
" bestLaneOffset=" << bestLaneOffset <<
" bestLaneDist=" << aVehicle->
getBestLaneDist() <<
" extraReservation=" << extraReservation
1391 <<
" distToStop=" << distToStop <<
" v=" << speed <<
" v2=" << stopSpeed <<
"\n";
1403 return v->getPositionOnLane() >= pos;
1405#ifdef DEBUG_INSERTION
1408 <<
" isInsertionSuccess lane=" <<
getID()
1409 <<
" veh=" << aVehicle->
getID()
1411 <<
" posLat=" << posLat
1412 <<
" speed=" << speed
1413 <<
" nspeed=" << nspeed
1440 return v->getPositionOnLane() >= pos;
1447 double nspeed = speed;
1448#ifdef DEBUG_INSERTION
1450 std::cout <<
SIMTIME <<
" safeInsertionSpeed veh=" << veh->
getID() <<
" speed=" << speed <<
"\n";
1455 if (leader !=
nullptr) {
1462#ifdef DEBUG_INSERTION
1473 nspeed =
MIN2(nspeed,
1475#ifdef DEBUG_INSERTION
1477 std::cout <<
" leader=" << leader->
getID() <<
" bPos=" << leader->
getBackPositionOnLane(
this) <<
" gap=" << gap <<
" nspeed=" << nspeed <<
"\n";
1489#ifdef DEBUG_SURROUNDING
1491 std::cout <<
" getLastVehicleInformation lane=" <<
getID() <<
" ego=" <<
Named::getIDSecure(ego) <<
" latOffset=" << latOffset <<
" minPos=" << minPos <<
" allowCached=" << allowCached
1498 int freeSublanes = 1;
1503 while (freeSublanes > 0 && veh !=
nullptr) {
1504#ifdef DEBUG_PLAN_MOVE
1507 std::cout <<
" getLastVehicleInformation lane=" <<
getID() <<
" minPos=" << minPos <<
" veh=" << veh->
getID() <<
" pos=" << veh->
getPositionOnLane(
this) <<
"\n";
1512 freeSublanes = leaderTmp.
addLeader(veh,
true, vehLatOffset);
1513#ifdef DEBUG_PLAN_MOVE
1515 std::cout <<
" latOffset=" << vehLatOffset <<
" newLeaders=" << leaderTmp.
toString() <<
"\n";
1521 if (ego ==
nullptr && minPos == 0) {
1529#ifdef DEBUG_PLAN_MOVE
1558 int freeSublanes = 1;
1560 while (freeSublanes > 0 && veh !=
nullptr) {
1561#ifdef DEBUG_PLAN_MOVE
1563 std::cout <<
" veh=" << veh->
getID() <<
" pos=" << veh->
getPositionOnLane(
this) <<
" maxPos=" << maxPos <<
"\n";
1570#ifdef DEBUG_PLAN_MOVE
1572 std::cout <<
" veh=" << veh->
getID() <<
" latOffset=" << vehLatOffset <<
"\n";
1575 freeSublanes = followerTmp.
addLeader(veh,
true, vehLatOffset);
1579 if (ego ==
nullptr && maxPos == std::numeric_limits<double>::max()) {
1584#ifdef DEBUG_PLAN_MOVE
1607 double cumulatedVehLength = 0.;
1611 VehCont::reverse_iterator veh =
myVehicles.rbegin();
1614#ifdef DEBUG_PLAN_MOVE
1618 <<
" planMovements() lane=" <<
getID()
1626#ifdef DEBUG_PLAN_MOVE
1628 std::cout <<
" plan move for: " << (*veh)->getID();
1632#ifdef DEBUG_PLAN_MOVE
1634 std::cout <<
" leaders=" << leaders.
toString() <<
"\n";
1637 (*veh)->planMove(t, leaders, cumulatedVehLength);
1638 cumulatedVehLength += (*veh)->getVehicleType().getLengthWithGap();
1647 veh->setApproachingForAllLinks();
1656 bool nextToConsiderIsPartial;
1659 while (moreReservationsAhead || morePartialVehsAhead) {
1660 if ((!moreReservationsAhead || (*vehRes)->getPositionOnLane(
this) <= veh->
getPositionOnLane())
1661 && (!morePartialVehsAhead || (*vehPart)->getPositionOnLane(
this) <= veh->
getPositionOnLane())) {
1667 if (moreReservationsAhead && !morePartialVehsAhead) {
1668 nextToConsiderIsPartial =
false;
1669 }
else if (morePartialVehsAhead && !moreReservationsAhead) {
1670 nextToConsiderIsPartial =
true;
1672 assert(morePartialVehsAhead && moreReservationsAhead);
1674 nextToConsiderIsPartial = (*vehPart)->getPositionOnLane(
this) > (*vehRes)->getPositionOnLane(
this);
1677 if (nextToConsiderIsPartial) {
1678 const double latOffset = (*vehPart)->getLatOffset(
this);
1679#ifdef DEBUG_PLAN_MOVE
1681 std::cout <<
" partial ahead: " << (*vehPart)->getID() <<
" latOffset=" << latOffset <<
"\n";
1685 && !(*vehPart)->getLaneChangeModel().isChangingLanes())) {
1686 ahead.
addLeader(*vehPart,
false, latOffset);
1691 const double latOffset = (*vehRes)->getLatOffset(
this);
1692#ifdef DEBUG_PLAN_MOVE
1694 std::cout <<
" reservation ahead: " << (*vehRes)->getID() <<
" latOffset=" << latOffset <<
"\n";
1697 ahead.
addLeader(*vehRes,
false, latOffset);
1708#ifdef DEBUG_COLLISIONS
1710 std::vector<const MSVehicle*> all;
1712 all.push_back(*last);
1714 std::cout <<
SIMTIME <<
" detectCollisions stage=" << stage <<
" lane=" <<
getID() <<
":\n"
1717 <<
" all=" <<
toString(all) <<
"\n"
1726 std::set<const MSVehicle*, ComparatorNumericalIdLess> toRemove;
1727 std::set<const MSVehicle*, ComparatorNumericalIdLess> toTeleport;
1730#ifdef DEBUG_JUNCTION_COLLISIONS
1732 std::cout <<
SIMTIME <<
" detect junction Collisions stage=" << stage <<
" lane=" <<
getID() <<
":\n"
1739 const std::vector<const MSLane*>& foeLanes =
myLinks.front()->getFoeLanes();
1746 for (
const MSLane*
const foeLane : foeLanes) {
1747#ifdef DEBUG_JUNCTION_COLLISIONS
1749 std::cout <<
" foeLane " << foeLane->getID()
1750 <<
" foeVehs=" <<
toString(foeLane->myVehicles)
1751 <<
" foePart=" <<
toString(foeLane->myPartialVehicles) <<
"\n";
1756 const MSVehicle*
const victim = *it_veh;
1757 if (victim == collider) {
1761#ifdef DEBUG_JUNCTION_COLLISIONS
1764 <<
" bound=" << colliderBoundary <<
" foeBound=" << victim->
getBoundingBox()
1787 foeLane->handleCollisionBetween(timestep, stage, victim, collider, -1, 0, toRemove, toTeleport);
1796 if (
myLinks.front()->getWalkingAreaFoe() !=
nullptr) {
1799 if (
myLinks.front()->getWalkingAreaFoeExit() !=
nullptr) {
1807#ifdef DEBUG_PEDESTRIAN_COLLISIONS
1809 std::cout <<
SIMTIME <<
" detect pedestrian collisions stage=" << stage <<
" lane=" <<
getID() <<
"\n";
1823#ifdef DEBUG_PEDESTRIAN_COLLISIONS
1826 <<
" dist=" << leader.second <<
" jammed=" << (leader.first ==
nullptr ? false : leader.first->isJammed()) <<
"\n";
1829 if (leader.first != 0 && leader.second < length && !leader.first->isJammed()) {
1834 const double gap = leader.second - length;
1845 VehCont::reverse_iterator lastVeh =
myVehicles.rend() - 1;
1846 for (VehCont::reverse_iterator pred =
myVehicles.rbegin(); pred != lastVeh; ++pred) {
1847 VehCont::reverse_iterator veh = pred + 1;
1858 double high = (*veh)->getPositionOnLane(
this);
1859 double low = (*veh)->getBackPositionOnLane(
this);
1867 if (*veh == *veh2 && !(*veh)->isRail()) {
1870 if ((*veh)->getLane() == (*veh2)->getLane() ||
1871 (*veh)->getLane() == (*veh2)->getBackLane() ||
1872 (*veh)->getBackLane() == (*veh2)->getLane()) {
1876 double low2 =
myLength - (*veh2)->getPositionOnLane(bidiLane);
1877 double high2 =
myLength - (*veh2)->getBackPositionOnLane(bidiLane);
1883 if (!(high < low2 || high2 < low)) {
1884#ifdef DEBUG_COLLISIONS
1886 std::cout <<
SIMTIME <<
" bidi-collision veh=" << (*veh)->getID() <<
" bidiVeh=" << (*veh2)->getID()
1887 <<
" vehFurther=" <<
toString((*veh)->getFurtherLanes())
1888 <<
" high=" << high <<
" low=" << low <<
" high2=" << high2 <<
" low2=" << low2 <<
"\n";
1917 if (lead == follow) {
1932 for (std::set<const MSVehicle*, ComparatorNumericalIdLess>::iterator it = toRemove.begin(); it != toRemove.end(); ++it) {
1936 if (toTeleport.count(veh) > 0) {
1948 SUMOTime timestep,
const std::string& stage,
1949 std::set<const MSVehicle*, ComparatorNumericalIdLess>& toRemove,
1950 std::set<const MSVehicle*, ComparatorNumericalIdLess>& toTeleport) {
1952#ifdef DEBUG_PEDESTRIAN_COLLISIONS
1954 std::cout <<
SIMTIME <<
" detect pedestrian junction collisions stage=" << stage <<
" lane=" <<
getID() <<
" foeLane=" << foeLane->
getID() <<
"\n";
1958 for (std::vector<MSTransportable*>::const_iterator it_p = persons.begin(); it_p != persons.end(); ++it_p) {
1959#ifdef DEBUG_PEDESTRIAN_COLLISIONS
1961 std::cout <<
" collider=" << collider->
getID()
1962 <<
" ped=" << (*it_p)->getID()
1963 <<
" jammed=" << (*it_p)->isJammed()
1964 <<
" colliderBoundary=" << colliderBoundary
1965 <<
" pedBoundary=" << (*it_p)->getBoundingBox()
1969 if ((*it_p)->isJammed()) {
1972 if (colliderBoundary.
overlapsWith((*it_p)->getBoundingBox())
1974 std::string collisionType =
"junctionPedestrian";
1976 collisionType =
"crossing";
1978 collisionType =
"walkingarea";
1989 std::set<const MSVehicle*, ComparatorNumericalIdLess>& toRemove,
1990 std::set<const MSVehicle*, ComparatorNumericalIdLess>& toTeleport)
const {
1997 if (collider == victim) {
2003 const bool bothOpposite = victimOpposite && colliderOpposite;
2019 }
else if (colliderOpposite) {
2023#ifdef DEBUG_COLLISIONS
2026 <<
" thisLane=" <<
getID()
2027 <<
" collider=" << collider->
getID()
2028 <<
" victim=" << victim->
getID()
2029 <<
" colOpposite=" << colliderOpposite
2030 <<
" vicOpposite=" << victimOpposite
2033 <<
" colPos=" << colliderPos
2034 <<
" vicBack=" << victimBack
2038 <<
" minGapFactor=" << minGapFactor
2047 if (gap < -NUMERICAL_EPS) {
2052 if (latGap + NUMERICAL_EPS > 0) {
2058 double gapDelta = 0;
2059 const MSVehicle* otherLaneVeh = collider->
getLane() ==
this ? victim : collider;
2064 if (&cand->getEdge() == &
getEdge()) {
2065 gapDelta =
getLength() - cand->getLength();
2070 if (gap + gapDelta >= 0) {
2078 && victim->
getLane() !=
this) {
2082#ifdef DEBUG_COLLISIONS
2084 std::cout <<
SIMTIME <<
" detectedCollision gap=" << gap <<
" latGap=" << latGap <<
"\n";
2096 double gap,
double latGap, std::set<const MSVehicle*, ComparatorNumericalIdLess>& toRemove,
2097 std::set<const MSVehicle*, ComparatorNumericalIdLess>& toTeleport)
const {
2101 std::string collisionType;
2102 std::string collisionText;
2104 collisionType =
"frontal";
2105 collisionText =
TL(
"frontal collision");
2107 collisionType =
"side";
2108 collisionText =
TL(
"side collision");
2110 collisionType =
"junction";
2111 collisionText =
TL(
"junction collision");
2113 collisionType =
"collision";
2114 collisionText =
TL(
"collision");
2121 std::string prefix =
TLF(
"Vehicle '%'; % with vehicle '%", collider->
getID(), collisionText, victim->
getID());
2126 std::string dummyError;
2132 double victimSpeed = victim->
getSpeed();
2133 double colliderSpeed = collider->
getSpeed();
2136 if (collisionAngle < 45) {
2138 colliderSpeed =
MIN2(colliderSpeed, victimSpeed);
2139 }
else if (collisionAngle < 135) {
2178 prefix =
TLF(
"Teleporting vehicle '%'; % with vehicle '%", collider->
getID(), collisionText, victim->
getID());
2179 toRemove.insert(collider);
2180 toTeleport.insert(collider);
2183 prefix =
TLF(
"Removing % participants: vehicle '%', vehicle '%", collisionText, collider->
getID(), victim->
getID());
2184 bool removeCollider =
true;
2185 bool removeVictim =
true;
2189 toRemove.insert(victim);
2191 if (removeCollider) {
2192 toRemove.insert(collider);
2194 if (!removeVictim) {
2195 if (!removeCollider) {
2196 prefix =
TLF(
"Keeping remote-controlled % participants: vehicle '%', vehicle '%", collisionText, collider->
getID(), victim->
getID());
2198 prefix =
TLF(
"Removing % participant: vehicle '%', keeping remote-controlled vehicle '%", collisionText, collider->
getID(), victim->
getID());
2200 }
else if (!removeCollider) {
2201 prefix =
TLF(
"Keeping remote-controlled % participant: vehicle '%', removing vehicle '%", collisionText, collider->
getID(), victim->
getID());
2218#ifdef DEBUG_COLLISIONS
2220 toRemove.erase(collider);
2221 toTeleport.erase(collider);
2224 toRemove.erase(victim);
2225 toTeleport.erase(victim);
2233 double gap,
const std::string& collisionType,
2234 std::set<const MSVehicle*, ComparatorNumericalIdLess>& toRemove,
2235 std::set<const MSVehicle*, ComparatorNumericalIdLess>& toTeleport)
const {
2239 std::string prefix =
TLF(
"Vehicle '%'", collider->
getID());
2244 std::string dummyError;
2249 double colliderSpeed = collider->
getSpeed();
2250 const double victimStopPos = victim->
getEdgePos();
2268 prefix =
TLF(
"Teleporting vehicle '%' after", collider->
getID());
2269 toRemove.insert(collider);
2270 toTeleport.insert(collider);
2273 prefix =
TLF(
"Removing vehicle '%' after", collider->
getID());
2274 bool removeCollider =
true;
2276 if (!removeCollider) {
2277 prefix =
TLF(
"Keeping remote-controlled vehicle '%' after", collider->
getID());
2279 toRemove.insert(collider);
2290 WRITE_WARNING(prefix +
TLF(
" collision with person '%', lane='%', gap=%, time=%, stage=%.",
2293 WRITE_WARNING(prefix +
TLF(
" collision with person '%', lane='%', time=%, stage=%.",
2299#ifdef DEBUG_COLLISIONS
2301 toRemove.erase(collider);
2302 toTeleport.erase(collider);
2318 if (&further->getEdge() == victimBidi) {
2346#ifdef DEBUG_EXEC_MOVE
2348 std::cout <<
SIMTIME <<
" veh " << veh->
getID() <<
" has arrived." << std::endl;
2353 }
else if (target !=
nullptr && moved) {
2373 WRITE_WARNINGF(
TL(
"Removing vehicle '%' after breaking down, lane='%', time=%."),
2384 WRITE_WARNINGF(
TL(
"Teleporting vehicle '%'; beyond end of lane, target lane='%', time=%."),
2392 WRITE_WARNINGF(
TL(
"Removing vehicle '%' after earlier collision, lane='%', time=%."),
2397 WRITE_WARNINGF(
TL(
"Teleporting vehicle '%' after earlier collision, lane='%', time=%."),
2401 if (firstNotStopped ==
nullptr && !(*i)->
isStopped() && (*i)->getLane() ==
this) {
2402 firstNotStopped = *i;
2408 if (firstNotStopped ==
nullptr && !(*i)->
isStopped() && (*i)->getLane() ==
this) {
2409 firstNotStopped = *i;
2417 i = VehCont::reverse_iterator(
myVehicles.erase(i.base()));
2419 if (firstNotStopped !=
nullptr) {
2423 const bool wrongLane = !
appropriate(firstNotStopped);
2425 && firstNotStopped->
succEdge(1) !=
nullptr
2428 const bool r1 = ttt > 0 && firstNotStopped->
getWaitingTime() > ttt && !disconnected
2436 const bool r4 = !r1 && !r2 && !r3 && tttb > 0
2440 if (r1 || r2 || r3 || r4 || r5) {
2442 const bool minorLink = !wrongLane && (link !=
myLinks.end()) && !((*link)->havePriority());
2443 std::string reason = (wrongLane ?
" (wrong lane" : (minorLink ?
" (yield" :
" (jam"));
2450 reason =
" (blocked";
2452 WRITE_WARNINGF(
"Teleporting vehicle '%'; waited too long" + reason
2453 + (r2 ?
", highway" :
"")
2454 + (r3 ?
", disconnected" :
"")
2455 + (r4 ?
", bidi" :
"")
2456 + (r5 ?
", railSignal" :
"")
2460 }
else if (minorLink) {
2525 const MSLane* firstInternal =
this;
2527 while (pred !=
nullptr && pred->
isInternal()) {
2528 firstInternal = pred;
2532 return firstInternal;
2539 const DictType::iterator it =
myDict.lower_bound(
id);
2540 if (it ==
myDict.end() || it->first !=
id) {
2542 myDict.emplace_hint(it,
id, ptr);
2551 const DictType::iterator it =
myDict.find(
id);
2552 if (it ==
myDict.end()) {
2562 for (DictType::iterator i =
myDict.begin(); i !=
myDict.end(); ++i) {
2571 for (DictType::iterator i =
myDict.begin(); i !=
myDict.end(); ++i) {
2572 into.push_back((*i).first);
2577template<
class RTREE>
void
2579 for (DictType::iterator i =
myDict.begin(); i !=
myDict.end(); ++i) {
2583 const float cmin[2] = {(float) b.
xmin(), (float) b.
ymin()};
2584 const float cmax[2] = {(float) b.
xmax(), (float) b.
ymax()};
2585 into.Insert(cmin, cmax, l);
2589template void MSLane::fill<NamedRTree>(
NamedRTree& into);
2610 return (link !=
myLinks.end());
2620 assert(veh->getLane() ==
this);
2634#ifdef DEBUG_VEHICLE_CONTAINER
2654 std::cout <<
"sortManeuverReservations on lane " <<
getID()
2749std::vector<MSLink*>::const_iterator
2751 const MSLane& succLinkSource,
const std::vector<MSLane*>& conts) {
2754 if (nRouteEdge ==
nullptr) {
2756 return succLinkSource.
myLinks.end();
2760 assert(succLinkSource.
myLinks.size() == 1);
2763 return succLinkSource.
myLinks.begin();
2774 if (nRouteSuccs < (
int)conts.size()) {
2776 for (std::vector<MSLink*>::const_iterator link = succLinkSource.
myLinks.begin(); link != succLinkSource.
myLinks.end(); ++link) {
2777 if ((*link)->getLane() !=
nullptr && (*link)->getLane()->myEdge == nRouteEdge
2778 && (*link)->getLane()->allowsVehicleClass(veh.
getVClass())
2779 && ((*link)->getViaLane() ==
nullptr || (*link)->getViaLane()->allowsVehicleClass(veh.
getVClass()))) {
2781 if ((*link)->getLane() == conts[nRouteSuccs]) {
2788 return succLinkSource.
myLinks.end();
2791#ifdef DEBUG_NO_CONNECTION
2793 WRITE_WARNING(
"Could not find connection between lane " + succLinkSource.
getID() +
" and lane " + conts[nRouteSuccs]->getID() +
2796 return succLinkSource.
myLinks.end();
2804 if ((internal && l->getViaLane() == target) || (!internal && l->getLane() == target)) {
2815 if (l->getLane() == target) {
2816 return l->getViaLane();
2828 const MSLane* internal =
this;
2830 assert(lane !=
nullptr);
2834 assert(lane !=
nullptr);
2847 while (first !=
nullptr) {
2888 assert(remVehicle->
getLane() ==
this);
2890 if (remVehicle == *it) {
2925 }
else if (!approachingEdge->
isInternal() && warnMultiCon) {
2928 WRITE_WARNINGF(
TL(
"Lane '%' is approached multiple times from edge '%'. This may cause collisions."),
2938 if (link->getLane() ==
this && (link->getPermissions() & svc) == svc) {
2953 const MSVehicle* v = followerInfo.first;
2973std::pair<MSVehicle* const, double>
2974MSLane::getLeader(
const MSVehicle* veh,
const double vehPos,
const std::vector<MSLane*>& bestLaneConts,
double dist,
bool checkTmpVehicles)
const {
2982 if (checkTmpVehicles) {
2991 std::cout << std::setprecision(
gPrecision) <<
" getLeader lane=" <<
getID() <<
" ego=" << veh->
getID() <<
" egoPos=" << vehPos <<
" pred=" << pred->
getID() <<
" predPos=" << pred->
getPositionOnLane() <<
"\n";
3007 std::cout <<
" getLeader lane=" <<
getID() <<
" ego=" << veh->
getID() <<
" egoPos=" << vehPos
3024 if (bestLaneConts.size() > 0) {
3032 std::cout <<
" getLeader lane=" <<
getID() <<
" seen=" << seen <<
" dist=" << dist <<
"\n";
3036 return std::pair<MSVehicle* const, double>(
static_cast<MSVehicle*
>(
nullptr), -1);
3040 return std::make_pair(
static_cast<MSVehicle*
>(
nullptr), -1);
3045std::pair<MSVehicle* const, double>
3047 const std::vector<MSLane*>& bestLaneConts,
bool considerCrossingFoes)
const {
3050 std::cout <<
" getLeaderOnConsecutive lane=" <<
getID() <<
" ego=" << veh.
getID() <<
" seen=" << seen <<
" dist=" << dist <<
" conts=" <<
toString(bestLaneConts) <<
"\n";
3054 return std::make_pair(
static_cast<MSVehicle*
>(
nullptr), -1);
3069 return std::pair<MSVehicle* const, double>(pred, gap);
3077 const MSLane* nextLane =
this;
3081 std::vector<MSLink*>::const_iterator link =
succLinkSec(veh, view, *nextLane, bestLaneConts);
3087 if ((*link)->getLane() == nextEdge->
getLanes().front()) {
3096 std::cout <<
" cannot continue after nextLane=" << nextLane->
getID() <<
"\n";
3103 const bool laneChanging = veh.
getLane() !=
this;
3106 if (linkLeaders.size() > 0) {
3107 std::pair<MSVehicle*, double> result;
3108 double shortestGap = std::numeric_limits<double>::max();
3109 for (
auto ll : linkLeaders) {
3110 double gap = ll.vehAndGap.second;
3112 if (lVeh !=
nullptr) {
3119 <<
" isLeader=" << veh.
isLeader(*link, lVeh, ll.vehAndGap.second)
3120 <<
" gap=" << ll.vehAndGap.second
3121 <<
" gap+brakeing=" << gap
3126 if (!considerCrossingFoes && !ll.sameTarget()) {
3130 if (lVeh !=
nullptr && !laneChanging && !veh.
isLeader(*link, lVeh, ll.vehAndGap.second)) {
3133 if (gap < shortestGap) {
3138 ll.vehAndGap.second =
MAX2(seen - nextLane->
getLength(), ll.distToCrossing);
3140 result = ll.vehAndGap;
3143 if (shortestGap != std::numeric_limits<double>::max()) {
3146 std::cout <<
" found linkLeader after nextLane=" << nextLane->
getID() <<
"\n";
3153 bool nextInternal = (*link)->getViaLane() !=
nullptr;
3154 nextLane = (*link)->getViaLaneOrLane();
3155 if (nextLane ==
nullptr) {
3160 if (leader !=
nullptr) {
3163 std::cout <<
" found leader " << leader->
getID() <<
" on nextLane=" << nextLane->
getID() <<
"\n";
3168 return std::make_pair(leader, leaderDist);
3175 if (!nextInternal) {
3178 }
while (seen <= dist || nextLane->
isInternal());
3182 return std::make_pair(
static_cast<MSVehicle*
>(
nullptr), -1);
3186std::pair<MSVehicle* const, double>
3190 std::cout <<
SIMTIME <<
" getCriticalLeader. lane=" <<
getID() <<
" veh=" << veh.
getID() <<
"\n";
3194 std::pair<MSVehicle*, double> result = std::make_pair(
static_cast<MSVehicle*
>(
nullptr), -1);
3195 double safeSpeed = std::numeric_limits<double>::max();
3200 const MSLane* nextLane =
this;
3204 std::vector<MSLink*>::const_iterator link =
succLinkSec(veh, view, *nextLane, bestLaneConts);
3221 for (MSLink::LinkLeaders::const_iterator it = linkLeaders.begin(); it != linkLeaders.end(); ++it) {
3222 const MSVehicle* leader = (*it).vehAndGap.first;
3223 if (leader !=
nullptr && leader != result.first) {
3227 double tmpSpeed = safeSpeed;
3228 veh.
adaptToJunctionLeader((*it).vehAndGap, seen,
nullptr, nextLane, tmpSpeed, tmpSpeed, (*it).distToCrossing);
3231 std::cout <<
" linkLeader=" << leader->
getID() <<
" gap=" << result.second <<
" tmpSpeed=" << tmpSpeed <<
" safeSpeed=" << safeSpeed <<
"\n";
3234 if (tmpSpeed < safeSpeed) {
3235 safeSpeed = tmpSpeed;
3236 result = (*it).vehAndGap;
3240 bool nextInternal = (*link)->getViaLane() !=
nullptr;
3241 nextLane = (*link)->getViaLaneOrLane();
3242 if (nextLane ==
nullptr) {
3246 if (leader !=
nullptr && leader != result.first) {
3249 if (tmpSpeed < safeSpeed) {
3250 safeSpeed = tmpSpeed;
3251 result = std::make_pair(leader, gap);
3262 if (!nextInternal) {
3265 }
while (seen <= dist || nextLane->
isInternal());
3275 for (MSEdgeVector::iterator i = pred.begin(); i != pred.end();) {
3284 if (pred.size() != 0) {
3286 MSEdge* best = *pred.begin();
3318 if (&(cand.lane->getEdge()) == &fromEdge) {
3343#ifdef DEBUG_LANE_SORTER
3359 std::vector<MSLink*> candidateLinks =
myLinks;
3362 MSLane* best = (*candidateLinks.begin())->getViaLaneOrLane();
3363#ifdef DEBUG_LANE_SORTER
3364 std::cout <<
"\nBest successor lane for lane '" <<
myID <<
"': '" << best->
getID() <<
"'" << std::endl;
3374 if (pred ==
nullptr) {
3382const std::vector<std::pair<const MSLane*, const MSEdge*> >
3384 std::vector<std::pair<const MSLane*, const MSEdge*> > result;
3386 assert(link->getLane() !=
nullptr);
3387 result.push_back(std::make_pair(link->getLane(), link->getViaLane() ==
nullptr ?
nullptr : &link->getViaLane()->getEdge()));
3392std::vector<const MSLane*>
3394 std::vector<const MSLane*> result = {};
3396 for (std::vector<MSLane*>::const_iterator it_lane = (*it).second.begin(); it_lane != (*it).second.end(); ++it_lane) {
3397 if (!((*it_lane)->isInternal())) {
3398 result.push_back(*it_lane);
3422 for (std::vector<MSLink*>::const_iterator i =
myLinks.begin(); i !=
myLinks.end(); ++i) {
3423 if ((*i)->getLane()->isCrossing()) {
3424 return (
int)(i -
myLinks.begin());
3440 if (cand->getLane() == bidi) {
3441 sum += (brutto ? cand->getVehicleType().getLengthWithGap() : cand->getVehicleType().getLength());
3443 sum +=
myLength - cand->getBackPositionOnLane(
this);
3487 wtime += (*i)->getWaitingSeconds();
3502 v += veh->getSpeed();
3524 v += veh->getSpeed();
3543 if (vehs.size() == 0) {
3547 for (MSLane::VehCont::const_iterator i = vehs.begin(); i != vehs.end(); ++i) {
3548 double sv = (*i)->getHarmonoise_NoiseEmissions();
3549 ret += (double) pow(10., (sv / 10.));
3582 myLaneDir(e->getLanes()[0]->
getShape().angleAt2D(0)) {
3593 if (ae1 !=
nullptr && ae1->size() != 0) {
3603 if (ae2 !=
nullptr && ae2->size() != 0) {
3623 myLaneDir(targetLane->
getShape().angleAt2D(0)) {}
3641#ifdef DEBUG_LANE_SORTER
3642 std::cout <<
"\nincoming_lane_priority sorter()\n"
3643 <<
"noninternal predecessor for lane '" << laneInfo1.
lane->
getID()
3644 <<
"': '" << noninternal1->
getID() <<
"'\n"
3645 <<
"noninternal predecessor for lane '" << laneInfo2.
lane->
getID()
3646 <<
"': '" << noninternal2->
getID() <<
"'\n";
3654 bool priorized1 =
true;
3655 bool priorized2 =
true;
3657#ifdef DEBUG_LANE_SORTER
3658 std::cout <<
"FoeLinks of '" << noninternal1->
getID() <<
"'" << std::endl;
3661#ifdef DEBUG_LANE_SORTER
3662 std::cout << foeLink->getLaneBefore()->getID() << std::endl;
3664 if (foeLink == link2) {
3670#ifdef DEBUG_LANE_SORTER
3671 std::cout <<
"FoeLinks of '" << noninternal2->
getID() <<
"'" << std::endl;
3674#ifdef DEBUG_LANE_SORTER
3675 std::cout << foeLink->getLaneBefore()->getID() << std::endl;
3678 if (foeLink == link1) {
3686 if (priorized1 != priorized2) {
3700 myLaneDir(sourceLane->
getShape().angleAt2D(0)) {}
3706 if (target2 ==
nullptr) {
3709 if (target1 ==
nullptr) {
3713#ifdef DEBUG_LANE_SORTER
3714 std::cout <<
"\noutgoing_lane_priority sorter()\n"
3715 <<
"noninternal successors for lane '" << myLane->
getID()
3716 <<
"': '" << target1->
getID() <<
"' and "
3717 <<
"'" << target2->
getID() <<
"'\n";
3724 if (priority1 != priority2) {
3725 return priority1 > priority2;
3751 if (link->getApproaching().size() > 0) {
3760 const bool toRailJunction =
myLinks.size() > 0 && (
3764 const bool saveApproaching = toRailJunction ||
isInternal();
3765 const bool hasVehicles =
myVehicles.size() > 0;
3774 if (saveApproaching) {
3776 if (link->getApproaching().size() > 0) {
3779 for (
auto item : link->getApproaching()) {
3789 if (item.second.latOffset != 0) {
3860 bool allSublanes,
double searchDist,
MinorLinkMode mLinkMode,
bool maxSearchDist)
const {
3869 std::cout <<
SIMTIME <<
" getFollowers lane=" <<
getID() <<
" ego=" << ego->
getID()
3870 <<
" backOffset=" << backOffset <<
" pos=" << egoPos
3871 <<
" allSub=" << allSublanes <<
" searchDist=" << searchDist <<
" ignoreMinor=" << mLinkMode
3872 <<
" maxSearchDist=" << maxSearchDist
3873 <<
" egoLatDist=" << egoLatDist
3874 <<
" getOppositeLeaders=" << getOppositeLeaders
3890 std::cout <<
SIMTIME <<
" getFollowers lane=" <<
getID() <<
" ego=" << ego->
getID()
3916 std::cout <<
" (1) added veh=" << veh->
getID() <<
" latOffset=" << latOffset <<
" result=" << result.
toString() <<
"\n";
3923 std::cout <<
" result.numFreeSublanes=" << result.
numFreeSublanes() <<
"\n";
3931 if (searchDist == -1) {
3935 std::cout <<
" computed searchDist=" << searchDist <<
"\n";
3939 std::set<const MSEdge*> egoFurther;
3941 egoFurther.insert(&further->getEdge());
3954 std::vector<MSLane::IncomingLaneInfo> newFound;
3956 while (toExamine.size() != 0) {
3957 for (std::vector<MSLane::IncomingLaneInfo>::iterator it = toExamine.begin(); it != toExamine.end(); ++it) {
3958 MSLane* next = (*it).lane;
3959 searchDist = maxSearchDist
3966 std::cout <<
" next=" << next->
getID() <<
" seen=" << (*it).length <<
" first=" << first.
toString() <<
" firstFront=" << firstFront.
toString() <<
" backOffset=" << backOffset <<
"\n";
3970 if (backOffset + (*it).length - next->
getLength() < 0
3971 && egoFurther.count(&next->
getEdge()) != 0
3977 for (
const auto& ll : linkLeaders) {
3978 if (ll.vehAndGap.first !=
nullptr) {
3979 const bool bidiFoe = (*it).viaLink->getLane() == ll.vehAndGap.first->getLane()->getNormalPredecessorLane()->getBidiLane();
3980 const bool egoIsLeader = !bidiFoe && ll.vehAndGap.first->isLeader((*it).viaLink, ego, ll.vehAndGap.second);
3983 const double gap = (egoIsLeader
3984 ? -ll.vehAndGap.second - ll.vehAndGap.first->getVehicleType().getLengthWithGap() - ego->
getVehicleType().
getMinGap()
3989 std::cout <<
SIMTIME <<
" ego=" << ego->
getID() <<
" link=" << (*it).viaLink->getViaLaneOrLane()->getID()
3991 <<
" gap=" << ll.vehAndGap.second <<
" dtC=" << ll.distToCrossing
3992 <<
" bidiFoe=" << bidiFoe
3993 <<
" egoIsLeader=" << egoIsLeader <<
" gap2=" << gap
4007 const MSVehicle* v = first[i] == ego ? firstFront[i] : first[i];
4010 if (v !=
nullptr && v != ego) {
4017 agap = (*it).length - next->
getLength() + backOffset;
4024 std::cout <<
" agap1=" << agap <<
"\n";
4028 if (agap > 0 && differentEdge) {
4031 if (!getOppositeLeaders) {
4036 if (v !=
nullptr && v != ego) {
4042 }
else if (differentEdge && result.
hasVehicle(v)) {
4052 if (!(*it).viaLink->havePriority() && egoFurther.count(&(*it).lane->getEdge()) == 0
4058 agap =
MAX2(agap, 0.0);
4069 if ((*it).length < searchDist) {
4070 const std::vector<MSLane::IncomingLaneInfo>& followers = next->
getIncomingLanes();
4071 for (std::vector<MSLane::IncomingLaneInfo>::const_iterator j = followers.begin(); j != followers.end(); ++j) {
4072 if (visited.find((*j).lane) == visited.end() && (((*j).viaLink->havePriority() && !(*j).viaLink->isTurnaround())
4075 visited.insert((*j).lane);
4077 ili.
lane = (*j).lane;
4078 ili.
length = (*j).length + (*it).length;
4080 newFound.push_back(ili);
4086 swap(newFound, toExamine);
4098 bool oppositeDirection)
const {
4101 std::cout <<
" getLeadersOnConsecutive " <<
getID() <<
" ego=" <<
Named::getIDSecure(ego) <<
" dist=" << dist <<
" seen=" << seen <<
"\n";
4122 const MSLane* nextLane =
this;
4126 if (nextLane !=
this) {
4130 bool nextInternal =
false;
4131 if (oppositeDirection) {
4132 if (view >= (
int)bestLaneConts.size()) {
4135 nextLane = bestLaneConts[view];
4137 std::vector<MSLink*>::const_iterator link =
succLinkSec(*ego, view, *nextLane, bestLaneConts);
4143 std::cout <<
" link=" << (*link)->getDescription() <<
" debugflag=" <<
gDebugFlag1 <<
"\n";
4153 std::cout <<
" linkleader=" << veh->
getID() <<
" gap=" << ll.vehAndGap.second <<
" leaderOffset=" << ll.latOffset <<
" flags=" << ll.llFlags <<
"\n";
4156 if (veh != 0 && (ego->
isLeader(*link, veh, ll.vehAndGap.second)
4160 if (ll.sameTarget() || ll.sameSource()) {
4161 result.
addLeader(veh, ll.vehAndGap.second, ll.latOffset);
4164 std::cout <<
" added selective: result=" << result.
toString() <<
"\n";
4170 result.
addLeader(veh, ll.vehAndGap.second, 0, i);
4174 std::cout <<
" added allSublanes: result=" << result.
toString() <<
"\n";
4180 nextInternal = (*link)->getViaLane() !=
nullptr;
4181 nextLane = (*link)->getViaLaneOrLane();
4182 if (nextLane ==
nullptr) {
4190 std::cout <<
SIMTIME <<
" getLeadersOnConsecutive lane=" <<
getID() <<
" nextLane=" << nextLane->
getID() <<
" leaders=" << leaders.
toString() <<
"\n";
4195 for (
int i = 0; i < iMax; ++i) {
4197 if (veh !=
nullptr) {
4215 std::cout <<
" newDist=" << dist <<
" newSeen=" << seen <<
"\n";
4218 if (!nextInternal) {
4232#ifdef DEBUG_SURROUNDING
4234 std::cout <<
" addLeaders lane=" <<
getID() <<
" veh=" << vehicle->
getID() <<
" vehPos=" << vehPos <<
" opposite=" << opposite <<
"\n";
4238 for (
int i = 0; i < aheadSamePos.
numSublanes(); ++i) {
4240 if (veh !=
nullptr && veh != vehicle) {
4242#ifdef DEBUG_SURROUNDING
4254 double speed = vehicle->
getSpeed();
4262#ifdef DEBUG_SURROUNDING
4264 std::cout <<
" aborting forward search. dist=" << dist <<
" seen=" << seen <<
"\n";
4269#ifdef DEBUG_SURROUNDING
4271 std::cout <<
" add consecutive before=" << result.
toString() <<
" seen=" << seen <<
" dist=" << dist;
4276#ifdef DEBUG_SURROUNDING
4278 std::cout <<
" upstreamOpposite=" <<
toString(bestLaneConts);
4286#ifdef DEBUG_SURROUNDING
4288 std::cout <<
" after=" << result.
toString() <<
"\n";
4304 std::cout <<
SIMTIME <<
" getPartialBehind lane=" <<
getID() <<
" ego=" << ego->
getID() <<
" found=" << veh->
getID() <<
"\n";
4335 assert(checkedLanes !=
nullptr);
4336 if (checkedLanes->find(
this) != checkedLanes->end()) {
4337#ifdef DEBUG_SURROUNDING
4338 std::cout <<
"Skipping previously scanned lane: " <<
getID() << std::endl;
4340 return std::set<MSVehicle*>();
4343 (*checkedLanes)[
this] = std::make_pair(
MAX2(0.0, startPos - upstreamDist),
MIN2(startPos + downstreamDist,
getLength()));
4345#ifdef DEBUG_SURROUNDING
4346 std::cout <<
"Scanning on lane " <<
myID <<
"(downstr. " << downstreamDist <<
", upstr. " << upstreamDist <<
", startPos " << startPos <<
"): " << std::endl;
4349 if (startPos < upstreamDist) {
4352 MSLane* incoming = incomingInfo.lane;
4353#ifdef DEBUG_SURROUNDING
4354 std::cout <<
"Checking on incoming: " << incoming->
getID() << std::endl;
4355 if (checkedLanes->find(incoming) != checkedLanes->end()) {
4356 std::cout <<
"Skipping previous: " << incoming->
getID() << std::endl;
4360 foundVehicles.insert(newVehs.begin(), newVehs.end());
4364 if (
getLength() < startPos + downstreamDist) {
4368#ifdef DEBUG_SURROUNDING
4369 std::cout <<
"Checking on outgoing: " << l->getViaLaneOrLane()->getID() << std::endl;
4371 std::set<MSVehicle*> newVehs = l->getViaLaneOrLane()->getSurroundingVehicles(0.0, downstreamDist - (
myLength - startPos), upstreamDist, checkedLanes);
4372 foundVehicles.insert(newVehs.begin(), newVehs.end());
4375#ifdef DEBUG_SURROUNDING
4376 std::cout <<
"On lane (2) " <<
myID <<
": \nFound vehicles: " << std::endl;
4378 std::cout << v->getID() <<
" pos = " << v->getPositionOnLane() << std::endl;
4381 return foundVehicles;
4387 std::set<MSVehicle*> res;
4390 if (!vehs.empty()) {
4392 if (veh->getPositionOnLane() >= a) {
4393 if (veh->getBackPositionOnLane() > b) {
4405std::vector<const MSJunction*>
4408 std::vector<const MSJunction*> junctions;
4410 junctions.insert(junctions.end(), l->getJunction());
4416std::vector<const MSLink*>
4418#ifdef DEBUG_SURROUNDING
4419 std::cout <<
"getUpcoming links on lane '" <<
getID() <<
"' with pos=" << pos
4420 <<
" range=" << range << std::endl;
4423 std::vector<const MSLink*> links;
4426 const MSLane* lane =
this;
4429 std::vector<MSLane*>::const_iterator contLanesIt = contLanes.begin();
4433 const MSLink* link =
nullptr;
4435 assert(*contLanesIt ==
nullptr);
4437 links.insert(links.end(), link);
4442 assert(*(contLanesIt + 1) == lane);
4444 while (++contLanesIt != contLanes.end()) {
4448#ifdef DEBUG_SURROUNDING
4449 std::cout <<
"Distance until end of lane '" << lane->
getID() <<
"' is " << dist <<
"." << std::endl;
4455 if (link !=
nullptr) {
4456 links.insert(links.end(), link);
4458 lane = *contLanesIt;
4481std::pair<MSVehicle* const, double>
4488 std::cout <<
" getFollower lane=" <<
getID() <<
" egoPos=" << egoPos <<
" pred=" << pred->
getID() <<
" predPos=" << pred->
getPositionOnLane(
this) <<
"\n";
4496 if (dist > 0 && backOffset > dist) {
4497 return std::make_pair(
nullptr, -1);
4501 return std::make_pair(
const_cast<MSVehicle*
>(result.first), result.second);
4504std::pair<MSVehicle* const, double>
4506#ifdef DEBUG_OPPOSITE
4508 <<
" ego=" << ego->
getID()
4512 <<
" oppositeDir=" << oppositeDir
4520 std::pair<MSVehicle* const, double> result =
getFollower(ego, egoPos + egoLength, dist, mLinkMode,
true);
4521 if (result.first !=
nullptr) {
4523 if (result.first->getLaneChangeModel().isOpposite()) {
4524 result.second -= result.first->getVehicleType().getLength();
4532std::pair<MSVehicle* const, double>
4534#ifdef DEBUG_OPPOSITE
4536 <<
" ego=" << ego->
getID()
4546 std::pair<MSVehicle*, double> result =
getLeader(ego, vehPos, std::vector<MSLane*>());
4549 while (result.first ==
nullptr && dist > 0) {
4554 if (next ==
nullptr) {
4558 result = next->
getLeader(ego, vehPos, std::vector<MSLane*>());
4560 if (result.first !=
nullptr) {
4561 if (result.first->getLaneChangeModel().isOpposite()) {
4562 result.second -= result.first->getVehicleType().getLength();
4564 if (result.second > POSITION_EPS) {
4566 return std::make_pair(
static_cast<MSVehicle*
>(
nullptr), -1);
4576 const std::string action = oc.
getString(option);
4577 if (action ==
"none") {
4579 }
else if (action ==
"warn") {
4581 }
else if (action ==
"teleport") {
4583 }
else if (action ==
"remove") {
4640 MSLane*
const internal = link->getViaLane();
4643 if (internal !=
nullptr && internal->
getPermissions() == oldPermissions) {
4685#ifdef DEBUG_INSERTION
4687 std::cout <<
SIMTIME <<
" check for pedestrians on lane=" <<
getID() <<
" pos=" << pos <<
"\n";
4692 if (leader.first != 0) {
4698#ifdef DEBUG_INSERTION
4700 <<
" isInsertionSuccess lane=" <<
getID()
4701 <<
" veh=" << aVehicle->
getID()
4704 <<
" patchSpeed=" << patchSpeed
4705 <<
" speed=" << speed
4706 <<
" stopSpeed=" << stopSpeed
4707 <<
" pedestrianLeader=" << leader.first->getID()
4708 <<
" failed (@796)!\n";
4714 double backLength = aVehicle->
getLength() - pos;
4718 const MSLane* cur =
this;
4719 while (backLength > 0 && prev !=
nullptr) {
4723 if (foe->isCrossing() && (foe->hasPedestrians() ||
4724 (foe->getIncomingLanes()[0].viaLink->getApproachingPersons() !=
nullptr
4725 && foe->getIncomingLanes()[0].viaLink->getApproachingPersons()->size() > 0))) {
4726#ifdef DEBUG_INSERTION
4728 <<
" isInsertionSuccess lane=" <<
getID()
4729 <<
" veh=" << aVehicle->
getID()
4731 <<
" backCrossing=" << foe->getID()
4733 <<
" approaching=" << foe->getIncomingLanes()[0].viaLink->getApproachingPersons()->size()
4734 <<
" failed (@4550)!\n";
4752 const int numRNGs = oc.
getInt(
"thread-rngs");
4753 const bool random = oc.
getBool(
"random");
4754 int seed = oc.
getInt(
"seed");
4756 for (
int i = 0; i < numRNGs; i++) {
4790 myLinks.front()->getFoeLanes().size() > 0
4791 ||
myLinks.front()->getWalkingAreaFoe() !=
nullptr
4792 ||
myLinks.front()->getWalkingAreaFoeExit() !=
nullptr);
4805 foundStopped =
true;
4806 const double lastBrakeGap = last->getCarFollowModel().brakeGap(last->getSpeed());
4807 const double ret = last->getBackPositionOnLane() + lastBrakeGap - lengths;
4811 lengths += last->getVehicleType().getLengthWithGap() * (last->getVehicleType().getWidth() + last->getVehicleType().getMinGapLat()) /
getWidth();
4813 lengths += last->getVehicleType().getLengthWithGap();
std::vector< MSEdge * > MSEdgeVector
std::pair< const MSVehicle *, double > CLeaderDist
std::pair< const MSPerson *, double > PersonDist
ConstMSEdgeVector::const_iterator MSRouteIterator
#define WRITE_WARNINGF(...)
#define WRITE_ERRORF(...)
#define WRITE_WARNING(msg)
SUMOTime string2time(const std::string &r)
convert string to SUMOTime
std::string time2string(SUMOTime t, bool humanReadable)
convert SUMOTime to string (independently of global format setting)
constexpr SUMOTime TIME2STEPS(double x)
const SVCPermissions SVCAll
all VClasses are allowed
bool isRailway(SVCPermissions permissions)
Returns whether an edge with the given permissions is a (exclusive) railway edge.
bool isRailwayOrShared(SVCPermissions permissions)
Returns whether an edge with the given permissions is a railway edge or a shared road/rail edge.
long long int SVCPermissions
bitset where each bit declares whether a certain SVC may use this edge/lane
@ AIRCRAFT
render as aircraft
SUMOVehicleClass
Definition of vehicle classes to differ between different lane usage and authority types.
@ SVC_SHIP
is an arbitrary ship
@ SVC_RAIL_CLASSES
classes which drive on tracks
@ SVC_BICYCLE
vehicle is a bicycle
const int STOP_DURATION_SET
@ GIVEN
The speed is given.
@ RANDOM
The lateral position is chosen randomly.
@ RIGHT
At the rightmost side of the lane.
@ GIVEN
The position is given.
@ DEFAULT
No information given; use default.
@ LEFT
At the leftmost side of the lane.
@ FREE
A free lateral position is chosen.
@ CENTER
At the center of the lane.
@ RANDOM_FREE
If a fixed number of random choices fails, a free lateral position is chosen.
@ RANDOM
A random position is chosen.
@ GIVEN
The position is given.
@ DEFAULT
No information given; use default.
@ STOP
depart position is endPos of first stop
@ FREE
A free position is chosen.
@ SPLIT_FRONT
depart position for a split vehicle is in front of the continuing vehicle
@ BASE
Back-at-zero position.
@ LAST
Insert behind the last vehicle as close as possible to still allow the specified departSpeed....
@ RANDOM_FREE
If a fixed number of random choices fails, a free position is chosen.
DepartSpeedDefinition
Possible ways to choose the departure speed.
@ RANDOM
The speed is chosen randomly.
@ MAX
The maximum safe speed is used.
@ GIVEN
The speed is given.
@ LIMIT
The maximum lane speed is used (speedLimit)
@ DEFAULT
No information given; use default.
@ DESIRED
The maximum lane speed is used (speedLimit * speedFactor)
@ LAST
The speed of the last vehicle. Fallback to DepartSpeedDefinition::DESIRED if there is no vehicle on t...
@ AVG
The average speed on the lane. Fallback to DepartSpeedDefinition::DESIRED if there is no vehicle on t...
@ SPLIT
The departure is triggered by a train split.
InsertionCheck
different checking levels for vehicle insertion
@ SUMO_TAG_LINK
Link information for state-saving.
@ SUMO_TAG_APPROACHING
Link-approaching vehicle information for state-saving.
@ SUMO_TAG_VIEWSETTINGS_VEHICLES
@ SUMO_TAG_LANE
begin/end of the description of a single lane
@ STRAIGHT
The link is a straight direction.
LinkState
The right-of-way state of a link between two lanes used when constructing a NBTrafficLightLogic,...
@ LINKSTATE_ALLWAY_STOP
This is an uncontrolled, all-way stop link.
@ LINKSTATE_MAJOR
This is an uncontrolled, major link, may pass.
@ LINKSTATE_STOP
This is an uncontrolled, minor link, has to stop.
@ LINKSTATE_EQUAL
This is an uncontrolled, right-before-left link.
@ LINKSTATE_DEADEND
This is a dead end link.
@ LINKSTATE_ZIPPER
This is an uncontrolled, zipper-merge link.
@ LINKSTATE_MINOR
This is an uncontrolled, minor link, has to brake.
@ SUMO_ATTR_JM_STOPLINE_CROSSING_GAP
@ SUMO_ATTR_ARRIVALSPEEDBRAKING
@ SUMO_ATTR_STATE
The state of a link.
int gPrecision
the precision for floating point outputs
double roundDecimal(double x, int precision)
round to the given number of decimal digits
bool gDebugFlag1
global utility flags for debugging
const double SUMO_const_haltingSpeed
the speed threshold at which vehicles are considered as halting
std::string joinNamedToString(const std::set< T *, C > &ns, const T_BETWEEN &between)
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
A class that stores a 2D geometrical boundary.
double ymin() const
Returns minimum y-coordinate.
double xmin() const
Returns minimum x-coordinate.
Boundary & grow(double by)
extends the boundary by the given amount
double ymax() const
Returns maximum y-coordinate.
double xmax() const
Returns maximum x-coordinate.
static double angleDiff(const double angle1, const double angle2)
Returns the difference of the second angle to the first angle in radiants.
static double sum(double val)
Computes the resulting noise.
MESegment * getSegmentForEdge(const MSEdge &e, double pos=0)
Get the segment for a given edge at a given position.
A single mesoscopic segment (cell)
void setSpeed(double newSpeed, SUMOTime currentTime, double jamThresh=DO_NOT_PATCH_JAM_THRESHOLD, int qIdx=-1)
reset mySpeed and patch the speed of all vehicles in it. Also set/recompute myJamThreshold
MESegment * getNextSegment() const
Returns the following segment on the same edge (0 if it is the last).
Container & getContainer()
virtual double getExtraReservation(int bestLaneOffset, double neighExtraDist=0) const
bool hasBlueLight() const
MSLane * getShadowLane() const
Returns the lane the vehicle's shadow is on during continuous/sublane lane change.
bool isChangingLanes() const
return true if the vehicle currently performs a lane change maneuver
The base class for microscopic and mesoscopic vehicles.
double getImpatience() const
Returns this vehicles impatience.
const MSEdge * succEdge(int nSuccs) const
Returns the nSuccs'th successor of edge the vehicle is currently at.
virtual double getArrivalPos() const
Returns this vehicle's desired arrivalPos for its current route (may change on reroute)
int getInsertionChecks() const
const SUMOVehicleParameter & getParameter() const
Returns the vehicle's parameter (including departure definition)
double getChosenSpeedFactor() const
Returns the precomputed factor by which the driver wants to be faster than the speed limit.
const SUMOVehicleParameter::Stop * getNextStopParameter() const
return parameters for the next stop (SUMOVehicle Interface)
bool isJumping() const
Returns whether the vehicle is perform a jump.
const MSRouteIterator & getCurrentRouteEdge() const
Returns an iterator pointing to the current edge in this vehicles route.
double getLength() const
Returns the vehicle's length.
bool isParking() const
Returns whether the vehicle is parking.
const MSEdge * getEdge() const
Returns the edge the vehicle is currently at.
bool hasDeparted() const
Returns whether this vehicle has already departed.
double basePos(const MSEdge *edge) const
departure position where the vehicle fits fully onto the edge (if possible)
bool hasStops() const
Returns whether the vehicle has to stop somewhere.
const MSStop & getNextStop() const
SUMOVehicleClass getVClass() const
Returns the vehicle's access class.
NumericalID getNumericalID() const
return the numerical ID which is only for internal usage
const MSRoute & getRoute() const
Returns the current route.
int getRoutePosition() const
return index of edge within route
SUMOTime getDepartDelay() const
Returns the depart delay.
const MSVehicleType & getVehicleType() const
Returns the vehicle's type definition.
bool isStopped() const
Returns whether the vehicle is at a stop.
MSDevice * getDevice(const std::type_info &type) const
Returns a device of the given type if it exists, nullptr otherwise.
The car-following model abstraction.
double getCollisionMinGapFactor() const
Get the factor of minGap that must be maintained to avoid a collision event.
double getEmergencyDecel() const
Get the vehicle type's maximal physically possible deceleration [m/s^2].
virtual double freeSpeed(const MSVehicle *const veh, double speed, double seen, double maxSpeed, const bool onInsertion=false, const CalcReason usage=CalcReason::CURRENT) const
Computes the vehicle's safe speed without a leader.
virtual double insertionFollowSpeed(const MSVehicle *const veh, double speed, double gap2pred, double predSpeed, double predMaxDecel, const MSVehicle *const pred=0) const
Computes the vehicle's safe speed (no dawdling) This method is used during the insertion stage....
@ FUTURE
the return value is used for calculating future speeds
virtual double getSecureGap(const MSVehicle *const veh, const MSVehicle *const, const double speed, const double leaderSpeed, const double leaderMaxDecel) const
Returns the minimum gap to reserve if the leader is braking at maximum (>=0)
double brakeGap(const double speed) const
Returns the distance the vehicle needs to halt including driver's reaction time tau (i....
double getMaxDecel() const
Get the vehicle type's maximal comfortable deceleration [m/s^2].
double stopSpeed(const MSVehicle *const veh, const double speed, double gap, const CalcReason usage=CalcReason::CURRENT) const
Computes the vehicle's safe speed for approaching a non-moving obstacle (no dawdling)
virtual double insertionStopSpeed(const MSVehicle *const veh, double speed, double gap) const
Computes the vehicle's safe speed for approaching an obstacle at insertion without constraints due to...
std::string toString() const
print a debugging representation
int addFollower(const MSVehicle *veh, const MSVehicle *ego, double gap, double latOffset=0, int sublane=-1)
A device which collects info on the vehicle trip (mainly on departure and arrival)
bool sidingDeadlock(const SUMOVehicle *veh) const
whether insertion on this driveway would cause deadlock in an approached siding
static const MSDriveWay * getDepartureDriveway(const SUMOVehicle *veh, bool init=false)
bool foeDriveWayOccupied(bool store, const SUMOVehicle *ego, MSEdgeVector &occupied) const
whether any of myFoes is occupied (vehicles that are the target of a join must be ignored)
void gotActive(MSLane *l)
Informs the control that the given lane got active.
void checkCollisionForInactive(MSLane *l)
trigger collision checking for inactive lane
void needsVehicleIntegration(MSLane *const l)
A road/street connecting two junctions.
void changeLanes(SUMOTime t) const
Performs lane changing on this edge.
bool isCrossing() const
return whether this edge is a pedestrian crossing
int getPriority() const
Returns the priority of the edge.
const std::set< MSTransportable *, ComparatorNumericalIdLess > & getPersons() const
Returns this edge's persons set.
bool isWalkingArea() const
return whether this edge is walking area
const std::vector< MSLane * > & getLanes() const
Returns this edge's lanes.
const MSEdge * getNormalSuccessor() const
if this edge is an internal edge, return its first normal successor, otherwise the edge itself
const std::vector< MSLane * > * allowedLanes(const MSEdge &destination, SUMOVehicleClass vclass=SVC_IGNORING, bool ignoreTransientPermissions=false) const
Get the allowed lanes to reach the destination-edge.
const MSEdge * getBidiEdge() const
return opposite superposable/congruent edge, if it exist and 0 else
bool isNormal() const
return whether this edge is an internal edge
std::vector< MSTransportable * > getSortedPersons(SUMOTime timestep, bool includeRiding=false) const
Returns this edge's persons sorted by pos.
void recalcCache()
Recalculates the cached values.
bool hasLaneChanger() const
const MSJunction * getToJunction() const
const MSJunction * getFromJunction() const
bool isInternal() const
return whether this edge is an internal edge
bool isVaporizing() const
Returns whether vehicles on this edge shall be vaporized.
MSLane * parallelLane(const MSLane *const lane, int offset, bool includeOpposite=true) const
Returns the lane with the given offset parallel to the given lane one or 0 if it does not exist.
const std::string & getEdgeType() const
Returns the type of the edge.
const MSEdge * getNormalBefore() const
if this edge is an internal edge, return its first normal predecessor, otherwise the edge itself
const MSEdgeVector & getPredecessors() const
void rebuildAllowedLanes(const bool onInit=false, bool updateVehicles=false)
static SUMOTime gTimeToTeleportDisconnected
static SUMOTime gTimeToGridlockHighways
static double gGridlockHighwaysSpeed
static bool gRemoveGridlocked
static SUMOTime gTimeToTeleportBidi
static MELoop * gMesoNet
mesoscopic simulation infrastructure
static double gLateralResolution
static SUMOTime gTimeToTeleportRSDeadlock
static bool gClearState
whether the simulation is in the process of clearing state (MSNet::clearState)
static bool gComputeLC
whether the simulationLoop is in the lane changing phase
static bool gEmergencyInsert
static int gNumSimThreads
how many threads to use for simulation
static SUMOTime gIgnoreJunctionBlocker
static bool gSublane
whether sublane simulation is enabled (sublane model or continuous lanechanging)
static SUMOTime gLaneChangeDuration
static bool gUnitTests
whether unit tests are being run
static bool gUsingInternalLanes
Information whether the simulation regards internal lanes.
static SUMOTime gTimeToGridlock
void retractDescheduleDeparture(const SUMOVehicle *veh)
reverts a previous call to descheduleDeparture (only needed for departPos="random_free")
void descheduleDeparture(const SUMOVehicle *veh)
stops trying to emit the given vehicle (and delete it)
The base class for an intersection.
SumoXMLNodeType getType() const
return the type of this Junction
AnyVehicleIterator is a structure, which manages the iteration through all vehicles on the lane,...
bool nextIsMyVehicles() const
AnyVehicleIterator & operator++()
const MSVehicle * operator*()
void add(const MSLane *const l) const
Adds the given object to the container.
std::set< const Named * > & myObjects
The container.
const PositionVector & myShape
Sorts edges by their angle relative to the given edge (straight comes first)
by_connections_to_sorter(const MSEdge *const e)
constructor
int operator()(const MSEdge *const e1, const MSEdge *const e2) const
comparing operator
Sorts lanes (IncomingLaneInfos) by their priority or, if this doesn't apply, wrt. the angle differenc...
incoming_lane_priority_sorter(const MSLane *targetLane)
constructor
int operator()(const IncomingLaneInfo &lane1, const IncomingLaneInfo &lane2) const
comparing operator
Sorts lanes (their origin link) by the priority of their noninternal target edges or,...
outgoing_lane_priority_sorter(const MSLane *sourceLane)
constructor
int operator()(const MSLink *link1, const MSLink *link2) const
comparing operator
int operator()(MSVehicle *v1, MSVehicle *v2) const
Comparing operator.
Sorts vehicles by their position (descending)
int operator()(MSVehicle *v1, MSVehicle *v2) const
Comparing operator.
Representation of a lane in the micro simulation.
void addApproachingLane(MSLane *lane, bool warnMultiCon)
void loadState(const std::vector< SUMOVehicle * > &vehs)
Loads the state of this segment with the given parameters.
bool detectCollisionBetween(SUMOTime timestep, const std::string &stage, MSVehicle *collider, MSVehicle *victim, std::set< const MSVehicle *, ComparatorNumericalIdLess > &toRemove, std::set< const MSVehicle *, ComparatorNumericalIdLess > &toTeleport) const
detect whether there is a collision between the two vehicles
static SUMOTime myIntermodalCollisionStopTime
MFXSynchQue< MSVehicle *, std::vector< MSVehicle * > > myVehBuffer
Buffer for vehicles that moved from their previous lane onto this one. Integrated after all vehicles ...
SVCPermissions myPermissions
The vClass permissions for this lane.
MSLane * myLogicalPredecessorLane
static void initCollisionAction(const OptionsCont &oc, const std::string &option, CollisionAction &myAction)
std::set< const MSBaseVehicle * > myParkingVehicles
bool checkForPedestrians(const MSVehicle *aVehicle, double &speed, double &dist, double pos, bool patchSpeed) const
check whether pedestrians on this lane interfere with vehicle insertion
static double myDefaultDepartSpeed
std::pair< const MSPerson *, double > nextBlocking(double minPos, double minRight, double maxLeft, double stopTime=0, bool bidi=false) const
This is just a wrapper around MSPModel::nextBlocking. You should always check using hasPedestrians be...
MSLane * getParallelLane(int offset, bool includeOpposite=true) const
Returns the lane with the given offset parallel to this one or 0 if it does not exist.
double myRightSideOnEdge
the combined width of all lanes with lower index on myEdge
const StopOffset & getLaneStopOffsets() const
Returns vehicle class specific stopOffsets.
virtual void removeParking(MSBaseVehicle *veh)
remove parking vehicle. This must be syncrhonized when running with GUI
virtual ~MSLane()
Destructor.
bool insertVehicle(MSVehicle &v)
Tries to insert the given vehicle.
bool mySpeedModified
Whether the current speed limit is set by a variable speed sign (VSS), TraCI or a MSCalibrator.
const MSLeaderInfo getFirstVehicleInformation(const MSVehicle *ego, double latOffset, bool onlyFrontOnLane, double maxPos=std::numeric_limits< double >::max(), bool allowCached=true) const
analogue to getLastVehicleInformation but in the upstream direction
virtual void integrateNewVehicles()
Insert buffered vehicle into the real lane.
double myLength
Lane length [m].
bool isApproachedFrom(MSEdge *const edge)
double getNettoOccupancy() const
Returns the netto (excluding minGaps) occupancy of this lane during the last step (including minGaps)
virtual MSVehicle * removeVehicle(MSVehicle *remVehicle, MSMoveReminder::Notification notification, bool notify=true)
int getCrossingIndex() const
return the index of the link to the next crossing if this is walkingArea, else -1
PositionVector myShape
The shape of the lane.
PositionVector * myOutlineShape
the outline of the lane (optional)
std::map< long long, SVCPermissions > myPermissionChanges
const std::map< SUMOVehicleClass, double > * myRestrictions
The vClass speed restrictions for this lane.
virtual void incorporateVehicle(MSVehicle *veh, double pos, double speed, double posLat, const MSLane::VehCont::iterator &at, MSMoveReminder::Notification notification=MSMoveReminder::NOTIFICATION_DEPARTED)
Inserts the vehicle into this lane, and informs it about entering the network.
void initRestrictions()
initialized vClass-specific speed limits
std::vector< MSMoveReminder * > myMoveReminders
This lane's move reminder.
bool hasApproaching() const
void addParking(MSBaseVehicle *veh)
add parking vehicle. This should only used during state loading
VehCont myTmpVehicles
Container for lane-changing vehicles. After completion of lane-change- process, the containers will b...
static DepartSpeedDefinition myDefaultDepartSpeedDefinition
MSLane(const std::string &id, double maxSpeed, double friction, double length, MSEdge *const edge, int numericalID, const PositionVector &shape, double width, SVCPermissions permissions, SVCPermissions changeLeft, SVCPermissions changeRight, int index, bool isRampAccel, const std::string &type, const PositionVector &outlineShape)
Constructor.
double getDepartSpeed(const MSVehicle &veh, bool &patchSpeed)
void updateInternalLanePermissions(SVCPermissions oldPermissions)
Propagate a permission change of this lane to internal lanes that mirror it.
MSLeaderInfo myFollowerInfo
followers on all sublanes as seen by vehicles on consecutive lanes (cached)
const MSLane * getNormalSuccessorLane() const
get normal lane following this internal lane, for normal lanes, the lane itself is returned
int getVehicleNumber() const
Returns the number of vehicles on this lane (for which this lane is responsible)
static SUMOTime myCollisionStopTime
static CollisionAction myCollisionAction
the action to take on collisions
MSLane * myCanonicalSuccessorLane
Main successor lane,.
SVCPermissions myChangeLeft
The vClass permissions for changing from this lane.
void getLeadersOnConsecutive(double dist, double seen, double speed, const MSVehicle *ego, const std::vector< MSLane * > &bestLaneConts, MSLeaderDistanceInfo &result, bool oppositeDirection=false) const
Returns the immediate leaders and the distance to them (as getLeaderOnConsecutive but for the sublane...
std::vector< IncomingLaneInfo > myIncomingLanes
All direct predecessor lanes.
AnyVehicleIterator anyVehiclesEnd() const
end iterator for iterating over all vehicles touching this lane in downstream direction
static void insertIDs(std::vector< std::string > &into)
Adds the ids of all stored lanes into the given vector.
bool hadPermissionChanges() const
void sortPartialVehicles()
sorts myPartialVehicles
double myFrictionCoefficient
Lane-wide friction coefficient [0..1].
MSVehicle * getFirstAnyVehicle() const
returns the first vehicle that is fully or partially on this lane
const MSLink * getEntryLink() const
Returns the entry link if this is an internal lane, else nullptr.
int getVehicleNumberWithPartials() const
Returns the number of vehicles on this lane (including partial occupators)
static bool myCheckJunctionCollisions
static void clear()
Clears the dictionary.
virtual void resetManeuverReservation(MSVehicle *v)
Unregisters a vehicle, which previously registered for maneuvering into this lane.
SVCPermissions myOriginalPermissions
The original vClass permissions for this lane (before temporary modifications)
MSEdge *const myEdge
The lane's edge, for routing only.
double myNettoVehicleLengthSum
The current length of all vehicles on this lane, excluding their minGaps.
std::pair< MSVehicle *const, double > getFollower(const MSVehicle *ego, double egoPos, double dist, MinorLinkMode mLinkMode, bool maxSearchDist=false) const
Find follower vehicle for the given ego vehicle (which may be on the opposite direction lane)
static std::vector< MSLink * >::const_iterator succLinkSec(const SUMOVehicle &veh, int nRouteSuccs, const MSLane &succLinkSource, const std::vector< MSLane * > &conts)
void detectPedestrianJunctionCollision(const MSVehicle *collider, const PositionVector &colliderBoundary, const MSLane *foeLane, SUMOTime timestep, const std::string &stage, std::set< const MSVehicle *, ComparatorNumericalIdLess > &toRemove, std::set< const MSVehicle *, ComparatorNumericalIdLess > &toTeleport)
detect whether a vehicle collids with pedestrians on the junction
double getMissingRearGap(const MSVehicle *leader, double backOffset, double leaderSpeed) const
return by how much further the leader must be inserted to avoid rear end collisions
double myMaxSpeed
Lane-wide speed limit [m/s].
void saveState(OutputDevice &out)
Saves the state of this lane into the given stream.
void markRecalculateBruttoSum()
Set a flag to recalculate the brutto (including minGaps) occupancy of this lane (used if mingap is ch...
const MSLink * getLinkTo(const MSLane *const) const
returns the link to the given lane or nullptr, if it is not connected
int myRightmostSublane
the index of the rightmost sublane of this lane on myEdge
void setChangeRight(SVCPermissions permissions)
Sets the permissions for changing to the right neighbour lane.
const MSLeaderInfo getLastVehicleInformation(const MSVehicle *ego, double latOffset, double minPos=0, bool allowCached=true, const MSVehicle *ignore=nullptr) const
Returns the last vehicles on the lane.
const bool myIsRampAccel
whether this lane is an acceleration lane
virtual void planMovements(const SUMOTime t)
Compute safe velocities for all vehicles based on positions and speeds from the last time step....
MSLeaderDistanceInfo getFollowersOnConsecutive(const MSVehicle *ego, double backOffset, bool allSublanes, double searchDist=-1, MinorLinkMode mLinkMode=FOLLOW_ALWAYS, bool maxSearchDist=false) const
return the sublane followers with the largest missing rear gap among all predecessor lanes (within di...
static void saveRNGStates(OutputDevice &out)
save random number generator states to the given output device
SUMOTime myFollowerInfoTime
time step for which myFollowerInfo was last updated
MSLeaderInfo myLeaderInfo
leaders on all sublanes as seen by approaching vehicles (cached)
bool isInsertionSuccess(MSVehicle *vehicle, double speed, double pos, double posLat, bool recheckNextLanes, MSMoveReminder::Notification notification)
Tries to insert the given vehicle with the given state (speed and pos)
void forceVehicleInsertion(MSVehicle *veh, double pos, MSMoveReminder::Notification notification, double posLat=0)
Inserts the given vehicle at the given position.
double getVehicleStopOffset(const MSVehicle *veh) const
Returns vehicle class specific stopOffset for the vehicle.
static void initCollisionOptions(const OptionsCont &oc)
int myNumericalID
Unique numerical ID (set on reading by netload)
VehCont myVehicles
The lane's vehicles. This container holds all vehicles that have their front (longitudinally) and the...
double getSpeedLimit() const
Returns the lane's maximum allowed speed.
MSLeaderInfo getPartialBeyond() const
get all vehicles that are inlapping from consecutive edges
std::vector< MSVehicle * > VehCont
Container for vehicles.
bool checkFailure(const MSVehicle *aVehicle, double &speed, double &dist, const double nspeed, const bool patchSpeed, const std::string errorMsg, InsertionCheck check) const
static DictType myDict
Static dictionary to associate string-ids with objects.
static void fill(RTREE &into)
Fills the given RTree with lane instances.
double safeInsertionSpeed(const MSVehicle *veh, double seen, const MSLeaderInfo &leaders, double speed)
return the maximum safe speed for insertion behind leaders (a negative value indicates that safe inse...
std::vector< const MSJunction * > getUpcomingJunctions(double pos, double range, const std::vector< MSLane * > &contLanes) const
Returns all upcoming junctions within given range along the given (non-internal) continuation lanes m...
void addIncomingLane(MSLane *lane, MSLink *viaLink)
bool isWalkingArea() const
const MSEdge * getNextNormal() const
Returns the lane's follower if it is an internal lane, the edge of the lane otherwise.
void addLink(MSLink *link)
Delayed initialization.
std::set< MSVehicle * > getVehiclesInRange(const double a, const double b) const
Returns all vehicles on the lane overlapping with the interval [a,b].
void enteredByLaneChange(MSVehicle *v)
double getDepartPosLat(const MSVehicle &veh)
std::pair< MSVehicle *const, double > getOppositeLeader(const MSVehicle *ego, double dist, bool oppositeDir, MinorLinkMode mLinkMode=MinorLinkMode::FOLLOW_NEVER) const
SVCPermissions getPermissions() const
Returns the vehicle class permissions for this lane.
LinkState getIncomingLinkState() const
get the state of the link from the logical predecessor to this lane
void updateLengthSum()
updated current vehicle length sum (delayed to avoid lane-order-dependency)
const std::vector< IncomingLaneInfo > & getIncomingLanes() const
static const long CHANGE_PERMISSIONS_PERMANENT
virtual void addMoveReminder(MSMoveReminder *rem, bool addToVehicles=true)
Add a move-reminder to move-reminder container.
MSLane * getCanonicalPredecessorLane() const
void resetPermissions(long long transientID)
bool isPriorityCrossing() const
MSVehicle * getLastFullVehicle() const
returns the last vehicle for which this lane is responsible or 0
static void loadRNGState(int index, const std::string &state)
load random number generator state for the given rng index
const std::string myLaneType
the type of this lane
VehCont myManeuverReservations
The vehicles which registered maneuvering into the lane within their current action step....
const MSJunction * getToJunction() const
void addLeaders(const MSVehicle *vehicle, double vehPos, MSLeaderDistanceInfo &result, bool oppositeDirection=false)
get leaders for ego on the given lane
static double myCheckJunctionCollisionMinGap
double getLength() const
Returns the lane's length.
double myBruttoVehicleLengthSum
The current length of all vehicles on this lane, including their minGaps.
bool mayContinue(const MSVehicle *veh) const
whether the route of the give vehicle might be extended on insertion
const PositionVector & getShape() const
Returns this lane's shape.
static bool isFrontalCollision(const MSVehicle *collider, const MSVehicle *victim)
detect frontal collisions
void setChangeLeft(SVCPermissions permissions)
Sets the permissions for changing to the left neighbour lane.
std::vector< const MSLink * > getUpcomingLinks(double pos, double range, const std::vector< MSLane * > &contLanes) const
Returns all upcoming links within given range along the given (non-internal) continuation lanes measu...
const MSLane * getFirstInternalInConnection(double &offset) const
Returns 0 if the lane is not internal. Otherwise the first part of the connection (sequence of intern...
const MSJunction * getFromJunction() const
static int getNumRNGs()
return the number of RNGs
void handleCollisionBetween(SUMOTime timestep, const std::string &stage, const MSVehicle *collider, const MSVehicle *victim, double gap, double latGap, std::set< const MSVehicle *, ComparatorNumericalIdLess > &toRemove, std::set< const MSVehicle *, ComparatorNumericalIdLess > &toTeleport) const
take action upon collision
double getMaximumBrakeDist() const
compute maximum braking distance on this lane
static CollisionAction myIntermodalCollisionAction
const MSLane * getInternalFollowingLane(const MSLane *const) const
returns the internal lane leading to the given lane or nullptr, if there is none
static std::vector< SumoRNG > myRNGs
virtual void swapAfterLaneChange(SUMOTime t)
moves myTmpVehicles int myVehicles after a lane change procedure
std::pair< MSVehicle *const, double > getCriticalLeader(double dist, double seen, double speed, const MSVehicle &veh) const
Returns the most dangerous leader and the distance to him.
StopOffset myLaneStopOffset
static void initRNGs(const OptionsCont &oc)
initialize rngs
std::pair< MSVehicle *const, double > getLeaderOnConsecutive(double dist, double seen, double speed, const MSVehicle &veh, const std::vector< MSLane * > &bestLaneConts, bool considerCrossingFoes=true) const
Returns the immediate leader and the distance to him.
std::set< MSVehicle * > getSurroundingVehicles(double startPos, double downstreamDist, double upstreamDist, std::shared_ptr< LaneCoverageInfo > checkedLanes) const
Returns all vehicles closer than downstreamDist along the road network starting on the given position...
bool myRecalculateBruttoSum
Flag to recalculate the occupancy (including minGaps) after a change in minGap.
virtual void removeMoveReminder(MSMoveReminder *rem)
Remove a move-reminder from move-reminder container.
void clearState()
Remove all vehicles before quick-loading state.
MSLane * myCanonicalPredecessorLane
Similar to LogicalPredecessorLane,.
bool myNeedsCollisionCheck
whether a collision check is currently needed
bool isLinkEnd(std::vector< MSLink * >::const_iterator &i) const
bool allowsVehicleClass(SUMOVehicleClass vclass) const
virtual double setPartialOccupation(MSVehicle *v)
Sets the information about a vehicle lapping into this lane.
double getVehicleMaxSpeed(const SUMOTrafficObject *const veh) const
Returns the lane's maximum speed, given a vehicle's speed limit adaptation.
void setBidiLane(MSLane *bidyLane)
Adds the (overlapping) reverse direction lane to this lane.
double getRightSideOnEdge() const
std::pair< MSVehicle *const, double > getOppositeFollower(const MSVehicle *ego) const
bool hasPedestrians() const
whether the lane has pedestrians on it
const std::vector< std::pair< const MSLane *, const MSEdge * > > getOutgoingViaLanes() const
get the list of outgoing lanes
MSVehicle * getPartialBehind(const MSVehicle *ego) const
void setLaneStopOffset(const StopOffset &stopOffset)
Set vehicle class specific stopOffsets.
double myBruttoVehicleLengthSumToRemove
The length of all vehicles that have left this lane in the current step (this lane,...
void leftByLaneChange(MSVehicle *v)
MSLane * getCanonicalSuccessorLane() const
std::vector< StopWatch< std::chrono::nanoseconds > > myStopWatch
void setPermissions(SVCPermissions permissions, long long transientID)
Sets the permissions to the given value. If a transientID is given, the permissions are recored as te...
const double myWidth
Lane width [m].
bool lastInsertion(MSVehicle &veh, double mspeed, double posLat, bool patchSpeed)
inserts vehicle as close as possible to the last vehicle on this lane (or at the end of the lane if t...
void changeLanes(const SUMOTime time)
double getOppositePos(double pos) const
return the corresponding position on the opposite lane
SVCPermissions myChangeRight
const double myLengthGeometryFactor
precomputed myShape.length / myLength
virtual void executeMovements(const SUMOTime t)
Executes planned vehicle movements with regards to right-of-way.
const std::set< const MSBaseVehicle * > & getParkingVehicles() const
retrieve the parking vehicles (see GUIParkingArea)
MSLane * getLogicalPredecessorLane() const
get the most likely predecessor lane (sorted using by_connections_to_sorter). The result is cached in...
double getBruttoOccupancy() const
Returns the brutto (including minGaps) occupancy of this lane during the last step.
AnyVehicleIterator anyVehiclesUpstreamEnd() const
end iterator for iterating over all vehicles touching this lane in upstream direction
int myIndex
The lane index.
double getMeanSpeedBike() const
get the mean speed of all bicycles on this lane
void updateLeaderInfo(const MSVehicle *veh, VehCont::reverse_iterator &vehPart, VehCont::reverse_iterator &vehRes, MSLeaderInfo &ahead) const
This updates the MSLeaderInfo argument with respect to the given MSVehicle. All leader-vehicles on th...
double getWaitingSeconds() const
Returns the overall waiting time on this lane.
bool hasUnsafeLink() const
whether any link from this lane is unsafe
static bool dictionary(const std::string &id, MSLane *lane)
Static (sic!) container methods {.
virtual void detectCollisions(SUMOTime timestep, const std::string &stage)
Check if vehicles are too close.
std::vector< MSLink * > myLinks
MSVehicle * getLastAnyVehicle() const
returns the last vehicle that is fully or partially on this lane
VehCont myPartialVehicles
The lane's partial vehicles. This container holds all vehicles that are partially on this lane but wh...
void sortManeuverReservations()
sorts myManeuverReservations
MinorLinkMode
determine whether/how getFollowers looks upstream beyond minor links
void setMaxSpeed(const double val, const bool modified=true, const double jamThreshold=-1)
Sets a new maximum speed for the lane (used by TraCI, MSLaneSpeedTrigger (VSS) and MSCalibrator)
AnyVehicleIterator anyVehiclesUpstreamBegin() const
begin iterator for iterating over all vehicles touching this lane in upstream direction
std::vector< const MSLane * > getNormalIncomingLanes() const
get the list of all direct (disregarding internal predecessors) non-internal predecessor lanes of thi...
virtual void resetPartialOccupation(MSVehicle *v)
Removes the information about a vehicle lapping into this lane.
void setOpposite(MSLane *oppositeLane)
Adds a neighbor to this lane.
AnyVehicleIterator anyVehiclesBegin() const
begin iterator for iterating over all vehicles touching this lane in downstream direction
double getHarmonoise_NoiseEmissions() const
Returns the sum of last step noise emissions.
std::pair< MSVehicle *const, double > getLeader(const MSVehicle *veh, const double vehPos, const std::vector< MSLane * > &bestLaneConts, double dist=-1, bool checkTmpVehicles=false) const
Returns the immediate leader of veh and the distance to veh starting on this lane.
void handleIntermodalCollisionBetween(SUMOTime timestep, const std::string &stage, const MSVehicle *collider, const MSTransportable *victim, double gap, const std::string &collisionType, std::set< const MSVehicle *, ComparatorNumericalIdLess > &toRemove, std::set< const MSVehicle *, ComparatorNumericalIdLess > &toTeleport) const
static bool myExtrapolateSubstepDepart
MSLane * getOpposite() const
return the neighboring opposite direction lane for lane changing or nullptr
void setLength(double val)
Sets a new length for the lane (used by TraCI only)
std::map< MSEdge *, std::vector< MSLane * > > myApproachingLanes
All direct internal and direct (disregarding internal predecessors) non-internal predecessor lanes of...
virtual const VehCont & getVehiclesSecure() const
Returns the vehicles container; locks it for microsimulation.
virtual void releaseVehicles() const
Allows to use the container for microsimulation again.
bool mustCheckJunctionCollisions() const
whether this lane must check for junction collisions
virtual void setManeuverReservation(MSVehicle *v)
Registers the lane change intentions (towards this lane) for the given vehicle.
virtual void setJunctionApproaches() const
Register junction approaches for all vehicles after velocities have been planned.
MSLane * getBidiLane() const
retrieve bidirectional lane or nullptr
static double myCollisionMinGapFactor
SUMOTime myLeaderInfoTime
time step for which myLeaderInfo was last updated
@ COLLISION_ACTION_TELEPORT
@ COLLISION_ACTION_REMOVE
virtual const PositionVector & getShape(bool) const
MSLane * getParallelOpposite() const
return the opposite direction lane of this lanes edge or nullptr
std::map< std::string, MSLane * > DictType
definition of the static dictionary type
double getFractionalVehicleLength(bool brutto) const
return length of fractional vehicles on this lane
MSEdge & getEdge() const
Returns the lane's edge.
double getSpaceTillLastStanding(const MSVehicle *ego, bool &foundStopped) const
return the empty space up to the last standing vehicle or the empty space on the whole lane if no veh...
const MSLane * getNormalPredecessorLane() const
get normal lane leading to this internal lane, for normal lanes, the lane itself is returned
virtual bool appropriate(const MSVehicle *veh) const
double getWidth() const
Returns the lane's width.
const std::vector< MSLink * > & getLinkCont() const
returns the container with all links !!!
bool freeInsertion(MSVehicle &veh, double speed, double posLat, MSMoveReminder::Notification notification=MSMoveReminder::NOTIFICATION_DEPARTED)
Tries to insert the given vehicle on any place.
MSVehicle * getFirstFullVehicle() const
returns the first vehicle for which this lane is responsible or 0
double getMeanSpeed() const
Returns the mean speed on this lane.
double myNettoVehicleLengthSumToRemove
The length of all vehicles that have left this lane in the current step (this lane,...
void setFrictionCoefficient(double val)
Sets a new friction coefficient for the lane [to be later (used by TraCI and MSCalibrator)].
static CollisionAction getCollisionAction()
saves leader/follower vehicles and their distances relative to an ego vehicle
virtual std::string toString() const
print a debugging representation
CLeaderDist getClosest() const
return vehicle with the smalles gap
virtual int addLeader(const MSVehicle *veh, double gap, double latOffset=0, int sublane=-1)
bool hasVehicle(const MSVehicle *veh) const
whether the given vehicle is part of this leaderInfo
void setSublaneOffset(int offset)
set number of sublanes by which to shift positions
int numFreeSublanes() const
virtual int addLeader(const MSVehicle *veh, bool beyond, double latOffset=0.)
virtual std::string toString() const
print a debugging representation
int getSublaneOffset() const
const std::vector< const MSLane * > & getFoeLanes() const
LinkState getState() const
Returns the current state of the link.
MSJunction * getJunction() const
MSLane * getLane() const
Returns the connected lane.
bool hasFoeCrossing() const
const std::vector< MSLink * > & getFoeLinks() const
std::vector< LinkLeader > LinkLeaders
double getInternalLengthsAfter() const
Returns the cumulative length of all internal lanes after this link.
const MSTrafficLightLogic * getTLLogic() const
Returns the TLS index.
Something on a lane to be noticed about vehicle movement.
Notification
Definition of a vehicle state.
@ NOTIFICATION_ARRIVED
The vehicle arrived at its destination (is deleted)
@ NOTIFICATION_TELEPORT_ARRIVED
The vehicle was teleported out of the net.
@ NOTIFICATION_DEPARTED
The vehicle has departed (was inserted into the network)
@ NOTIFICATION_VAPORIZED_VAPORIZER
The vehicle got vaporized with a vaporizer.
@ NOTIFICATION_VAPORIZED_BREAKDOWN
The vehicle got removed via stationfinder device.
@ NOTIFICATION_VAPORIZED_COLLISION
The vehicle got removed by a collision.
@ NOTIFICATION_LOAD_STATE
The vehicle has been loaded from a state file.
@ NOTIFICATION_TELEPORT
The vehicle is being teleported.
The simulated network and simulation perfomer.
@ COLLISION
The vehicle is involved in a collision.
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
static const std::string STAGE_MOVEMENTS
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
const std::map< SUMOVehicleClass, double > * getRestrictions(const std::string &id) const
Returns the restrictions for an edge type If no restrictions are present, 0 is returned.
void informVehicleStateListener(const SUMOVehicle *const vehicle, VehicleState to, const std::string &info="")
Informs all added listeners about a vehicle's state change.
bool hasPersons() const
Returns whether persons are simulated.
MSInsertionControl & getInsertionControl()
Returns the insertion control.
static const std::string STAGE_LANECHANGE
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
virtual MSTransportableControl & getPersonControl()
Returns the person control.
bool registerCollision(const SUMOTrafficObject *collider, const SUMOTrafficObject *victim, const std::string &collisionType, const MSLane *lane, double pos)
register collision and return whether it was the first one involving these vehicles
MSEdgeControl & getEdgeControl()
Returns the edge control.
virtual PersonDist nextBlocking(const MSLane *lane, double minPos, double minRight, double maxLeft, double stopTime=0, bool bidi=false)
returns the next pedestrian beyond minPos that is laterally between minRight and maxLeft or nullptr
virtual bool hasPedestrians(const MSLane *lane)
whether the given lane has pedestrians on it
static const double SAFETY_GAP
static bool isSignalized(SUMOVehicleClass svc)
static bool hasInstance()
static MSRailSignalControl & getInstance()
bool haveDeadlock(const SUMOVehicle *veh) const
whether there is a circle in the waiting-for relationships that contains the given vehicle
static bool hasInsertionConstraint(MSLink *link, const MSVehicle *veh, std::string &info, bool &isInsertionOrder)
int size() const
Returns the number of edges to pass.
const MSEdge * getLastEdge() const
returns the destination edge
MSRouteIterator begin() const
Returns the begin of the list of edges to pass.
const MSLane * lane
The lane to stop at (microsim only)
MSRouteIterator edge
The edge in the route to stop at.
double getEndPos(const SUMOVehicle &veh) const
return halting position for upcoming stop;
const SUMOVehicleParameter::Stop pars
The stop parameter.
MSPModel * getMovementModel()
Returns the default movement model for this kind of transportables.
virtual double getEdgePos() const
Return the position on the edge.
const MSVehicleType & getVehicleType() const override
Returns the object's "vehicle" type.
Reroutes traffic objects passing an edge.
bool isRemoteAffected(SUMOTime t) const
The class responsible for building and deletion of vehicles.
void registerTeleportYield()
register one non-collision-related teleport
double getMinDeceleration() const
return the minimum deceleration capability for all road vehicles that ever entered the network
void countCollision(bool teleport)
registers one collision-related teleport
double getMaxMinGap() const
return the maximum minGap for all vehicles that ever entered the network
void registerTeleportJam()
register one non-collision-related teleport
double getMaxSpeedFactor() const
return the maximum speed factor for all vehicles that ever entered the network
double getMinDecelerationRail() const
return the minimum deceleration capability for all ral vehicles that ever entered the network
void scheduleVehicleRemoval(SUMOVehicle *veh, bool checkDuplicate=false)
Removes a vehicle after it has ended.
void registerTeleportWrongLane()
register one non-collision-related teleport
Representation of a vehicle in the micro simulation.
double getRightSideOnEdge(const MSLane *lane=0) const
Get the vehicle's lateral position on the edge of the given lane (or its current edge if lane == 0)
void checkLinkLeader(const MSLink *link, const MSLane *lane, double seen, DriveProcessItem *const lastLink, double &v, double &vLinkPass, double &vLinkWait, bool &setRequest, bool isShadowLink=false) const
checks for link leaders on the given link
void updateBestLanes(bool forceRebuild=false, const MSLane *startLane=0)
computes the best lanes to use in order to continue the route
bool isOnRoad() const
Returns the information whether the vehicle is on a road (is simulated)
SUMOTime getLastActionTime() const
Returns the time of the vehicle's last action point.
PositionVector getBoundingPoly(double offset=0) const
get bounding polygon
void setTentativeLaneAndPosition(MSLane *lane, double pos, double posLat=0)
set tentative lane and position during insertion to ensure that all cfmodels work (some of them requi...
bool brokeDown() const
Returns how long the vehicle has been stopped already due to lack of energy.
void registerInsertionApproach(MSLink *link, double dist)
register approach on insertion
void enterLaneAtInsertion(MSLane *enteredLane, double pos, double speed, double posLat, MSMoveReminder::Notification notification)
Update when the vehicle enters a new lane in the emit step.
SUMOTime getWaitingTime(const bool accumulated=false) const
Returns the SUMOTime waited (speed was lesser than 0.1m/s)
bool isFrontOnLane(const MSLane *lane) const
Returns the information whether the front of the vehicle is on the given lane.
MSAbstractLaneChangeModel & getLaneChangeModel()
double getLeftSideOnLane() const
Get the lateral position of the vehicles left side on the lane:
double getActionStepLengthSecs() const
Returns the vehicle's action step length in secs, i.e. the interval between two action points.
const std::vector< MSLane * > getUpstreamOppositeLanes() const
Returns the sequence of opposite lanes corresponding to past lanes.
PositionVector getBoundingBox(double offset=0) const
get bounding rectangle
Position getPosition(const double offset=0) const
Return current position (x/y, cartesian)
const std::vector< MSLane * > & getBestLanesContinuation() const
Returns the best sequence of lanes to continue the route starting at myLane.
bool ignoreCollision() const
whether this vehicle is except from collision checks
void onRemovalFromNet(const MSMoveReminder::Notification reason)
Called when the vehicle is removed from the network.
bool resumeFromStopping()
int getBestLaneOffset() const
void adaptToJunctionLeader(const std::pair< const MSVehicle *, double > leaderInfo, const double seen, DriveProcessItem *const lastLink, const MSLane *const lane, double &v, double &vLinkPass, double distToCrossing=-1) const
double getBackPositionOnLane(const MSLane *lane) const
Get the vehicle's position relative to the given lane.
void resetActionOffset(const SUMOTime timeUntilNextAction=0)
Resets the action offset for the vehicle.
void leaveLane(const MSMoveReminder::Notification reason, const MSLane *approachedLane=0)
Update of members if vehicle leaves a new lane in the lane change step or at arrival.
double getLatOffset(const MSLane *lane) const
Get the offset that that must be added to interpret myState.myPosLat for the given lane.
bool hasArrived() const
Returns whether this vehicle has already arrived (reached the arrivalPosition on its final edge)
SUMOTime collisionStopTime() const
Returns the remaining time a vehicle needs to stop due to a collision. A negative value indicates tha...
double getBestLaneDist() const
returns the distance that can be driven without lane change
bool executeMove()
Executes planned vehicle movements with regards to right-of-way.
const MSLane * getLane() const
Returns the lane the vehicle is on.
bool isLeader(const MSLink *link, const MSVehicle *veh, const double gap) const
whether the given vehicle must be followed at the given junction
MSLane * getMutableLane() const
Returns the lane the vehicle is on Non const version indicates that something volatile is going on.
Influencer & getInfluencer()
bool isBidiOn(const MSLane *lane) const
whether this vehicle is driving against lane
double getRightSideOnLane() const
Get the lateral position of the vehicles right side on the lane:
double getLateralPositionOnLane() const
Get the vehicle's lateral position on the lane.
double getSpeed() const
Returns the vehicle's current speed.
const std::vector< MSLane * > & getFurtherLanes() const
const std::vector< LaneQ > & getBestLanes() const
Returns the description of best lanes to use in order to continue the route.
const MSCFModel & getCarFollowModel() const
Returns the vehicle's car following model definition.
double getPositionOnLane() const
Get the vehicle's position along the lane.
double getLateralOverlap() const
return the amount by which the vehicle extends laterally outside it's primary lane
double getAngle() const
Returns the vehicle's direction in radians.
bool hasInfluencer() const
whether the vehicle is individually influenced (via TraCI or special parameters)
double getBrakeGap(bool delayed=false) const
get distance for coming to a stop (used for rerouting checks)
void executeFractionalMove(double dist)
move vehicle forward by the given distance during insertion
double getCenterOnEdge(const MSLane *lane=0) const
Get the vehicle's lateral position on the edge of the given lane (or its current edge if lane == 0)
static MSVehicleTransfer * getInstance()
Returns the instance of this object.
void add(const SUMOTime t, MSVehicle *veh)
Adds a vehicle to this transfer object.
double getLengthWithGap() const
Get vehicle's length including the minimum gap [m].
double getWidth() const
Get the width which vehicles of this class shall have when being drawn.
double getMinGap() const
Get the free space in front of vehicles of this class.
double getLength() const
Get vehicle's length [m].
SUMOVehicleShape getGuiShape() const
Get this vehicle type's shape.
const SUMOVTypeParameter & getParameter() const
Base class for objects which have an id.
std::string myID
The name of the object.
static std::string getIDSecure(const T *obj, const std::string &fallBack="NULL")
get an identifier for Named-like object which may be Null
const std::string & getID() const
Returns the id.
A RT-tree for efficient storing of SUMO's Named objects.
A storage for options typed value containers)
double getFloat(const std::string &name) const
Returns the double-value of the named option (only for Option_Float)
int getInt(const std::string &name) const
Returns the int-value of the named option (only for Option_Integer)
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
Static storage of an output device and its base (abstract) implementation.
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
OutputDevice & writeAttr(const ATTR_TYPE &attr, const T &val, const bool isNull=false, const bool escape=false)
writes a named attribute
bool closeTag(const std::string &comment="")
Closes the most recently opened tag and optionally adds a comment.
void unsetParameter(const std::string &key)
Removes a parameter.
virtual void setParameter(const std::string &key, const std::string &value)
Sets a parameter.
double distanceTo2D(const Position &p2) const
returns the euclidean distance in the x-y-plane
bool overlapsWith(const AbstractPoly &poly, double offset=0) const
Returns the information whether the given polygon overlaps with this.
double distance2D(const Position &p, bool perpendicular=false) const
closest 2D-distance to point p (or -1 if perpendicular is true and the point is beyond this vector)
Boundary getBoxBoundary() const
Returns a boundary enclosing this list of lines.
double angleAt2D(int pos) const
get angle in certain position of position vector (in radians between -M_PI and M_PI)
static void loadState(const std::string &state, SumoRNG *rng=nullptr)
load rng state from string
static void initRand(SumoRNG *which=nullptr, const bool random=false, const int seed=23423)
Initialises the random number generator with hardware randomness or seed.
static double rand(SumoRNG *rng=nullptr)
Returns a random real number in [0, 1)
static std::string saveState(SumoRNG *rng=nullptr)
save rng state to string
virtual SUMOVehicleClass getVClass() const =0
Returns the object's access class.
SUMOTime getTimeToTeleport(SUMOTime defaultValue) const
return time-to-teleport (either custom or default)
SUMOTime getTimeToTeleportBidi(SUMOTime defaultValue) const
return time-to-teleport.bidi (either custom or default)
double getJMParam(const SumoXMLAttr attr, const double defaultValue) const
Returns the named value from the map, or the default if it is not contained there.
Representation of a vehicle.
virtual const MSEdge * succEdge(int nSuccs) const =0
Returns the nSuccs'th successor of edge the vehicle is currently at.
Definition of vehicle stop (position and duration)
std::string lane
The lane to stop at.
double speed
the speed at which this stop counts as reached (waypoint mode)
std::string split
the id of the vehicle (train portion) that splits of upon reaching this stop
double startPos
The stopping position start.
int parametersSet
Information for the output which parameter were set.
double endPos
The stopping position end.
bool collision
Whether this stop was triggered by a collision.
SUMOTime duration
The stopping duration.
Structure representing possible vehicle parameter.
double departPosLat
(optional) The lateral position the vehicle shall depart from
ArrivalSpeedDefinition arrivalSpeedProcedure
Information how the vehicle's end speed shall be chosen.
double departSpeed
(optional) The initial speed of the vehicle
DepartPosLatDefinition departPosLatProcedure
Information how the vehicle shall choose the lateral departure position.
double departPos
(optional) The position the vehicle shall depart from
DepartSpeedDefinition departSpeedProcedure
Information how the vehicle's initial speed shall be chosen.
double arrivalSpeed
(optional) The final speed of the vehicle (not used yet)
DepartDefinition departProcedure
Information how the vehicle shall choose the depart time.
DepartPosDefinition departPosProcedure
Information how the vehicle shall choose the departure position.
A scoped lock which only triggers on condition.
bool isDefined() const
check if stopOffset was defined
SVCPermissions getPermissions() const
get permissions
double getOffset() const
get offset
TRACI_CONST int CMD_GET_VEHICLE_VARIABLE
TRACI_CONST int CMD_GET_EDGE_VARIABLE
TRACI_CONST int CMD_GET_PERSON_VARIABLE
TRACI_CONST int CMD_GET_LANE_VARIABLE
TRACI_CONST int ROUTING_MODE_IGNORE_TRANSIENT_PERMISSIONS
NLOHMANN_BASIC_JSON_TPL_DECLARATION void swap(nlohmann::NLOHMANN_BASIC_JSON_TPL &j1, nlohmann::NLOHMANN_BASIC_JSON_TPL &j2) noexcept(//NOLINT(readability-inconsistent-declaration-parameter-name, cert-dcl58-cpp) is_nothrow_move_constructible< nlohmann::NLOHMANN_BASIC_JSON_TPL >::value &&//NOLINT(misc-redundant-expression, cppcoreguidelines-noexcept-swap, performance-noexcept-swap) is_nothrow_move_assignable< nlohmann::NLOHMANN_BASIC_JSON_TPL >::value)
exchanges the values of two JSON objects