SUMO - Simulation of Urban MObility
RODUAFrame.cpp
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.org/sumo
3 // Copyright (C) 2001-2018 German Aerospace Center (DLR) and others.
4 // This program and the accompanying materials
5 // are made available under the terms of the Eclipse Public License v2.0
6 // which accompanies this distribution, and is available at
7 // http://www.eclipse.org/legal/epl-v20.html
8 // SPDX-License-Identifier: EPL-2.0
9 /****************************************************************************/
17 // Sets and checks options for dua-routing
18 /****************************************************************************/
19 
20 
21 // ===========================================================================
22 // included modules
23 // ===========================================================================
24 #include <config.h>
25 
26 #include <iostream>
27 #include <fstream>
28 #include <ctime>
30 #include <utils/options/Option.h>
33 #include <utils/common/ToString.h>
34 #include "RODUAFrame.h"
35 #include <router/ROFrame.h>
39 
40 
41 // ===========================================================================
42 // method definitions
43 // ===========================================================================
44 void
47  oc.addCallExample("-c <CONFIGURATION>", "run routing with options from file");
48 
49  // insert options sub-topics
50  SystemFrame::addConfigurationOptions(oc); // fill this subtopic, too
51  oc.addOptionSubTopic("Input");
52  oc.addOptionSubTopic("Output");
53  oc.addOptionSubTopic("Processing");
54  oc.addOptionSubTopic("Defaults");
55  oc.addOptionSubTopic("Time");
56  SystemFrame::addReportOptions(oc); // fill this subtopic, too
57 
58  // insert options
60  // to make the transition from --trip-files easier, but has a conflict with jtrrouter
61  oc.addSynonyme("route-files", "t", true);
63  addDUAOptions();
64  // add rand options
66 }
67 
68 
69 void
72  oc.doRegister("alternatives-output", new Option_FileName());
73  oc.addSynonyme("alternatives-output", "alternatives");
74  oc.addDescription("alternatives-output", "Output", "Write generated route alternatives to FILE");
75 
76  oc.doRegister("intermodal-network-output", new Option_FileName());
77  oc.addDescription("intermodal-network-output", "Output", "Write edge splits and connectivity to FILE");
78 
79  oc.doRegister("intermodal-weight-output", new Option_FileName());
80  oc.addDescription("intermodal-weight-output", "Output", "Write intermodal edges with lengths and travel times to FILE");
81 
82  // register import options
83  oc.doRegister("weight-files", 'w', new Option_FileName());
84  oc.addSynonyme("weight-files", "weights");
85  oc.addDescription("weight-files", "Input", "Read network weights from FILE(s)");
86 
87  oc.doRegister("lane-weight-files", new Option_FileName());
88  oc.addDescription("lane-weight-files", "Input", "Read lane-based network weights from FILE(s)");
89 
90  oc.doRegister("weight-attribute", 'x', new Option_String("traveltime"));
91  oc.addSynonyme("weight-attribute", "measure", true);
92  oc.addDescription("weight-attribute", "Input", "Name of the xml attribute which gives the edge weight");
93 
94  oc.doRegister("phemlight-path", new Option_FileName("./PHEMlight/"));
95  oc.addDescription("phemlight-path", "Input", "Determines where to load PHEMlight definitions from.");
96 
97  // register further processing options
98  // ! The subtopic "Processing" must be initialised earlier !
99  oc.doRegister("weights.expand", new Option_Bool(false));
100  oc.addSynonyme("weights.expand", "expand-weights", true);
101  oc.addDescription("weights.expand", "Processing", "Expand weights behind the simulation's end");
102 
103  oc.doRegister("routing-algorithm", new Option_String("dijkstra"));
104  oc.addDescription("routing-algorithm", "Processing", "Select among routing algorithms ['dijkstra', 'astar', 'CH', 'CHWrapper']");
105 
106  oc.doRegister("weight-period", new Option_String("3600", "TIME"));
107  oc.addDescription("weight-period", "Processing", "Aggregation period for the given weight files; triggers rebuilding of Contraction Hierarchy");
108 
109  oc.doRegister("astar.all-distances", new Option_FileName());
110  oc.addDescription("astar.all-distances", "Processing", "Initialize lookup table for astar from the given file (generated by marouter --all-pairs-output)");
111 
112  oc.doRegister("astar.landmark-distances", new Option_FileName());
113  oc.addDescription("astar.landmark-distances", "Processing", "Initialize lookup table for astar ALT-variant from the given file");
114 
115  oc.doRegister("astar.save-landmark-distances", new Option_FileName());
116  oc.addDescription("astar.save-landmark-distances", "Processing", "Save lookup table for astar ALT-variant to the given file");
117 }
118 
119 
120 void
123  // register Gawron's DUE-settings
124  oc.doRegister("gawron.beta", new Option_Float(double(0.3)));
125  oc.addSynonyme("gawron.beta", "gBeta", true);
126  oc.addDescription("gawron.beta", "Processing", "Use FLOAT as Gawron's beta");
127 
128  oc.doRegister("gawron.a", new Option_Float(double(0.05)));
129  oc.addSynonyme("gawron.a", "gA", true);
130  oc.addDescription("gawron.a", "Processing", "Use FLOAT as Gawron's a");
131 
132  oc.doRegister("exit-times", new Option_Bool(false));
133  oc.addDescription("exit-times", "Output", "Write exit times (weights) for each edge");
134 
135  oc.doRegister("keep-all-routes", new Option_Bool(false));
136  oc.addDescription("keep-all-routes", "Processing", "Save routes with near zero probability");
137 
138  oc.doRegister("skip-new-routes", new Option_Bool(false));
139  oc.addDescription("skip-new-routes", "Processing", "Only reuse routes from input, do not calculate new ones");
140 
141  oc.doRegister("ptline-routing", new Option_Bool(false));
142  oc.addDescription("ptline-routing", "Processing", "Route all public transport input");
143 
144  oc.doRegister("logit", new Option_Bool(false)); // deprecated
145  oc.addDescription("logit", "Processing", "Use c-logit model (deprecated in favor of --route-choice-method logit)");
146 
147  oc.doRegister("route-choice-method", new Option_String("gawron"));
148  oc.addDescription("route-choice-method", "Processing", "Choose a route choice method: gawron, logit, or lohse");
149 
150  oc.doRegister("logit.beta", new Option_Float(double(-1)));
151  oc.addSynonyme("logit.beta", "lBeta", true);
152  oc.addDescription("logit.beta", "Processing", "Use FLOAT as logit's beta");
153 
154  oc.doRegister("logit.gamma", new Option_Float(double(1)));
155  oc.addSynonyme("logit.gamma", "lGamma", true);
156  oc.addDescription("logit.gamma", "Processing", "Use FLOAT as logit's gamma");
157 
158  oc.doRegister("logit.theta", new Option_Float(double(-1)));
159  oc.addSynonyme("logit.theta", "lTheta", true);
160  oc.addDescription("logit.theta", "Processing", "Use FLOAT as logit's theta (negative values mean auto-estimation)");
161 
162  oc.doRegister("persontrip.walkfactor", new Option_Float(double(0.75)));
163  oc.addDescription("persontrip.walkfactor", "Processing", "Use FLOAT as a factor on pedestrian maximum speed during intermodal routing");
164 
165  oc.doRegister("persontrip.transfer.car-walk", new Option_String("parkingAreas"));
166  oc.addDescription("persontrip.transfer.car-walk", "Processing", "Where are mode changes from car to walking allowed (possible values: 'parkingAreas', 'ptStops', 'allJunctions' and combinations)");
167 
168 }
169 
170 
171 bool
174  bool ok = ROFrame::checkOptions(oc);
175 
177  std::string error;
178  if (oc.isSet("departlane") && !SUMOVehicleParameter::parseDepartLane(oc.getString("departlane"), "option", "departlane", p.departLane, p.departLaneProcedure, error)) {
179  WRITE_ERROR(error);
180  ok = false;
181  }
182  if (oc.isSet("departpos") && !SUMOVehicleParameter::parseDepartPos(oc.getString("departpos"), "option", "departpos", p.departPos, p.departPosProcedure, error)) {
183  WRITE_ERROR(error);
184  ok = false;
185  }
186  if (oc.isSet("departspeed") && !SUMOVehicleParameter::parseDepartSpeed(oc.getString("departspeed"), "option", "departspeed", p.departSpeed, p.departSpeedProcedure, error)) {
187  WRITE_ERROR(error);
188  ok = false;
189  }
190  if (oc.isSet("arrivallane") && !SUMOVehicleParameter::parseArrivalLane(oc.getString("arrivallane"), "option", "arrivallane", p.arrivalLane, p.arrivalLaneProcedure, error)) {
191  WRITE_ERROR(error);
192  ok = false;
193  }
194  if (oc.isSet("arrivalpos") && !SUMOVehicleParameter::parseArrivalPos(oc.getString("arrivalpos"), "option", "arrivalpos", p.arrivalPos, p.arrivalPosProcedure, error)) {
195  WRITE_ERROR(error);
196  ok = false;
197  }
198  if (oc.isSet("arrivalspeed") && !SUMOVehicleParameter::parseArrivalSpeed(oc.getString("arrivalspeed"), "option", "arrivalspeed", p.arrivalSpeed, p.arrivalSpeedProcedure, error)) {
199  WRITE_ERROR(error);
200  ok = false;
201  }
202 
203  if (oc.getString("routing-algorithm") != "dijkstra" && oc.getString("weight-attribute") != "traveltime") {
204  WRITE_ERROR("Routing algorithm '" + oc.getString("routing-algorithm") + "' does not support weight-attribute '" + oc.getString("weight-attribute") + "'.");
205  return false;
206  }
207  if (oc.getBool("bulk-routing") && (oc.getString("routing-algorithm") == "CH" || oc.getString("routing-algorithm") == "CHWrapper")) {
208  WRITE_ERROR("Routing algorithm '" + oc.getString("routing-algorithm") + "' does not support bulk routing.");
209  return false;
210  }
211  if (oc.isDefault("routing-algorithm") && (oc.isSet("astar.all-distances") || oc.isSet("astar.landmark-distances") || oc.isSet("astar.save-landmark-distances"))) {
212  oc.set("routing-algorithm", "astar");
213  }
214 
215  if (oc.getString("route-choice-method") != "gawron" && oc.getString("route-choice-method") != "logit") {
216  WRITE_ERROR("Invalid route choice method '" + oc.getString("route-choice-method") + "'.");
217  return false;
218  }
219  if (oc.getBool("logit")) {
220  WRITE_WARNING("The --logit option is deprecated, please use --route-choice-method logit.");
221  oc.set("route-choice-method", "logit");
222  }
223 
224  if (oc.isSet("output-file") && !oc.isSet("alternatives-output")) {
225  const std::string& filename = oc.getString("output-file");
226  const int len = (int)filename.length();
227  if (len > 4 && filename.substr(len - 4) == ".xml") {
228  oc.set("alternatives-output", filename.substr(0, len - 4) + ".alt.xml");
229  } else if (len > 4 && filename.substr(len - 4) == ".sbx") {
230  oc.set("alternatives-output", filename.substr(0, len - 4) + ".alt.sbx");
231  } else {
232  WRITE_WARNING("Cannot derive file name for alternatives output, skipping it.");
233  }
234  }
235  return ok;
236 }
237 
238 
239 
240 /****************************************************************************/
241 
void doRegister(const std::string &name, Option *v)
Adds an option under the given name.
Definition: OptionsCont.cpp:75
static void insertRandOptions()
Initialises the given options container with random number options.
Definition: RandHelper.cpp:43
static void addReportOptions(OptionsCont &oc)
Adds reporting options to the given container.
Definition: SystemFrame.cpp:65
static void addImportOptions()
Inserts import options used by duarouter into the OptionsCont-singleton.
Definition: RODUAFrame.cpp:70
static void fillOptions(OptionsCont &oc)
Inserts options used by routing applications into the OptionsCont-singleton.
Definition: ROFrame.cpp:43
ArrivalLaneDefinition arrivalLaneProcedure
Information how the vehicle shall choose the lane to arrive on.
static bool checkOptions()
Checks set options from the OptionsCont-singleton for being valid for usage within duarouter...
Definition: RODUAFrame.cpp:172
void addCallExample(const std::string &example, const std::string &desc)
Add a call example.
DepartLaneDefinition departLaneProcedure
Information how the vehicle shall choose the lane to depart from.
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
ArrivalSpeedDefinition arrivalSpeedProcedure
Information how the vehicle&#39;s end speed shall be chosen.
bool isDefault(const std::string &name) const
Returns the information whether the named option has still the default value.
static void addConfigurationOptions(OptionsCont &oc)
Adds configuration options to the given container.
Definition: SystemFrame.cpp:40
#define WRITE_WARNING(msg)
Definition: MsgHandler.h:241
static OptionsCont & getOptions()
Retrieves the options.
Definition: OptionsCont.cpp:58
void addSynonyme(const std::string &name1, const std::string &name2, bool isDeprecated=false)
Adds a synonyme for an options name (any order)
Definition: OptionsCont.cpp:96
double departSpeed
(optional) The initial speed of the vehicle
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
static void fillOptions()
Inserts options used by duarouter into the OptionsCont-singleton.
Definition: RODUAFrame.cpp:45
DepartSpeedDefinition departSpeedProcedure
Information how the vehicle&#39;s initial speed shall be chosen.
DepartPosDefinition departPosProcedure
Information how the vehicle shall choose the departure position.
static bool checkOptions(OptionsCont &oc)
Checks whether options are valid.
Definition: ROFrame.cpp:164
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
int arrivalLane
(optional) The lane the vehicle shall arrive on (not used yet)
void addOptionSubTopic(const std::string &topic)
Adds an option subtopic.
static bool parseArrivalLane(const std::string &val, const std::string &element, const std::string &id, int &lane, ArrivalLaneDefinition &ald, std::string &error)
Validates a given arrivalLane value.
int departLane
(optional) The lane the vehicle shall depart from (index in edge)
double arrivalPos
(optional) The position the vehicle shall arrive on
#define WRITE_ERROR(msg)
Definition: MsgHandler.h:247
double departPos
(optional) The position the vehicle shall depart from
Structure representing possible vehicle parameter.
bool set(const std::string &name, const std::string &value)
Sets the given value for the named option.
static bool parseDepartPos(const std::string &val, const std::string &element, const std::string &id, double &pos, DepartPosDefinition &dpd, std::string &error)
Validates a given departPos value.
static bool parseArrivalSpeed(const std::string &val, const std::string &element, const std::string &id, double &speed, ArrivalSpeedDefinition &asd, std::string &error)
Validates a given arrivalSpeed value.
A storage for options typed value containers)
Definition: OptionsCont.h:92
static bool parseArrivalPos(const std::string &val, const std::string &element, const std::string &id, double &pos, ArrivalPosDefinition &apd, std::string &error)
Validates a given arrivalPos value.
static bool parseDepartSpeed(const std::string &val, const std::string &element, const std::string &id, double &speed, DepartSpeedDefinition &dsd, std::string &error)
Validates a given departSpeed value.
double arrivalSpeed
(optional) The final speed of the vehicle (not used yet)
void addDescription(const std::string &name, const std::string &subtopic, const std::string &description)
Adds a description for an option.
static void addDUAOptions()
Inserts dua options used by duarouter into the OptionsCont-singleton.
Definition: RODUAFrame.cpp:121
ArrivalPosDefinition arrivalPosProcedure
Information how the vehicle shall choose the arrival position.
static bool parseDepartLane(const std::string &val, const std::string &element, const std::string &id, int &lane, DepartLaneDefinition &dld, std::string &error)
Validates a given departLane value.