54 #ifdef CHECK_MEMORY_LEAKS 56 #endif // CHECK_MEMORY_LEAKS 63 : myDistricts(dc), myNoLoaded(0), myNoWritten(0), myNoDiscarded(0) {}
76 SUMOTime end,
const std::string& origin,
const std::string& destination,
77 const std::string& vehicleType) {
80 WRITE_WARNING(
"Missing origin '" + origin +
"' and destination '" + destination +
"' (" +
toString(vehicleNumber) +
" vehicles).");
84 }
else if (
myDistricts.
get(destination) == 0 && vehicleNumber > 0) {
85 WRITE_ERROR(
"Missing destination '" + destination +
"' (" +
toString(vehicleNumber) +
" vehicles).");
89 WRITE_ERROR(
"District '" + origin +
"' has no source.");
92 WRITE_ERROR(
"District '" + destination +
"' has no sink.");
110 const std::pair<const std::string, const std::string>& od,
111 const std::string& vehicleType) {
113 std::vector<ODCell*>& odList =
myShortCut[od];
115 for (std::vector<ODCell*>::const_reverse_iterator c = odList.rbegin(); c != odList.rend(); ++c) {
116 if ((*c)->begin <= depart && (*c)->end > depart && (*c)->vehicleType == vehicleType) {
123 const int intervalIdx = (int)(depart / interval);
124 add(1., intervalIdx * interval, (intervalIdx + 1) * interval, od.first, od.second, vehicleType);
126 odList.push_back(cell);
136 size_t& vehName, std::vector<ODVehicle>& into,
137 const bool uniform,
const bool differSourceSink,
138 const std::string& prefix) {
144 if (vehicles2insert == 0) {
149 for (
int i = 0; i < vehicles2insert; ++i) {
162 }
while (canDiffer && differSourceSink && (veh.
to == veh.
from));
163 if (!canDiffer && differSourceSink && (veh.
to == veh.
from)) {
175 const ODCell*
const cell) {
181 if (oc.
isSet(
"departlane") && oc.
getString(
"departlane") !=
"default") {
184 if (oc.
isSet(
"departpos")) {
187 if (oc.
isSet(
"departspeed") && oc.
getString(
"departspeed") !=
"default") {
190 if (oc.
isSet(
"arrivallane")) {
193 if (oc.
isSet(
"arrivalpos")) {
196 if (oc.
isSet(
"arrivalspeed")) {
205 const bool differSourceSink,
const bool noVtype,
206 const std::string& prefix,
const bool stepLog) {
210 std::map<std::pair<std::string, std::string>,
SUMOReal> fractionLeft;
215 std::vector<ODCell*>::iterator next =
myContainer.begin();
216 std::vector<ODVehicle> vehicles;
219 for (
SUMOTime t = begin; t < end;) {
220 if (stepLog && t - lastOut >=
DELTA_T) {
221 std::cout <<
"Parsing time " +
time2string(t) <<
'\r';
225 bool changed =
false;
226 while (next !=
myContainer.end() && (*next)->begin <= t && (*next)->end > t) {
227 std::pair<std::string, std::string> odID = std::make_pair((*next)->origin, (*next)->destination);
229 if (fractionLeft.find(odID) != fractionLeft.end()) {
230 (*next)->vehicleNumber += fractionLeft[odID];
231 fractionLeft[odID] = 0;
234 const size_t oldSize = vehicles.size();
236 if (oldSize != vehicles.size()) {
240 fractionLeft[odID] = fraction;
247 for (std::vector<ODVehicle>::reverse_iterator i = vehicles.rbegin(); i != vehicles.rend() && (*i).depart == t; ++i) {
256 while (vehicles.size() != 0 && vehicles.back().depart == t) {
259 if (!vehicles.empty()) {
260 t = vehicles.back().depart;
262 if (next !=
myContainer.end() && (t > (*next)->begin || vehicles.empty())) {
265 if (next ==
myContainer.end() && vehicles.empty()) {
275 const std::string& prefix) {
283 const ODCell*
const c = *i;
284 if (c->
end > begin && c->
begin < end) {
300 if (line[0] !=
'*') {
310 if (time.find(
'.') == std::string::npos) {
313 std::string hours = time.substr(0, time.find(
'.'));
314 std::string minutes = time.substr(time.find(
'.') + 1);
319 std::pair<SUMOTime, SUMOTime>
327 throw ProcessError(
"Begin time is larger than end time.");
329 return std::make_pair(begin, end);
331 throw ProcessError(
"Broken period definition '" + line +
"'.");
333 throw ProcessError(
"Broken period definition '" + line +
"'.");
351 std::string vehType,
bool matrixHasVehType) {
355 if (matrixHasVehType) {
363 std::pair<SUMOTime, SUMOTime> times =
readTime(lr);
374 std::vector<std::string> names;
379 names.push_back(st2.
next());
381 }
while ((
int) names.size() != districtNo);
384 for (std::vector<std::string>::iterator si = names.begin(); si != names.end(); ++si) {
385 std::vector<std::string>::iterator di = names.begin();
389 if (line.length() == 0) {
395 assert(di != names.end());
397 if (vehNumber != 0) {
398 add(vehNumber, begin, end, *si, *di, vehType);
400 if (di == names.end()) {
401 throw ProcessError(
"More entries than districts found.");
406 throw ProcessError(
"Not numeric vehicle number in line '" + line +
"'.");
411 }
while (di != names.end());
419 std::string vehType,
bool matrixHasVehType) {
423 if (matrixHasVehType) {
432 std::pair<SUMOTime, SUMOTime> times =
readTime(lr);
442 if (line.length() == 0) {
446 if (st2.
size() == 0) {
450 std::string sourceD = st2.
next();
451 std::string destD = st2.
next();
453 if (vehNumber != 0) {
454 add(vehNumber, begin, end, sourceD, destD, vehType);
457 throw ProcessError(
"Missing at least one information in line '" + line +
"'.");
459 throw ProcessError(
"Not numeric vehicle number in line '" + line +
"'.");
487 for (
size_t i = 0; i < ps.
getAreaNo(); ++i) {
495 newCells.push_back(ncell);
504 for (std::vector<ODCell*>::iterator i = oldCells.begin(); i != oldCells.end(); ++i) {
505 std::vector<ODCell*> newCells;
507 copy(newCells.begin(), newCells.end(), back_inserter(
myContainer));
515 std::vector<std::string> files = oc.
getStringVector(
"od-matrix-files");
516 for (std::vector<std::string>::iterator i = files.begin(); i != files.end(); ++i) {
523 if (type.find(
';') != std::string::npos) {
524 type = type.substr(0, type.find(
';'));
527 if (type.length() > 1 && type[1] ==
'V') {
529 if (type.find(
'N') != std::string::npos) {
530 throw ProcessError(
"'" + *i +
"' does not contain the needed information about the time described.");
533 }
else if (type.length() > 1 && type[1] ==
'O') {
535 if (type.find(
'N') != std::string::npos) {
536 throw ProcessError(
"'" + *i +
"' does not contain the needed information about the time described.");
540 throw ProcessError(
"'" + *i +
"' uses an unknown matrix type '" + type +
"'.");
543 std::vector<std::string> amitranFiles = oc.
getStringVector(
"od-amitran-files");
544 for (std::vector<std::string>::iterator i = amitranFiles.begin(); i != amitranFiles.end(); ++i) {
546 throw ProcessError(
"Could not access matrix file '" + *i +
"' to load.");
561 std::vector<std::string> routeFiles = oc.
getStringVector(
"route-files");
562 for (std::vector<std::string>::iterator i = routeFiles.begin(); i != routeFiles.end(); ++i) {
564 throw ProcessError(
"Could not access route file '" + *i +
"' to load.");
578 bool interpolating = !timelineDayInHours;
581 if (timelineDayInHours) {
582 if (def.size() != 24) {
583 throw ProcessError(
"Assuming 24 entries for a day timeline, but got " +
toString(def.size()) +
".");
585 for (
int chour = 0; chour < 24; ++chour) {
592 while (i < def.size()) {
594 if (st2.
size() != 2) {
595 throw ProcessError(
"Broken time line definition: missing a value in '" + def[i - 1] +
"'.");
SUMOReal getNoLoaded() const
Returns the number of loaded vehicles.
SUMOReal myNoLoaded
Number of loaded vehicles.
void writeDefaultAttrs(OutputDevice &dev, const bool noVtype, const ODCell *const cell)
Helper function for flow and trip output writing the depart and arrival attributes.
OutputDevice & writeAttr(const SumoXMLAttr attr, const T &val)
writes a named attribute
Used for sorting the cells by the begin time they describe.
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) ...
SUMOReal computeDeparts(ODCell *cell, size_t &vehName, std::vector< ODVehicle > &into, const bool uniform, const bool differSourceSink, const std::string &prefix)
Computes the vehicle departs stored in the given cell and saves them in "into".
static bool isReadable(std::string path)
Checks whether the given file is readable.
bool readLine(LineHandler &lh)
Reads a single (the next) line from the file and reports it to the given LineHandler.
static SUMOReal _2SUMOReal(const E *const data)
static const int WHITECHARS
Retrieves a file linewise and reports the lines to a handler.
SUMOReal getAreaPerc(size_t index) const
SUMOReal myNoWritten
Number of written vehicles.
const ODDistrictCont & myDistricts
The districts to retrieve sources/sinks from.
SUMOReal getAreaEnd(size_t index) const
An internal representation of a single vehicle.
static SUMOReal rand()
Returns a random real number in [0, 1)
std::string time2string(SUMOTime t)
void add(SUMOReal vehicleNumber, SUMOTime begin, SUMOTime end, const std::string &origin, const std::string &destination, const std::string &vehicleType)
Builds a single cell from the given values, verifying them.
SUMOReal getFloat(const std::string &name) const
Returns the SUMOReal-value of the named option (only for Option_Float)
SAX-handler base for SUMO-files.
std::string from
The edge the vehicles shall start at.
static bool runParser(GenericSAXHandler &handler, const std::string &file, const bool isNet=false)
Runs the given handler on the given file; returns if everything's ok.
SUMOTime parseSingleTime(const std::string &time)
#define WRITE_WARNING(msg)
static OptionsCont & getOptions()
Retrieves the options.
void loadMatrix(OptionsCont &oc)
read a matrix in one of several formats
T get(const std::string &id) const
Retrieves an item.
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
#define PROGRESS_FAILED_MESSAGE()
unsigned int sinkNumber() const
Returns the number of sinks.
SUMOReal getNoDiscarded() const
Returns the number of discarded vehicles.
A single O/D-matrix cell.
void readV(LineReader &lr, SUMOReal scale, std::string vehType, bool matrixHasVehType)
read a VISUM-matrix with the V Format
std::string origin
Name of the origin district.
std::string getRandomSourceFromDistrict(const std::string &name) const
Returns the id of a random source from the named district.
A point in 2D or 3D with translation and scaling methods.
void readO(LineReader &lr, SUMOReal scale, std::string vehType, bool matrixHasVehType)
read a VISUM-matrix with the O Format
ODCell * cell
The cell of the ODMatrix which generated the vehicle.
void loadRoutes(OptionsCont &oc, SUMOSAXHandler &handler)
read SUMO routes
SUMOTime string2time(const std::string &r)
A container for districts.
SUMOReal getAreaBegin(size_t index) const
#define PROGRESS_BEGIN_MESSAGE(msg)
unsigned int sourceNumber() const
Returns the number of sources.
SUMOReal getNoWritten() const
Returns the number of written vehicles.
SUMOReal vehicleNumber
The number of vehicles.
Used for sorting vehicles by their departure (latest first)
std::map< SUMOTime, std::vector< std::string > > departures
mapping of departure times to departing vehicles, if already fixed
std::map< const std::pair< const std::string, const std::string >, std::vector< ODCell * > > myShortCut
The loaded cells indexed by origin and destination.
SUMOReal myNoDiscarded
Number of discarded vehicles.
std::vector< ODCell * > myContainer
The loaded cells.
std::string toString(const T &t, std::streamsize accuracy=OUTPUT_ACCURACY)
SUMOTime begin
The begin time this cell describes.
bool good() const
Returns the information whether the stream is readable.
void writeFlows(const SUMOTime begin, const SUMOTime end, OutputDevice &dev, const bool noVtype, const std::string &prefix)
Writes the flows stored in the matrix.
SUMOReal readFactor(LineReader &lr, SUMOReal scale)
std::string getFileName() const
Returns the name of the used file.
std::pair< SUMOTime, SUMOTime > readTime(LineReader &lr)
static int _2int(const E *const data)
std::string getNextNonCommentLine(LineReader &lr)
SUMOTime depart
The departure time of the vehicle.
static std::string prune(const std::string &str)
Removes trailing and leading whitechars.
A storage for options typed value containers)
An XML-Handler for districts.
void applyCurve(const Distribution_Points &ps)
Splits the stored cells dividing them on the given time line.
std::string vehicleType
Name of the vehicle type.
Static storage of an output device and its base (abstract) implementation.
std::string destination
Name of the destination district.
bool closeTag()
Closes the most recently opened tag.
bool hasMore() const
Returns whether another line may be read (the file was not read completely)
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.
std::string getRandomSinkFromDistrict(const std::string &name) const
Returns the id of a random sink from the named district.
SUMOTime end
The end time this cell describes.
#define PROGRESS_DONE_MESSAGE()
std::string to
The edge the vehicles shall end at.
ODMatrix(const ODDistrictCont &dc)
Constructor.
std::string id
The id of the vehicle.
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
Distribution_Points parseTimeLine(const std::vector< std::string > &def, bool timelineDayInHours)
split the given timeline
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.