110 std::set<const SUMOVehicle*> seen;
111 std::vector<WaitRelation> list;
113 std::vector<MSRailSignalConstraint*> constraints;
114 std::vector<const SUMOVehicle*> constraintBlocked;
115 std::vector<const MSRailSignal*> constraintSignals;
117 while (seen.count(cur) == 0) {
120 if (it->second.constraint !=
nullptr) {
121 constraints.push_back(it->second.constraint);
122 constraintBlocked.push_back(cur);
123 constraintSignals.push_back(it->second.railSignal);
126 list.push_back(it->second);
127 cur = it->second.foe;
139 if (!constraints.empty() && oc.
getBool(
"time-to-teleport.remove-constraint")) {
140 resolved = constraints.front();
142 std::vector<std::string> vehicles;
143 for (
auto item : list) {
144 vehicles.push_back(item.foe->getID());
148 resolvedUnblocked = constraintBlocked.front();
149 resolvedSignal = constraintSignals.front();
153 if (oc.
isSet(
"deadlock-output")) {
156 std::vector<std::string> signals;
157 std::vector<std::string> vehicles;
158 std::vector<std::string> tripIDs;
159 for (
auto item : list) {
160 signals.push_back(item.railSignal ==
nullptr ?
"INSERTION" : item.railSignal->getID());
161 vehicles.push_back(item.foe->getID());
162 tripIDs.push_back(item.foe->getParameter().getParameter(
"tripId", item.foe->getID()));
165 if (constraints.empty()) {
168 od.
openTag(
"constraintDeadlock");
173 if (!constraints.empty()) {
176 if (resolved !=
nullptr) {
177 od.
openTag(
"resolvedConstraint");
186 return resolved ==
nullptr;
197 WRITE_WARNING(
"Deadlocks should be loaded before any vehicles");
199 const int n = (int)signals.size();
200 for (
int i = 0; i < n; i++) {
201 std::vector<const MSRailSignal*> others;
202 for (
int j = 0; j < n; j++) {
203 others.push_back(signals[(i + j + 1) % n]);
223 const std::vector<const MSRailSignal*>& others = itDL->second;
225 std::vector<const MSDriveWay*> deadlockFoes;
232#ifdef DEBUG_BUILD_DEADLOCK_CHECK
235 int circleIndex = (int)deadlockFoes.size();
236 if (circleIndex < (
int)others.size()) {
238 deadlockFoes.push_back(dw);
241 if (foe->getForward().back()->getEdge().getToJunction()->getID() == other->
getID()) {
247#ifdef DEBUG_BUILD_DEADLOCK_CHECK
248 std::cout <<
" add deadlock check foes=" <<
toString(deadlockFoes) <<
"\n";;
251 if (dldw->isDepartDriveway()) {
252 const_cast<MSDriveWay*
>(dldw)->addDWDeadlock(deadlockFoes);
255 if (!pred->isDepartDriveway()) {
257 if (std::find(others.begin(), others.end(), predRS) != others.end()) {
263 const_cast<MSDriveWay*
>(pred)->addDWDeadlock(deadlockFoes);
275 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)
bool isRailway(SVCPermissions permissions)
Returns whether an edge with the given permissions is a railway edge.
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
#define UNUSED_PARAMETER(x)
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
static bool haveDriveWays()
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
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.
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)
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 SUMOVehicleClass getVClass() const =0
Returns the object's access class.
virtual const MSEdge * getEdge() const =0
Returns the edge the object is currently at.
Representation of a vehicle.
virtual bool hasDeparted() const =0
Returns whether this vehicle has departed.
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.