71 #ifdef CHECK_MEMORY_LEAKS
73 #endif // CHECK_MEMORY_LEAKS
89 myShape(shape), myNumericalID(numericalID),
90 myVehicles(), myLength(length), myWidth(width), myEdge(edge), myMaxSpeed(maxSpeed),
91 myPermissions(permissions),
92 myLogicalPredecessorLane(0),
93 myVehicleLengthSum(0), myInlappingVehicleEnd(10000), myInlappingVehicle(0),
94 myLengthGeometryFactor(myShape.length() / myLength) {}
98 for (MSLinkCont::iterator i =
myLinks.begin(); i !=
myLinks.end(); ++i) {
115 (*veh)->addReminder(rem);
154 if (leader.first != 0) {
156 vIn = leader.first->getSpeed();
157 leaderDecel = leader.first->getCarFollowModel().getMaxDecel();
163 const SUMOReal vHlp = 0.5 * (vIn + mspeed);
167 for (
int i = 0; i <= 10; i++) {
178 }
else if (x > maxPos) {
198 if (leader.first != 0) {
200 vIn = leader.first->getSpeed();
206 const SUMOReal vHlp = 0.5 * (mspeed + vIn);
210 }
else if (xIn > maxPos) {
224 MSLane::VehCont::iterator predIt =
myVehicles.begin();
227 MSLane::VehCont::iterator maxIt =
myVehicles.begin();
246 const SUMOReal lhs = nettoGap / tau + tauDecel - fSpeed - fSpeed * fSpeed / (2 * tauDecel) + leaderSpeed * leaderSpeed / (2 * tauDecel);
247 if (lhs >= sqrt(tauDecel * tauDecel + leaderSpeed * leaderSpeed)) {
249 const SUMOReal currentMaxSpeed = lhs - tauDecel;
250 if (
MIN2(currentMaxSpeed, mspeed) > maxSpeed) {
251 maxSpeed = currentMaxSpeed;
252 maxPos = leaderRearPos + frontGap;
270 bool adaptableSpeed =
true;
280 if (adaptableSpeed) {
284 if (leaderPos - frontGapNeeded >= 0) {
293 MSLane::VehCont::iterator predIt =
myVehicles.begin();
301 if (adaptableSpeed && leader != 0) {
313 frontMax = leaderRearPos - frontGapNeeded;
321 if (frontMax > 0 && backMin +
POSITION_EPS < frontMax) {
338 bool patchSpeed =
true;
374 for (
unsigned int i = 0; i < 10; i++) {
411 aVehicle->
getID() +
"'. Inserting at lane end instead.");
417 std::vector<MSLane*>::const_iterator ri = bestLaneConts.begin();
422 unsigned int nRouteSuccs = 1;
423 MSLane* currentLane =
this;
426 while (seen < dist && ri != bestLaneConts.end()) {
428 MSLinkCont::const_iterator link = currentLane->
succLinkSec(*aVehicle, nRouteSuccs, *currentLane, bestLaneConts);
434 if (nspeed < speed) {
436 speed =
MIN2(nspeed, speed);
440 WRITE_ERROR(
"Vehicle '" + aVehicle->
getID() +
"' will not be able to depart using the given velocity due (arrival speed too low)!");
449 if (nspeed < speed) {
451 speed =
MIN2(nspeed, speed);
455 WRITE_ERROR(
"Vehicle '" + aVehicle->
getID() +
"' will not be able to depart using the given velocity (junction too close)!");
464 || !(*link)->havePriority()) {
467 if (nspeed < speed) {
469 speed =
MIN2(nspeed, speed);
473 const LinkState state = (*link)->getState();
479 WRITE_ERROR(
"Vehicle '" + aVehicle->
getID() +
"' will not be able to depart using the given velocity (unpriorised junction too close)!");
488 nextLane = (*link)->getViaLaneOrLane();
508 if (nspeed < speed) {
510 speed =
MIN2(nspeed, speed);
520 if (nspeed < speed) {
523 speed =
MIN2(cfModel.
freeSpeed(aVehicle, speed, seen, nspeed), speed);
527 WRITE_ERROR(
"Vehicle '" + aVehicle->
getID() +
"' will not be able to depart using the given velocity (slow lane ahead)!");
537 if ((*link)->hasApproachingFoe(arrivalTime, leaveTime, speed, cfModel.
getMaxDecel())) {
539 if (nspeed < speed) {
541 speed =
MIN2(nspeed, speed);
550 currentLane = nextLane;
551 #ifdef HAVE_INTERNAL_LANES
552 if ((*link)->getViaLane() == 0) {
570 if (gap < frontGapNeeded) {
582 if (gap < backGapNeeded) {
595 if (missingRearGap > 0) {
597 const SUMOReal neededStartPos = pos + missingRearGap;
600 pos = neededStartPos;
626 if (leftVehicleLength > myLength) {
644 std::pair<MSVehicle*, SUMOReal>
650 return std::make_pair(last, pos);
656 return std::make_pair<MSVehicle*, SUMOReal>(0, 0);
667 if ((*veh)->getLane() ==
this) {
668 (*veh)->planMove(t, pred, cumulatedVehLength);
682 VehCont::iterator lastVeh =
myVehicles.end() - 1;
683 for (VehCont::iterator veh =
myVehicles.begin(); veh != lastVeh;) {
684 VehCont::iterator pred = veh + 1;
685 if ((*veh)->hasInfluencer() && (*veh)->getInfluencer().isVTDControlled()) {
689 if ((*pred)->hasInfluencer() && (*pred)->getInfluencer().isVTDControlled()) {
693 SUMOReal gap = (*pred)->getPositionOnLane() - (*pred)->getVehicleType().getLength() - (*veh)->getPositionOnLane() - (*veh)->getVehicleType().getMinGap();
698 + (*pred)->getID() +
"', lane='" +
getID() +
"', gap=" +
toString(gap)
710 + (*pred)->getID() +
"', lane='" +
getID() +
"', gap=" +
toString(gap)
748 }
else if (target != 0 && moved) {
759 into.push_back(target);
762 if (shadowLane != 0) {
763 into.push_back(shadowLane);
774 WRITE_WARNING(
"Teleporting vehicle '" + veh->
getID() +
"'; beyond lane (2), targetLane='" +
getID() +
"', time=" +
795 + (r2 ?
" on highway" :
"")
808 DictType::iterator it =
myDict.find(
id);
811 myDict.insert(DictType::value_type(
id, ptr));
820 DictType::iterator it =
myDict.find(
id);
831 for (DictType::iterator i =
myDict.begin(); i !=
myDict.end(); ++i) {
840 for (DictType::iterator i =
myDict.begin(); i !=
myDict.end(); ++i) {
841 into.push_back((*i).first);
852 return (link !=
myLinks.end());
900 MSLinkCont::const_iterator
902 const MSLane& succLinkSource,
const std::vector<MSLane*>& conts)
const {
905 if (nRouteEdge == 0) {
907 return succLinkSource.
myLinks.end();
911 assert(succLinkSource.
myLinks.size() == 1);
913 return succLinkSource.
myLinks.begin();
923 MSLinkCont::const_iterator link;
924 if (nRouteSuccs < conts.size()) {
926 for (link = succLinkSource.
myLinks.begin(); link != succLinkSource.
myLinks.end(); ++link) {
927 if ((*link)->getLane() != 0 && (*link)->getLane()->myEdge == nRouteEdge && (*link)->getLane()->allowsVehicleClass(veh.
getVehicleType().
getVehicleClass())) {
929 if ((*link)->getLane() == conts[nRouteSuccs]) {
936 return succLinkSource.
myLinks.end();
939 return succLinkSource.
myLinks.end();
960 if (remVehicle == *it) {
1005 std::map<MSEdge*, std::vector<MSLane*> >::const_iterator i =
myApproachingLanes.find(edge);
1009 const std::vector<MSLane*>& lanes = (*i).second;
1010 return find(lanes.begin(), lanes.end(), lane) != lanes.end();
1016 inline int operator()(
const std::pair<const MSVehicle* , SUMOReal>& p1,
const std::pair<const MSVehicle* , SUMOReal>& p2)
const {
1017 return p1.second < p2.second;
1027 std::set<MSLane*> visited;
1028 std::vector<MSLane::IncomingLaneInfo> newFound;
1030 while (toExamine.size() != 0) {
1031 for (std::vector<MSLane::IncomingLaneInfo>::iterator i = toExamine.begin(); i != toExamine.end(); ++i) {
1032 MSLane* next = (*i).lane;
1038 result =
MAX2(result, missingRearGap);
1040 if ((*i).length < dist) {
1041 const std::vector<MSLane::IncomingLaneInfo>& followers = next->
getIncomingLanes();
1042 for (std::vector<MSLane::IncomingLaneInfo>::const_iterator j = followers.begin(); j != followers.end(); ++j) {
1043 if (visited.find((*j).lane) == visited.end()) {
1044 visited.insert((*j).lane);
1046 ili.
lane = (*j).lane;
1047 ili.
length = (*j).length + (*i).length;
1049 newFound.push_back(ili);
1056 swap(newFound, toExamine);
1062 std::pair<MSVehicle* const, SUMOReal>
1067 std::set<MSLane*> visited;
1068 std::vector<std::pair<MSVehicle*, SUMOReal> > possible;
1069 std::vector<MSLane::IncomingLaneInfo> newFound;
1071 while (toExamine.size() != 0) {
1072 for (std::vector<MSLane::IncomingLaneInfo>::iterator i = toExamine.begin(); i != toExamine.end(); ++i) {
1078 MSLane* next = (*i).lane;
1083 possible.push_back(std::make_pair(v, agap));
1086 if ((*i).length + seen < dist) {
1087 const std::vector<MSLane::IncomingLaneInfo>& followers = next->
getIncomingLanes();
1088 for (std::vector<MSLane::IncomingLaneInfo>::const_iterator j = followers.begin(); j != followers.end(); ++j) {
1089 if (visited.find((*j).lane) == visited.end()) {
1090 visited.insert((*j).lane);
1092 ili.
lane = (*j).lane;
1093 ili.
length = (*j).length + (*i).length;
1095 newFound.push_back(ili);
1102 swap(newFound, toExamine);
1104 if (possible.size() == 0) {
1105 return std::pair<MSVehicle* const, SUMOReal>(
static_cast<MSVehicle*
>(0), -1);
1108 return *(possible.begin());
1112 std::pair<MSVehicle* const, SUMOReal>
1114 const std::vector<MSLane*>& bestLaneConts)
const {
1116 return std::pair<MSVehicle* const, SUMOReal>(
static_cast<MSVehicle*
>(0), -1);
1118 unsigned int view = 1;
1120 const MSLane* targetLane =
this;
1125 const MSLane* nextLane = targetLane;
1129 MSLinkCont::const_iterator link = targetLane->
succLinkSec(veh, view, *nextLane, bestLaneConts);
1134 #ifdef HAVE_INTERNAL_LANES
1137 if (linkLeaders.size() > 0) {
1140 return linkLeaders[0];
1142 bool nextInternal = (*link)->getViaLane() != 0;
1144 nextLane = (*link)->getViaLaneOrLane();
1145 if (nextLane == 0) {
1151 return std::pair<MSVehicle* const, SUMOReal>(leader, seen + leader->getPositionOnLane() - leader->getVehicleType().getLength() - veh.
getVehicleType().
getMinGap());
1162 #ifdef HAVE_INTERNAL_LANES
1163 if (!nextInternal) {
1169 }
while (seen <= dist);
1170 return std::pair<MSVehicle* const, SUMOReal>(
static_cast<MSVehicle*
>(0), -1);
1182 for (std::vector<MSEdge*>::iterator i = pred.begin(); i != pred.end();) {
1191 if (pred.size() != 0) {
1193 MSEdge* best = *pred.begin();
1234 for (VehCont::const_iterator i = vehs.begin(); i != vehs.end(); ++i) {
1235 v += (*i)->getSpeed();
1247 for (MSLane::VehCont::const_iterator i = vehs.begin(); i != vehs.end(); ++i) {
1248 ret += (*i)->getHBEFA_CO2Emissions();
1259 for (MSLane::VehCont::const_iterator i = vehs.begin(); i != vehs.end(); ++i) {
1260 ret += (*i)->getHBEFA_COEmissions();
1271 for (MSLane::VehCont::const_iterator i = vehs.begin(); i != vehs.end(); ++i) {
1272 ret += (*i)->getHBEFA_PMxEmissions();
1283 for (MSLane::VehCont::const_iterator i = vehs.begin(); i != vehs.end(); ++i) {
1284 ret += (*i)->getHBEFA_NOxEmissions();
1295 for (MSLane::VehCont::const_iterator i = vehs.begin(); i != vehs.end(); ++i) {
1296 ret += (*i)->getHBEFA_HCEmissions();
1307 for (MSLane::VehCont::const_iterator i = vehs.begin(); i != vehs.end(); ++i) {
1308 ret += (*i)->getHBEFA_FuelConsumption();
1319 if (vehs.size() == 0) {
1323 for (MSLane::VehCont::const_iterator i = vehs.begin(); i != vehs.end(); ++i) {
1324 SUMOReal sv = (*i)->getHarmonoise_NoiseEmissions();
1325 ret += (
SUMOReal) pow(10., (sv / 10.));
1345 myLaneDir(e->getLanes()[0]->
getShape().getBegLine().atan2PositiveAngle())
1354 if (ae1 != 0 && ae1->size() != 0) {
1358 if (ae2 != 0 && ae2->size() != 0) {
1377 for (std::vector<std::string>::const_iterator it = vehIds.begin(); it != vehIds.end(); ++it) {