62 nVehDeparted(0), nVehArrived(0), nVehEntered(0), nVehLeft(0),
63 nVehVaporized(0), nVehTeleported(0), waitSeconds(0), timeLoss(0),
64 nVehLaneChangeFrom(0), nVehLaneChangeTo(0),
65 frontSampleSeconds(0), frontTravelledDistance(0),
66 vehLengthSum(0), occupationSum(0),
83 nVehLaneChangeFrom = 0;
86 travelledDistance = 0;
89 frontSampleSeconds = 0;
90 frontTravelledDistance = 0;
131 const double timeOnLane,
const double ,
132 const double meanSpeedVehicleOnLane,
133 const double travelledDistanceFrontOnLane,
134 const double travelledDistanceVehicleOnLane,
135 const double meanLengthOnLane) {
136#ifdef DEBUG_OCCUPANCY
138 std::cout <<
SIMTIME <<
"\n MSMeanData_Net::MSLaneMeanDataValues::notifyMoveInternal()\n"
140 <<
", timeOnLane=" << timeOnLane
141 <<
", meanSpeedVehicleOnLane=" << meanSpeedVehicleOnLane
142 <<
",\ntravelledDistanceFrontOnLane=" << travelledDistanceFrontOnLane
143 <<
", travelledDistanceVehicleOnLane=" << travelledDistanceVehicleOnLane
144 <<
", meanLengthOnLane=" << meanLengthOnLane
148 if (myParent !=
nullptr && !myParent->vehicleApplies(veh)) {
151 sampleSeconds += timeOnLane;
152 travelledDistance += travelledDistanceVehicleOnLane;
162 occupationSum += meanLengthOnLane *
TS;
165 if (myParent !=
nullptr && (meanSpeedVehicleOnLane < myParent->
myHaltSpeed
167 waitSeconds += timeOnLane;
173 timeLoss += timeOnLane *
MAX2(0.0, vmax - meanSpeedVehicleOnLane) / vmax;
176 frontSampleSeconds += frontOnLane;
177 frontTravelledDistance += travelledDistanceFrontOnLane;
183#ifdef DEBUG_OCCUPANCY2
185 std::cout <<
SIMTIME <<
"ID: " << getDescription() <<
" minVehicleLength=" << minimalVehicleLength << std::endl;
192 if ((myParent ==
nullptr || myParent->vehicleApplies(veh)) && (
193 getLane() ==
nullptr || !veh.
isVehicle() || getLane() ==
static_cast<MSVehicle&
>(veh).getLane())) {
198 removeFromVehicleUpdateValues(veh);
203 ++nVehLaneChangeFrom;
223#ifdef DEBUG_NOTIFY_ENTER
224 std::cout <<
"\n" <<
SIMTIME <<
" MSMeanData_Net::MSLaneMeanDataValues: veh '" << veh.
getID() <<
"' enters lane '" << enteredLane->
getID() <<
"'" << std::endl;
228 if (myParent ==
nullptr || myParent->vehicleApplies(veh)) {
229 if (getLane() ==
nullptr || !veh.
isVehicle() || getLane() ==
static_cast<MSVehicle&
>(veh).getLane()) {
249 return sampleSeconds == 0 && nVehDeparted == 0 && nVehArrived == 0 && nVehEntered == 0
250 && nVehLeft == 0 && nVehVaporized == 0 && nVehTeleported == 0 && nVehLaneChangeFrom == 0 && nVehLaneChangeTo == 0;
255 return occupationSum /
STEPS2TIME(period) / myLaneLength / (double)numLanes * 100.;
260 const int numLanes,
const double speedLimit,
const double defaultTravelTime,
const int numVehicles)
const {
262 double density = frontSampleSeconds /
STEPS2TIME(period) * 1000. / myLaneLength;
263 double overlapDensity = sampleSeconds /
STEPS2TIME(period) * 1000. / myLaneLength;
266 density =
MIN2(density, 1000 * (
double)numLanes /
MAX2(minimalVehicleLength, NUMERICAL_EPS));
267 overlapDensity =
MIN2(overlapDensity, 1000 * (
double)numLanes /
MAX2(minimalVehicleLength, NUMERICAL_EPS));
269 const double laneDensity = density / (double)numLanes;
270 const double occupancy = getOccupancy(period, numLanes);
271#ifdef DEBUG_OCCUPANCY2
273 if (occupancy > 100) {
274 std::cout <<
SIMTIME <<
" Encountered bad occupancy: " << occupancy
275 <<
", myLaneLength=" << myLaneLength <<
", period=" <<
STEPS2TIME(period) <<
", occupationSum=" << occupationSum
279 std::cout <<
SIMTIME <<
"ID: " << getDescription() <<
" minVehicleLength=" << minimalVehicleLength
280 <<
"\ndensity=" << density <<
"\n";
283 if (myParent ==
nullptr) {
284 const double speed = sampleSeconds == 0 ? 0. : travelledDistance / sampleSeconds;
285 const double frontSpeed = frontSampleSeconds == 0 ? 0. : frontTravelledDistance / frontSampleSeconds;
293 attributeMask, sampleSeconds == 0);
305 const bool haveSamples = sampleSeconds > myParent->myMinSamples;
306 const bool haveFrontSamples = frontSampleSeconds > myParent->myMinSamples;
307 const bool haveSamplesOrDefault = haveSamples || defaultTravelTime >= 0.;
308 bool haveTravelTime = haveSamplesOrDefault;
309 double traveltime = myParent->myMaxTravelTime;
311 if (numVehicles > 0) {
312 traveltime = sampleSeconds / numVehicles;
314 traveltime = myParent->myMaxTravelTime;
315 if (frontTravelledDistance > NUMERICAL_EPS) {
316 traveltime =
MIN2(traveltime, myLaneLength * frontSampleSeconds / frontTravelledDistance);
317 }
else if (defaultTravelTime >= 0.) {
318 traveltime = defaultTravelTime;
320 haveTravelTime =
false;
323 }
else if (defaultTravelTime >= 0.) {
324 traveltime = defaultTravelTime;
327 double overlapTraveltime = myParent->myMaxTravelTime;
328 if (travelledDistance > 0.) {
331 overlapTraveltime =
MIN2(overlapTraveltime, (myLaneLength + vehLengthSum / sampleSeconds) * sampleSeconds / travelledDistance);
341 double frontSpeed = 0.;
343 speed = travelledDistance / sampleSeconds;
344 }
else if (defaultTravelTime > 0.) {
345 speed = myLaneLength / defaultTravelTime;
347 if (haveFrontSamples) {
348 frontSpeed = frontTravelledDistance / frontSampleSeconds;
349 }
else if (defaultTravelTime > 0.) {
350 frontSpeed = myLaneLength / defaultTravelTime;
369 const SUMOTime period,
const double numLanes,
const double speedLimit)
const {
373 return MIN2(frontSampleSeconds /
STEPS2TIME(period) * (
double) 1000 / myLaneLength,
374 1000. * numLanes /
MAX2(minimalVehicleLength, NUMERICAL_EPS));
376 const double density =
MIN2(frontSampleSeconds /
STEPS2TIME(period) * (
double) 1000 / myLaneLength,
377 1000. * numLanes /
MAX2(minimalVehicleLength, NUMERICAL_EPS));
378 return density / numLanes;
381 const double overlapDensity =
MIN2(sampleSeconds /
STEPS2TIME(period) * (
double) 1000 / myLaneLength,
382 1000. * numLanes /
MAX2(minimalVehicleLength, NUMERICAL_EPS));
383 return overlapDensity / numLanes;
386 return occupationSum /
STEPS2TIME(period) / myLaneLength / numLanes * (double) 1000;
392 return travelledDistance / sampleSeconds;
394 return speedLimit == 0. ? 0. : travelledDistance / sampleSeconds / speedLimit;
404 return nVehVaporized;
406 return nVehTeleported;
408 const double density =
MIN2(frontSampleSeconds /
STEPS2TIME(period) * (
double) 1000 / myLaneLength,
409 1000. * numLanes /
MAX2(minimalVehicleLength, NUMERICAL_EPS));
410 const double speed = frontTravelledDistance / frontSampleSeconds;
411 return density * speed * 3.6;
414 return frontTravelledDistance;
426 const SUMOTime dumpEnd,
const bool useLanes,
427 const std::string& excludeEmpty,
428 const bool withInternal,
429 const bool trackVehicles,
430 const int detectPersons,
431 const double maxTravelTime,
432 const double minSamples,
433 const double haltSpeed,
434 const double haltSpeedRel,
435 const std::string& vTypes,
436 const std::string& writeAttributes,
437 const std::vector<MSEdge*>& edges,
439 MSMeanData(id, dumpBegin, dumpEnd, useLanes, excludeEmpty,
440 withInternal, trackVehicles, detectPersons, maxTravelTime, minSamples, vTypes, writeAttributes, edges, aggregate),
455std::vector<std::string>
457 std::vector<std::string> result;
std::bitset< 96 > SumoXMLAttrMask
AggregateType
Numbers representing special SUMO-XML-attribute values Information on edgeData/laneData output should...
SumoXMLAttr
Numbers representing SUMO-XML - attributes.
@ SUMO_ATTR_OVERLAPDENSITY
@ SUMO_ATTR_OVERLAPTRAVELTIME
@ SUMO_ATTR_LANECHANGEDFROM
@ SUMO_ATTR_LANECHANGEDTO
const double INVALID_DOUBLE
invalid double
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
double getSpeedLimit() const
Returns the speed limit of the edge @caution The speed limit of the first lane is retured; should pro...
double getVehicleMaxSpeed(const SUMOTrafficObject *const veh) const
Returns the maximum speed the vehicle may use on this edge.
static double gLateralResolution
static int gNumSimThreads
how many threads to use for simulation
Representation of a lane in the micro simulation.
double getVehicleMaxSpeed(const SUMOTrafficObject *const veh) const
Returns the lane's maximum speed, given a vehicle's speed limit adaptation.
Data structure for mean (aggregated) edge/lane values.
double travelledDistance
The sum of the distances the vehicles travelled.
MeanDataValues * getSubData()
Data structure for mean (aggregated) edge/lane values.
bool notifyLeave(SUMOTrafficObject &veh, double lastPos, MSMoveReminder::Notification reason, const MSLane *enteredLane=0)
Called if the vehicle leaves the reminder's lane.
double frontTravelledDistance
The travelled distance regarding the vehicle front.
void addTo(MSMeanData::MeanDataValues &val) const
Add the values of this to the given one and store them there.
void write(OutputDevice &dev, const SumoXMLAttrMask &attributeMask, const SUMOTime period, const int numLanes, const double speedLimit, const double defaultTravelTime, const int numVehicles=-1) const
Writes output values into the given stream.
int nVehLaneChangeTo
The number of vehicles that changed to this lane.
double getAttributeValue(SumoXMLAttr a, const SUMOTime period, const double numLanes, const double speedLimit) const
return attribute value
int nVehVaporized
The number of vehicles that left this lane via vaporization within the sample interval.
double minimalVehicleLength
minimal vehicle length in the current interval (used to determine a maximal density,...
double getOccupancy(SUMOTime period, int numLanes) const
bool isEmpty() const
Returns whether any data was collected.
bool notifyEnter(SUMOTrafficObject &veh, MSMoveReminder::Notification reason, const MSLane *enteredLane=0)
Computes current values and adds them to their sums.
MSLaneMeanDataValues(MSLane *const lane, const double length, const bool doAdd, const MSMeanData_Net *parent)
Constructor.
void notifyMoveInternal(const SUMOTrafficObject &veh, const double frontOnLane, const double timeOnLane, const double, const double meanSpeedVehicleOnLane, const double travelledDistanceFrontOnLane, const double travelledDistanceVehicleOnLane, const double meanLengthOnLane)
Internal notification about the vehicle moves.
int nVehLeft
The number of vehicles that left this lane within the sample interval.
int nVehLaneChangeFrom
The number of vehicles that changed from this lane.
int nVehTeleported
The number of vehicles that left this lane via teleporting within the sample interval.
double timeLoss
The time loss accrued by vehicle probes.
double frontSampleSeconds
The number of vehicle probes regarding the vehicle front.
int nVehArrived
The number of vehicles that finished on the lane.
double waitSeconds
The number of vehicle probes with small speed.
virtual ~MSLaneMeanDataValues()
Destructor.
double occupationSum
The sum of the occupation of the lane.
int nVehEntered
The number of vehicles that entered this lane within the sample interval.
double vehLengthSum
The sum of the lengths the vehicles had.
void reset(bool afterWrite=false)
Resets values so they may be used for the next interval.
Network state mean data collector for edges/lanes.
virtual ~MSMeanData_Net()
Destructor.
static bool supports(const SumoXMLAttrMask &attributeMask)
check whether any of the given attributes can be calculated by this meandata
std::vector< std::string > getAttributeNames() const
return all attributes that are (potentially) written by this output
MSMeanData::MeanDataValues * createValues(MSLane *const lane, const double length, const bool doAdd) const
Create an instance of MeanDataValues.
const double myHaltSpeedRel
the minimum relative speed to consider a vehicle halting
MSMeanData_Net(const std::string &id, const SUMOTime dumpBegin, const SUMOTime dumpEnd, const bool useLanes, const std::string &excludeEmpty, const bool withInternal, const bool trackVehicles, const int detectPersons, const double maxTravelTime, const double minSamples, const double haltSpeed, const double haltSpeedRel, const std::string &vTypes, const std::string &writeAttributes, const std::vector< MSEdge * > &edges, AggregateType aggregate)
Constructor.
const double myHaltSpeed
the minimum speed to consider a vehicle halting
Data collector for edges/lanes.
MSMeanData * mySubData
more data collectors which write to the same output
Notification
Definition of a vehicle state.
@ NOTIFICATION_ARRIVED
The vehicle arrived at its destination (is deleted)
@ NOTIFICATION_TELEPORT_ARRIVED
The vehicle was teleported out of the net.
@ NOTIFICATION_VAPORIZED_CALIBRATOR
The vehicle got removed by a calibrator.
@ NOTIFICATION_DEPARTED
The vehicle has departed (was inserted into the network)
@ NOTIFICATION_SEGMENT
The vehicle changes the segment (meso only)
@ NOTIFICATION_LANE_CHANGE
The vehicle changes lanes (micro only)
@ NOTIFICATION_JUNCTION
The vehicle arrived at a junction.
@ NOTIFICATION_TELEPORT
The vehicle is being teleported.
Representation of a vehicle in the micro simulation.
double getLengthWithGap() const
Get vehicle's length including the minimum gap [m].
double getLength() const
Get vehicle's length [m].
void addTo(const StoringVisitor &cont) const
Adds this object to the given container.
const std::string & getID() const
Returns the id.
Static storage of an output device and its base (abstract) implementation.
OutputDevice & writeOptionalAttr(const SumoXMLAttr attr, const T &val, const bool isNull=false, const bool escape=false)
writes a named attribute unless null
bool closeTag(const std::string &comment="")
Closes the most recently opened tag and optionally adds a comment.
Representation of a vehicle, person, or container.
virtual bool isVehicle() const
Whether it is a vehicle.
virtual const MSEdge * getCurrentEdge() const =0
Returns the edge (normal or internal) the object is currently at.
virtual const MSVehicleType & getVehicleType() const =0
Returns the object's "vehicle" type.
virtual const MSLane * getLane() const =0
Returns the lane the object is currently at.
virtual SUMOTime getWaitingTime(const bool accumulated=false) const =0
virtual bool isStopped() const =0
Returns whether the object is at a stop.
virtual SUMOVehicleClass getVClass() const =0
Returns the object's access class.
virtual const MSEdge * getEdge() const =0
Returns the (normal) route edge the object is currently at.
A scoped lock which only triggers on condition.
#define UNUSED_PARAMETER(x)