100 for (
const auto& links : signal->
getLinks()) {
101 for (
const MSLink* link : links) {
117 std::set<const SUMOVehicle*> seen;
118 std::vector<WaitRelation> list;
120 std::vector<MSRailSignalConstraint*> constraints;
121 std::vector<const SUMOVehicle*> constraintBlocked;
122 std::vector<const MSRailSignal*> constraintSignals;
124 while (seen.count(cur) == 0) {
127 if (it->second.constraint !=
nullptr) {
128 constraints.push_back(it->second.constraint);
129 constraintBlocked.push_back(cur);
130 constraintSignals.push_back(it->second.railSignal);
133 list.push_back(it->second);
134 cur = it->second.foe;
146 if (!constraints.empty() && oc.
getBool(
"time-to-teleport.remove-constraint")) {
147 resolved = constraints.front();
149 std::vector<std::string> vehicles;
150 for (
auto item : list) {
151 vehicles.push_back(item.foe->getID());
155 resolvedUnblocked = constraintBlocked.front();
156 resolvedSignal = constraintSignals.front();
160 if (oc.
isSet(
"deadlock-output")) {
163 std::vector<std::string> signals;
164 std::vector<std::string> vehicles;
165 std::vector<std::string> tripIDs;
166 for (
auto item : list) {
167 signals.push_back(item.railSignal ==
nullptr ?
"INSERTION" : item.railSignal->getID());
168 vehicles.push_back(item.foe->getID());
169 tripIDs.push_back(item.foe->getParameter().getParameter(
"tripId", item.foe->getID()));
172 if (constraints.empty()) {
175 od.
openTag(
"constraintDeadlock");
180 if (!constraints.empty()) {
183 if (resolved !=
nullptr) {
184 od.
openTag(
"resolvedConstraint");
193 return resolved ==
nullptr;
204 WRITE_WARNING(
"Deadlocks should be loaded before any vehicles");
206 const int n = (int)signals.size();
207 for (
int i = 0; i < n; i++) {
208 std::vector<const MSRailSignal*> others;
209 for (
int j = 0; j < n; j++) {
210 others.push_back(signals[(i + j + 1) % n]);
230 const std::vector<const MSRailSignal*>& others = itDL->second;
232 std::vector<const MSDriveWay*> deadlockFoes;
239#ifdef DEBUG_BUILD_DEADLOCK_CHECK
242 int circleIndex = (int)deadlockFoes.size();
243 if (circleIndex < (
int)others.size()) {
245 deadlockFoes.push_back(dw);
248 if (foe->getForward().back()->getEdge().getToJunction()->getID() == other->
getID()) {
254#ifdef DEBUG_BUILD_DEADLOCK_CHECK
255 std::cout <<
" add deadlock check foes=" <<
toString(deadlockFoes) <<
"\n";;
258 if (dldw->isDepartDriveway()) {
259 const_cast<MSDriveWay*
>(dldw)->addDWDeadlock(deadlockFoes);
262 if (!pred->isDepartDriveway()) {
264 if (std::find(others.begin(), others.end(), predRS) != others.end()) {
270 const_cast<MSDriveWay*
>(pred)->addDWDeadlock(deadlockFoes);
282 assert(rs !=
nullptr);
#define WRITE_WARNINGF(...)
#define WRITE_WARNING(msg)
std::string time2string(SUMOTime t, bool humanReadable)
convert SUMOTime to string (independently of global format setting)
const SVCPermissions SVC_UNSPECIFIED
permissions not specified
bool isRailwayOrShared(SVCPermissions permissions)
Returns whether an edge with the given permissions is a railway edge or a shared road/rail edge.
long long int SVCPermissions
bitset where each bit declares whether a certain SVC may use this edge/lane
const long long int VEHPARS_FORCE_REROUTE
@ SUMO_TAG_DEADLOCK
Saved deadlock information, also for loading as an extra check.
@ SUMO_ATTR_TIME
trigger: the time of the step
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
static bool haveDriveWays()
SVCPermissions getPermissions() const
Returns the combined permissions of all lanes of this edge.
SumoXMLEdgeFunc getFunction() const
Returns the edge type (SumoXMLEdgeFunc)
const MSTrafficLightLogic * getTLLogic() const
Returns the TLS index.
VehicleState
Definition of a vehicle state.
@ BUILT
The vehicle was built, but has not yet departed.
@ NEWROUTE
The vehicle got a new route.
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
void addVehicleStateListener(VehicleStateListener *listener)
Adds a vehicle states listener.
A base class for constraints.
virtual void setActive(bool active)=0
virtual void write(OutputDevice &out, const std::string &tripId) const =0
void notifyApproach(const MSLink *link)
switch rail signal to active
void addSignal(MSRailSignal *signal)
void vehicleStateChanged(const SUMOVehicle *const vehicle, MSNet::VehicleState to, const std::string &info="")
Called if a vehicle changes its state.
std::map< const MSDriveWay *, std::set< const MSDriveWay * > > myDriveWaySucc
void addDeadlockCheck(std::vector< const MSRailSignal * > signals)
void addDrivewayFollower(const MSDriveWay *dw, const MSDriveWay *dw2)
std::vector< MSRailSignal * > mySignals
list of all rail signals
std::map< const MSRailSignal *, std::vector< const MSRailSignal * > > myDeadlockChecks
MSRailSignalControl()
Constructor.
void addWaitRelation(const SUMOVehicle *waits, const MSRailSignal *rs, const SUMOVehicle *reason, MSRailSignalConstraint *constraint=nullptr)
static MSRailSignalControl * myInstance
std::map< const SUMOVehicle *, WaitRelation > myWaitRelations
void addDWDeadlockChecks(const MSRailSignal *rs, MSDriveWay *dw)
check whether the given signal and driveway are part of a deadlock circle
static MSRailSignalControl & getInstance()
std::map< const MSDriveWay *, std::set< const MSDriveWay * > > myDriveWayPred
const std::map< const MSRailSignal *, std::vector< const MSRailSignal * > > & getDeadlockChecks() const
static SVCPermissions mySignalizedClasses
signalized classes
bool haveDeadlock(const SUMOVehicle *veh) const
whether there is a circle in the waiting-for relationships that contains the given vehicle
std::set< std::set< const SUMOVehicle * > > myWrittenDeadlocks
void updateSignals(SUMOTime t)
update active rail signals
std::set< MSRailSignal *, ComparatorNumericalIdLess > myActiveSignals
std::map< std::pair< int, int >, bool > myDriveWayCompatibility
static void clearState()
Perform resets events when quick-loading state.
static SVCPermissions myMBClasses
void findDeadlockFoes(const MSDriveWay *dw, const std::vector< const MSRailSignal * > &others, std::vector< const MSDriveWay * > deadlockFoes)
bool updateCurrentPhase()
returns the state of the signal that actually required
static void initDriveWays(const SUMOVehicle *ego, bool update)
const LinkVectorVector & getLinks() const
Returns the list of lists of all affected links.
bool isActive() const
whether this logic is the active program
bool setTrafficLightSignals(SUMOTime t) const
Applies the current signal states to controlled links.
const std::string & getID() const
Returns the id.
A storage for options typed value containers)
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
static OptionsCont & getOptions()
Retrieves the options.
Static storage of an output device and its base (abstract) implementation.
OutputDevice & writeAttr(const SumoXMLAttr attr, const T &val)
writes a named attribute
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
static OutputDevice & getDeviceByOption(const std::string &name)
Returns the device described by the option.
bool closeTag(const std::string &comment="")
Closes the most recently opened tag and optionally adds a comment.
virtual const std::string getParameter(const std::string &key, const std::string defaultValue="") const
Returns the value for a given key.
virtual const SUMOVehicleParameter & getParameter() const =0
Returns the vehicle's parameter (including departure definition)
virtual const MSEdge * getEdge() const =0
Returns the edge the object is currently at.
Representation of a vehicle.
virtual bool isRail() const =0
virtual bool hasValidRoute(std::string &msg, ConstMSRoutePtr route=0) const =0
Validates the current or given route.
bool wasSet(long long int what) const
Returns whether the given parameter was set.
#define UNUSED_PARAMETER(x)