46 #ifdef CHECK_MEMORY_LEAKS
48 #endif // CHECK_MEMORY_LEAKS
61 #ifndef HAVE_INTERNAL_LANES
66 myLastStateChange(-1),
71 myKeepClear(keepClear),
78 myLastStateChange(-1),
83 myKeepClear(keepClear),
84 myJunctionInlane(via),
85 myInternalLaneBefore(0),
96 const std::vector<MSLink*>& foeLinks,
97 const std::vector<MSLane*>& foeLanes,
98 MSLane* internalLaneBefore) {
103 for (std::vector<MSLane*>::const_iterator it_lane = foeLanes.begin(); it_lane != foeLanes.end(); ++it_lane) {
108 #ifdef HAVE_INTERNAL_LANES
109 myInternalLaneBefore = internalLaneBefore;
111 if (internalLaneBefore != 0) {
113 lane = internalLaneBefore;
119 #ifdef MSLink_DEBUG_CROSSING_POINTS
123 const bool beforeInternalJunction = lane->
getLinkCont()[0]->getViaLaneOrLane()->getEdge().isInternal();
126 for (std::vector<const MSLane*>::const_iterator it_lane =
myFoeLanes.begin(); it_lane !=
myFoeLanes.end(); ++it_lane) {
128 if (sameTarget && !beforeInternalJunction) {
131 myLengthsBehindCrossing.push_back(std::make_pair(0, 0));
132 #ifdef MSLink_DEBUG_CROSSING_POINTS
134 <<
" " << lane->
getID()
135 <<
" merges with " << (*it_lane)->getID()
136 <<
" nextLane " << lane->
getLinkCont()[0]->getViaLaneOrLane()->getID()
137 <<
" dist1=" << myLengthsBehindCrossing.back().first
138 <<
" dist2=" << myLengthsBehindCrossing.back().second
143 #ifdef MSLink_DEBUG_CROSSING_POINTS
146 bool haveIntersection =
true;
147 if (intersections1.size() == 0) {
148 intersections1.push_back(-10000.0);
149 haveIntersection =
false;
150 }
else if (intersections1.size() > 1) {
151 std::sort(intersections1.begin(), intersections1.end());
153 std::vector<SUMOReal> intersections2 = (*it_lane)->getShape().intersectsAtLengths2D(lane->
getShape());
154 #ifdef MSLink_DEBUG_CROSSING_POINTS
157 if (intersections2.size() == 0) {
158 intersections2.push_back(0);
159 }
else if (intersections2.size() > 1) {
160 std::sort(intersections2.begin(), intersections2.end());
162 if (haveIntersection) {
164 intersections1.back() -= (*it_lane)->getWidth() / 2;
165 intersections2.back() -= lane->
getWidth() / 2;
168 intersections2.back() = (*it_lane)->interpolateGeometryPosToLanePos(intersections2.back());
173 intersections1.back() = 0;
177 myLengthsBehindCrossing.push_back(std::make_pair(
178 lane->
getLength() - intersections1.back(),
179 (*it_lane)->getLength() - intersections2.back()));
181 #ifdef MSLink_DEBUG_CROSSING_POINTS
183 <<
" intersection of " << lane->
getID()
185 <<
" with " << (*it_lane)->getID()
186 <<
" totalLength=" << (*it_lane)->getLength()
187 <<
" dist1=" << myLengthsBehindCrossing.back().first
188 <<
" dist2=" << myLengthsBehindCrossing.back().second
198 for (MSLinkCont::const_iterator it = predLinks.begin(); it != predLinks.end(); ++it) {
199 const MSLane* sibling = (*it)->getViaLane();
200 if (sibling != lane && sibling != 0) {
202 #ifdef MSLink_DEBUG_CROSSING_POINTS
205 if (intersections1.size() > 0) {
206 std::sort(intersections1.begin(), intersections1.end());
209 myLengthsBehindCrossing.push_back(std::make_pair(
210 lane->
getLength() - intersections1.back(),
211 sibling->
getLength() - intersections1.back()));
213 #ifdef MSLink_DEBUG_CROSSING_POINTS
214 std::cout <<
" adding same-origin foe" << sibling->
getID()
215 <<
" dist1=" << myLengthsBehindCrossing.back().first
216 <<
" dist2=" << myLengthsBehindCrossing.back().second
230 std::pair<SUMOReal, SUMOReal>
235 const bool setRequest,
const SUMOTime arrivalTimeBraking,
const SUMOReal arrivalSpeedBraking,
const SUMOTime waitingTime) {
239 arrivalTimeBraking, arrivalSpeedBraking, waitingTime)));
253 if ((*i)->isBlockingAnyone()) {
269 std::map<const SUMOVehicle*, ApproachingVehicleInformation>::const_iterator i =
myApproachingVehicles.find(veh);
288 std::vector<const SUMOVehicle*>* collectFoes)
const {
302 if ((*i)->haveRed()) {
307 if ((*i)->blockedAtTime(arrivalTime, leaveTime, arrivalSpeed, leaveSpeed,
myLane == (*i)->getLane(),
308 impatience, decel, waitingTime, collectFoes)) {
319 std::vector<const SUMOVehicle*>* collectFoes)
const {
321 if (!i->second.willPass) {
325 assert(waitingTime > 0);
326 if (waitingTime > i->second.waitingTime) {
329 if (waitingTime == i->second.waitingTime && arrivalTime < i->second.arrivalTime) {
333 const SUMOTime foeArrivalTime = (
SUMOTime)((1.0 - impatience) * i->second.arrivalTime + impatience * i->second.arrivalTimeBraking);
334 if (i->second.leavingTime < arrivalTime) {
336 if (sameTargetLane && (arrivalTime - i->second.leavingTime <
myLookaheadTime
338 i->first->getVehicleType().getCarFollowModel().getMaxDecel(), decel))) {
339 if (collectFoes == 0) {
342 collectFoes->push_back(i->first);
345 }
else if (foeArrivalTime > leaveTime) {
349 decel, i->first->getVehicleType().getCarFollowModel().getMaxDecel()))) {
350 if (collectFoes == 0) {
353 collectFoes->push_back(i->first);
358 if (collectFoes == 0) {
361 collectFoes->push_back(i->first);
382 assert(distLeft > 0);
393 if ((*i)->blockedAtTime(arrivalTime, leaveTime, speed, speed,
myLane == (*i)->getLane(), 0, decel, 0)) {
397 for (std::vector<const MSLane*>::const_iterator i =
myFoeLanes.begin(); i !=
myFoeLanes.end(); ++i) {
398 if ((*i)->getVehicleNumber() > 0 || (*i)->getPartialOccupator() != 0) {
429 #ifdef HAVE_INTERNAL_LANES
430 if (myJunctionInlane != 0) {
431 approachedLane = myJunctionInlane;
438 const std::vector<MSLane::IncomingLaneInfo> possibleLanes = approachedLane->
getIncomingLanes();
439 std::vector<MSLane::IncomingLaneInfo>::const_iterator i;
440 for (i = possibleLanes.begin(); i != possibleLanes.end(); i++) {
443 for (MSLinkCont::const_iterator j = outgoingLinks.begin(); j != outgoingLinks.end(); j++) {
456 #ifdef HAVE_INTERNAL_LANES
457 if (myJunctionInlane == 0 ||
myAmCont) {
467 assert(predLink != 0);
482 #ifdef HAVE_INTERNAL_LANES
483 const std::string via = getViaLane() == 0 ?
"" : getViaLane()->getID();
485 const std::string via =
"";
489 std::vector<std::pair<SUMOTime, const SUMOVehicle*> > toSort;
491 toSort.push_back(std::make_pair(it->second.arrivalTime, it->first));
493 std::sort(toSort.begin(), toSort.end());
494 for (std::vector<std::pair<SUMOTime, const SUMOVehicle*> >::const_iterator it = toSort.begin(); it != toSort.end(); ++it) {
513 #ifdef HAVE_INTERNAL_LANES
515 MSLink::getViaLane()
const {
516 return myJunctionInlane;
521 MSLink::getLeaderInfo(
SUMOReal dist,
SUMOReal minGap, std::vector<const MSPerson*>* collectBlockers)
const {
527 || (myJunctionInlane != 0 && myJunctionInlane->getLogicalPredecessorLane()->getEdge().isInternal()))) {
530 for (
size_t i = 0; i <
myFoeLanes.size(); ++i) {
533 const SUMOReal distToCrossing = dist - myLengthsBehindCrossing[i].first;
535 const bool sameSource = (myInternalLaneBefore != 0 && myInternalLaneBefore->getLogicalPredecessorLane() == foeLane->
getLogicalPredecessorLane());
536 const SUMOReal crossingWidth = (sameTarget || sameSource) ? 0 : foeLane->
getWidth();
537 const SUMOReal foeCrossingWidth = (sameTarget || sameSource) ? 0 : myInternalLaneBefore->getWidth();
539 if (distToCrossing + crossingWidth < 0) {
542 const SUMOReal foeDistToCrossing = foeLane->
getLength() - myLengthsBehindCrossing[i].second;
550 const bool cannotIgnore = contLane || sameTarget || sameSource;
553 for (MSLane::VehCont::const_iterator it_veh = vehicles.begin(); it_veh != vehicles.end(); ++it_veh) {
555 if (!cannotIgnore && !foeLane->
getLinkCont()[0]->getApproaching(leader).willPass) {
562 if (contLane && !sameSource) {
566 const SUMOReal leaderBackDist = foeDistToCrossing - leaderBack;
568 if (leaderBackDist + foeCrossingWidth < 0) {
573 gap = distToCrossing - leaderBackDist - (sameTarget ? minGap : 0);
575 result.push_back(LinkLeader(leader, gap, cannotIgnore ? -1 : distToCrossing));
585 if (contLane && !sameSource) {
590 if (leaderBackDist + foeCrossingWidth < 0) {
595 gap = distToCrossing - leaderBackDist - (sameTarget ? minGap : 0);
597 result.push_back(LinkLeader(leader, gap, sameTarget ? -1 : distToCrossing));
602 if (distToPeds >= -MSPModel::SAFETY_GAP &&
MSPModel::getModel()->blockedAtDist(foeLane, foeDistToCrossing, collectBlockers)) {
603 result.push_back(LinkLeader((
MSVehicle*)0, -1, distToPeds));
614 #ifdef HAVE_INTERNAL_LANES
615 if (myJunctionInlane != 0) {
616 return myJunctionInlane;
const MSJunction * myJunction
the junction to which this link belongs
OutputDevice & writeAttr(const SumoXMLAttr attr, const T &val)
writes a named attribute
MSEdge & getEdge() const
Returns the lane's edge.
int myIndex
The position within this respond.
Representation of a vehicle in the micro simulation.
bool hasFoes() const
Returns whether this link belongs to a junction where more than one edge is incoming.
bool hasApproachingFoe(SUMOTime arrivalTime, SUMOTime leaveTime, SUMOReal speed, SUMOReal decel) const
Returns the information whether a vehicle is approaching on one of the link's foe streams...
static const SUMOReal SAFETY_GAP
MSLane * myLane
The lane (but the internal one) approached by this link.
void addBlockedLink(MSLink *link)
ApproachingVehicleInformation getApproaching(const SUMOVehicle *veh) const
LinkState myState
The state of the link.
virtual void releaseVehicles() const
Allows to use the container for microsimulation again.
const MSCFModel & getCarFollowModel() const
Returns the vehicle's car following model definition.
std::pair< SUMOReal, SUMOReal > getLastIntersections(const MSLane *lane, const MSLane *foe)
void setRequestInformation(int index, bool hasFoes, bool isCont, const std::vector< MSLink * > &foeLinks, const std::vector< MSLane * > &foeLanes, MSLane *internalLaneBefore=0)
Sets the request information.
SUMOTime getWaitingTime() const
Returns the SUMOTime waited (speed was lesser than 0.1m/s)
bool myHasFoes
Whether any foe links exist.
This is an uncontrolled, minor link, has to stop.
SUMOReal getLength() const
Returns the lane's length.
SUMOTime myLastStateChange
The time of the last state change.
std::vector< MSLink * > myFoeLinks
void setTLState(LinkState state, SUMOTime t)
Sets the current tl-state.
std::vector< MSVehicle * > VehCont
Container for vehicles.
std::string time2string(SUMOTime t)
SUMOReal getLength() const
Get vehicle's length [m].
LinkDirection myDirection
An abstract (hopefully human readable) definition of the link's direction.
SUMOReal getWidth() const
Returns the lane's width.
LinkDirection getDirection() const
Returns the direction the vehicle passing this link take.
SUMOReal getPositionOnLane() const
Get the vehicle's position along the lane.
std::map< const SUMOVehicle *, ApproachingVehicleInformation > myApproachingVehicles
bool lastWasContMajor() const
whether this is a link past an internal junction which currently has priority
This is an uncontrolled, all-way stop link.
#define UNUSED_PARAMETER(x)
#define WRITE_WARNING(msg)
bool blockedAtTime(SUMOTime arrivalTime, SUMOTime leaveTime, SUMOReal arrivalSpeed, SUMOReal leaveSpeed, bool sameTargetLane, SUMOReal impatience, SUMOReal decel, SUMOTime waitingTime, std::vector< const SUMOVehicle * > *collectFoes=0) const
Returns the information whether this link is blocked Valid after the vehicles have set their requests...
virtual const VehCont & getVehiclesSecure() const
Returns the vehicles container; locks it for microsimulation.
SUMOReal getPartialOccupatorEnd() const
Returns the position of the in-lapping vehicle's end.
LinkDirection
The different directions a link between two lanes may take (or a stream between two edges)...
int getIndex() const
Returns the respond index (for visualization)
SUMOTime getLeaveTime(const SUMOTime arrivalTime, const SUMOReal arrivalSpeed, const SUMOReal leaveSpeed, const SUMOReal vehicleLength) const
return the expected time at which the given vehicle will clear the link
const std::string & getID() const
Returns the id.
MSLane * getLogicalPredecessorLane() const
get the most likely precedecessor lane (sorted using by_connections_to_sorter). The result is cached ...
Representation of a vehicle.
static MSPModel * getModel()
MSLane * getLane() const
Returns the connected lane.
std::set< MSLink * > myBlockedFoeLinks
LinkState
The right-of-way state of a link between two lanes used when constructing a NBTrafficLightLogic, in MSLink and GNEInternalLane.
std::vector< LinkLeader > LinkLeaders
static bool gUsingInternalLanes
Information whether the simulation regards internal lanes.
SUMOReal getMaxDecel() const
Get the vehicle type's maximum deceleration [m/s^2].
MSVehicle * getLastVehicle() const
returns the last vehicle
std::string toString(const T &t, std::streamsize accuracy=OUTPUT_ACCURACY)
MSLink(MSLane *succLane, LinkDirection dir, LinkState state, SUMOReal length, bool keepClear)
Constructor for simulation not using internal lanes.
bool isInternal() const
return whether this edge is an internal edge
static bool unsafeMergeSpeeds(SUMOReal leaderSpeed, SUMOReal followerSpeed, SUMOReal leaderDecel, SUMOReal followerDecel)
return whether the given vehicles may NOT merge safely
SUMOReal getLength() const
Returns the length of this link.
static bool maybeOccupied(MSLane *lane)
returns whether the given lane may still be occupied by a vehicle currently on it ...
EdgeBasicFunction getPurpose() const
Returns the edge type (EdgeBasicFunction)
MSLane * getApproachingLane() const
Returns the lane leading to this link.
bool havePriority() const
Returns whether this link is a major link.
bool willHaveBlockedFoe() const
static MSLink * getConnectingLink(const MSLane &from, const MSLane &to)
Returns the link connecting both lanes Both lanes have to be non-internal; 0 may be returned if no co...
The edge is a normal street.
MSLane * getViaLaneOrLane() const
return the via lane if it exists and the lane otherwise
const MSVehicleType & getVehicleType() const
Returns the vehicle's type definition.
bool haveRed() const
Returns whether this link is blocked by a red (or redyellow) traffic light.
SUMOReal getSpeed() const
Returns the vehicle's current speed.
void writeApproaching(OutputDevice &od, const std::string fromLaneID) const
write information about all approaching vehicles to the given output device
static SUMOTime gIgnoreJunctionBlocker
Information whether the simulation regards internal lanes.
const PositionVector & getShape() const
Returns this lane's shape.
MSVehicle * getPartialOccupator() const
Returns the vehicle which laps into this lane.
Static storage of an output device and its base (abstract) implementation.
bool closeTag()
Closes the most recently opened tag.
static const bool gUseMesoSim
void setApproaching(const SUMOVehicle *approaching, const SUMOTime arrivalTime, const SUMOReal arrivalSpeed, const SUMOReal leaveSpeed, const bool setRequest, const SUMOTime arrivalTimeBraking, const SUMOReal arrivalSpeedBraking, const SUMOTime waitingTime)
Sets the information about an approaching vehicle.
const MSJunction * getFromJunction() const
void removeApproaching(const SUMOVehicle *veh)
removes the vehicle from myApproachingVehicles
const MSLinkCont & getLinkCont() const
returns the container with all links !!!
const std::vector< IncomingLaneInfo > & getIncomingLanes() const
The edge is an internal edge.
SUMOReal interpolateGeometryPosToLanePos(SUMOReal geometryPos) const
std::vector< SUMOReal > intersectsAtLengths2D(const PositionVector &other) const
For all intersections between this vector and other, return the 2D-length of the subvector from this ...
static SUMOTime myLookaheadTime
Representation of a lane in the micro simulation.
bool opened(SUMOTime arrivalTime, SUMOReal arrivalSpeed, SUMOReal leaveSpeed, SUMOReal vehicleLength, SUMOReal impatience, SUMOReal decel, SUMOTime waitingTime, std::vector< const SUMOVehicle * > *collectFoes=0) const
Returns the information whether the link may be passed.
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
std::vector< const MSLane * > myFoeLanes
virtual const MSVehicleType & getVehicleType() const =0
Returns the vehicle's type.