Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/router/RORoute.cpp
193674 views
1
/****************************************************************************/
2
// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3
// Copyright (C) 2002-2026 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
/****************************************************************************/
14
/// @file RORoute.cpp
15
/// @author Daniel Krajzewicz
16
/// @author Michael Behrisch
17
/// @author Yun-Pang Floetteroed
18
/// @date Sept 2002
19
///
20
// A complete router's route
21
/****************************************************************************/
22
#include <config.h>
23
24
#include <string>
25
#include <iostream>
26
#include <utils/common/Named.h>
27
#include <utils/common/StringUtils.h>
28
#include <utils/common/StdDefs.h>
29
#include "ROEdge.h"
30
#include "RORoute.h"
31
#include "ROHelper.h"
32
#include <utils/iodevices/OutputDevice.h>
33
34
35
// ===========================================================================
36
// method definitions
37
// ===========================================================================
38
RORoute::RORoute(const std::string& id, double costs, double prop,
39
const ConstROEdgeVector& route,
40
const RGBColor* const color,
41
const StopParVector& stops)
42
: Named(StringUtils::convertUmlaute(id)), myCosts(costs),
43
myProbability(prop), myRoute(route), myColor(color), myStops(stops) {}
44
45
RORoute::RORoute(const std::string& id, const ConstROEdgeVector& route)
46
: Named(StringUtils::convertUmlaute(id)), myCosts(0.0),
47
myProbability(0.0), myRoute(route), myColor(nullptr), myStops() {}
48
49
RORoute::RORoute(const RORoute& src)
50
: Named(src.myID), myCosts(src.myCosts),
51
myProbability(src.myProbability), myRoute(src.myRoute), myColor(nullptr) {
52
if (src.myColor != nullptr) {
53
myColor = new RGBColor(*src.myColor);
54
}
55
}
56
57
58
RORoute::~RORoute() {
59
delete myColor;
60
}
61
62
63
void
64
RORoute::setCosts(double costs) {
65
myCosts = costs;
66
}
67
68
69
void
70
RORoute::setProbability(double prob) {
71
myProbability = prob;
72
}
73
74
75
void
76
RORoute::recheckForLoops(const ConstROEdgeVector& mandatory) {
77
ROHelper::recheckForLoops(myRoute, mandatory);
78
}
79
80
bool
81
RORoute::isValid(const ROVehicle& veh, bool ignoreErrors, MsgHandler* mh) const {
82
if (mh == nullptr) {
83
mh = ignoreErrors ? MsgHandler::getWarningInstance() : MsgHandler::getErrorInstance();
84
}
85
for (ConstROEdgeVector::const_iterator i = myRoute.begin() + 1; i != myRoute.end(); ++i) {
86
const ROEdge* prev = *(i - 1);
87
const ROEdge* cur = *i;
88
if (!prev->isConnectedTo(*cur, veh.getVClass())) {
89
mh->informf("Edge '%' not connected to edge '%' for vehicle '%'.", prev->getID(), cur->getID(), veh.getID());
90
return ignoreErrors;
91
}
92
}
93
return true;
94
}
95
96
97
bool
98
RORoute::isPermitted(const ROVehicle* veh, MsgHandler* mh) const {
99
const bool hasRestrictions = RONet::getInstance()->hasParamRestrictions();
100
const bool hasPermissions = RONet::getInstance()->hasPermissions();
101
if (hasRestrictions || hasPermissions) {
102
for (const ROEdge* e : myRoute) {
103
if ((hasPermissions && e->prohibits(veh)) || (hasRestrictions && e->restricts(veh))) {
104
mh->informf("Vehicle '%' is not permitted on Edge '%'", veh->getID(), e->getID());
105
return false;
106
}
107
}
108
}
109
return true;
110
}
111
112
113
void
114
RORoute::addProbability(double prob) {
115
myProbability += prob;
116
}
117
118
119
ConstROEdgeVector
120
RORoute::getNormalEdges() const {
121
ConstROEdgeVector tempRoute;
122
for (const ROEdge* roe : myRoute) {
123
if (!roe->isInternal() && !roe->isTazConnector()) {
124
tempRoute.push_back(roe);
125
}
126
}
127
return tempRoute;
128
}
129
130
131
OutputDevice&
132
RORoute::writeXMLDefinition(OutputDevice& dev, const ROVehicle* const veh,
133
const bool withCosts,
134
const bool asAlternatives,
135
const bool withExitTimes,
136
const bool withLength,
137
const std::string& id) const {
138
dev.openTag(SUMO_TAG_ROUTE);
139
if (id != "") {
140
dev.writeAttr(SUMO_ATTR_ID, id);
141
}
142
if (withCosts) {
143
dev.writeAttr(SUMO_ATTR_COST, myCosts);
144
}
145
if (asAlternatives) {
146
dev.setPrecision(8);
147
dev.writeAttr(SUMO_ATTR_PROB, myProbability);
148
dev.setPrecision();
149
}
150
if (myColor != nullptr) {
151
dev.writeAttr(SUMO_ATTR_COLOR, *myColor);
152
}
153
dev.writeAttr(SUMO_ATTR_EDGES, getNormalEdges());
154
if (withExitTimes) {
155
std::vector<double> exitTimes;
156
double time = STEPS2TIME(veh->getDepartureTime());
157
for (const ROEdge* const roe : myRoute) {
158
time += roe->getTravelTime(veh, time);
159
if (!roe->isInternal() && !roe->isTazConnector()) {
160
exitTimes.push_back(time);
161
}
162
}
163
dev.writeAttr("exitTimes", exitTimes);
164
}
165
if (withLength) {
166
double length = 0.;
167
for (const ROEdge* const roe : myRoute) {
168
length += roe->getLength();
169
}
170
dev.writeAttr("routeLength", length);
171
}
172
dev.closeTag();
173
return dev;
174
}
175
176
177
/****************************************************************************/
178
179