57 :
Named(id), myLaneID(laneID), myPosition(pos), myType(type), myRoutes(nullptr) {}
82 double distance = rd.
edges2Pass[0]->getFromJunction()->getPosition().distanceTo(rd.
edges2Pass.back()->getToJunction()->getPosition());
85 length += (*i)->getLength();
87 return (distance / length);
99 const std::vector<RODFRouteDesc>& routes =
myRoutes->
get();
100 std::vector<RODFEdge*> nextDetEdges;
101 std::set<ROEdge*> preSplitEdges;
102 for (std::vector<RODFRouteDesc>::const_iterator i = routes.begin(); i != routes.end(); ++i) {
104 bool hadSplit =
false;
107 if (find(nextDetEdges.begin(), nextDetEdges.end(), *j) == nextDetEdges.end()) {
108 nextDetEdges.push_back(static_cast<RODFEdge*>(*j));
114 preSplitEdges.insert(*j);
116 if ((*j)->getNumSuccessors() > 1) {
121 std::map<ROEdge*, double> inFlows;
123 for (std::vector<RODFEdge*>::const_iterator i = nextDetEdges.begin(); i != nextDetEdges.end(); ++i) {
124 std::set<ROEdge*> seen(preSplitEdges);
126 pending.push_back(*i);
128 while (!pending.empty()) {
129 ROEdge* e = pending.back();
137 pending.push_back(e2);
147 for (
SUMOTime time = startTime; time < endTime; time += stepOffset, ++index) {
149 double overallProb = 0;
151 for (std::vector<RODFEdge*>::const_iterator i = nextDetEdges.begin(); i != nextDetEdges.end(); ++i) {
152 double flow = detectors.
getAggFlowFor(*i, time, 60, flows) - inFlows[*i];
157 if (overallProb > 0) {
158 for (std::vector<RODFEdge*>::const_iterator i = nextDetEdges.begin(); i != nextDetEdges.end(); ++i) {
177 std::vector<RODFRouteDesc>& descs =
myRoutes->
get();
179 for (
SUMOTime time = startTime; time < endTime; time += stepOffset) {
181 std::map<ROEdge*, double> flowMap;
184 for (std::vector<RODFRouteDesc>::iterator ri = descs.begin(); ri != descs.end(); ++ri, index++) {
186 for (ROEdgeVector::iterator j = (*ri).edges2Pass.begin(); j != (*ri).edges2Pass.end() && prob > 0;) {
193 if (probs.size() == 0) {
198 const std::map<RODFEdge*, double>& tprobs = probs[(int)((time - startTime) / stepOffset)];
200 for (std::map<RODFEdge*, double>::const_iterator k = tprobs.begin(); k != tprobs.end(); ++k) {
201 if (find(j, (*ri).edges2Pass.end(), (*k).first) != (*ri).edges2Pass.end()) {
203 splitEdge = (*k).first;
207 if (splitEdge !=
nullptr) {
208 j = find(j, (*ri).edges2Pass.end(), splitEdge);
213 into[time]->add(index, prob);
214 (*ri).overallProb = prob;
220 const std::vector<RODFRouteDesc>&
238 const std::set<const RODFDetector*>&
244 const std::set<const RODFDetector*>&
279 bool includeUnusedRoutes,
282 double defaultSpeed)
const {
290 const std::vector<RODFRouteDesc>& routes =
myRoutes->
get();
292 bool isEmptyDist =
true;
293 for (std::vector<RODFRouteDesc>::const_iterator i = routes.begin(); i != routes.end(); ++i) {
294 if ((*i).overallProb > 0) {
298 for (std::vector<RODFRouteDesc>::const_iterator i = routes.begin(); i != routes.end(); ++i) {
301 }
else if ((*i).overallProb > 0 || includeUnusedRoutes) {
311 if (insertionsOnly || flows.
knows(
myID)) {
316 for (
SUMOTime time = startTime; time < endTime; time += stepOffset, index++) {
318 assert(index < (
int)mflows.size());
319 const FlowDef& srcFD = mflows[index];
323 const int numCars = (int)((srcFD.qPKW + srcFD.qLKW) * scale);
326 std::vector<SUMOTime> departures;
327 if (oc.
getBool(
"randomize-flows")) {
328 for (
int i = 0; i < numCars; ++i) {
331 std::sort(departures.begin(), departures.end());
333 for (
int i = 0; i < numCars; ++i) {
334 departures.push_back(time + (
SUMOTime)(stepOffset * i / (
double)numCars));
338 for (
int car = 0; car < numCars; ++car) {
343 if (destDist !=
nullptr) {
345 destIndex = destDist->
get();
351 if (srcFD.isLKW >= 1) {
352 srcFD.isLKW = srcFD.isLKW - 1.;
360 if (v <= 0 || v > 250) {
366 const SUMOTime ctime = departures[car];
379 if (oc.
isSet(
"departlane")) {
384 if (oc.
isSet(
"departpos")) {
385 std::string posDesc = oc.
getString(
"departpos");
386 if (posDesc.substr(0, 8) ==
"detector") {
388 if (posDesc.length() > 8) {
389 if (posDesc[8] ==
'+') {
391 }
else if (posDesc[8] ==
'-') {
404 if (oc.
isSet(
"departspeed")) {
409 if (oc.
isSet(
"arrivallane")) {
412 if (oc.
isSet(
"arrivalpos")) {
415 if (oc.
isSet(
"arrivalspeed")) {
418 if (destIndex >= 0) {
424 srcFD.isLKW += srcFD.fLKW;
449 SUMOTime stepOffset,
double defaultSpeed) {
454 for (
SUMOTime t = startTime; t < endTime; t += stepOffset, index++) {
455 assert(index < (
int)mflows.size());
456 const FlowDef& srcFD = mflows[index];
457 double speed =
MAX2(srcFD.vLKW, srcFD.vPKW);
458 if (speed <= 0 || speed > 250) {
459 speed = defaultSpeed;
461 speed = (double)(speed / 3.6);
481 for (std::vector<RODFDetector*>::iterator i = myDetectors.begin(); i != myDetectors.end(); ++i) {
489 if (myDetectorMap.find(dfd->
getID()) != myDetectorMap.end()) {
492 myDetectorMap[dfd->
getID()] = dfd;
493 myDetectors.push_back(dfd);
495 if (myDetectorEdgeMap.find(edgeid) == myDetectorEdgeMap.end()) {
496 myDetectorEdgeMap[edgeid] = std::vector<RODFDetector*>();
498 myDetectorEdgeMap[edgeid].push_back(dfd);
505 for (std::vector<RODFDetector*>::const_iterator i = myDetectors.begin(); i != myDetectors.end(); ++i) {
516 for (std::vector<RODFDetector*>::const_iterator i = myDetectors.begin(); i != myDetectors.end(); ++i) {
517 if ((*i)->hasRoutes()) {
525 const std::vector< RODFDetector*>&
535 for (std::vector<RODFDetector*>::const_iterator i = myDetectors.begin(); i != myDetectors.end(); ++i) {
537 switch ((*i)->getType()) {
563 for (std::vector<RODFDetector*>::const_iterator i = myDetectors.begin(); i != myDetectors.end(); ++i) {
565 switch ((*i)->getType()) {
591 std::vector<std::string> saved;
593 bool lastWasSaved =
true;
594 for (std::vector<RODFDetector*>::const_iterator i = myDetectors.begin(); i != myDetectors.end(); ++i) {
602 lastWasSaved = (*i)->writeRoutes(saved, out);
611 return *(myDetectorMap.find(
id)->second);
617 return *(myDetectorMap.find(
id)->second);
623 return myDetectorMap.find(
id) != myDetectorMap.end();
632 bool writeCalibrators,
633 bool includeUnusedRoutes,
635 bool insertionsOnly) {
637 for (std::vector<RODFDetector*>::const_iterator i = myDetectors.begin(); i != myDetectors.end(); ++i) {
638 (*i)->computeSplitProbabilities(&net, *
this, flows, startTime, endTime, stepOffset);
646 if (separateVTypeOutput) {
656 pkwType.
write(vTypeOut);
660 lkwType.
write(vTypeOut);
666 type.
write(vTypeOut);
671 for (std::vector<RODFDetector*>::const_iterator i = myDetectors.begin(); i != myDetectors.end(); ++i) {
675 std::string defFileName;
687 std::map<SUMOTime, RandomDistributor<int>* > dists;
688 if (!insertionsOnly && flows.
knows(det->
getID())) {
692 if (!det->
writeEmitterDefinition(defFileName, dists, flows, startTime, endTime, stepOffset, includeUnusedRoutes, scale, insertionsOnly, defaultSpeed)) {
705 if (separateVTypeOutput) {
732 for (std::vector<RODFDetector*>::const_iterator i = myDetectors.begin(); i != myDetectors.end(); ++i) {
735 const unsigned char col =
static_cast<unsigned char>(128 * flow / flows.
getMaxDetectorFlow() + 128);
737 switch ((*i)->getType()) {
764 if (edge ==
nullptr) {
770 assert(myDetectorEdgeMap.find(edge->
getID()) != myDetectorEdgeMap.end());
771 const std::vector<FlowDef>& flows =
static_cast<const RODFEdge*
>(edge)->getFlows();
773 for (std::vector<FlowDef>::const_iterator i = flows.begin(); i != flows.end(); ++i) {
775 if (srcFD.
qLKW >= 0) {
778 if (srcFD.
qPKW >= 0) {
805 const std::string& file,
811 for (std::vector<RODFDetector*>::const_iterator i = myDetectors.begin(); i != myDetectors.end(); ++i) {
817 double defaultSpeed = net !=
nullptr ? net->
getEdge(det->
getEdgeID())->getSpeedLimit() : (double) 200.;
829 for (std::vector<RODFDetector*>::const_iterator i = myDetectors.begin(); i != myDetectors.end(); ++i) {
844 bool singleFile,
bool friendly) {
847 for (std::vector<RODFDetector*>::const_iterator i = myDetectors.begin(); i != myDetectors.end(); ++i) {
851 double pos = det->
getPos();
875 std::map<std::string, RODFDetector*>::iterator ri1 = myDetectorMap.find(
id);
877 myDetectorMap.erase(ri1);
879 std::vector<RODFDetector*>::iterator ri2 =
880 find(myDetectors.begin(), myDetectors.end(), oldDet);
881 myDetectors.erase(ri2);
884 for (std::map<std::string, std::vector<RODFDetector*> >::iterator rr3 = myDetectorEdgeMap.begin(); !found && rr3 != myDetectorEdgeMap.end(); ++rr3) {
885 std::vector<RODFDetector*>& dets = (*rr3).second;
886 for (std::vector<RODFDetector*>::iterator ri3 = dets.begin(); !found && ri3 != dets.end();) {
887 if (*ri3 == oldDet) {
889 ri3 = dets.erase(ri3);
904 for (std::vector<RODFDetector*>::const_iterator i = myDetectors.begin(); i != myDetectors.end(); ++i) {
908 int noFollowerWithRoutes = 0;
909 int noPriorWithRoutes = 0;
911 std::set<const RODFDetector*>::const_iterator j;
912 for (j = prior.begin(); j != prior.end(); ++j) {
913 if (flows.
knows((*j)->getID())) {
917 for (j = follower.begin(); j != follower.end(); ++j) {
918 if (flows.
knows((*j)->getID())) {
919 ++noFollowerWithRoutes;
929 if (noPriorWithRoutes == (
int)prior.size()) {
935 if (noFollowerWithRoutes == (
int)follower.size()) {
946 for (std::vector<RODFDetector*>::const_iterator i = myDetectors.begin(); i != myDetectors.end(); ++i) {
947 if ((*i)->getEdgeID() == edge->
getID()) {
965 const std::vector<std::string>& oldids) {
967 const RODFDetector& first = getDetector(*(oldids.begin()));
971 for (std::vector<std::string>::const_iterator i = oldids.begin(); i != oldids.end(); ++i) {
double getFlowSumSecure(const std::string &id) const
RODFDetector & getModifiableDetector(const std::string &id) const
OutputDevice & writeAttr(const SumoXMLAttr attr, const T &val)
writes a named attribute
static const RGBColor BLUE
void close()
Closes the device and removes it from the dictionary.
const ROEdgeVector & getPredecessors() const
Returns the edge at the given position from the list of incoming edges.
bool detectorsHaveRoutes() const
bool writeEmitterDefinition(const std::string &file, const std::map< SUMOTime, RandomDistributor< int > * > &dists, const RODFDetectorFlows &flows, SUMOTime startTime, SUMOTime endTime, SUMOTime stepOffset, bool includeUnusedRoutes, double scale, bool insertionsOnly, double defaultSpeed) const
void addRoute(RODFRouteDesc &nrd)
std::string getEdgeID() const
Returns the id of the edge this detector is placed on.
void removeDetector(const std::string &id)
void saveRoutes(const std::string &file) const
int getNumSuccessors() const
Returns the number of edges this edge is connected to.
RODFDetectorType
Numerical representation of different detector types.
void save(const std::string &file) const
A calibrator placed over edge.
Structure representing possible vehicle parameter.
bool addDetector(RODFDetector *dfd)
double getAvgSpeedFactorPKW() const
void addRoutes(RODFRouteCont *routes)
const RODFDetector & getDetector(const std::string &id) const
std::vector< double > & getParameter()
Returns the parameters of this distribution.
static double rand(std::mt19937 *rng=0)
Returns a random real number in [0, 1)
std::string time2string(SUMOTime t)
ROEdgeVector edges2Pass
The edges the route is made of.
double getMaxSpeedFactorPKW() const
int getAggFlowFor(const ROEdge *edge, SUMOTime time, SUMOTime period, const RODFDetectorFlows &flows) const
void addPriorDetector(const RODFDetector *det)
bool hasDetector(ROEdge *edge) const
begin/end of the description of a Point of interest
const std::vector< RODFDetector * > & getDetectors() const
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
const std::string & getID() const
Returns the id.
void writeSpeedTrigger(const RODFNet *const net, const std::string &file, const RODFDetectorFlows &flows, SUMOTime startTime, SUMOTime endTime, SUMOTime stepOffset)
RODFDetectorType getType() const
Returns the type of the detector.
bool isDefault(const std::string &name) const
Returns the information whether the named option has still the default value.
const std::vector< RODFRouteDesc > & getRouteVector() const
bool knows(const std::string &det_id) const
const std::string DEFAULT_VTYPE_ID
RODFDetector(const std::string &id, const std::string &laneID, double pos, const RODFDetectorType type)
Constructor.
std::vector< RODFRouteDesc > & get()
Returns the container of stored routes.
A container for RODFDetectors.
#define UNUSED_PARAMETER(x)
const std::set< const RODFDetector * > & getFollowerDetectors() const
begin/end of the description of a route
void computeSplitProbabilities(const RODFNet *net, const RODFDetectorCon &detectors, const RODFDetectorFlows &flows, SUMOTime startTime, SUMOTime endTime, SUMOTime stepOffset)
static OptionsCont & getOptions()
Retrieves the options.
vehicle is a large transport vehicle
A not yet defined detector.
double getMaxDetectorFlow() const
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
bool writeRoutes(std::vector< std::string > &saved, OutputDevice &out)
double getMaxSpeedFactorLKW() const
static const RGBColor GREEN
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
std::vector< std::map< RODFEdge *, double > > mySplitProbabilities
const std::vector< std::map< RODFEdge *, double > > & getSplitProbabilities() const
OutputDevice & writeNonEmptyAttr(const SumoXMLAttr attr, const std::string &val)
writes a string attribute only if it is not the empty string and not the string "default" ...
bool knows(const std::string &id) const
static double toDouble(const std::string &sData)
converts a string into the double value described by it by calling the char-type converter ...
T get(std::mt19937 *which=0) const
Draw a sample of the distribution.
bool writeXMLHeader(const std::string &rootElement, const std::string &schemaFile, std::map< SumoXMLAttr, std::string > attrs=std::map< SumoXMLAttr, std::string >())
Writes an XML header with optional configuration.
const std::set< const RODFDetector * > & getPriorDetectors() const
std::vector< ROEdge * > ROEdgeVector
double computeDistanceFactor(const RODFRouteDesc &rd) const
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
A detector which had to be discarded (!!!)
const RODFDetector & getAnyDetectorForEdge(const RODFEdge *const edge) const
void writeValidationDetectors(const std::string &file, bool includeSources, bool singleFile, bool friendly)
void setSpeedFactorAndDev(SUMOVTypeParameter &type, double maxFactor, double avgFactor, double dev, bool forceDev)
~RODFDetector()
Destructor.
void clearDists(std::map< SUMOTime, RandomDistributor< int > * > &dists) const
Clears the given distributions map, deleting the timed distributions.
static int toInt(const std::string &sData)
converts a string into the integer value described by it by calling the char-type converter...
void saveAsPOIs(const std::string &file) const
static std::string escapeXML(const std::string &orig, const bool maskDoubleHyphen=false)
Replaces the standard escapes by their XML entities.
Definition of the traffic during a certain time containing the flows and speeds.
double getFloat(const std::string &name) const
Returns the double-value of the named option (only for Option_Float)
vehicle is a passenger car (a "normal" car)
A route within the DFROUTER.
double getAvgSpeedFactorLKW() const
A basic edge for routing applications.
Base class for objects which have an id.
const int VTYPEPARS_SPEEDFACTOR_SET
void writeEmitters(const std::string &file, const RODFDetectorFlows &flows, SUMOTime startTime, SUMOTime endTime, SUMOTime stepOffset, const RODFNet &net, bool writeCalibrators, bool includeUnusedRoutes, double scale, bool insertionsOnly)
int parametersSet
Information for the router which parameter were set.
const std::string & getLaneID() const
Returns the id of the lane this detector is placed on.
void writeSingleSpeedTrigger(const std::string &file, const RODFDetectorFlows &flows, SUMOTime startTime, SUMOTime endTime, SUMOTime stepOffset, double defaultSpeed)
bool detectorsHaveCompleteTypes() const
std::string myID
The name of the object.
void write(OutputDevice &dev) const
Writes the vtype.
trigger: the time of the step
static const RGBColor RED
named colors
std::map< std::string, RODFEdge * > myRoute2Edge
static OutputDevice & getDevice(const std::string &name)
Returns the described OutputDevice.
void guessEmptyFlows(RODFDetectorFlows &flows)
Class representing a detector within the DFROUTER.
A storage for options typed value containers)
A container for DFROUTER-routes.
double getOverallProb() const
Return the sum of the probabilites assigned to the members.
std::string routename
The name of the route.
void buildDestinationDistribution(const RODFDetectorCon &detectors, SUMOTime startTime, SUMOTime endTime, SUMOTime stepOffset, const RODFNet &net, std::map< SUMOTime, RandomDistributor< int > * > &into) const
const std::vector< FlowDef > & getFlowDefs(const std::string &id) const
void writeEmitterPOIs(const std::string &file, const RODFDetectorFlows &flows)
void setType(RODFDetectorType type)
std::set< const RODFDetector * > myPriorDetectors
Static storage of an output device and its base (abstract) implementation.
bool closeTag(const std::string &comment="")
Closes the most recently opened tag and optionally adds a comment.
static std::string getFilePath(const std::string &path)
Removes the file information from the given path.
std::set< const RODFDetector * > myFollowingDetectors
void writeEndRerouterDetectors(const std::string &file)
ROEdge * getEdge(const std::string &name) const
Retrieves an edge from the network.
void mesoJoin(const std::string &nid, const std::vector< std::string > &oldids)
void addRouteDesc(RODFRouteDesc &desc)
Adds a route to the container.
const int VTYPEPARS_VEHICLECLASS_SET
void addFollowingDetector(const RODFDetector *det)
Distribution_Parameterized speedFactor
The factor by which the maximum speed may deviate from the allowed max speed on the street...
double getPos() const
Returns the position at which the detector lies.
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
bool save(std::vector< std::string > &saved, const std::string &prependix, OutputDevice &out)
Saves routes.
trigger: a step description