72ODMatrix::add(
double vehicleNumber,
const std::pair<SUMOTime, SUMOTime>& beginEnd,
73 const std::string& origin,
const std::string& destination,
74 const std::string& vehicleType,
const bool originIsEdge,
const bool destinationIsEdge,
76 if (vehicleNumber == 0) {
81 WRITE_WARNINGF(
TL(
"Missing origin '%' and destination '%' (% vehicles)."), origin, destination,
toString(vehicleNumber));
91 }
else if (!destinationIsEdge &&
myDistricts.
get(destination) == 0) {
107 cell->
begin = beginEnd.first;
108 cell->
end = beginEnd.second;
128 const std::string fromTaz = veh.
fromTaz;
129 const std::string toTaz = veh.
toTaz;
136 std::vector<ODCell*>& odList =
myShortCut[std::make_pair(fromTaz, toTaz)];
138 for (std::vector<ODCell*>::const_reverse_iterator c = odList.rbegin(); c != odList.rend(); ++c) {
139 if ((*c)->begin <= veh.
depart && (*c)->end > veh.
depart && (*c)->vehicleType == veh.
vtypeid) {
144 if (cell ==
nullptr) {
146 const int intervalIdx = (int)(veh.
depart / interval);
148 if (
add(1., std::make_pair(intervalIdx * interval, (intervalIdx + 1) * interval),
149 fromTaz, toTaz, veh.
vtypeid, originIsEdge, destinationIsEdge,
true)) {
151 odList.push_back(cell);
166 int& vehName, std::vector<ODVehicle>& into,
167 const bool uniform,
const bool differSourceSink,
168 const std::string& prefix) {
174 if (vehicles2insert == 0) {
178 const double offset = (double)(cell->
end - cell->
begin) / (double) vehicles2insert / (
double) 2.;
179 for (
int i = 0; i < vehicles2insert; ++i) {
192 }
while (canDiffer && differSourceSink && (veh.
to == veh.
from));
193 if (!canDiffer && differSourceSink && (veh.
to == veh.
from)) {
205 const ODCell*
const cell) {
211 if (oc.
isSet(
"departlane") && oc.
getString(
"departlane") !=
"default") {
214 if (oc.
isSet(
"departpos")) {
217 if (oc.
isSet(
"departspeed") && oc.
getString(
"departspeed") !=
"default") {
220 if (oc.
isSet(
"arrivallane")) {
223 if (oc.
isSet(
"arrivalpos")) {
226 if (oc.
isSet(
"arrivalspeed")) {
235 const bool differSourceSink,
const bool noVtype,
236 const std::string& prefix,
const bool stepLog,
237 bool pedestrians,
bool persontrips,
238 const std::string& modes) {
242 std::map<std::pair<std::string, std::string>,
double> fractionLeft;
247 std::vector<ODCell*>::iterator next =
myContainer.begin();
248 std::vector<ODVehicle> vehicles;
252 std::string personDepartPos = oc.
isSet(
"departpos") ? oc.
getString(
"departpos") :
"random";
253 std::string personArrivalPos = oc.
isSet(
"arrivalpos") ? oc.
getString(
"arrivalpos") :
"random";
256 const std::string vType = oc.
isSet(
"vtype") ? oc.
getString(
"vtype") :
"";
259 for (
SUMOTime t = begin; t < end;) {
260 if (stepLog && t - lastOut >=
DELTA_T) {
261 std::cout <<
"Parsing time " +
time2string(t) <<
'\r';
265 bool changed =
false;
266 while (next !=
myContainer.end() && (*next)->begin <= t && (*next)->end > t) {
267 std::pair<std::string, std::string> odID = std::make_pair((*next)->origin, (*next)->destination);
269 if (fractionLeft.find(odID) != fractionLeft.end()) {
270 (*next)->vehicleNumber += fractionLeft[odID];
271 fractionLeft[odID] = 0;
274 const int oldSize = (int)vehicles.size();
275 const double fraction =
computeDeparts(*next, vehName, vehicles, uniform, differSourceSink, prefix);
276 if (oldSize != (
int)vehicles.size()) {
280 fractionLeft[odID] = fraction;
288 for (std::vector<ODVehicle>::reverse_iterator i = vehicles.rbegin(); i != vehicles.rend() && (*i).depart == t; ++i) {
294 if (!noVtype && vType.size() > 0) {
304 }
else if (persontrips) {
326 while (vehicles.size() != 0 && vehicles.back().depart == t) {
329 if (!vehicles.empty()) {
330 t = vehicles.back().depart;
332 if (next !=
myContainer.end() && (t > (*next)->begin || vehicles.empty())) {
335 if (next ==
myContainer.end() && vehicles.empty()) {
345 const std::string& prefix,
348 bool pedestrians,
bool persontrips,
349 const std::string& modes) {
357 const ODCell*
const c = *i;
358 if (c->
end > begin && c->
begin < end) {
360 if (probability <= 0) {
369 }
else if (!asProbability) {
372 if (probability > 1) {
373 WRITE_WARNINGF(
TL(
"Flow density of % vehicles per second, cannot be represented with a simple probability. Falling back to even spacing."),
toString(probability));
386 }
else if (persontrips) {
391 }
else if (!asProbability) {
394 if (probability > 1) {
395 WRITE_WARNINGF(
TL(
"Flow density of % vehicles per second, cannot be represented with a simple probability. Falling back to even spacing."),
toString(probability));
418 }
else if (!asProbability) {
421 if (probability > 1) {
422 WRITE_WARNINGF(
TL(
"Flow density of % vehicles per second, cannot be represented with a simple probability. Falling back to even spacing."),
toString(probability));
441 const std::string line = lr.
readLine();
442 if (line[0] !=
'*') {
452 if (time.find(
'.') == std::string::npos) {
455 const std::string hours = time.substr(0, time.find(
'.'));
456 const std::string minutes = time.substr(time.find(
'.') + 1);
461std::pair<SUMOTime, SUMOTime>
471 return std::make_pair(begin, end);
475 throw ProcessError(
"Broken period definition '" + line +
"' (" + e.what() +
").");
494 std::string vehType,
bool matrixHasVehType) {
498 if (matrixHasVehType) {
505 const std::pair<SUMOTime, SUMOTime> beginEnd =
readTime(lr);
512 std::vector<std::string> names;
513 while ((
int)names.size() != numDistricts && lr.
hasMore()) {
517 names.push_back(st2.
next());
525 for (std::vector<std::string>::iterator si = names.begin(); si != names.end(); ++si) {
526 std::vector<std::string>::iterator di = names.begin();
533 if (line.length() == 0) {
539 assert(di != names.end());
541 if (vehNumber != 0) {
542 add(vehNumber, beginEnd, *si, *di, vehType);
544 if (di == names.end()) {
550 throw ProcessError(
TLF(
"Not numeric vehicle number in line '%'.", line));
555 }
while (di != names.end());
563 std::string vehType,
bool matrixHasVehType) {
567 if (matrixHasVehType) {
575 const std::pair<SUMOTime, SUMOTime> beginEnd =
readTime(lr);
581 if (line.length() == 0) {
585 if (st2.
size() == 0) {
589 std::string sourceD = st2.
next();
590 std::string destD = st2.
next();
592 if (vehNumber != 0) {
593 add(vehNumber, beginEnd, sourceD, destD, vehType);
596 throw ProcessError(
TLF(
"Missing at least one information in line '%'.", line));
598 throw ProcessError(
TLF(
"Not numeric vehicle number in line '%'.", line));
626 const std::vector<double>& times = ps.
getVals();
627 for (
int i = 0; i < (int)times.size() - 1; ++i) {
635 newCells.push_back(ncell);
644 for (std::vector<ODCell*>::iterator i = oldCells.begin(); i != oldCells.end(); ++i) {
645 std::vector<ODCell*> newCells;
647 copy(newCells.begin(), newCells.end(), back_inserter(
myContainer));
655 std::vector<std::string> files = oc.
getStringVector(
"od-matrix-files");
656 for (std::vector<std::string>::iterator i = files.begin(); i != files.end(); ++i) {
663 if (type.find(
';') != std::string::npos) {
664 type = type.substr(0, type.find(
';'));
667 if (type.length() > 1 && type[1] ==
'V') {
669 if (type.find(
'N') != std::string::npos) {
670 throw ProcessError(
TLF(
"'%' does not contain the needed information about the time described.", *i));
672 readV(lr, 1, oc.
getString(
"vtype"), type.find(
'M') != std::string::npos);
673 }
else if (type.length() > 1 && type[1] ==
'O') {
675 if (type.find(
'N') != std::string::npos) {
676 throw ProcessError(
TLF(
"'%' does not contain the needed information about the time described.", *i));
678 readO(lr, 1, oc.
getString(
"vtype"), type.find(
'M') != std::string::npos);
680 throw ProcessError(
"'" + *i +
"' uses an unknown matrix type '" + type +
"'.");
683 std::vector<std::string> amitranFiles = oc.
getStringVector(
"od-amitran-files");
684 for (std::vector<std::string>::iterator i = amitranFiles.begin(); i != amitranFiles.end(); ++i) {
686 throw ProcessError(
TLF(
"Could not access matrix file '%' to load.", *i));
699 throw ProcessError(
TLF(
"Could not access matrix file '%' to load.", file));
703 std::vector<SAXWeightsHandler::ToRetrieveDefinition*> retrieverDefs;
716 double val,
double beg,
double end) {
723 std::vector<std::string> routeFiles = oc.
getStringVector(
"route-files");
724 for (std::vector<std::string>::iterator i = routeFiles.begin(); i != routeFiles.end(); ++i) {
726 throw ProcessError(
TLF(
"Could not access route file '%' to load.", *i));
741 if (timelineDayInHours) {
742 if (def.size() != 24) {
745 for (
int chour = 0; chour < 24; ++chour) {
748 result.
add(24 * 3600., 0.);
750 for (
int i = 0; i < (int)def.size(); i++) {
752 if (st2.
size() != 2) {
753 throw ProcessError(
TLF(
"Broken time line definition: missing a value in '%'.", def[i]));
#define WRITE_WARNINGF(...)
#define WRITE_ERRORF(...)
#define PROGRESS_DONE_MESSAGE()
#define PROGRESS_FAILED_MESSAGE()
#define PROGRESS_BEGIN_MESSAGE(msg)
SUMOTime string2time(const std::string &r)
convert string to SUMOTime
std::string time2string(SUMOTime t, bool humanReadable)
convert SUMOTime to string (independently of global format setting)
@ SUMO_TAG_FLOW
a flow definition using from and to edges or a route
@ SUMO_TAG_TRIP
a single trip definition (used by router)
SumoXMLAttr
Numbers representing SUMO-XML - attributes.
@ SUMO_ATTR_FROM_JUNCTION
@ SUMO_ATTR_BEGIN
weights: time range begin
@ SUMO_ATTR_END
weights: time range end
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
static bool isReadable(std::string path)
Checks whether the given file is readable.
Retrieves a file linewise and reports the lines to a handler.
bool good() const
Returns the information whether the stream is readable.
bool readLine(LineHandler &lh)
Reads a single (the next) line from the file and reports it to the given LineHandler.
bool hasMore() const
Returns whether another line may be read (the file was not read completely)
std::string getFileName() const
Returns the name of the used file.
T get(const std::string &id) const
Retrieves an item.
An XML-Handler for districts.
A container for districts.
std::string getRandomSourceFromDistrict(const std::string &name) const
Returns the id of a random source from the named district.
std::string getRandomSinkFromDistrict(const std::string &name) const
Returns the id of a random sink from the named district.
int sourceNumber() const
Returns the number of sources.
int sinkNumber() const
Returns the number of sinks.
Used for sorting the cells by the begin time they describe.
Used for sorting vehicles by their departure (latest first)
void writeFlows(const SUMOTime begin, const SUMOTime end, OutputDevice &dev, const bool noVtype, const std::string &prefix, bool asProbability=false, bool asPoisson=false, bool pedestrians=false, bool persontrips=false, const std::string &modes="")
Writes the flows stored in the matrix.
double getNumLoaded() const
Returns the number of loaded vehicles.
void readV(LineReader &lr, double scale, std::string vehType, bool matrixHasVehType)
read a VISUM-matrix with the V Format
double readFactor(LineReader &lr, double scale)
double computeDeparts(ODCell *cell, int &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".
void addTazRelWeight(const std::string intervalID, const std::string &from, const std::string &to, double val, double beg, double end)
SUMOTime myBegin
parsed time bounds
SUMOTime parseSingleTime(const std::string &time)
double myScale
the scaling factor for traffic
void applyCurve(const Distribution_Points &ps)
Splits the stored cells dividing them on the given time line.
std::map< const std::pair< const std::string, const std::string >, std::vector< ODCell * > > myShortCut
The loaded cells indexed by origin and destination.
std::pair< SUMOTime, SUMOTime > readTime(LineReader &lr)
void readO(LineReader &lr, double scale, std::string vehType, bool matrixHasVehType)
read a VISUM-matrix with the O Format
std::set< std::string > myMissingDistricts
The missing districts already warned about.
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, bool pedestrians, bool persontrips, const std::string &modes)
Writes the vehicles stored in the matrix assigning the sources and sinks.
const ODDistrictCont & myDistricts
The districts to retrieve sources/sinks from.
Distribution_Points parseTimeLine(const std::vector< std::string > &def, bool timelineDayInHours)
split the given timeline
ODMatrix(const ODDistrictCont &dc, double scale)
Constructor.
void writeDefaultAttrs(OutputDevice &dev, const bool noVtype, const ODCell *const cell)
Helper function for flow and trip output writing the depart and arrival attributes.
double myNumLoaded
Number of loaded vehicles.
double myNumWritten
Number of written vehicles.
bool add(double vehicleNumber, const std::pair< SUMOTime, SUMOTime > &beginEnd, const std::string &origin, const std::string &destination, const std::string &vehicleType, const bool originIsEdge=false, const bool destinationIsEdge=false, bool noScaling=false)
Builds a single cell from the given values, verifying them.
void loadMatrix(OptionsCont &oc)
read a matrix in one of several formats
void loadRoutes(OptionsCont &oc, SUMOSAXHandler &handler)
read SUMO routes
double getNumWritten() const
Returns the number of written vehicles.
std::vector< ODCell * > myContainer
The loaded cells.
double myNumDiscarded
Number of discarded vehicles.
double getNumDiscarded() const
Returns the number of discarded vehicles.
std::string myVType
user-defined vType
std::string getNextNonCommentLine(LineReader &lr)
A storage for options typed value containers)
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
const StringVector & getStringVector(const std::string &name) const
Returns the list of string-value of the named option (only for Option_StringVector)
static OptionsCont & getOptions()
Retrieves the options.
Static storage of an output device and its base (abstract) implementation.
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
OutputDevice & writeAttr(const ATTR_TYPE &attr, const T &val, const bool isNull=false)
writes a named attribute
bool closeTag(const std::string &comment="")
Closes the most recently opened tag and optionally adds a comment.
void setPrecision(int precision=gPrecision)
Sets the precision or resets it to default.
static double rand(SumoRNG *rng=nullptr)
Returns a random real number in [0, 1)
double getOverallProb() const
Return the sum of the probabilites assigned to the members.
bool add(T val, double prob, bool checkDuplicates=true)
Adds a value with an assigned probability to the distribution.
const std::vector< T > & getVals() const
Returns the members of the distribution.
const std::vector< double > & getProbs() const
Returns the probabilities assigned to the members of the distribution.
Complete definition about what shall be retrieved and where to store it.
An XML-handler for network weights.
SAX-handler base for SUMO-files.
Structure representing possible vehicle parameter.
std::string vtypeid
The vehicle's type id.
std::string toTaz
The vehicle's destination zone (district)
std::string fromTaz
The vehicle's origin zone (district)
int size() const
returns the number of existing substrings
static const int WHITECHARS
identifier for splitting the given string at all whitespace characters
bool hasNext()
returns the information whether further substrings exist
std::string next()
returns the next substring when it exists. Otherwise the behaviour is undefined
static double toDouble(const std::string &sData)
converts a string into the double value described by it by calling the char-type converter
static std::string prune(const std::string &str)
Removes trailing and leading whitechars.
static std::string adjustDecimalValue(double value, int precision)
write with maximum precision if needed but remove trailing zeros
static int toInt(const std::string &sData)
converts a string into the integer value described by it by calling the char-type converter,...
static bool runParser(GenericSAXHandler &handler, const std::string &file, const bool isNet=false, const bool isRoute=false, const bool isExternal=false, const bool catchExceptions=true)
Runs the given handler on the given file; returns if everything's ok.
A single O/D-matrix cell.
std::string destination
Name of the destination district.
std::string vehicleType
Name of the vehicle type.
std::string origin
Name of the origin district.
double vehicleNumber
The number of vehicles.
bool originIsEdge
the origin "district" is an edge id
SUMOTime end
The end time this cell describes.
SUMOTime begin
The begin time this cell describes.
bool destinationIsEdge
the destination "district" is an edge id
An internal representation of a single vehicle.
SUMOTime depart
The departure time of the vehicle.
std::string from
The edge the vehicles shall start at.
ODCell * cell
The cell of the ODMatrix which generated the vehicle.
std::string to
The edge the vehicles shall end at.
std::string id
The id of the vehicle.