Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/duarouter/RODUAFrame.cpp
169666 views
1
/****************************************************************************/
2
// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3
// Copyright (C) 2001-2025 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 RODUAFrame.cpp
15
/// @author Daniel Krajzewicz
16
/// @author Jakob Erdmann
17
/// @author Michael Behrisch
18
/// @date Sept 2002
19
///
20
// Sets and checks options for dua-routing
21
/****************************************************************************/
22
#include <config.h>
23
24
#include <iostream>
25
#include <fstream>
26
#include <ctime>
27
#include <utils/options/OptionsCont.h>
28
#include <utils/options/Option.h>
29
#include <utils/common/MsgHandler.h>
30
#include <utils/common/UtilExceptions.h>
31
#include <utils/common/ToString.h>
32
#include "RODUAFrame.h"
33
#include <router/ROFrame.h>
34
#include <utils/common/RandHelper.h>
35
#include <utils/common/SystemFrame.h>
36
#include <utils/vehicle/SUMOVehicleParameter.h>
37
38
39
// ===========================================================================
40
// method definitions
41
// ===========================================================================
42
void
43
RODUAFrame::fillOptions() {
44
OptionsCont& oc = OptionsCont::getOptions();
45
oc.addCallExample("-c <CONFIGURATION>", "run routing with options from file");
46
47
// insert options sub-topics
48
SystemFrame::addConfigurationOptions(oc); // fill this subtopic, too
49
oc.addOptionSubTopic("Input");
50
oc.addOptionSubTopic("Output");
51
oc.addOptionSubTopic("Processing");
52
oc.addOptionSubTopic("Defaults");
53
oc.addOptionSubTopic("Time");
54
55
// insert options
56
ROFrame::fillOptions(oc, true);
57
addImportOptions();
58
addDUAOptions();
59
// add rand options
60
RandHelper::insertRandOptions(oc);
61
}
62
63
64
void
65
RODUAFrame::addImportOptions() {
66
OptionsCont& oc = OptionsCont::getOptions();
67
oc.doRegister("alternatives-output", new Option_FileName());
68
oc.addSynonyme("alternatives-output", "alternatives");
69
oc.addDescription("alternatives-output", "Output", TL("Write generated route alternatives to FILE"));
70
71
oc.doRegister("intermodal-network-output", new Option_FileName());
72
oc.addDescription("intermodal-network-output", "Output", TL("Write edge splits and connectivity to FILE"));
73
74
oc.doRegister("intermodal-weight-output", new Option_FileName());
75
oc.addDescription("intermodal-weight-output", "Output", TL("Write intermodal edges with lengths and travel times to FILE"));
76
77
oc.doRegister("write-trips", new Option_Bool(false));
78
oc.addDescription("write-trips", "Output", TL("Write trips instead of vehicles (for validating trip input)"));
79
80
oc.doRegister("write-trips.geo", new Option_Bool(false));
81
oc.addDescription("write-trips.geo", "Output", TL("Write trips with geo-coordinates"));
82
83
oc.doRegister("write-trips.junctions", new Option_Bool(false));
84
oc.addDescription("write-trips.junctions", "Output", TL("Write trips with fromJunction and toJunction"));
85
86
oc.doRegister("write-costs", new Option_Bool(false));
87
oc.addDescription("write-costs", "Output", TL("Include the cost attribute in route output"));
88
89
// register further processing options
90
// ! The subtopic "Processing" must be initialised earlier !
91
oc.doRegister("weights.random-factor", new Option_Float(1.));
92
oc.addDescription("weights.random-factor", "Processing", TL("Edge weights for routing are dynamically disturbed by a random factor drawn uniformly from [1,FLOAT)"));
93
94
oc.doRegister("weight-period", new Option_String("3600", "TIME"));
95
oc.addDescription("weight-period", "Processing", TL("Aggregation period for the given weight files; triggers rebuilding of Contraction Hierarchy"));
96
97
oc.doRegister("weights.priority-factor", new Option_Float(0));
98
oc.addDescription("weights.priority-factor", "Processing", TL("Consider edge priorities in addition to travel times, weighted by factor"));
99
100
oc.doRegister("astar.all-distances", new Option_FileName());
101
oc.addDescription("astar.all-distances", "Processing", TL("Initialize lookup table for astar from the given file (generated by marouter --all-pairs-output)"));
102
103
oc.doRegister("astar.landmark-distances", new Option_FileName());
104
oc.addDescription("astar.landmark-distances", "Processing", TL("Initialize lookup table for astar ALT-variant from the given file"));
105
106
oc.doRegister("astar.save-landmark-distances", new Option_FileName());
107
oc.addDescription("astar.save-landmark-distances", "Processing", TL("Save lookup table for astar ALT-variant to the given file"));
108
109
oc.doRegister("scale", new Option_Float(1.));
110
oc.addDescription("scale", "Processing", TL("Scale demand by the given factor (by discarding or duplicating vehicles)"));
111
112
oc.doRegister("scale-suffix", new Option_String("."));
113
oc.addDescription("scale-suffix", "Processing", TL("Suffix to be added when creating ids for cloned vehicles"));
114
115
}
116
117
118
void
119
RODUAFrame::addDUAOptions() {
120
OptionsCont& oc = OptionsCont::getOptions();
121
// register Gawron's DUE-settings
122
oc.doRegister("gawron.beta", new Option_Float(double(0.9)));
123
oc.addSynonyme("gawron.beta", "gBeta", true);
124
oc.addDescription("gawron.beta", "Processing", TL("Use FLOAT as Gawron's beta"));
125
126
oc.doRegister("gawron.a", new Option_Float(double(0.5)));
127
oc.addSynonyme("gawron.a", "gA", true);
128
oc.addDescription("gawron.a", "Processing", TL("Use FLOAT as Gawron's a"));
129
130
oc.doRegister("exit-times", new Option_Bool(false));
131
oc.addDescription("exit-times", "Output", TL("Write exit times (weights) for each edge"));
132
133
oc.doRegister("route-length", new Option_Bool(false));
134
oc.addDescription("route-length", "Output", TL("Include total route length in the output"));
135
136
oc.doRegister("keep-all-routes", new Option_Bool(false));
137
oc.addDescription("keep-all-routes", "Processing", TL("Save routes with near zero probability"));
138
139
oc.doRegister("skip-new-routes", new Option_Bool(false));
140
oc.addDescription("skip-new-routes", "Processing", TL("Only reuse routes from input, do not calculate new ones"));
141
142
oc.doRegister("keep-route-probability", new Option_Float(0));
143
oc.addDescription("keep-route-probability", "Processing", TL("The probability of keeping the old route"));
144
145
oc.doRegister("ptline-routing", new Option_Bool(false));
146
oc.addDescription("ptline-routing", "Processing", TL("Route all public transport input"));
147
148
oc.doRegister("route-choice-method", new Option_String("gawron"));
149
oc.addDescription("route-choice-method", "Processing", TL("Choose a route choice method: gawron, logit, or lohse"));
150
151
oc.doRegister("logit", new Option_Bool(false)); // deprecated
152
oc.addDescription("logit", "Processing", TL("Use c-logit model (deprecated in favor of --route-choice-method logit)"));
153
154
oc.doRegister("logit.beta", new Option_Float(double(-1)));
155
oc.addSynonyme("logit.beta", "lBeta", true);
156
oc.addDescription("logit.beta", "Processing", TL("Use FLOAT as logit's beta"));
157
158
oc.doRegister("logit.gamma", new Option_Float(double(1)));
159
oc.addSynonyme("logit.gamma", "lGamma", true);
160
oc.addDescription("logit.gamma", "Processing", TL("Use FLOAT as logit's gamma"));
161
162
oc.doRegister("logit.theta", new Option_Float(double(-1)));
163
oc.addSynonyme("logit.theta", "lTheta", true);
164
oc.addDescription("logit.theta", "Processing", TL("Use FLOAT as logit's theta (negative values mean auto-estimation)"));
165
166
oc.doRegister("persontrip.walkfactor", new Option_Float(double(0.75)));
167
oc.addDescription("persontrip.walkfactor", "Processing", TL("Use FLOAT as a factor on pedestrian maximum speed during intermodal routing"));
168
169
oc.doRegister("persontrip.walk-opposite-factor", new Option_Float(1.0));
170
oc.addDescription("persontrip.walk-opposite-factor", "Processing", TL("Use FLOAT as a factor on walking speed against vehicle traffic direction"));
171
172
oc.doRegister("persontrip.transfer.car-walk", new Option_StringVector(StringVector({ "parkingAreas" })));
173
oc.addDescription("persontrip.transfer.car-walk", "Processing",
174
"Where are mode changes from car to walking allowed (possible values: 'parkingAreas', 'ptStops', 'allJunctions' and combinations)");
175
176
oc.doRegister("persontrip.transfer.taxi-walk", new Option_StringVector());
177
oc.addDescription("persontrip.transfer.taxi-walk", "Processing", TL("Where taxis can drop off customers ('allJunctions, 'ptStops')"));
178
179
oc.doRegister("persontrip.transfer.walk-taxi", new Option_StringVector());
180
oc.addDescription("persontrip.transfer.walk-taxi", "Processing", TL("Where taxis can pick up customers ('allJunctions, 'ptStops')"));
181
182
oc.doRegister("persontrip.taxi.waiting-time", new Option_String("300", "TIME"));
183
oc.addDescription("persontrip.taxi.waiting-time", "Processing", TL("Estimated time for taxi pickup"));
184
185
oc.doRegister("persontrip.ride-public-line", new Option_Bool(false));
186
oc.addDescription("persontrip.ride-public-line", "Processing", TL("Only use the intended public transport line rather than any alternative line that stops at the destination"));
187
188
oc.doRegister("railway.max-train-length", new Option_Float(1000.0));
189
oc.addDescription("railway.max-train-length", "Processing", TL("Use FLOAT as a maximum train length when initializing the railway router"));
190
}
191
192
193
bool
194
RODUAFrame::checkOptions() {
195
OptionsCont& oc = OptionsCont::getOptions();
196
bool ok = ROFrame::checkOptions(oc);
197
198
SUMOVehicleParameter p;
199
std::string error;
200
if (oc.isSet("departlane") && !SUMOVehicleParameter::parseDepartLane(oc.getString("departlane"), "option", "departlane", p.departLane, p.departLaneProcedure, error)) {
201
WRITE_ERROR(error);
202
ok = false;
203
}
204
if (oc.isSet("departpos") && !SUMOVehicleParameter::parseDepartPos(oc.getString("departpos"), "option", "departpos", p.departPos, p.departPosProcedure, error)) {
205
WRITE_ERROR(error);
206
ok = false;
207
}
208
if (oc.isSet("departspeed") && !SUMOVehicleParameter::parseDepartSpeed(oc.getString("departspeed"), "option", "departspeed", p.departSpeed, p.departSpeedProcedure, error)) {
209
WRITE_ERROR(error);
210
ok = false;
211
}
212
if (oc.isSet("arrivallane") && !SUMOVehicleParameter::parseArrivalLane(oc.getString("arrivallane"), "option", "arrivallane", p.arrivalLane, p.arrivalLaneProcedure, error)) {
213
WRITE_ERROR(error);
214
ok = false;
215
}
216
if (oc.isSet("arrivalpos") && !SUMOVehicleParameter::parseArrivalPos(oc.getString("arrivalpos"), "option", "arrivalpos", p.arrivalPos, p.arrivalPosProcedure, error)) {
217
WRITE_ERROR(error);
218
ok = false;
219
}
220
if (oc.isSet("arrivalspeed") && !SUMOVehicleParameter::parseArrivalSpeed(oc.getString("arrivalspeed"), "option", "arrivalspeed", p.arrivalSpeed, p.arrivalSpeedProcedure, error)) {
221
WRITE_ERROR(error);
222
ok = false;
223
}
224
225
if (oc.getString("routing-algorithm") != "dijkstra" && oc.getString("weight-attribute") != "traveltime") {
226
WRITE_ERRORF(TL("Routing algorithm '%' does not support weight-attribute '%'."), oc.getString("routing-algorithm"), oc.getString("weight-attribute"));
227
return false;
228
}
229
if (oc.getBool("bulk-routing") && (oc.getString("routing-algorithm") == "CH" || oc.getString("routing-algorithm") == "CHWrapper")) {
230
WRITE_ERRORF(TL("Routing algorithm '%' does not support bulk routing."), oc.getString("routing-algorithm"));
231
return false;
232
}
233
if (oc.isDefault("routing-algorithm") && (oc.isSet("astar.all-distances") || oc.isSet("astar.landmark-distances") || oc.isSet("astar.save-landmark-distances"))) {
234
oc.setDefault("routing-algorithm", "astar");
235
}
236
if (!oc.isDefault("weights.random-factor") && (oc.isSet("astar.all-distances") || oc.isSet("astar.landmark-distances") || oc.isSet("astar.save-landmark-distances"))) {
237
WRITE_WARNING(TL("The option --weights.random-factor should not be used together with astar and precomputed distances."));
238
}
239
240
if (oc.getString("route-choice-method") != "gawron" && oc.getString("route-choice-method") != "logit") {
241
WRITE_ERRORF(TL("Invalid route choice method '%'."), oc.getString("route-choice-method"));
242
return false;
243
}
244
if (oc.getBool("logit")) {
245
WRITE_WARNING(TL("The --logit option is deprecated, please use --route-choice-method logit."));
246
oc.set("route-choice-method", "logit");
247
}
248
249
if (oc.isSet("output-file") && !oc.isSet("alternatives-output")) {
250
const std::string& filename = oc.getString("output-file");
251
const int len = (int)filename.length();
252
if (len > 4 && filename.substr(len - 4) == ".xml") {
253
oc.setDefault("alternatives-output", filename.substr(0, len - 4) + ".alt.xml");
254
} else if (len > 4 && filename.substr(len - 3) == ".gz") {
255
oc.setDefault("alternatives-output", filename.substr(0, len - 3) + ".alt.gz");
256
} else {
257
WRITE_WARNING(TL("Cannot derive file name for alternatives output, skipping it."));
258
}
259
}
260
if (oc.getBool("write-trips.junctions")) {
261
if (oc.isDefault("write-trips")) {
262
oc.setDefault("write-trips", "true");
263
} else if (!oc.getBool("write-trips")) {
264
WRITE_WARNING(TL("Option --write-trips.junctions takes no affect when --write-trips is disabled."));
265
}
266
}
267
return ok;
268
}
269
270
271
/****************************************************************************/
272
273