53 #ifdef CHECK_MEMORY_LEAKS
55 #endif // CHECK_MEMORY_LEAKS
74 : myJunction(junction),
75 myAll(all), myIncoming(incoming), myOutgoing(outgoing) {
80 myDone.reserve(variations);
81 for (
size_t i = 0; i < variations; i++) {
86 for (NBConnectionProhibits::const_iterator j = loadedProhibits.begin(); j != loadedProhibits.end(); j++) {
88 bool ok1 = prohibited.
check(ec);
103 for (NBConnectionVector::const_iterator k = prohibiting.begin(); k != prohibiting.end(); k++) {
105 bool ok2 = sprohibiting.
check(ec);
118 myDone[idx2][idx1] =
true;
119 myDone[idx1][idx2] =
true;
124 std::string ptID = prohibited.
getTo() != 0 ? prohibited.
getTo()->
getID() :
"UNKNOWN";
125 std::string bfID = sprohibiting.
getFrom() != 0 ? sprohibiting.
getFrom()->
getID() :
"UNKNOWN";
126 std::string btID = sprohibiting.
getTo() != 0 ? sprohibiting.
getTo()->
getID() :
"UNKNOWN";
127 WRITE_WARNING(
"could not prohibit " + pfID +
"->" + ptID +
" by " + bfID +
"->" + btID);
135 for (
size_t s1 = 0; s1 < no; s1++) {
136 for (
size_t s2 = s1 + 1; s2 < no; s2++) {
157 EdgeVector::const_iterator i, j;
173 EdgeVector::const_iterator pfrom = find(
myAll.begin(),
myAll.end(), from);
174 while (*pfrom != to) {
177 EdgeVector::const_iterator pto = find(
myAll.begin(),
myAll.end(), to);
178 while (*pto != from) {
191 EdgeVector::const_iterator pfrom = find(
myAll.begin(),
myAll.end(), from);
192 while (*pfrom != to) {
195 EdgeVector::const_iterator pto = find(
myAll.begin(),
myAll.end(), to);
196 while (*pto != from) {
212 if (to1 == 0 || to2 == 0) {
218 if (idx1 < 0 || idx2 < 0) {
227 myDone[idx1][idx2] =
true;
228 myDone[idx2][idx1] =
true;
252 if (from1p > from2p) {
256 if (from2p > from1p) {
284 EdgeVector::const_iterator c1 = find(
myAll.begin(),
myAll.end(), from1);
287 while (*c1 != from1 && *c1 != from2) {
300 EdgeVector::const_iterator c2 = find(
myAll.begin(),
myAll.end(), from2);
303 while (*c2 != from2 && *c2 != from1) {
320 EdgeVector::const_iterator p = find(
myAll.begin(),
myAll.end(), from);
324 if (p ==
myAll.begin()) {
336 EdgeVector::const_iterator i;
338 unsigned int noLanes = (*i)->getNumLanes();
339 for (
unsigned int k = 0; k < noLanes; k++) {
350 unsigned int noLanesEdge1 = (*i11)->getNumLanes();
351 for (
unsigned int j1 = 0; j1 < noLanesEdge1; j1++) {
352 std::vector<NBEdge::Connection> el1 = (*i11)->getConnectionsFromLane(j1);
353 for (std::vector<NBEdge::Connection>::iterator i12 = el1.begin(); i12 != el1.end(); ++i12) {
354 int idx1 =
getIndex((*i11), (*i12).toEdge);
360 unsigned int noLanesEdge2 = (*i21)->getNumLanes();
361 for (
unsigned int j2 = 0; j2 < noLanesEdge2; j2++) {
362 std::vector<NBEdge::Connection> el2 = (*i21)->getConnectionsFromLane(j2);
363 for (std::vector<NBEdge::Connection>::iterator i22 = el2.begin(); i22 != el2.end(); i22++) {
364 int idx2 =
getIndex((*i21), (*i22).toEdge);
370 if ((*i11) == (*i21)) {
377 if (((*i12).tlID ==
"" && (*i22).tlID ==
"")
379 ((*i12).tlID !=
"" && (*i22).tlID !=
"")) {
385 if (!
foes(*i11, (*i12).toEdge, *i21, (*i22).toEdge)) {
390 if ((*i12).tlID !=
"") {
406 std::pair<unsigned int, unsigned int>
408 unsigned int noLanes = 0;
409 unsigned int noLinks = 0;
410 for (EdgeVector::const_iterator i =
myIncoming.begin();
412 unsigned int noLanesEdge = (*i)->getNumLanes();
413 for (
unsigned int j = 0; j < noLanesEdge; j++) {
414 unsigned int numConnections = (
unsigned int)(*i)->getConnectionsFromLane(j).size();
415 noLinks += numConnections;
416 if (numConnections > 0) {
421 return std::make_pair(noLanes, noLinks);
427 const NBEdge*
const from2,
const NBEdge*
const to2)
const {
429 if (to1 == 0 || to2 == 0) {
435 if (idx1 < 0 || idx2 < 0) {
446 const NBEdge*
const possProhibitedFrom,
const NBEdge*
const possProhibitedTo,
447 bool regardNonSignalisedLowerPriority)
const {
449 if (possProhibitorTo == 0 || possProhibitedTo == 0) {
453 int possProhibitorIdx =
getIndex(possProhibitorFrom, possProhibitorTo);
454 int possProhibitedIdx =
getIndex(possProhibitedFrom, possProhibitedTo);
455 if (possProhibitorIdx < 0 || possProhibitedIdx < 0) {
461 if (!regardNonSignalisedLowerPriority) {
462 return myForbids[possProhibitorIdx][possProhibitedIdx];
465 if (!
myForbids[possProhibitorIdx][possProhibitedIdx]) {
478 int fromLane,
int pos,
const bool checkLaneFoes)
const {
480 for (std::vector<NBEdge::Connection>::iterator j = connected.begin(); j != connected.end(); j++) {
481 assert((*j).toEdge != 0);
497 int fromLane,
int toLane,
bool mayDefinitelyPass,
const bool checkLaneFoes)
const {
505 unsigned int noLanes = (*i)->getNumLanes();
506 for (
int j = noLanes; j-- > 0;) {
507 std::vector<NBEdge::Connection> connected = (*i)->getConnectionsFromLane(j);
508 int size = (
int) connected.size();
509 for (
int k = size; k-- > 0;) {
510 if (mayDefinitelyPass) {
512 }
else if ((*i) == from && fromLane == j) {
516 assert(k < (
int) connected.size());
518 assert(connected[k].toEdge != 0);
522 (!checkLaneFoes ||
laneConflict(from, to, toLane, *i, connected[k].toEdge, connected[k].toLane)))
523 ||
rightTurnConflict(from, to, fromLane, *i, connected[k].toEdge, connected[k].fromLane)) {
543 for (EdgeVector::const_reverse_iterator i =
myIncoming.rbegin();
546 unsigned int noLanes = (*i)->getNumLanes();
547 for (
unsigned int j = noLanes; j-- > 0;) {
548 std::vector<NBEdge::Connection> connected = (*i)->getConnectionsFromLane(j);
549 int size = (
int) connected.size();
550 for (
int k = size; k-- > 0;) {
551 if ((
foes(from, to, (*i), connected[k].toEdge) &&
552 (!checkLaneFoes ||
laneConflict(from, to, toLane, *i, connected[k].toEdge, connected[k].toLane)))
553 ||
rightTurnConflict(from, to, fromLane, *i, connected[k].toEdge, connected[k].fromLane)) {
567 const NBEdge* prohibitorFrom,
const NBEdge* prohibitorTo,
int prohibitorToLane)
const {
568 if (to != prohibitorTo) {
583 return rightOfProhibitor ? toLane >= prohibitorToLane : toLane <= prohibitorToLane;
589 const NBEdge* prohibitorFrom,
const NBEdge* prohibitorTo,
int prohibitorFromLane)
const {
590 if (from != prohibitorFrom) {
598 if ((!lefthand && fromLane <= prohibitorFromLane) ||
599 (lefthand && fromLane >= prohibitorFromLane)) {
625 for (
size_t i = 0; i < variations; i++) {
627 for (
size_t j = 0; j < variations; j++) {
667 const NBEdge*
const possProhibitedFrom,
const NBEdge*
const possProhibitedTo)
const {
669 int idx1 =
getIndex(possProhibitorFrom, possProhibitorTo);
670 int idx2 =
getIndex(possProhibitedFrom, possProhibitedTo);
687 std::map<NBEdge*, size_t> incomingCount;
689 std::map<NBEdge*, std::set<int> > approachedLanes;
691 std::map<NBEdge*, EdgeVector> incomingEdges;
693 const std::vector<NBEdge::Connection> connections = (*it_e)->getConnections();
694 for (std::vector<NBEdge::Connection>::const_iterator it_c = connections.begin(); it_c != connections.end(); ++it_c) {
695 incomingCount[it_c->toEdge]++;
696 approachedLanes[it_c->toEdge].insert(it_c->toLane);
697 incomingEdges[it_c->toEdge].push_back(*it_e);
700 for (std::map<NBEdge*, size_t>::iterator it = incomingCount.begin(); it != incomingCount.end(); ++it) {
703 if (approachedLanes[to].size() >= it->second) {
706 for (EdgeVector::iterator it_e1 = incoming.begin(); it_e1 != incoming.end(); ++it_e1) {
707 for (EdgeVector::iterator it_e2 = incoming.begin(); it_e2 != incoming.end(); ++it_e2) {
int getIndex(const NBEdge *const from, const NBEdge *const to) const
Returns the index to the internal combination container for the given edge combination.
OutputDevice & writeAttr(const SumoXMLAttr attr, const T &val)
writes a named attribute
bool check(const NBEdgeCont &ec)
checks whether the edges are still valid
static SUMOReal getCWAngleDiff(SUMOReal angle1, SUMOReal angle2)
Returns the distance of second angle from first angle clockwise.
void computeLeftOutgoingLinkCrossings(bool leftHanded, NBEdge *from, NBEdge *to)
std::vector< bool > LinkInfoCont
NBRequest(const NBEdgeCont &ec, NBNode *junction, const EdgeVector &all, const EdgeVector &incoming, const EdgeVector &outgoing, const NBConnectionProhibits &loadedProhibits)
std::ostream & operator<<(std::ostream &os, const NBRequest &r)
bool forbids(const NBEdge *const possProhibitorFrom, const NBEdge *const possProhibitorTo, const NBEdge *const possProhibitedFrom, const NBEdge *const possProhibitedTo, bool regardNonSignalisedLowerPriority) const
Returns the information whether "prohibited" flow must let "prohibitor" flow pass.
SUMOReal getEndAngle() const
Returns the angle at the end of the edge The angle is computed in computeAngle()
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
The representation of a single edge during network building.
NBNode * myJunction
the node the request is assigned to
const EdgeVector & myOutgoing
static void nextCW(const EdgeVector &edges, EdgeVector::const_iterator &from)
bool isTurningDirectionAt(const NBNode *n, const NBEdge *const edge) const
Returns whether the given edge is the opposite direction to this edge.
void writeLogic(std::string key, OutputDevice &into, const bool checkLaneFoes) const
std::vector< Connection > getConnectionsFromLane(unsigned int lane) const
Returns connections from a given lane.
NBEdge * getFrom() const
returns the from-edge (start of the connection)
std::string getResponseString(const NBEdge *const from, const NBEdge *const to, int fromLane, int toLane, bool mayDefinitelyPass, const bool checkLaneFoes) const
Writes the response of a certain link.
#define WRITE_WARNING(msg)
size_t distanceCounterClockwise(NBEdge *from, NBEdge *to)
const EdgeVector & myIncoming
static OptionsCont & getOptions()
Retrieves the options.
static void reportWarnings()
reports warnings if any occured
const std::string & getID() const
Returns the id.
bool rightTurnConflict(const NBEdge *from, const NBEdge *to, int fromLane, const NBEdge *prohibitorFrom, const NBEdge *prohibitorTo, int prohibitorFromLane) const
return whether the given laneToLane connection is a right turn which must yield to pedestrian or bicy...
void buildBitfieldLogic(bool leftHanded)
bool mustBrake(const NBEdge *const possProhibitorFrom, const NBEdge *const possProhibitorTo, const NBEdge *const possProhibitedFrom, const NBEdge *const possProhibitedTo) const
Returns the information whether "prohibited" flow must let "prohibitor" flow pass.
bool laneConflict(const NBEdge *from, const NBEdge *to, int toLane, const NBEdge *prohibitorFrom, const NBEdge *prohibitorTo, int prohibitorToLane) const
return whether the given laneToLane connections prohibit each other under the assumption that the edg...
SumoXMLNodeType getType() const
Returns the type of this node.
Information within the junction logic which internal lanes block external.
Storage for edges, including some functionality operating on multiple edges.
std::string getFoesString(NBEdge *from, NBEdge *to, int fromLane, int toLane, const bool checkLaneFoes) const
std::string toString(const T &t, std::streamsize accuracy=OUTPUT_ACCURACY)
std::vector< NBConnection > NBConnectionVector
Definition of a connection vector.
int getJunctionPriority(const NBNode *const node) const
Returns the junction priority (normalised for the node currently build)
void setBlocking(bool leftHanded, NBEdge *from1, NBEdge *to1, NBEdge *from2, NBEdge *to2)
NBNode * getToNode() const
Returns the destination node of the edge.
std::map< NBConnection, NBConnectionVector > NBConnectionProhibits
Definition of a container for connection block dependencies Includes a list of all connections which ...
int writeLaneResponse(OutputDevice &od, NBEdge *from, int lane, int pos, const bool checkLaneFoes) const
writes the response of a certain lane Returns the next link index within the junction ...
std::vector< NBEdge * > EdgeVector
NBEdge * getTo() const
returns the to-edge (end of the connection)
Represents a single node (junction) during network building.
bool hasSignalisedConnectionTo(const NBEdge *const e) const
bool foes(const NBEdge *const from1, const NBEdge *const to1, const NBEdge *const from2, const NBEdge *const to2) const
Returns the information whether the given flows cross.
Static storage of an output device and its base (abstract) implementation.
bool closeTag()
Closes the most recently opened tag.
static size_t myGoodBuilds
static SUMOReal relAngle(SUMOReal angle1, SUMOReal angle2)
SUMOReal getStartAngle() const
Returns the angle at the start of the edge The angle is computed in computeAngle() ...
Information whether the detector shall be continued on the folowing lanes.
void resetCooperating()
reset foes it the number of lanes matches (or exceeds) the number of incoming connections for an edge...
static void nextCCW(const EdgeVector &edges, EdgeVector::const_iterator &from)
CombinationsCont myForbids
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
std::pair< unsigned int, unsigned int > getSizes() const
returns the number of the junction's lanes and the number of the junction's links in respect...
void computeRightOutgoingLinkCrossings(bool leftHanded, NBEdge *from, NBEdge *to)
SUMOReal getAngleAtNode(const NBNode *const node) const
Returns the angle of the edge's geometry at the given node.
NBNode * getFromNode() const
Returns the origin node of the edge.