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 myBruttoVehicleLengthSum(0), myNettoVehicleLengthSum(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);
155 if (leader.first != 0) {
157 vIn = leader.first->getSpeed();
158 leaderDecel = leader.first->getCarFollowModel().getMaxDecel();
164 const SUMOReal vHlp = 0.5 * (vIn + mspeed);
168 for (
int i = 0; i <= 10; i++) {
179 }
else if (x > maxPos) {
199 if (leader.first != 0) {
201 vIn = leader.first->getSpeed();
207 const SUMOReal vHlp = 0.5 * (mspeed + vIn);
211 }
else if (xIn > maxPos) {
225 MSLane::VehCont::iterator predIt =
myVehicles.begin();
228 MSLane::VehCont::iterator maxIt =
myVehicles.begin();
247 const SUMOReal lhs = nettoGap / tau + tauDecel - fSpeed - fSpeed * fSpeed / (2 * tauDecel) + leaderSpeed * leaderSpeed / (2 * tauDecel);
248 if (lhs >= sqrt(tauDecel * tauDecel + leaderSpeed * leaderSpeed)) {
250 const SUMOReal currentMaxSpeed = lhs - tauDecel;
251 if (
MIN2(currentMaxSpeed, mspeed) > maxSpeed) {
252 maxSpeed = currentMaxSpeed;
253 maxPos = leaderRearPos + frontGap;
271 bool adaptableSpeed =
true;
281 if (adaptableSpeed) {
285 if (leaderPos - frontGapNeeded >= 0) {
294 MSLane::VehCont::iterator predIt =
myVehicles.begin();
302 if (adaptableSpeed && leader != 0) {
314 frontMax = leaderRearPos - frontGapNeeded;
322 if (frontMax > 0 && backMin +
POSITION_EPS < frontMax) {
339 bool patchSpeed =
true;
375 for (
unsigned int i = 0; i < 10; i++) {
407 if (nspeed < speed) {
409 speed =
MIN2(nspeed, speed);
412 if (errorMsg !=
"") {
413 WRITE_ERROR(
"Vehicle '" + aVehicle->
getID() +
"' will not be able to depart using the given velocity (" + errorMsg +
")!");
430 aVehicle->
getID() +
"'. Inserting at lane end instead.");
436 std::vector<MSLane*>::const_iterator ri = bestLaneConts.begin();
441 unsigned int nRouteSuccs = 1;
442 MSLane* currentLane =
this;
445 while (seen < dist && ri != bestLaneConts.end()) {
447 MSLinkCont::const_iterator link = currentLane->
succLinkSec(*aVehicle, nRouteSuccs, *currentLane, bestLaneConts);
453 patchSpeed,
"arrival speed too low")) {
461 patchSpeed,
"junction too close")) {
469 || !(*link)->havePriority()) {
471 std::string errorMsg =
"";
472 const LinkState state = (*link)->getState();
478 errorMsg =
"unpriorised junction too close";
481 patchSpeed, errorMsg)) {
488 nextLane = (*link)->getViaLaneOrLane();
508 if (
checkFailure(aVehicle, speed, dist, nspeed, patchSpeed,
"")) {
515 if (nspeed < speed) {
517 speed =
MIN2(cfModel.
freeSpeed(aVehicle, speed, seen, nspeed), speed);
521 WRITE_ERROR(
"Vehicle '" + aVehicle->
getID() +
"' will not be able to depart using the given velocity (slow lane ahead)!");
531 if ((*link)->hasApproachingFoe(arrivalTime, leaveTime, speed, cfModel.
getMaxDecel())) {
539 currentLane = nextLane;
540 #ifdef HAVE_INTERNAL_LANES
541 if ((*link)->getViaLane() == 0) {
559 if (gap < frontGapNeeded) {
571 if (gap < backGapNeeded) {
584 if (missingRearGap > 0) {
586 const SUMOReal neededStartPos = pos + missingRearGap;
589 pos = neededStartPos;
616 if (leftVehicleLength > myLength) {
634 std::pair<MSVehicle*, SUMOReal>
640 return std::make_pair(last, pos);
646 return std::make_pair<MSVehicle*, SUMOReal>(0, 0);
657 if ((*veh)->getLane() ==
this) {
658 (*veh)->planMove(t, pred, cumulatedVehLength);
672 VehCont::iterator lastVeh =
myVehicles.end() - 1;
673 for (VehCont::iterator veh =
myVehicles.begin(); veh != lastVeh;) {
674 VehCont::iterator pred = veh + 1;
675 if ((*veh)->hasInfluencer() && (*veh)->getInfluencer().isVTDControlled()) {
679 if ((*pred)->hasInfluencer() && (*pred)->getInfluencer().isVTDControlled()) {
683 SUMOReal gap = (*pred)->getPositionOnLane() - (*pred)->getVehicleType().getLength() - (*veh)->getPositionOnLane() - (*veh)->getVehicleType().getMinGap();
688 + (*pred)->getID() +
"', lane='" +
getID() +
"', gap=" +
toString(gap)
701 + (*pred)->getID() +
"', lane='" +
getID() +
"', gap=" +
toString(gap)
741 }
else if (target != 0 && moved) {
752 into.push_back(target);
755 if (shadowLane != 0) {
756 into.push_back(shadowLane);
767 WRITE_WARNING(
"Teleporting vehicle '" + veh->
getID() +
"'; beyond lane (2), targetLane='" +
getID() +
"', time=" +
778 i = VehCont::reverse_iterator(
myVehicles.erase(i.base()));
789 const bool minorLink = !wrongLane && (link !=
myLinks.end()) && !((*link)->havePriority());
790 const std::string reason = (wrongLane ?
" (wrong lane)" : (minorLink ?
" (yield)" :
" (jam)"));
797 + (r2 ?
" (highway)" :
"")
813 DictType::iterator it =
myDict.find(
id);
816 myDict.insert(DictType::value_type(
id, ptr));
825 DictType::iterator it =
myDict.find(
id);
836 for (DictType::iterator i =
myDict.begin(); i !=
myDict.end(); ++i) {
845 for (DictType::iterator i =
myDict.begin(); i !=
myDict.end(); ++i) {
846 into.push_back((*i).first);
851 template<
class RTREE>
void
853 for (DictType::iterator i =
myDict.begin(); i !=
myDict.end(); ++i) {
859 into.Insert(cmin, cmax, l);
863 template void MSLane::fill<NamedRTree>(
NamedRTree& into);
883 return (link !=
myLinks.end());
932 MSLinkCont::const_iterator
934 const MSLane& succLinkSource,
const std::vector<MSLane*>& conts)
const {
937 if (nRouteEdge == 0) {
939 return succLinkSource.
myLinks.end();
943 assert(succLinkSource.
myLinks.size() == 1);
945 return succLinkSource.
myLinks.begin();
955 MSLinkCont::const_iterator link;
956 if (nRouteSuccs < conts.size()) {
958 for (link = succLinkSource.
myLinks.begin(); link != succLinkSource.
myLinks.end(); ++link) {
959 if ((*link)->getLane() != 0 && (*link)->getLane()->myEdge == nRouteEdge && (*link)->getLane()->allowsVehicleClass(veh.
getVehicleType().
getVehicleClass())) {
961 if ((*link)->getLane() == conts[nRouteSuccs]) {
968 return succLinkSource.
myLinks.end();
972 WRITE_WARNING(
"Could not find connection between '" + succLinkSource.
getID() +
"' and '" + conts[nRouteSuccs]->getID() +
975 return succLinkSource.
myLinks.end();
996 if (remVehicle == *it) {
1042 std::map<MSEdge*, std::vector<MSLane*> >::const_iterator i =
myApproachingLanes.find(edge);
1046 const std::vector<MSLane*>& lanes = (*i).second;
1047 return find(lanes.begin(), lanes.end(), lane) != lanes.end();
1053 inline int operator()(
const std::pair<const MSVehicle* , SUMOReal>& p1,
const std::pair<const MSVehicle* , SUMOReal>& p2)
const {
1054 return p1.second < p2.second;
1064 std::set<MSLane*> visited;
1065 std::vector<MSLane::IncomingLaneInfo> newFound;
1067 while (toExamine.size() != 0) {
1068 for (std::vector<MSLane::IncomingLaneInfo>::iterator i = toExamine.begin(); i != toExamine.end(); ++i) {
1069 MSLane* next = (*i).lane;
1075 result =
MAX2(result, missingRearGap);
1077 if ((*i).length < dist) {
1078 const std::vector<MSLane::IncomingLaneInfo>& followers = next->
getIncomingLanes();
1079 for (std::vector<MSLane::IncomingLaneInfo>::const_iterator j = followers.begin(); j != followers.end(); ++j) {
1080 if (visited.find((*j).lane) == visited.end()) {
1081 visited.insert((*j).lane);
1083 ili.
lane = (*j).lane;
1084 ili.
length = (*j).length + (*i).length;
1086 newFound.push_back(ili);
1093 swap(newFound, toExamine);
1099 std::pair<MSVehicle* const, SUMOReal>
1104 std::set<MSLane*> visited;
1105 std::vector<std::pair<MSVehicle*, SUMOReal> > possible;
1106 std::vector<MSLane::IncomingLaneInfo> newFound;
1108 while (toExamine.size() != 0) {
1109 for (std::vector<MSLane::IncomingLaneInfo>::iterator i = toExamine.begin(); i != toExamine.end(); ++i) {
1115 MSLane* next = (*i).lane;
1120 possible.push_back(std::make_pair(v, agap));
1123 if ((*i).length + seen < dist) {
1124 const std::vector<MSLane::IncomingLaneInfo>& followers = next->
getIncomingLanes();
1125 for (std::vector<MSLane::IncomingLaneInfo>::const_iterator j = followers.begin(); j != followers.end(); ++j) {
1126 if (visited.find((*j).lane) == visited.end()) {
1127 visited.insert((*j).lane);
1129 ili.
lane = (*j).lane;
1130 ili.
length = (*j).length + (*i).length;
1132 newFound.push_back(ili);
1139 swap(newFound, toExamine);
1141 if (possible.size() == 0) {
1142 return std::pair<MSVehicle* const, SUMOReal>(
static_cast<MSVehicle*
>(0), -1);
1145 return *(possible.begin());
1149 std::pair<MSVehicle* const, SUMOReal>
1151 const std::vector<MSLane*>& bestLaneConts)
const {
1153 return std::pair<MSVehicle* const, SUMOReal>(
static_cast<MSVehicle*
>(0), -1);
1155 unsigned int view = 1;
1157 const MSLane* targetLane =
this;
1162 const MSLane* nextLane = targetLane;
1166 MSLinkCont::const_iterator link = targetLane->
succLinkSec(veh, view, *nextLane, bestLaneConts);
1171 #ifdef HAVE_INTERNAL_LANES
1174 if (linkLeaders.size() > 0) {
1177 return linkLeaders[0];
1179 bool nextInternal = (*link)->getViaLane() != 0;
1181 nextLane = (*link)->getViaLaneOrLane();
1182 if (nextLane == 0) {
1188 return std::pair<MSVehicle* const, SUMOReal>(leader, seen + leader->getPositionOnLane() - leader->getVehicleType().getLength() - veh.
getVehicleType().
getMinGap());
1199 #ifdef HAVE_INTERNAL_LANES
1200 if (!nextInternal) {
1206 }
while (seen <= dist);
1207 return std::pair<MSVehicle* const, SUMOReal>(
static_cast<MSVehicle*
>(0), -1);
1219 for (std::vector<MSEdge*>::iterator i = pred.begin(); i != pred.end();) {
1228 if (pred.size() != 0) {
1230 MSEdge* best = *pred.begin();
1297 wtime += (*i)->getWaitingSeconds();
1310 for (VehCont::const_iterator i = vehs.begin(); i != vehs.end(); ++i) {
1311 v += (*i)->getSpeed();
1323 for (MSLane::VehCont::const_iterator i = vehs.begin(); i != vehs.end(); ++i) {
1324 ret += (*i)->getHBEFA_CO2Emissions();
1335 for (MSLane::VehCont::const_iterator i = vehs.begin(); i != vehs.end(); ++i) {
1336 ret += (*i)->getHBEFA_COEmissions();
1347 for (MSLane::VehCont::const_iterator i = vehs.begin(); i != vehs.end(); ++i) {
1348 ret += (*i)->getHBEFA_PMxEmissions();
1359 for (MSLane::VehCont::const_iterator i = vehs.begin(); i != vehs.end(); ++i) {
1360 ret += (*i)->getHBEFA_NOxEmissions();
1371 for (MSLane::VehCont::const_iterator i = vehs.begin(); i != vehs.end(); ++i) {
1372 ret += (*i)->getHBEFA_HCEmissions();
1383 for (MSLane::VehCont::const_iterator i = vehs.begin(); i != vehs.end(); ++i) {
1384 ret += (*i)->getHBEFA_FuelConsumption();
1395 if (vehs.size() == 0) {
1399 for (MSLane::VehCont::const_iterator i = vehs.begin(); i != vehs.end(); ++i) {
1400 SUMOReal sv = (*i)->getHarmonoise_NoiseEmissions();
1401 ret += (
SUMOReal) pow(10., (sv / 10.));
1421 myLaneDir(e->getLanes()[0]->
getShape().getBegLine().atan2PositiveAngle())
1430 if (ae1 != 0 && ae1->size() != 0) {
1434 if (ae2 != 0 && ae2->size() != 0) {
1453 for (std::vector<std::string>::const_iterator it = vehIds.begin(); it != vehIds.end(); ++it) {