69 #ifdef CHECK_MEMORY_LEAKS
71 #endif // CHECK_MEMORY_LEAKS
87 myShape(shape), myNumericalID(numericalID),
88 myVehicles(), myLength(length), myWidth(width), myEdge(edge), myMaxSpeed(maxSpeed),
89 myPermissions(permissions),
90 myLogicalPredecessorLane(0),
91 myVehicleLengthSum(0), myInlappingVehicleEnd(10000), myInlappingVehicle(0),
92 myLengthGeometryFactor(myShape.length() / myLength) {}
96 for (MSLinkCont::iterator i =
myLinks.begin(); i !=
myLinks.end(); ++i) {
113 (*veh)->addReminder(rem);
152 if (leader.first != 0) {
154 vIn = leader.first->getSpeed();
155 leaderDecel = leader.first->getCarFollowModel().getMaxDecel();
161 const SUMOReal vHlp = 0.5 * (vIn + mspeed);
165 for (
int i = 0; i <= 10; i++) {
176 }
else if (x > maxPos) {
196 if (leader.first != 0) {
198 vIn = leader.first->getSpeed();
204 const SUMOReal vHlp = 0.5 * (mspeed + vIn);
208 }
else if (xIn > maxPos) {
222 MSLane::VehCont::iterator predIt =
myVehicles.begin();
225 MSLane::VehCont::iterator maxIt =
myVehicles.begin();
244 const SUMOReal lhs = nettoGap / tau + tauDecel - fSpeed - fSpeed * fSpeed / (2 * tauDecel) + leaderSpeed * leaderSpeed / (2 * tauDecel);
245 if (lhs >= sqrt(tauDecel * tauDecel + leaderSpeed * leaderSpeed)) {
247 const SUMOReal currentMaxSpeed = lhs - tauDecel;
248 if (
MIN2(currentMaxSpeed, mspeed) > maxSpeed) {
249 maxSpeed = currentMaxSpeed;
250 maxPos = leaderRearPos + frontGap;
268 bool adaptableSpeed =
true;
278 if (adaptableSpeed) {
282 if (leaderPos - frontGapNeeded >= 0) {
291 MSLane::VehCont::iterator predIt =
myVehicles.begin();
299 if (adaptableSpeed && leader != 0) {
311 frontMax = leaderRearPos - frontGapNeeded;
319 if (frontMax > 0 && backMin +
POSITION_EPS < frontMax) {
336 bool patchSpeed =
true;
372 for (
unsigned int i = 0; i < 10; i++) {
409 aVehicle->
getID() +
"'. Inserting at lane end instead.");
415 std::vector<MSLane*>::const_iterator ri = bestLaneConts.begin();
420 unsigned int nRouteSuccs = 1;
421 MSLane* currentLane =
this;
424 while (seen < dist && ri != bestLaneConts.end()) {
426 MSLinkCont::const_iterator link = currentLane->
succLinkSec(*aVehicle, nRouteSuccs, *currentLane, bestLaneConts);
432 if (nspeed < speed) {
434 speed =
MIN2(nspeed, speed);
438 WRITE_ERROR(
"Vehicle '" + aVehicle->
getID() +
"' will not be able to depart using given velocity!");
447 if (nspeed < speed) {
449 speed =
MIN2(nspeed, speed);
453 WRITE_ERROR(
"Vehicle '" + aVehicle->
getID() +
"' will not be able to depart using given velocity!");
464 if (nspeed < speed) {
466 speed =
MIN2(nspeed, speed);
476 nextLane = (*link)->getViaLaneOrLane();
496 if (nspeed < speed) {
498 speed =
MIN2(nspeed, speed);
508 if (nspeed < speed) {
511 speed =
MIN2(cfModel.
freeSpeed(aVehicle, speed, seen, nspeed), speed);
515 WRITE_ERROR(
"Vehicle '" + aVehicle->
getID() +
"' will not be able to depart using given velocity!");
525 if ((*link)->hasApproachingFoe(arrivalTime, leaveTime, speed)) {
527 if (nspeed < speed) {
529 speed =
MIN2(nspeed, speed);
538 currentLane = nextLane;
539 #ifdef HAVE_INTERNAL_LANES
540 if ((*link)->getViaLane() == 0) {
558 if (gap < frontGapNeeded) {
570 if (gap < backGapNeeded) {
583 if (missingRearGap > 0) {
585 const SUMOReal neededStartPos = pos + missingRearGap;
588 pos = neededStartPos;
598 if (gap <= frontGapNeeded) {
625 if (leftVehicleLength > myLength) {
643 std::pair<MSVehicle*, SUMOReal>
649 return std::make_pair(last, pos);
655 return std::make_pair<MSVehicle*, SUMOReal>(0, 0);
664 std::vector<MSVehicle*> collisions;
665 VehCont::iterator lastBeforeEnd =
myVehicles.end() - 1;
666 VehCont::iterator veh;
668 for (veh =
myVehicles.begin(); veh != lastBeforeEnd; ++veh) {
670 VehCont::const_iterator pred(veh + 1);
675 assert((*veh)->getPositionOnLane() <=
myLength);
676 assert((*veh)->getLane() ==
this);
687 VehCont::iterator lastVeh =
myVehicles.end() - 1;
688 for (VehCont::iterator veh =
myVehicles.begin(); veh != lastVeh;) {
689 VehCont::iterator pred = veh + 1;
690 SUMOReal gap = (*pred)->getPositionOnLane() - (*pred)->getVehicleType().getLength() - (*veh)->getPositionOnLane() - (*veh)->getVehicleType().getMinGap();
694 + (*pred)->getID() +
"', lane='" +
getID() +
"', gap=" +
toString(gap)
715 MSLane* currentLane = (*next)->getLanes()[0];
719 while (seen < dist && next != veh.
getRoute().
end() - 1) {
721 MSLane* nextLane = (*next)->getLanes()[0];
742 }
else if (target != 0 && moved) {
753 into.push_back(target);
789 DictType::iterator it =
myDict.find(
id);
792 myDict.insert(DictType::value_type(
id, ptr));
801 DictType::iterator it =
myDict.find(
id);
812 for (DictType::iterator i =
myDict.begin(); i !=
myDict.end(); ++i) {
821 for (DictType::iterator i =
myDict.begin(); i !=
myDict.end(); ++i) {
822 into.push_back((*i).first);
833 return (link !=
myLinks.end());
881 MSLinkCont::const_iterator
883 const MSLane& succLinkSource,
const std::vector<MSLane*>& conts)
const {
886 if (nRouteEdge == 0) {
888 return succLinkSource.
myLinks.end();
897 MSLinkCont::const_iterator link;
898 if (nRouteSuccs < conts.size()) {
900 for (link = succLinkSource.
myLinks.begin(); link != succLinkSource.
myLinks.end(); ++link) {
901 if ((*link)->getLane() != 0 && (*link)->getLane()->myEdge == nRouteEdge && (*link)->getLane()->allowsVehicleClass(veh.
getVehicleType().
getVehicleClass())) {
903 if ((*link)->getLane() == conts[nRouteSuccs]) {
913 std::vector<MSLinkCont::const_iterator> valid;
914 for (link = succLinkSource.
myLinks.begin(); link != succLinkSource.
myLinks.end(); ++link) {
915 if ((*link)->getLane() != 0 && (*link)->getLane()->myEdge == nRouteEdge && (*link)->getLane()->allowsVehicleClass(veh.
getVehicleType().
getVehicleClass())) {
916 valid.push_back(link);
920 if (valid.size() == 0) {
922 return succLinkSource.
myLinks.end();
925 if (valid.size() == 1) {
926 return *(valid.begin());
932 if (nRouteEdge2 == 0 || next_allowed == 0) {
933 return *(valid.begin());
937 for (std::vector<MSLinkCont::const_iterator>::iterator i = valid.begin(); i != valid.end(); ++i) {
938 if (find(next_allowed->begin(), next_allowed->end(), (**i)->getLane()) != next_allowed->end()) {
942 return *(valid.begin());
964 throw "Only within the gui-version";
971 if (remVehicle == *it) {
1022 std::map<MSEdge*, std::vector<MSLane*> >::const_iterator i =
myApproachingLanes.find(edge);
1026 const std::vector<MSLane*>& lanes = (*i).second;
1027 return find(lanes.begin(), lanes.end(), lane) != lanes.end();
1033 inline int operator()(
const std::pair<const MSVehicle* , SUMOReal>& p1,
const std::pair<const MSVehicle* , SUMOReal>& p2)
const {
1034 return p1.second < p2.second;
1044 std::set<MSLane*> visited;
1045 std::vector<MSLane::IncomingLaneInfo> newFound;
1047 while (toExamine.size() != 0) {
1048 for (std::vector<MSLane::IncomingLaneInfo>::iterator i = toExamine.begin(); i != toExamine.end(); ++i) {
1049 MSLane* next = (*i).lane;
1055 result =
MAX2(result, missingRearGap);
1057 if ((*i).length < dist) {
1058 const std::vector<MSLane::IncomingLaneInfo>& followers = next->
getIncomingLanes();
1059 for (std::vector<MSLane::IncomingLaneInfo>::const_iterator j = followers.begin(); j != followers.end(); ++j) {
1060 if (visited.find((*j).lane) == visited.end()) {
1061 visited.insert((*j).lane);
1063 ili.
lane = (*j).lane;
1064 ili.
length = (*j).length + (*i).length;
1066 newFound.push_back(ili);
1073 swap(newFound, toExamine);
1079 std::pair<MSVehicle* const, SUMOReal>
1084 std::set<MSLane*> visited;
1085 std::vector<std::pair<MSVehicle*, SUMOReal> > possible;
1086 std::vector<MSLane::IncomingLaneInfo> newFound;
1088 while (toExamine.size() != 0) {
1089 for (std::vector<MSLane::IncomingLaneInfo>::iterator i = toExamine.begin(); i != toExamine.end(); ++i) {
1095 MSLane* next = (*i).lane;
1100 possible.push_back(std::make_pair(v, agap));
1103 if ((*i).length + seen < dist) {
1104 const std::vector<MSLane::IncomingLaneInfo>& followers = next->
getIncomingLanes();
1105 for (std::vector<MSLane::IncomingLaneInfo>::const_iterator j = followers.begin(); j != followers.end(); ++j) {
1106 if (visited.find((*j).lane) == visited.end()) {
1107 visited.insert((*j).lane);
1109 ili.
lane = (*j).lane;
1110 ili.
length = (*j).length + (*i).length;
1112 newFound.push_back(ili);
1119 swap(newFound, toExamine);
1121 if (possible.size() == 0) {
1122 return std::pair<MSVehicle* const, SUMOReal>(
static_cast<MSVehicle*
>(0), -1);
1125 return *(possible.begin());
1129 std::pair<MSVehicle* const, SUMOReal>
1131 const std::vector<MSLane*>& bestLaneConts)
const {
1133 return std::pair<MSVehicle* const, SUMOReal>(
static_cast<MSVehicle*
>(0), -1);
1135 unsigned int view = 1;
1137 const MSLane* targetLane =
this;
1142 const MSLane* nextLane = targetLane;
1146 MSLinkCont::const_iterator link = targetLane->
succLinkSec(veh, view, *nextLane, bestLaneConts);
1150 #ifdef HAVE_INTERNAL_LANES
1151 bool nextInternal = (*link)->getViaLane() != 0;
1153 nextLane = (*link)->getViaLaneOrLane();
1154 if (nextLane == 0) {
1160 return std::pair<MSVehicle* const, SUMOReal>(leader, seen + leader->getPositionOnLane() - leader->getVehicleType().getLength() - veh.
getVehicleType().
getMinGap());
1171 #ifdef HAVE_INTERNAL_LANES
1172 if (!nextInternal) {
1178 }
while (seen <= dist);
1179 return std::pair<MSVehicle* const, SUMOReal>(
static_cast<MSVehicle*
>(0), -1);
1191 for (std::vector<MSEdge*>::iterator i = pred.begin(); i != pred.end();) {
1200 if (pred.size() != 0) {
1202 MSEdge* best = *pred.begin();
1243 for (VehCont::const_iterator i = vehs.begin(); i != vehs.end(); ++i) {
1244 v += (*i)->getSpeed();
1256 for (MSLane::VehCont::const_iterator i = vehs.begin(); i != vehs.end(); ++i) {
1257 ret += (*i)->getHBEFA_CO2Emissions();
1268 for (MSLane::VehCont::const_iterator i = vehs.begin(); i != vehs.end(); ++i) {
1269 ret += (*i)->getHBEFA_COEmissions();
1280 for (MSLane::VehCont::const_iterator i = vehs.begin(); i != vehs.end(); ++i) {
1281 ret += (*i)->getHBEFA_PMxEmissions();
1292 for (MSLane::VehCont::const_iterator i = vehs.begin(); i != vehs.end(); ++i) {
1293 ret += (*i)->getHBEFA_NOxEmissions();
1304 for (MSLane::VehCont::const_iterator i = vehs.begin(); i != vehs.end(); ++i) {
1305 ret += (*i)->getHBEFA_HCEmissions();
1316 for (MSLane::VehCont::const_iterator i = vehs.begin(); i != vehs.end(); ++i) {
1317 ret += (*i)->getHBEFA_FuelConsumption();
1328 if (vehs.size() == 0) {
1332 for (MSLane::VehCont::const_iterator i = vehs.begin(); i != vehs.end(); ++i) {
1333 SUMOReal sv = (*i)->getHarmonoise_NoiseEmissions();
1334 ret += (
SUMOReal) pow(10., (sv / 10.));
1354 myLaneDir(e->getLanes()[0]->
getShape().getBegLine().atan2PositiveAngle())
1363 if (ae1 != 0 && ae1->size() != 0) {
1367 if (ae2 != 0 && ae2->size() != 0) {