62 const std::string& aXMLFilename,
63 const std::string& outputFilename,
64 const SUMOTime freq,
const double length,
66 const std::string& vTypes,
67 bool addLaneMeanData) :
73 myPos(pos), myProbe(probe),
74 myEdgeMeanData(nullptr, length, false, nullptr),
75 myMeanDataParent(id +
"_dummyMeanData", 0, 0, false, false, false, false, false, false, 1, 0, 0, vTypes),
76 myCurrentStateInterval(myIntervals.begin()),
77 myOutput(nullptr), myFrequency(freq), myRemoved(0),
78 myInserted(0), myClearedInJam(0),
79 mySpeedIsDefault(true), myDidSpeedAdaption(false), myDidInit(false),
80 myDefaultSpeed(myLane == nullptr ? myEdge->getSpeedLimit() : myLane->getSpeedLimit()),
81 myHaveWarnedAboutClearingJam(false),
83 if (outputFilename !=
"") {
87 if (aXMLFilename !=
"") {
93 if (addLaneMeanData) {
154 if (state.
begin < lastEnd) {
155 WRITE_ERROR(
"Overlapping or unsorted intervals in calibrator '" +
getID() +
"'.");
172 }
else if (
myLane !=
nullptr && (
175 WRITE_WARNING(
"Insertion lane may differ from calibrator lane for calibrator '" +
getID() +
"'.");
182 WRITE_ERROR(
"Mandatory attribute missing in definition of calibrator '" +
getID() +
"'.");
184 WRITE_ERROR(
"Non-numeric value for numeric attribute in definition of calibrator '" +
getID() +
"'.");
186 if (state.
q < 0 && state.
v < 0) {
187 WRITE_ERROR(
"Either 'vehsPerHour' or 'speed' has to be given in flow definition of calibrator '" +
getID() +
"'.");
250 return passed() / totalHourFraction;
271 if (vehicle !=
nullptr) {
276 WRITE_WARNING(
"Calibrator '" +
getID() +
"' could not remove vehicle '" + *it +
"'.");
328 #ifdef MSCalibrator_DEBUG 331 <<
" totalWished=" << totalWishedNum
332 <<
" adapted=" << adaptedNum
342 if (calibrateFlow && adaptedNum < totalWishedNum && !hadRemovals) {
350 const int insertionSlack =
MAX2(0, adaptedNum + relaxedInsertion - totalWishedNum);
352 #ifdef MSCalibrator_DEBUG 354 <<
" wished:" << wishedNum
355 <<
" slack:" << insertionSlack
356 <<
" before:" << adaptedNum
359 while (wishedNum > adaptedNum + insertionSlack) {
362 if (route ==
nullptr) {
365 if (route ==
nullptr) {
373 const int routeIndex = (int)std::distance(route->
begin(),
376 assert(route != 0 && vtype != 0);
380 newPars->
depart = currentTime;
386 newPars, route, vtype,
true,
false));
396 #ifdef MSCalibrator_DEBUG 397 std::cout <<
" resetting route pos: " << routeIndex <<
"\n";
402 throw ProcessError(
"Emission of vehicle '" + vehicle->
getID() +
"' in calibrator '" +
getID() +
"'failed!");
406 #ifdef MSCalibrator_DEBUG 411 #ifdef MSCalibrator_DEBUG 438 for (
int i = 0; i < numLanes; ++i) {
447 if (lane->getVehicleNumber() < 4) {
462 for (
int i = 0; i < numLanes; ++i) {
469 MSVehicle* last = lane->getLastFullVehicle();
473 if (last ==
nullptr) {
499 for (std::vector<MSMeanData_Net::MSLaneMeanDataValues*>::iterator it =
myLaneMeanData.begin();
506 if (myParent ==
nullptr) {
509 if (!myParent->vehicleApplies(veh)) {
512 if (myParent->isActive()) {
513 myParent->updateMeanData();
514 const bool calibrateFlow = myParent->myCurrentStateInterval->q >= 0;
515 const int totalWishedNum = myParent->totalWished();
516 int adaptedNum = myParent->passed() + myParent->myClearedInJam;
518 if (calibrateFlow && adaptedNum > totalWishedNum) {
519 #ifdef MSCalibrator_DEBUG 521 <<
" vaporizing " << vehicle->
getID() <<
" to reduce flow\n";
523 if (myParent->scheduleRemoval(vehicle)) {
524 myParent->myRemoved++;
526 }
else if (myParent->invalidJam(myLaneIndex)) {
527 #ifdef MSCalibrator_DEBUG 529 <<
" vaporizing " << vehicle->
getID() <<
" to clear jam\n";
531 if (!myParent->myHaveWarnedAboutClearingJam) {
532 WRITE_WARNING(
"Clearing jam at calibrator '" + myParent->getID() +
"' at time " 534 myParent->myHaveWarnedAboutClearingJam =
true;
536 if (myParent->scheduleRemoval(vehicle)) {
537 myParent->myClearedInJam++;
550 assert(discrepancy >= 0);
551 const std::string ds = (discrepancy > 0 ?
"\" vaporizedOnNextEdge=\"" +
toString(discrepancy) :
"");
552 const double durationSeconds =
STEPS2TIME(stopTime - startTime);
553 dev <<
" <interval begin=\"" <<
time2string(startTime) <<
555 "\" id=\"" <<
getID() <<
556 "\" nVehContrib=\"" << p <<
560 "\" flow=\"" << p * 3600.0 / durationSeconds <<
570 dev.
writeXMLHeader(
"calibratorstats",
"calibratorstats_file.xsd");
double getLengthWithGap() const
Get vehicle's length including the minimum gap [m].
int nVehEntered
The number of vehicles that entered this lane within the sample interval.
bool insertVehicle(SUMOVehicle &v, SUMOTime time, const bool checkOnly=false, const bool forceCheck=false) const
Tries to insert the given vehicle into the network.
virtual void myEndElement(int element)
Called when a closing tag occurs.
Representation of a vehicle in the micro simulation.
virtual void deleteVehicle(SUMOVehicle *v, bool discard=false)
Deletes the vehicle.
std::string vtypeid
The vehicle's type id.
int nVehVaporized
The number of vehicles that left this lane within the sample interval.
const MSRoute * getRoute() const
a flow definitio nusing a from-to edges instead of a route (used by router)
MSLane * getLane() const
Returns the lane the vehicle is on.
A calibrator placed over edge.
static std::vector< SUMOVehicleParameter * > LeftoverVehicleParameters
void setMaxSpeed(double val)
Sets a new maximum speed for the lane (used by TraCI and MSCalibrator)
virtual int passed() const
virtual void myEndElement(int element)
Called on the closing of a tag;.
Writes routes of vehicles passing a certain edge.
DepartLaneDefinition departLaneProcedure
Information how the vehicle shall choose the lane to depart from.
bool myDidSpeedAdaption
The information whether speed was adapted in the current interval.
MSVehicleType * getVType(const std::string &id=DEFAULT_VTYPE_ID, std::mt19937 *rng=nullptr)
Returns the named vehicle type or a sample from the named distribution.
double getPositionOnLane() const
Get the vehicle's position along the lane.
static SUMOVehicleParameter * parseVehicleAttributes(const SUMOSAXAttributes &attrs, const bool hardFail, const bool optionalID=false, const bool skipDepart=false, const bool isPerson=false)
Parses a vehicle's attributes.
SUMOVehicle * getVehicle(const std::string &id) const
Returns the vehicle with the given id.
Notification
Definition of a vehicle state.
std::string time2string(SUMOTime t)
bool myAmActive
whether the calibrator was active when last checking
virtual MSVehicle * removeVehicle(MSVehicle *remVehicle, MSMoveReminder::Notification notification, bool notify=true)
weights: time range begin
const std::vector< MSLane * > & getLanes() const
Returns this edge's lanes.
bool myDidInit
The information whether init was called.
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
double getLength() const
Returns the lane's length.
The vehicle got vaporized.
virtual bool addVehicle(const std::string &id, SUMOVehicle *v)
Tries to insert the vehicle into the internal vehicle container.
const std::string & getID() const
Returns the id.
SUMOTime myFrequency
The frequeny with which to check for calibration.
int myRemoved
The number of vehicles that were removed in the current interval.
friend class VehicleRemover
double getLength() const
return the length of the edge
double currentSpeed() const
measured speed in the current interval
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.
const std::string DEFAULT_VTYPE_ID
int myClearedInJam
The number of vehicles that were removed when clearin a jam.
double getSpeedLimit() const
Returns the speed limit of the edge The speed limit of the first lane is retured; should probably be...
SUMOTime getSUMOTimeReporting(int attr, const char *objectid, bool &ok, bool report=true) const
Tries to read given attribute assuming it is a SUMOTime.
const MSEdge *const myEdge
the edge on which this calibrator lies
virtual void myStartElement(int element, const SUMOSAXAttributes &attrs)
Called on the opening of a tag;.
Data structure for mean (aggregated) edge/lane values.
#define WRITE_WARNING(msg)
The car-following model and parameter.
const std::string & getID() const
int totalWished() const
number of vehicles expected to pass this interval
A road/street connecting two junctions.
int getIndex() const
Returns the lane's index.
DepartSpeedDefinition departSpeedProcedure
Information how the vehicle's initial speed shall be chosen.
void resetRoutePosition(int index, DepartLaneDefinition departLaneProcedure)
const MSCFModel & getCarFollowModel() const
Returns the vehicle type's car following model definition (const version)
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
std::vector< AspiredState >::const_iterator myCurrentStateInterval
Iterator pointing to the current interval.
An abstract device that changes the state of the micro simulation.
std::string routeid
The vehicle's route id.
The least occupied lane from lanes which allow the continuation.
Encapsulated SAX-Attributes.
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.
void writeXMLDetectorProlog(OutputDevice &dev) const
Open the XML-output.
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
virtual void addEvent(Command *operation, SUMOTime execTimeStep=-1)
Adds an Event.
The maximum safe speed is used.
double myDefaultSpeed
The default (maximum) speed on the segment.
No information given; use default.
bool mySpeedIsDefault
The information whether the speed adaption has been reset.
void onRemovalFromNet(const MSMoveReminder::Notification reason)
Called when the vehicle is removed from the network.
std::vector< AspiredState > myIntervals
List of adaptation intervals.
virtual void reset()
reset collected vehicle data
virtual void myStartElement(int element, const SUMOSAXAttributes &attrs)
Called on the opening of a tag;.
bool myHaveWarnedAboutClearingJam
The default (maximum) speed on the segment.
The rightmost lane the vehicle may use.
int departLane
(optional) The lane the vehicle shall depart from (index in edge)
void setDescription(const std::string &description)
MSEventControl * getEndOfTimestepEvents()
Returns the event control for events executed at the end of a time step.
double waitSeconds
The number of vehicle probes with small speed.
double getTravelledDistance() const
Returns the total travelled distance.
int nVehLeft
The number of vehicles that left this lane within the sample interval.
MSMeanData_Net myMeanDataParent
dummy parent to retrieve vType filter
MSLane *const myLane
the lane on which this calibrator lies (0 if the whole edge is covered at once)
int nVehArrived
The number of vehicles that finished on the lane.
bool invalidJam(int laneIndex) const
No information given; use default.
std::vector< MSMeanData_Net::MSLaneMeanDataValues * > myLaneMeanData
data collector for the calibrator
static std::vector< MSMoveReminder * > LeftoverReminders
T getOpt(int attr, const char *objectid, bool &ok, T defaultValue, bool report=true) const
Tries to read given attribute assuming it is an int.
Structure representing possible vehicle parameter.
Representation of a vehicle or person.
virtual bool notifyEnter(SUMOTrafficObject &veh, MSMoveReminder::Notification reason, const MSLane *enteredLane=0)
Checks whether the reminder is activated by a vehicle entering the lane.
virtual double getHeadwayTime() const
Get the driver's desired headway [s].
static OutputDevice & getDevice(const std::string &name)
Returns the described OutputDevice.
SUMOTime getOptSUMOTimeReporting(int attr, const char *objectid, bool &ok, SUMOTime defaultValue, bool report=true) const
Tries to read given attribute assuming it is a SUMOTime.
SUMOVehicleParameter * vehicleParameter
void setMaxSpeed(double val) const
Sets a new maximum speed for all lanes (used by TraCI and MSCalibrator)
const MSRouteProbe *const myProbe
the route probe to retrieve routes from
static void cleanup()
cleanup remaining data structures
OutputDevice * myOutput
The device for xml statistics.
virtual void updateMeanData()
aggregate lane values
virtual SUMOTime execute(SUMOTime currentTime)
Static storage of an output device and its base (abstract) implementation.
virtual double getSamples() const
Returns the number of collected sample seconds.
MSCalibrator(const std::string &id, const MSEdge *const edge, MSLane *lane, const double pos, const std::string &aXMLFilename, const std::string &outputFilename, const SUMOTime freq, const double length, const MSRouteProbe *probe, const std::string &vTypes, bool addLaneMeanData=true)
bool removePending()
remove any vehicles which are scheduled for removal. return true if removals took place ...
void reset(bool afterWrite=false)
Resets values so they may be used for the next interval.
MSMeanData_Net::MSLaneMeanDataValues myEdgeMeanData
accumlated data for the whole edge
MSRouteIterator begin() const
Returns the begin of the list of edges to pass.
The class responsible for building and deletion of vehicles.
bool isCurrentStateActive(SUMOTime time)
std::vector< VehicleRemover * > myVehicleRemovers
virtual SUMOVehicle * buildVehicle(SUMOVehicleParameter *defs, const MSRoute *route, MSVehicleType *type, const bool ignoreStopErrors, const bool fromRouteFile=true)
Builds a vehicle, increases the number of built vehicles.
int remainingVehicleCapacity(int laneIndex) const
const std::string & getID() const
Returns the name of the vehicle.
void writeXMLOutput(OutputDevice &dev, SUMOTime startTime, SUMOTime stopTime)
Write the generated output to the given device.
Representation of a lane in the micro simulation.
void scheduleVehicleRemoval(SUMOVehicle *veh, bool checkDuplicate=false)
Removes a vehicle after it has ended.
std::set< std::string > myToRemove
set of vehicle ids to remove
MSRouteIterator end() const
Returns the end of the list of edges to pass.
Parser and container for routes during their loading.
bool contains(const MSEdge *const edge) const
int myInserted
The number of vehicles that were inserted in the current interval.
Base of value-generating classes (detectors)
double currentFlow() const
flow in the current interval in veh/h
std::string id
The vehicle's id.
static bool dictionary(const std::string &id, const MSRoute *route)
Adds a route to the dictionary.