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;
614 if (leftVehicleLength > myLength) {
632 std::pair<MSVehicle*, SUMOReal>
638 return std::make_pair(last, pos);
644 return std::make_pair<MSVehicle*, SUMOReal>(0, 0);
653 std::vector<MSVehicle*> collisions;
654 VehCont::iterator lastBeforeEnd =
myVehicles.end() - 1;
655 VehCont::iterator veh;
657 for (veh =
myVehicles.begin(); veh != lastBeforeEnd; ++veh) {
659 VehCont::const_iterator pred(veh + 1);
660 assert((*veh)->getLane() ==
this);
664 assert((*veh)->getLane() ==
this);
666 assert((*veh)->getPositionOnLane() <=
myLength);
667 assert((*veh)->getLane() ==
this);
678 VehCont::iterator lastVeh =
myVehicles.end() - 1;
679 for (VehCont::iterator veh =
myVehicles.begin(); veh != lastVeh;) {
680 VehCont::iterator pred = veh + 1;
681 if ((*veh)->hasInfluencer() && (*veh)->getInfluencer().isVTDControlled()) {
685 if ((*pred)->hasInfluencer() && (*pred)->getInfluencer().isVTDControlled()) {
689 SUMOReal gap = (*pred)->getPositionOnLane() - (*pred)->getVehicleType().getLength() - (*veh)->getPositionOnLane() - (*veh)->getVehicleType().getMinGap();
693 + (*pred)->getID() +
"', lane='" +
getID() +
"', gap=" +
toString(gap)
727 }
else if (target != 0 && moved) {
738 into.push_back(target);
774 DictType::iterator it =
myDict.find(
id);
777 myDict.insert(DictType::value_type(
id, ptr));
786 DictType::iterator it =
myDict.find(
id);
797 for (DictType::iterator i =
myDict.begin(); i !=
myDict.end(); ++i) {
806 for (DictType::iterator i =
myDict.begin(); i !=
myDict.end(); ++i) {
807 into.push_back((*i).first);
818 return (link !=
myLinks.end());
866 MSLinkCont::const_iterator
868 const MSLane& succLinkSource,
const std::vector<MSLane*>& conts)
const {
871 if (nRouteEdge == 0) {
873 return succLinkSource.
myLinks.end();
877 assert(succLinkSource.
myLinks.size() == 1);
879 return succLinkSource.
myLinks.begin();
889 MSLinkCont::const_iterator link;
890 if (nRouteSuccs < conts.size()) {
892 for (link = succLinkSource.
myLinks.begin(); link != succLinkSource.
myLinks.end(); ++link) {
893 if ((*link)->getLane() != 0 && (*link)->getLane()->myEdge == nRouteEdge && (*link)->getLane()->allowsVehicleClass(veh.
getVehicleType().
getVehicleClass())) {
895 if ((*link)->getLane() == conts[nRouteSuccs]) {
902 return succLinkSource.
myLinks.end();
905 return succLinkSource.
myLinks.end();
927 throw "Only within the gui-version";
934 if (remVehicle == *it) {
985 std::map<MSEdge*, std::vector<MSLane*> >::const_iterator i =
myApproachingLanes.find(edge);
989 const std::vector<MSLane*>& lanes = (*i).second;
990 return find(lanes.begin(), lanes.end(), lane) != lanes.end();
996 inline int operator()(
const std::pair<const MSVehicle* , SUMOReal>& p1,
const std::pair<const MSVehicle* , SUMOReal>& p2)
const {
997 return p1.second < p2.second;
1007 std::set<MSLane*> visited;
1008 std::vector<MSLane::IncomingLaneInfo> newFound;
1010 while (toExamine.size() != 0) {
1011 for (std::vector<MSLane::IncomingLaneInfo>::iterator i = toExamine.begin(); i != toExamine.end(); ++i) {
1012 MSLane* next = (*i).lane;
1018 result =
MAX2(result, missingRearGap);
1020 if ((*i).length < dist) {
1021 const std::vector<MSLane::IncomingLaneInfo>& followers = next->
getIncomingLanes();
1022 for (std::vector<MSLane::IncomingLaneInfo>::const_iterator j = followers.begin(); j != followers.end(); ++j) {
1023 if (visited.find((*j).lane) == visited.end()) {
1024 visited.insert((*j).lane);
1026 ili.
lane = (*j).lane;
1027 ili.
length = (*j).length + (*i).length;
1029 newFound.push_back(ili);
1036 swap(newFound, toExamine);
1042 std::pair<MSVehicle* const, SUMOReal>
1047 std::set<MSLane*> visited;
1048 std::vector<std::pair<MSVehicle*, SUMOReal> > possible;
1049 std::vector<MSLane::IncomingLaneInfo> newFound;
1051 while (toExamine.size() != 0) {
1052 for (std::vector<MSLane::IncomingLaneInfo>::iterator i = toExamine.begin(); i != toExamine.end(); ++i) {
1058 MSLane* next = (*i).lane;
1063 possible.push_back(std::make_pair(v, agap));
1066 if ((*i).length + seen < dist) {
1067 const std::vector<MSLane::IncomingLaneInfo>& followers = next->
getIncomingLanes();
1068 for (std::vector<MSLane::IncomingLaneInfo>::const_iterator j = followers.begin(); j != followers.end(); ++j) {
1069 if (visited.find((*j).lane) == visited.end()) {
1070 visited.insert((*j).lane);
1072 ili.
lane = (*j).lane;
1073 ili.
length = (*j).length + (*i).length;
1075 newFound.push_back(ili);
1082 swap(newFound, toExamine);
1084 if (possible.size() == 0) {
1085 return std::pair<MSVehicle* const, SUMOReal>(
static_cast<MSVehicle*
>(0), -1);
1088 return *(possible.begin());
1092 std::pair<MSVehicle* const, SUMOReal>
1094 const std::vector<MSLane*>& bestLaneConts)
const {
1096 return std::pair<MSVehicle* const, SUMOReal>(
static_cast<MSVehicle*
>(0), -1);
1098 unsigned int view = 1;
1100 const MSLane* targetLane =
this;
1105 const MSLane* nextLane = targetLane;
1109 MSLinkCont::const_iterator link = targetLane->
succLinkSec(veh, view, *nextLane, bestLaneConts);
1113 #ifdef HAVE_INTERNAL_LANES
1114 bool nextInternal = (*link)->getViaLane() != 0;
1116 nextLane = (*link)->getViaLaneOrLane();
1117 if (nextLane == 0) {
1123 return std::pair<MSVehicle* const, SUMOReal>(leader, seen + leader->getPositionOnLane() - leader->getVehicleType().getLength() - veh.
getVehicleType().
getMinGap());
1134 #ifdef HAVE_INTERNAL_LANES
1135 if (!nextInternal) {
1141 }
while (seen <= dist);
1142 return std::pair<MSVehicle* const, SUMOReal>(
static_cast<MSVehicle*
>(0), -1);
1154 for (std::vector<MSEdge*>::iterator i = pred.begin(); i != pred.end();) {
1163 if (pred.size() != 0) {
1165 MSEdge* best = *pred.begin();
1206 for (VehCont::const_iterator i = vehs.begin(); i != vehs.end(); ++i) {
1207 v += (*i)->getSpeed();
1219 for (MSLane::VehCont::const_iterator i = vehs.begin(); i != vehs.end(); ++i) {
1220 ret += (*i)->getHBEFA_CO2Emissions();
1231 for (MSLane::VehCont::const_iterator i = vehs.begin(); i != vehs.end(); ++i) {
1232 ret += (*i)->getHBEFA_COEmissions();
1243 for (MSLane::VehCont::const_iterator i = vehs.begin(); i != vehs.end(); ++i) {
1244 ret += (*i)->getHBEFA_PMxEmissions();
1255 for (MSLane::VehCont::const_iterator i = vehs.begin(); i != vehs.end(); ++i) {
1256 ret += (*i)->getHBEFA_NOxEmissions();
1267 for (MSLane::VehCont::const_iterator i = vehs.begin(); i != vehs.end(); ++i) {
1268 ret += (*i)->getHBEFA_HCEmissions();
1279 for (MSLane::VehCont::const_iterator i = vehs.begin(); i != vehs.end(); ++i) {
1280 ret += (*i)->getHBEFA_FuelConsumption();
1291 if (vehs.size() == 0) {
1295 for (MSLane::VehCont::const_iterator i = vehs.begin(); i != vehs.end(); ++i) {
1296 SUMOReal sv = (*i)->getHarmonoise_NoiseEmissions();
1297 ret += (
SUMOReal) pow(10., (sv / 10.));
1317 myLaneDir(e->getLanes()[0]->
getShape().getBegLine().atan2PositiveAngle())
1326 if (ae1 != 0 && ae1->size() != 0) {
1330 if (ae2 != 0 && ae2->size() != 0) {