Eclipse SUMO - Simulation of Urban MObility
MSDispatch_TraCI.cpp
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3 // Copyright (C) 2007-2024 German Aerospace Center (DLR) and others.
4 // This program and the accompanying materials are made available under the
5 // terms of the Eclipse Public License 2.0 which is available at
6 // https://www.eclipse.org/legal/epl-2.0/
7 // This Source Code may also be made available under the following Secondary
8 // Licenses when the conditions for such availability set forth in the Eclipse
9 // Public License 2.0 are satisfied: GNU General Public License, version 2
10 // or later which is available at
11 // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12 // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13 /****************************************************************************/
18 // An algorithm that performs dispatch for the taxi device
19 /****************************************************************************/
20 #include <config.h>
21 
22 #include <limits>
24 #include "MSDispatch_TraCI.h"
25 
26 //#define DEBUG_RESERVATION
27 //#define DEBUG_DISPATCH
28 //#define DEBUG_SERVABLE
29 //#define DEBUG_TRAVELTIME
30 //#define DEBUG_DETOUR
31 //#define DEBUG_COND2(obj) (obj->getID() == "p0")
32 #define DEBUG_COND2(obj) (true)
33 
34 // ===========================================================================
35 // MSDispatch_TraCI methods
36 // ===========================================================================
37 
40  SUMOTime reservationTime,
41  SUMOTime pickupTime,
42  SUMOTime earliestPickupTime,
43  const MSEdge* from, double fromPos,
44  const MSStoppingPlace* fromStop,
45  const MSEdge* to, double toPos,
46  const MSStoppingPlace* toStop,
47  std::string group,
48  const std::string& line,
49  int maxCapacity,
50  int maxContainerCapacity) {
51  Reservation* res = MSDispatch::addReservation(person, reservationTime, pickupTime, earliestPickupTime, from, fromPos, fromStop, to, toPos, toStop, group, line, maxCapacity, maxContainerCapacity);
52  if (!myReservationLookup.has(res)) {
53  myReservationLookup.insert(res->id, res);
54  }
55  return res;
56 }
57 
58 std::string
60  const MSEdge* from, double fromPos,
61  const MSEdge* to, double toPos,
62  std::string group) {
63  const std::string removedID = MSDispatch::removeReservation(person, from, fromPos, to, toPos, group);
64  if (myReservationLookup.hasString(removedID)) {
65  // warning! res is already deleted
66  const Reservation* res = myReservationLookup.get(removedID);
67  myReservationLookup.remove(removedID, res);
68  }
69  return removedID;
70 }
71 
72 
73 void
75  myReservationLookup.remove(res->id, res);
77 }
78 
79 void
80 MSDispatch_TraCI::interpretDispatch(MSDevice_Taxi* taxi, const std::vector<std::string>& reservationsIDs) {
81  std::vector<const Reservation*> reservations;
82  for (std::string resID : reservationsIDs) {
83  if (myReservationLookup.hasString(resID)) {
84  reservations.push_back(myReservationLookup.get(resID));
85  } else {
86  throw InvalidArgument("Reservation id '" + resID + "' is not known");
87  }
88  }
89  try {
90  if (reservations.size() == 1) {
91  taxi->dispatch(*reservations.front());
92  } else {
93  taxi->dispatchShared(reservations);
94  }
95  } catch (ProcessError& e) {
96  throw InvalidArgument(e.what());
97  }
98  // in case of ride sharing the same reservation may occur multiple times
99  std::set<const Reservation*> unique(reservations.begin(), reservations.end());
100  for (const Reservation* res : unique) {
101  servedReservation(res);
102  }
103 }
104 
105 
106 std::string
107 MSDispatch_TraCI::splitReservation(std::string resID, std::vector<std::string> personIDs) {
108  if (myReservationLookup.hasString(resID)) {
109  Reservation* res = const_cast<Reservation*>(myReservationLookup.get(resID));
110  if (myRunningReservations.count(res) != 0) {
111  throw InvalidArgument("Cannot split reservation '" + resID + "' after dispatch");
112  }
113  std::set<std::string> allPersons;
114  for (const MSTransportable* t : res->persons) {
115  allPersons.insert(t->getID());
116  }
117  for (std::string p : personIDs) {
118  if (allPersons.count(p) == 0) {
119  throw InvalidArgument("Person '" + p + "' is not part of reservation '" + resID + "'");
120  }
121  }
122  if (personIDs.size() == allPersons.size()) {
123  throw InvalidArgument("Cannot remove all person from reservation '" + resID + "'");
124  }
125  std::vector<const MSTransportable*> split;
126  for (const std::string& p : personIDs) {
127  for (const MSTransportable* const t : res->persons) {
128  if (t->getID() == p) {
129  res->persons.erase(t);
130  split.push_back(t);
131  break;
132  }
133  }
134  }
136  res->reservationTime, res->pickupTime,
137  res->earliestPickupTime,
138  res->from, res->fromPos, res->fromStop,
139  res->to, res->toPos, res->toStop,
140  res->group, res->line);
141  myGroupReservations[res->group].push_back(newRes);
142  myReservationLookup.insert(newRes->id, newRes);
143  return newRes->id;
144  } else {
145  throw InvalidArgument("Reservation id '" + resID + "' is not known");
146  }
147 }
148 
149 
150 
151 //
152 /****************************************************************************/
long long int SUMOTime
Definition: GUI.h:35
std::vector< std::string > & split(const std::string &s, char delim, std::vector< std::string > &elems)
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition: ToString.h:46
A device which collects info on the vehicle trip (mainly on departure and arrival)
Definition: MSDevice_Taxi.h:49
void dispatch(const Reservation &res)
service the given reservation
void dispatchShared(std::vector< const Reservation * > reservations)
service the given reservations
void fulfilledReservation(const Reservation *res) override
erase reservation from storage
std::string splitReservation(std::string resID, std::vector< std::string > personIDs)
split existing reservations and return the new reservation id
StringBijection< const Reservation * > myReservationLookup
Reservation * addReservation(MSTransportable *person, SUMOTime reservationTime, SUMOTime pickupTime, SUMOTime earliestPickupTime, const MSEdge *from, double fromPos, const MSStoppingPlace *fromStop, const MSEdge *to, double toPos, const MSStoppingPlace *toStop, std::string group, const std::string &line, int maxCapacity, int maxContainerCapacity) override
add a new reservation
void interpretDispatch(MSDevice_Taxi *taxi, const std::vector< std::string > &reservationsIDs)
trigger taxi dispatch.
std::string removeReservation(MSTransportable *person, const MSEdge *from, double fromPos, const MSEdge *to, double toPos, std::string group) override
remove person from reservation. If the whole reservation is removed, return its id
virtual std::string removeReservation(MSTransportable *person, const MSEdge *from, double fromPos, const MSEdge *to, double toPos, std::string group)
remove person from reservation. If the whole reservation is removed, return its id
Definition: MSDispatch.cpp:137
std::map< std::string, std::vector< Reservation * > > myGroupReservations
Definition: MSDispatch.h:206
virtual Reservation * addReservation(MSTransportable *person, SUMOTime reservationTime, SUMOTime pickupTime, SUMOTime earliestPickupTime, const MSEdge *from, double fromPos, const MSStoppingPlace *fromStop, const MSEdge *to, double toPos, const MSStoppingPlace *tostop, std::string group, const std::string &line, int maxCapacity, int maxContainerCapacity)
add a new reservation
Definition: MSDispatch.cpp:70
int myReservationCount
Definition: MSDispatch.h:205
virtual void fulfilledReservation(const Reservation *res)
erase reservation from storage
Definition: MSDispatch.cpp:264
void servedReservation(const Reservation *res)
Definition: MSDispatch.cpp:242
std::set< const Reservation * > myRunningReservations
Definition: MSDispatch.h:200
A road/street connecting two junctions.
Definition: MSEdge.h:77
A lane area vehicles can halt at.
const std::string & getID() const
Returns the id.
Definition: Named.h:74
void remove(const std::string str, const T key)
bool has(const T key) const
bool hasString(const std::string &str) const
T get(const std::string &str) const
void insert(const std::string str, const T key, bool checkDuplicates=true)
const MSStoppingPlace * toStop
Definition: MSDispatch.h:86
SUMOTime pickupTime
Definition: MSDispatch.h:79
const MSStoppingPlace * fromStop
Definition: MSDispatch.h:83
std::string id
Definition: MSDispatch.h:76
const MSEdge * to
Definition: MSDispatch.h:84
double fromPos
Definition: MSDispatch.h:82
std::string line
Definition: MSDispatch.h:88
const MSEdge * from
Definition: MSDispatch.h:81
SUMOTime reservationTime
Definition: MSDispatch.h:78
std::string group
Definition: MSDispatch.h:87
SUMOTime earliestPickupTime
Definition: MSDispatch.h:80
std::set< const MSTransportable * > persons
Definition: MSDispatch.h:77
double toPos
Definition: MSDispatch.h:85