64 const std::string& vTypes,
65 const double departPos,
const std::string& stopOrigin,
66 const double arrivalPos,
const std::string& busStop,
67 double walkFactor,
const std::string& group) {
68 PersonTrip* trip =
new PersonTrip(from, to, modeSet, departPos, stopOrigin, arrivalPos, busStop, walkFactor, group);
81 if (type ==
nullptr) {
83 throw InvalidArgument(
"The vehicle type '" + pars.
vtypeid +
"' in a trip for person '" +
id +
"' is not known.");
100 pars.
id =
id +
"_b0";
112 plan.push_back(trip);
118 double arrivalPos,
const std::string& destStop,
const std::string& group) {
120 plan.back()->addTripItem(
new Ride(-1, from, to, lines, group, -1., arrivalPos, -1., destStop));
125ROPerson::addWalk(std::vector<PlanItem*>& plan,
const ConstROEdgeVector& edges,
const double duration,
const double speed,
const double departPos,
const double arrivalPos,
const std::string& busStop) {
126 if (plan.empty() || plan.back()->isStop()) {
127 plan.push_back(
new PersonTrip(edges.back(), busStop));
129 plan.back()->addTripItem(
new Walk(-1, edges, -1., duration, speed, departPos, arrivalPos, busStop));
135 plan.push_back(
new Stop(stopPar, stopEdge));
142 std::string comment =
"";
143 if ((extended || options.
getBool(
"write-costs")) &&
myCost >= 0.) {
146 if (
from !=
nullptr) {
157 comment =
" <!-- " + name +
" -->";
159 }
else if (
arrPos != 0 &&
arrPos != std::numeric_limits<double>::infinity()) {
175 if (options.
getBool(
"exit-times")) {
188 stopDesc.write(os,
false);
189 std::string comment =
"";
190 for (std::string sID : stopDesc.getStoppingPlaceIDs()) {
193 comment += name +
" ";
197 comment =
" <!-- " + comment +
" -->";
199 stopDesc.writeParams(os);
206 std::string comment =
"";
207 if ((extended || options.
getBool(
"write-costs")) && myCost >= 0.) {
217 if (options.
getBool(
"exit-times")) {
220 if (!exitTimes.empty()) {
224 if (options.
getBool(
"route-length")) {
226 for (
const ROEdge* roe : edges) {
227 length += roe->getLength();
231 if (destStop !=
"") {
236 comment =
" <!-- " + name +
" -->";
238 }
else if (arr != 0 && arr != std::numeric_limits<double>::infinity()) {
246 PersonTrip* result =
new PersonTrip(from, to, modes, dep, stopOrigin, arr, stopDest, walkFactor, group);
247 for (
auto* item : myTripItems) {
257 veh->
saveAsXML(os, typeos, asAlternatives, options);
264 if ((asTrip || extended) && from !=
nullptr) {
265 const bool writeGeoTrip = asTrip && options.
getBool(
"write-trips.geo");
268 Position fromPos = from->getLanes()[0]->getShape().positionAtOffset2D(getDepartPos());
281 Position toPos = to->getLanes()[0]->getShape().positionAtOffset2D(
MIN2(getArrivalPos(), to->getLanes()[0]->getShape().length2D()));
293 std::vector<std::string> allowedModes;
295 allowedModes.push_back(
"public");
298 allowedModes.push_back(
"car");
301 allowedModes.push_back(
"taxi");
304 allowedModes.push_back(
"bicycle");
306 if (allowedModes.size() > 0) {
310 if (dep != 0 && dep != std::numeric_limits<double>::infinity()) {
313 if (arr != 0 && arr != std::numeric_limits<double>::infinity()) {
317 if (getStopDest() !=
"") {
320 if (walkFactor != 1) {
323 if (extended && myTripItems.size() != 0) {
324 std::vector<double> costs;
325 for (
const TripItem*
const tripItem : myTripItems) {
326 costs.push_back(tripItem->getCost());
332 for (
const TripItem*
const it : myTripItems) {
333 it->saveAsXML(os, extended, options);
341 for (
TripItem* tItem : myTripItems) {
342 result += tItem->getDuration();
350 std::vector<TripItem*>& resultItems,
MsgHandler*
const errorHandler) {
352 std::vector<ROIntermodalRouter::TripItem> result;
357 bool carUsed =
false;
360 const int lastIndex = (int)result.size() - 1;
362 if (!item.edges.empty()) {
363 if (item.line ==
"") {
368 const ROEdge* first = item.edges.front();
377 const ROEdge* last = item.edges.back();
384 if (&item == &result.back() && trip->
getStopDest() ==
"") {
385 resultItems.push_back(
new Walk(start, item.edges, item.cost, item.exitTimes, depPos, arrPos));
387 resultItems.push_back(
new Walk(start, item.edges, item.cost, item.exitTimes, depPos, arrPos, item.destStop));
389 }
else if (veh !=
nullptr && item.line == veh->
getID()) {
390 double cost = item.cost;
396 }
else if (resultItems.empty()) {
401 double arrPos = index == lastIndex ? trip->
getArrivalPos(
false) : item.arrivalPos;
402 resultItems.push_back(
new Ride(start, item.edges.front(), item.edges.back(), veh->
getID(), trip->
getGroup(), cost, arrPos, item.length, item.destStop));
407 resultItems.push_back(
new Ride(start, origin,
nullptr, line, trip->
getGroup(), item.cost, item.arrivalPos, item.length, item.destStop, item.intended,
TIME2STEPS(item.depart)));
413 if (result.empty()) {
414 errorHandler->
inform(
"No route for trip in person '" +
getID() +
"'.");
427 if (it->needsRouting()) {
429 const std::vector<ROVehicle*>& vehicles = trip->
getVehicles();
430 std::vector<TripItem*> resultItems;
431 std::vector<TripItem*> best;
433 if (vehicles.empty()) {
436 double bestCost = std::numeric_limits<double>::infinity();
437 for (
const ROVehicle*
const v : vehicles) {
438 const bool carUsed =
computeIntermodal(time, provider, trip, v, resultItems, errorHandler);
440 for (
const TripItem*
const tripIt : resultItems) {
441 cost += tripIt->getCost();
443 if (cost < bestCost) {
445 bestVeh = carUsed ? v :
nullptr;
446 best.swap(resultItems);
448 for (
const TripItem*
const tripIt : resultItems) {
460 WRITE_WARNINGF(
"Person '%' is configured to use public transport but no schedules are loaded.",
getID());
464 time += it->getDuration();
480 const bool writeTrip = options.
exists(
"write-trips") && options.
getBool(
"write-trips");
484 it->saveVehicles(os, typeos, asAlternatives, options);
498 if (cloneIndex == 0) {
504 p.
write(os, options, tag);
508 it->saveAsXML(os, asAlternatives, writeTrip, options);
#define WRITE_WARNINGF(...)
std::vector< const ROEdge * > ConstROEdgeVector
SUMOTime string2time(const std::string &r)
convert string to SUMOTime
std::string time2string(SUMOTime t, bool humanReadable)
convert SUMOTime to string (independently of global format setting)
long long int SVCPermissions
bitset where each bit declares whether a certain SVC may use this edge/lane
const std::string DEFAULT_TAXITYPE_ID
const std::string DEFAULT_VTYPE_ID
@ SVC_PASSENGER
vehicle is a passenger car (a "normal" car)
@ SVC_BICYCLE
vehicle is a bicycle
@ SVC_TAXI
vehicle is a taxi
@ SVC_BUS
vehicle is a bus
const std::string DEFAULT_BIKETYPE_ID
@ GIVEN
The position is given.
const std::string LINE_ANY
const long long int VEHPARS_DEPARTPOS_SET
const long long int VEHPARS_VTYPE_SET
@ TRIGGERED
The departure is person triggered.
SumoXMLTag
Numbers representing SUMO-XML - element names.
@ SUMO_ATTR_EDGES
the edges of a route
int gPrecision
the precision for floating point outputs
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
static const GeoConvHelper & getFinal()
the coordinate transformation for writing the location element and for tracking the original coordina...
void cartesian2geo(Position &cartesian) const
Converts the given cartesian (shifted) position to its geo (lat/long) representation.
virtual void inform(std::string msg, bool addType=true)
adds a new error to the list
const std::string & getID() const
Returns the id.
A storage for options typed value containers)
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
bool exists(const std::string &name) const
Returns the information whether the named option is known.
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.
bool closeTag(const std::string &comment="")
Closes the most recently opened tag and optionally adds a comment.
void setPrecision(int precision=gPrecision)
Sets the precision or resets it to default.
void writeParams(OutputDevice &device) const
write Params in the given outputdevice
A point in 2D or 3D with translation and scaling methods.
A basic edge for routing applications.
bool isTazConnector() const
const ROEdgeVector & getPredecessors() const
Returns the edge at the given position from the list of incoming edges.
const ROEdgeVector & getSuccessors(SUMOVehicleClass vClass=SVC_IGNORING) const
Returns the following edges, restricted by vClass.
double getLength() const
Returns the length of the edge.
The router's network representation.
SUMOVTypeParameter * getVehicleTypeSecure(const std::string &id)
Retrieves the named vehicle type.
static RONet * getInstance()
Returns the pointer to the unique instance of RONet (singleton).
bool knowsVehicle(const std::string &id) const
returns whether a vehicle with the given id was already loaded
const std::string getStoppingPlaceElement(const std::string &id) const
return the element name for the given stopping place id
const std::string getStoppingPlaceName(const std::string &id) const
return the name for the given stopping place id
A planItem can be a Trip which contains multiple tripItems.
double getDepartPos(bool replaceDefault=true) const
void saveVehicles(OutputDevice &os, OutputDevice *const typeos, bool asAlternatives, OptionsCont &options) const
const std::string & getStopOrigin() const
SVCPermissions getModes() const
const std::string & getStopDest() const
double getWalkFactor() const
const ROEdge * getDestination() const
SUMOTime getDuration() const
return duration sum of all trip items
double getArrivalPos(bool replaceDefault=true) const
std::vector< ROVehicle * > & getVehicles()
const std::string & getGroup() const
void saveAsXML(OutputDevice &os, const bool extended, const bool asTrip, OptionsCont &options) const
const ROEdge * getOrigin() const
std::vector< TripItem * > myTripItems
the fully specified trips
void setItems(std::vector< TripItem * > &newItems, const ROVehicle *const veh)
void addVehicle(ROVehicle *veh)
void updateModes(SVCPermissions additionalModes)
Every person has a plan comprising of multiple planItems.
static const std::string UNDEFINED_STOPPING_PLACE
A ride is part of a trip, e.g., go from here to here by car or bus.
const std::string destStop
const std::string intended
void saveAsXML(OutputDevice &os, const bool extended, OptionsCont &options) const
A planItem can be a Stop.
void saveAsXML(OutputDevice &os, const bool extended, const bool asTrip, OptionsCont &options) const
A TripItem is part of a trip, e.g., go from here to here by car.
SUMOTime getStart() const
SUMOTime getDuration() const
A walk is part of a trip, e.g., go from here to here by foot.
void saveAsXML(OutputDevice &os, const bool extended, OptionsCont &options) const
static bool myHaveWarnedPTMissing
virtual ~ROPerson()
Destructor.
bool computeIntermodal(SUMOTime time, const RORouterProvider &provider, const PersonTrip *const trip, const ROVehicle *const veh, std::vector< TripItem * > &resultItems, MsgHandler *const errorHandler)
ROPerson(const SUMOVehicleParameter &pars, const SUMOVTypeParameter *type)
Constructor.
static void addTrip(std::vector< PlanItem * > &plan, const std::string &id, const ROEdge *const from, const ROEdge *const to, const SVCPermissions modeSet, const std::string &vTypes, const double departPos, const std::string &stopOrigin, const double arrivalPos, const std::string &busStop, double walkFactor, const std::string &group)
static void addStop(std::vector< PlanItem * > &plan, const SUMOVehicleParameter::Stop &stopPar, const ROEdge *const stopEdge)
static void addRide(std::vector< PlanItem * > &plan, const ROEdge *const from, const ROEdge *const to, const std::string &lines, double arrivalPos, const std::string &destStop, const std::string &group)
void computeRoute(const RORouterProvider &provider, const bool removeLoops, MsgHandler *errorHandler)
void saveAsXML(OutputDevice &os, OutputDevice *const typeos, bool asAlternatives, OptionsCont &options, int cloneIndex=0) const
Saves the complete person description.
static void addWalk(std::vector< PlanItem * > &plan, const ConstROEdgeVector &edges, const double duration, const double speed, const double departPos, const double arrivalPos, const std::string &busStop)
std::vector< PlanItem * > myPlan
The plan of the person.
A routable thing such as a vehicle or person.
SUMOVehicleClass getVClass() const
bool isPartOfFlow() const
bool myRoutingSuccess
Whether the last routing was successful.
const SUMOVTypeParameter * getType() const
Returns the type of the routable.
const std::string & getID() const
Returns the id of the routable.
const SUMOVehicleParameter & getParameter() const
Returns the definition of the vehicle / person parameter.
double getMaxSpeed() const
Returns the vehicle's maximum speed.
Base class for a vehicle's route definition.
void addLoadedAlternative(RORoute *alternative)
Adds a single alternative loaded from the file An alternative may also be generated during DUA.
A complete router's route.
void setProbability(double prob)
Sets the probability of the route.
A vehicle as used by router.
RORouteDef * getRouteDefinition() const
Returns the definition of the route the vehicle takes.
IntermodalRouter< E, L, N, V > & getIntermodalRouter() const
Structure representing possible vehicle parameter.
void write(OutputDevice &dev) const
Writes the vtype.
bool saved
Information whether this type was already saved (needed by routers)
SUMOVehicleClass vehicleClass
The vehicle's class.
Definition of vehicle stop (position and duration)
Structure representing possible vehicle parameter.
std::string vtypeid
The vehicle's type id.
long long int parametersSet
Information for the router which parameter were set, TraCI may modify this (when changing color)
void write(OutputDevice &dev, const OptionsCont &oc, const SumoXMLTag altTag=SUMO_TAG_VEHICLE, const std::string &typeID="") const
Writes the parameters as a beginning element.
double departPos
(optional) The position the vehicle shall depart from
std::string id
The vehicle's id.
DepartDefinition departProcedure
Information how the vehicle shall choose the depart time.
DepartPosDefinition departPosProcedure
Information how the vehicle shall choose the departure position.
bool hasNext()
returns the information whether further substrings exist