SUMO - Simulation of Urban MObility
od2trips_main.cpp
Go to the documentation of this file.
1 /****************************************************************************/
11 // Main for OD2TRIPS
12 /****************************************************************************/
13 // SUMO, Simulation of Urban MObility; see http://sumo.dlr.de/
14 // Copyright (C) 2002-2017 DLR (http://www.dlr.de/) and contributors
15 /****************************************************************************/
16 //
17 // This file is part of SUMO.
18 // SUMO is free software: you can redistribute it and/or modify
19 // it under the terms of the GNU General Public License as published by
20 // the Free Software Foundation, either version 3 of the License, or
21 // (at your option) any later version.
22 //
23 /****************************************************************************/
24 
25 
26 // ===========================================================================
27 // included modules
28 // ===========================================================================
29 #ifdef _MSC_VER
30 #include <windows_config.h>
31 #else
32 #include <config.h>
33 #endif
34 
35 #ifdef HAVE_VERSION_H
36 #include <version.h>
37 #endif
38 
39 #include <iostream>
40 #include <algorithm>
41 #include <math.h>
42 #include <cstdlib>
43 #include <string>
44 #include <xercesc/parsers/SAXParser.hpp>
45 #include <xercesc/sax2/SAX2XMLReader.hpp>
46 #include <utils/options/Option.h>
53 #include <utils/common/ToString.h>
54 #include <utils/xml/XMLSubSys.h>
56 #include <od/ODDistrictCont.h>
57 #include <od/ODDistrictHandler.h>
58 #include <od/ODMatrix.h>
60 #include <utils/common/SUMOTime.h>
66 
67 #ifdef CHECK_MEMORY_LEAKS
68 #include <foreign/nvwa/debug_new.h>
69 #endif // CHECK_MEMORY_LEAKS
70 
71 
72 // ===========================================================================
73 // functions
74 // ===========================================================================
75 void
78  oc.addCallExample("-c <CONFIGURATION>", "run with configuration file");
79 
80  // insert options sub-topics
81  SystemFrame::addConfigurationOptions(oc); // fill this subtopic, too
82  oc.addOptionSubTopic("Input");
83  oc.addOptionSubTopic("Output");
84  oc.addOptionSubTopic("Time");
85  oc.addOptionSubTopic("Processing");
86  oc.addOptionSubTopic("Defaults");
87  SystemFrame::addReportOptions(oc); // fill this subtopic, too
88 
89 
90  // register the file input options
91  oc.doRegister("taz-files", 'n', new Option_FileName());
92  oc.addSynonyme("taz-files", "taz");
93  oc.addSynonyme("taz-files", "net-file");
94  oc.addSynonyme("taz-files", "net");
95  oc.addDescription("taz-files", "Input", "Loads TAZ (districts; also from networks) from FILE(s)");
96 
97  oc.doRegister("od-matrix-files", 'd', new Option_FileName());
98  oc.addSynonyme("od-matrix-files", "od-files");
99  oc.addSynonyme("od-matrix-files", "od");
100  oc.addDescription("od-matrix-files", "Input", "Loads O/D-files from FILE(s)");
101 
102  oc.doRegister("od-amitran-files", new Option_FileName());
103  oc.addSynonyme("od-amitran-files", "amitran-files");
104  oc.addSynonyme("od-amitran-files", "amitran");
105  oc.addDescription("od-amitran-files", "Input", "Loads O/D-matrix in Amitran format from FILE(s)");
106 
107 
108  // register the file output options
109  oc.doRegister("output-file", 'o', new Option_FileName());
110  oc.addSynonyme("output-file", "output", true);
111  oc.addDescription("output-file", "Output", "Writes trip definitions into FILE");
112 
113  oc.doRegister("flow-output", new Option_FileName());
114  oc.addDescription("flow-output", "Output", "Writes flow definitions into FILE");
115 
116  oc.doRegister("flow-output.probability", new Option_Bool(false));
117  oc.addDescription("flow-output.probability", "Output", "Writes probabilistic flow instead of evenly spaced flow");
118 
119  oc.doRegister("ignore-vehicle-type", new Option_Bool(false));
120  oc.addSynonyme("ignore-vehicle-type", "no-vtype", true);
121  oc.addDescription("ignore-vehicle-type", "Output", "Does not save vtype information");
122 
123 
124  // register the time settings
125  oc.doRegister("begin", 'b', new Option_String("0", "TIME"));
126  oc.addDescription("begin", "Time", "Defines the begin time; Previous trips will be discarded");
127 
128  oc.doRegister("end", 'e', new Option_String(SUMOTIME_MAXSTRING, "TIME"));
129  oc.addDescription("end", "Time", "Defines the end time; Later trips will be discarded; Defaults to the maximum time that SUMO can represent");
130 
131 
132  // register the data processing options
133  oc.doRegister("scale", 's', new Option_Float(1));
134  oc.addDescription("scale", "Processing", "Scales the loaded flows by FLOAT");
135 
136  oc.doRegister("spread.uniform", new Option_Bool(false));
137  oc.addDescription("spread.uniform", "Processing", "Spreads trips uniformly over each time period");
138 
139  oc.doRegister("different-source-sink", new Option_Bool(false));
140  oc.addDescription("different-source-sink", "Processing", "Always choose source and sink edge which are not identical");
141 
142  oc.doRegister("vtype", new Option_String(""));
143  oc.addDescription("vtype", "Processing", "Defines the name of the vehicle type to use");
144 
145  oc.doRegister("prefix", new Option_String(""));
146  oc.addDescription("prefix", "Processing", "Defines the prefix for vehicle names");
147 
148  oc.doRegister("timeline", new Option_String());
149  oc.addDescription("timeline", "Processing", "Uses STR as a timeline definition");
150 
151  oc.doRegister("timeline.day-in-hours", new Option_Bool(false));
152  oc.addDescription("timeline.day-in-hours", "Processing", "Uses STR as a 24h-timeline definition");
153 
154  oc.doRegister("ignore-errors", new Option_Bool(false)); // !!! describe, document
155  oc.addSynonyme("ignore-errors", "dismiss-loading-errors", true);
156  oc.addDescription("ignore-errors", "Processing", "Continue on broken input");
157 
158  oc.doRegister("no-step-log", new Option_Bool(false));
159  oc.addDescription("no-step-log", "Processing", "Disable console output of current time step");
160 
161 
162  // register defaults options
163  oc.doRegister("departlane", new Option_String("free"));
164  oc.addDescription("departlane", "Defaults", "Assigns a default depart lane");
165 
166  oc.doRegister("departpos", new Option_String());
167  oc.addDescription("departpos", "Defaults", "Assigns a default depart position");
168 
169  oc.doRegister("departspeed", new Option_String("max"));
170  oc.addDescription("departspeed", "Defaults", "Assigns a default depart speed");
171 
172  oc.doRegister("arrivallane", new Option_String());
173  oc.addDescription("arrivallane", "Defaults", "Assigns a default arrival lane");
174 
175  oc.doRegister("arrivalpos", new Option_String());
176  oc.addDescription("arrivalpos", "Defaults", "Assigns a default arrival position");
177 
178  oc.doRegister("arrivalspeed", new Option_String());
179  oc.addDescription("arrivalspeed", "Defaults", "Assigns a default arrival speed");
180 
181  // add rand options
183 }
184 
185 bool
188  bool ok = true;
189  if (!oc.isSet("taz-files")) {
190  WRITE_ERROR("No TAZ input file (-n) specified.");
191  ok = false;
192  }
193  if (!oc.isSet("od-matrix-files") && !oc.isSet("od-amitran-files")) {
194  WRITE_ERROR("No input specified.");
195  ok = false;
196  }
197  if (!oc.isSet("output-file")) {
198  WRITE_ERROR("No trip table output file (-o) specified.");
199  ok = false;
200  }
201  //
203  std::string error;
204  if (oc.isSet("departlane") && !SUMOVehicleParameter::parseDepartLane(oc.getString("departlane"), "option", "departlane", p.departLane, p.departLaneProcedure, error)) {
205  WRITE_ERROR(error);
206  ok = false;
207  }
208  if (oc.isSet("departpos") && !SUMOVehicleParameter::parseDepartPos(oc.getString("departpos"), "option", "departpos", p.departPos, p.departPosProcedure, error)) {
209  WRITE_ERROR(error);
210  ok = false;
211  }
212  if (oc.isSet("departspeed") && !SUMOVehicleParameter::parseDepartSpeed(oc.getString("departspeed"), "option", "departspeed", p.departSpeed, p.departSpeedProcedure, error)) {
213  WRITE_ERROR(error);
214  ok = false;
215  }
216  if (oc.isSet("arrivallane") && !SUMOVehicleParameter::parseArrivalLane(oc.getString("arrivallane"), "option", "arrivallane", p.arrivalLane, p.arrivalLaneProcedure, error)) {
217  WRITE_ERROR(error);
218  ok = false;
219  }
220  if (oc.isSet("arrivalpos") && !SUMOVehicleParameter::parseArrivalPos(oc.getString("arrivalpos"), "option", "arrivalpos", p.arrivalPos, p.arrivalPosProcedure, error)) {
221  WRITE_ERROR(error);
222  ok = false;
223  }
224  if (oc.isSet("arrivalspeed") && !SUMOVehicleParameter::parseArrivalSpeed(oc.getString("arrivalspeed"), "option", "arrivalspeed", p.arrivalSpeed, p.arrivalSpeedProcedure, error)) {
225  WRITE_ERROR(error);
226  ok = false;
227  }
228  return ok;
229 }
230 
231 
232 
233 
234 /* -------------------------------------------------------------------------
235  * main
236  * ----------------------------------------------------------------------- */
237 int
238 main(int argc, char** argv) {
240  // give some application descriptions
241  oc.setApplicationDescription("Importer of O/D-matrices for the road traffic simulation SUMO.");
242  oc.setApplicationName("od2trips", "SUMO od2trips Version " VERSION_STRING);
243  int ret = 0;
244  try {
245  // initialise subsystems
246  XMLSubSys::init();
247  fillOptions();
248  OptionsIO::setArgs(argc, argv);
250  if (oc.processMetaOptions(argc < 2)) {
252  return 0;
253  }
254  XMLSubSys::setValidation(oc.getString("xml-validation"), oc.getString("xml-validation.net"));
256  if (!checkOptions()) {
257  throw ProcessError();
258  }
260  // load the districts
261  // check whether the user gave a net filename
262  if (!oc.isSet("taz-files")) {
263  throw ProcessError("You must supply a TAZ, network or districts file ('-n').");
264  }
265  // get the file name and set it
266  ODDistrictCont districts;
267  districts.loadDistricts(oc.getStringVector("taz-files"));
268  if (districts.size() == 0) {
269  throw ProcessError("No districts loaded.");
270  }
271  // load the matrix
272  ODMatrix matrix(districts);
273  matrix.loadMatrix(oc);
274  if (matrix.getNumLoaded() == 0) {
275  throw ProcessError("No vehicles loaded.");
276  }
277  if (MsgHandler::getErrorInstance()->wasInformed() && !oc.getBool("ignore-errors")) {
278  throw ProcessError("Loading failed.");
279  }
280  WRITE_MESSAGE(toString(matrix.getNumLoaded()) + " vehicles loaded.");
281  // apply a curve if wished
282  if (oc.isSet("timeline")) {
283  matrix.applyCurve(matrix.parseTimeLine(oc.getStringVector("timeline"), oc.getBool("timeline.day-in-hours")));
284  }
285  // write
286  bool haveOutput = false;
287  if (OutputDevice::createDeviceByOption("output-file", "routes", "routes_file.xsd")) {
288  matrix.write(string2time(oc.getString("begin")), string2time(oc.getString("end")),
289  OutputDevice::getDeviceByOption("output-file"),
290  oc.getBool("spread.uniform"), oc.getBool("different-source-sink"),
291  oc.getBool("ignore-vehicle-type"),
292  oc.getString("prefix"), !oc.getBool("no-step-log"));
293  haveOutput = true;
294  }
295  if (OutputDevice::createDeviceByOption("flow-output", "routes", "routes_file.xsd")) {
296  matrix.writeFlows(string2time(oc.getString("begin")), string2time(oc.getString("end")),
297  OutputDevice::getDeviceByOption("flow-output"),
298  oc.getBool("ignore-vehicle-type"), oc.getString("prefix"),
299  oc.getBool("flow-output.probability"));
300  haveOutput = true;
301  }
302  if (!haveOutput) {
303  throw ProcessError("No output file given.");
304  }
305  WRITE_MESSAGE(toString(matrix.getNumDiscarded()) + " vehicles discarded.");
306  WRITE_MESSAGE(toString(matrix.getNumWritten()) + " vehicles written.");
307  } catch (const ProcessError& e) {
308  if (std::string(e.what()) != std::string("Process Error") && std::string(e.what()) != std::string("")) {
309  WRITE_ERROR(e.what());
310  }
311  MsgHandler::getErrorInstance()->inform("Quitting (on error).", false);
312  ret = 1;
313 #ifndef _DEBUG
314  } catch (const std::exception& e) {
315  if (std::string(e.what()) != std::string("")) {
316  WRITE_ERROR(e.what());
317  }
318  MsgHandler::getErrorInstance()->inform("Quitting (on error).", false);
319  ret = 1;
320  } catch (...) {
321  MsgHandler::getErrorInstance()->inform("Quitting (on unknown error).", false);
322  ret = 1;
323 #endif
324  }
326  if (ret == 0) {
327  std::cout << "Success." << std::endl;
328  }
329  return ret;
330 }
331 
332 
333 
334 /****************************************************************************/
335 
void doRegister(const std::string &name, Option *v)
Adds an option under the given name.
Definition: OptionsCont.cpp:86
std::vector< std::string > getStringVector(const std::string &name) const
Returns the list of string-vector-value of the named option (only for Option_String) ...
static void init()
Initialises the xml-subsystem.
Definition: XMLSubSys.cpp:58
static MsgHandler * getErrorInstance()
Returns the instance to add errors to.
Definition: MsgHandler.cpp:80
bool checkOptions()
static void insertRandOptions()
Initialises the given options container with random number options.
Definition: RandHelper.cpp:53
static void getOptions(const bool commandLineOnly=false)
Parses the command line arguments and loads the configuration.
Definition: OptionsIO.cpp:72
static bool parseDepartSpeed(const std::string &val, const std::string &element, const std::string &id, SUMOReal &speed, DepartSpeedDefinition &dsd, std::string &error)
Validates a given departSpeed value.
static void addReportOptions(OptionsCont &oc)
Adds reporting options to the given container.
Definition: SystemFrame.cpp:76
static bool parseArrivalPos(const std::string &val, const std::string &element, const std::string &id, SUMOReal &pos, ArrivalPosDefinition &apd, std::string &error)
Validates a given arrivalPos value.
SUMOReal getNumLoaded() const
Returns the number of loaded vehicles.
Definition: ODMatrix.cpp:500
ArrivalLaneDefinition arrivalLaneProcedure
Information how the vehicle shall choose the lane to arrive on.
static void setValidation(const std::string &validationScheme, const std::string &netValidationScheme)
Enables or disables validation.
Definition: XMLSubSys.cpp:69
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.
SUMOReal departSpeed
(optional) The initial speed of the vehicle
void setApplicationDescription(const std::string &appDesc)
Sets the application description.
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
SUMOReal arrivalSpeed
(optional) The final speed of the vehicle (not used yet)
SUMOReal arrivalPos
(optional) The position the vehicle shall arrive on
ArrivalSpeedDefinition arrivalSpeedProcedure
Information how the vehicle&#39;s end speed shall be chosen.
static void close()
Closes all of an applications subsystems.
static void addConfigurationOptions(OptionsCont &oc)
Adds configuration options to the given container.
Definition: SystemFrame.cpp:51
static void setArgs(int argc, char **argv)
Stores the command line arguments for later parsing.
Definition: OptionsIO.cpp:65
static OptionsCont & getOptions()
Retrieves the options.
Definition: OptionsCont.cpp:69
static void initRandGlobal(MTRand *which=0)
Reads the given random number options and initialises the random number generator in accordance...
Definition: RandHelper.cpp:68
void loadMatrix(OptionsCont &oc)
read a matrix in one of several formats
Definition: ODMatrix.cpp:546
void addSynonyme(const std::string &name1, const std::string &name2, bool isDeprecated=false)
Adds a synonyme for an options name (any order)
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
DepartSpeedDefinition departSpeedProcedure
Information how the vehicle&#39;s initial speed shall be chosen.
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition: ToString.h:55
DepartPosDefinition departPosProcedure
Information how the vehicle shall choose the departure position.
An O/D (origin/destination) matrix.
Definition: ODMatrix.h:76
void fillOptions()
bool processMetaOptions(bool missingOptions)
Checks for help and configuration output, returns whether we should exit.
int arrivalLane
(optional) The lane the vehicle shall arrive on (not used yet)
SUMOReal getNumWritten() const
Returns the number of written vehicles.
Definition: ODMatrix.cpp:506
SUMOTime string2time(const std::string &r)
Definition: SUMOTime.cpp:47
A container for districts.
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.
#define VERSION_STRING
Definition: version.h:1
#define SUMOTIME_MAXSTRING
Definition: SUMOTime.h:46
static bool parseDepartPos(const std::string &val, const std::string &element, const std::string &id, SUMOReal &pos, DepartPosDefinition &dpd, std::string &error)
Validates a given departPos value.
int departLane
(optional) The lane the vehicle shall depart from (index in edge)
void loadDistricts(std::vector< std::string > files)
load districts from files
static bool parseArrivalSpeed(const std::string &val, const std::string &element, const std::string &id, SUMOReal &speed, ArrivalSpeedDefinition &asd, std::string &error)
Validates a given arrivalSpeed value.
#define WRITE_ERROR(msg)
Definition: MsgHandler.h:206
int main(int argc, char **argv)
Structure representing possible vehicle parameter.
static OutputDevice & getDeviceByOption(const std::string &name)
Returns the device described by the option.
void inform(std::string msg, bool addType=true)
adds a new error to the list
Definition: MsgHandler.cpp:89
A storage for options typed value containers)
Definition: OptionsCont.h:99
void applyCurve(const Distribution_Points &ps)
Splits the stored cells dividing them on the given time line.
Definition: ODMatrix.cpp:533
SUMOReal departPos
(optional) The position the vehicle shall depart from
static bool createDeviceByOption(const std::string &optionName, const std::string &rootElement="", const std::string &schemaFile="")
Creates the device using the output definition stored in the named option.
void write(SUMOTime begin, const SUMOTime end, OutputDevice &dev, const bool uniform, const bool differSourceSink, const bool noVtype, const std::string &prefix, const bool stepLog)
Writes the vehicles stored in the matrix assigning the sources and sinks.
Definition: ODMatrix.cpp:221
void addDescription(const std::string &name, const std::string &subtopic, const std::string &description)
Adds a description for an option.
#define WRITE_MESSAGE(msg)
Definition: MsgHandler.h:201
static void initOutputOptions()
Definition: MsgHandler.cpp:197
void writeFlows(const SUMOTime begin, const SUMOTime end, OutputDevice &dev, const bool noVtype, const std::string &prefix, bool asProbability=false)
Writes the flows stored in the matrix.
Definition: ODMatrix.cpp:291
ArrivalPosDefinition arrivalPosProcedure
Information how the vehicle shall choose the arrival position.
SUMOReal getNumDiscarded() const
Returns the number of discarded vehicles.
Definition: ODMatrix.cpp:512
Distribution_Points parseTimeLine(const std::vector< std::string > &def, bool timelineDayInHours)
split the given timeline
Definition: ODMatrix.cpp:609
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
int size() const
Returns the number of items within the container.
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.
void setApplicationName(const std::string &appName, const std::string &fullName)
Sets the application name.