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;
128 const double timeOnLane,
const double ,
129 const double meanSpeedVehicleOnLane,
130 const double travelledDistanceFrontOnLane,
131 const double travelledDistanceVehicleOnLane,
132 const double meanLengthOnLane) {
133#ifdef DEBUG_OCCUPANCY
135 std::cout <<
SIMTIME <<
"\n MSMeanData_Net::MSLaneMeanDataValues::notifyMoveInternal()\n"
137 <<
", timeOnLane=" << timeOnLane
138 <<
", meanSpeedVehicleOnLane=" << meanSpeedVehicleOnLane
139 <<
",\ntravelledDistanceFrontOnLane=" << travelledDistanceFrontOnLane
140 <<
", travelledDistanceVehicleOnLane=" << travelledDistanceVehicleOnLane
141 <<
", meanLengthOnLane=" << meanLengthOnLane
145 if (myParent !=
nullptr && !myParent->vehicleApplies(veh)) {
148 sampleSeconds += timeOnLane;
149 travelledDistance += travelledDistanceVehicleOnLane;
159 occupationSum += meanLengthOnLane *
TS;
162 if (myParent !=
nullptr && meanSpeedVehicleOnLane < myParent->
myHaltSpeed) {
163 waitSeconds += timeOnLane;
169 timeLoss += timeOnLane *
MAX2(0.0, vmax - meanSpeedVehicleOnLane) / vmax;
172 frontSampleSeconds += frontOnLane;
173 frontTravelledDistance += travelledDistanceFrontOnLane;
179#ifdef DEBUG_OCCUPANCY2
181 std::cout <<
SIMTIME <<
"ID: " << getDescription() <<
" minVehicleLength=" << minimalVehicleLength << std::endl;
188 if ((myParent ==
nullptr || myParent->vehicleApplies(veh)) && (
189 getLane() ==
nullptr || !veh.
isVehicle() || getLane() ==
static_cast<MSVehicle&
>(veh).getLane())) {
194 removeFromVehicleUpdateValues(veh);
199 ++nVehLaneChangeFrom;
218#ifdef DEBUG_NOTIFY_ENTER
219 std::cout <<
"\n" <<
SIMTIME <<
" MSMeanData_Net::MSLaneMeanDataValues: veh '" << veh.
getID() <<
"' enters lane '" << enteredLane->
getID() <<
"'" << std::endl;
223 if (myParent ==
nullptr || myParent->vehicleApplies(veh)) {
224 if (getLane() ==
nullptr || !veh.
isVehicle() || getLane() ==
static_cast<MSVehicle&
>(veh).getLane()) {
244 return sampleSeconds == 0 && nVehDeparted == 0 && nVehArrived == 0 && nVehEntered == 0
245 && nVehLeft == 0 && nVehVaporized == 0 && nVehTeleported == 0 && nVehLaneChangeFrom == 0 && nVehLaneChangeTo == 0;
250 return occupationSum /
STEPS2TIME(period) / myLaneLength / (double)numLanes * 100.;
255 const int numLanes,
const double speedLimit,
const double defaultTravelTime,
const int numVehicles)
const {
257 double density = frontSampleSeconds /
STEPS2TIME(period) * 1000. / myLaneLength;
258 double overlapDensity = sampleSeconds /
STEPS2TIME(period) * 1000. / myLaneLength;
261 density =
MIN2(density, 1000 * (
double)numLanes /
MAX2(minimalVehicleLength, NUMERICAL_EPS));
262 overlapDensity =
MIN2(overlapDensity, 1000 * (
double)numLanes /
MAX2(minimalVehicleLength, NUMERICAL_EPS));
264 const double laneDensity = density / (double)numLanes;
265 const double occupancy = getOccupancy(period, numLanes);
266#ifdef DEBUG_OCCUPANCY2
268 if (occupancy > 100) {
269 std::cout <<
SIMTIME <<
" Encountered bad occupancy: " << occupancy
270 <<
", myLaneLength=" << myLaneLength <<
", period=" <<
STEPS2TIME(period) <<
", occupationSum=" << occupationSum
274 std::cout <<
SIMTIME <<
"ID: " << getDescription() <<
" minVehicleLength=" << minimalVehicleLength
275 <<
"\ndensity=" << density <<
"\n";
278 if (myParent ==
nullptr) {
279 const double speed = sampleSeconds == 0 ? 0. : travelledDistance / sampleSeconds;
280 const double frontSpeed = frontSampleSeconds == 0 ? 0. : frontTravelledDistance / frontSampleSeconds;
288 attributeMask, sampleSeconds == 0);
299 const bool haveSamples = sampleSeconds > myParent->myMinSamples;
300 const bool haveFrontSamples = frontSampleSeconds > myParent->myMinSamples;
301 const bool haveSamplesOrDefault = haveSamples || defaultTravelTime >= 0.;
302 bool haveTravelTime = haveSamplesOrDefault;
303 double traveltime = myParent->myMaxTravelTime;
305 if (numVehicles > 0) {
306 traveltime = sampleSeconds / numVehicles;
308 traveltime = myParent->myMaxTravelTime;
309 if (frontTravelledDistance > NUMERICAL_EPS) {
310 traveltime =
MIN2(traveltime, myLaneLength * frontSampleSeconds / frontTravelledDistance);
311 }
else if (defaultTravelTime >= 0.) {
312 traveltime = defaultTravelTime;
314 haveTravelTime =
false;
317 }
else if (defaultTravelTime >= 0.) {
318 traveltime = defaultTravelTime;
321 double overlapTraveltime = myParent->myMaxTravelTime;
322 if (travelledDistance > 0.) {
325 overlapTraveltime =
MIN2(overlapTraveltime, (myLaneLength + vehLengthSum / sampleSeconds) * sampleSeconds / travelledDistance);
335 double frontSpeed = 0.;
337 speed = travelledDistance / sampleSeconds;
338 }
else if (defaultTravelTime > 0.) {
339 speed = myLaneLength / defaultTravelTime;
341 if (haveFrontSamples) {
342 frontSpeed = frontTravelledDistance / frontSampleSeconds;
343 }
else if (defaultTravelTime > 0.) {
344 frontSpeed = myLaneLength / defaultTravelTime;
363 const SUMOTime period,
const double numLanes,
const double speedLimit)
const {
367 return MIN2(frontSampleSeconds /
STEPS2TIME(period) * (
double) 1000 / myLaneLength,
368 1000. * numLanes /
MAX2(minimalVehicleLength, NUMERICAL_EPS));
370 const double density =
MIN2(frontSampleSeconds /
STEPS2TIME(period) * (
double) 1000 / myLaneLength,
371 1000. * numLanes /
MAX2(minimalVehicleLength, NUMERICAL_EPS));
372 return density / numLanes;
375 const double overlapDensity =
MIN2(sampleSeconds /
STEPS2TIME(period) * (
double) 1000 / myLaneLength,
376 1000. * numLanes /
MAX2(minimalVehicleLength, NUMERICAL_EPS));
377 return overlapDensity / numLanes;
380 return occupationSum /
STEPS2TIME(period) / myLaneLength / numLanes * (double) 1000;
386 return travelledDistance / sampleSeconds;
388 return speedLimit == 0. ? 0. : travelledDistance / sampleSeconds / speedLimit;
398 return nVehVaporized;
400 return nVehTeleported;
402 const double density =
MIN2(frontSampleSeconds /
STEPS2TIME(period) * (
double) 1000 / myLaneLength,
403 1000. * numLanes /
MAX2(minimalVehicleLength, NUMERICAL_EPS));
404 const double speed = frontTravelledDistance / frontSampleSeconds;
405 return density * speed * 3.6;
417 const SUMOTime dumpEnd,
const bool useLanes,
418 const bool withEmpty,
const bool printDefaults,
419 const bool withInternal,
420 const bool trackVehicles,
421 const int detectPersons,
422 const double maxTravelTime,
423 const double minSamples,
424 const double haltSpeed,
425 const std::string& vTypes,
426 const std::string& writeAttributes,
427 const std::vector<MSEdge*>& edges,
429 MSMeanData(id, dumpBegin, dumpEnd, useLanes, withEmpty, printDefaults,
430 withInternal, trackVehicles, detectPersons, maxTravelTime, minSamples, vTypes, writeAttributes, edges, aggregate),
444std::vector<std::string>
446 std::vector<std::string> result;
467 double result = defaultValue;
469 if (edgeValues ==
nullptr) {
474 values = (*edgeValues)[lane->
getIndex()];
478 meanData->addTo(*sumData);
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 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 getSpeedLimit() const
Returns the lane's maximum allowed speed.
double getLength() const
Returns the lane's length.
double getVehicleMaxSpeed(const SUMOTrafficObject *const veh) const
Returns the lane's maximum speed, given a vehicle's speed limit adaptation.
int getIndex() const
Returns the lane's index.
MSEdge & getEdge() const
Returns the lane's edge.
Data structure for mean (aggregated) edge/lane values.
double travelledDistance
The sum of the distances the vehicles travelled.
virtual double getAttributeValue(SumoXMLAttr a, const SUMOTime period, const double numLanes, const double speedLimit) const
return attribute value
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.
double getAttributeValue(const MSLane *lane, SumoXMLAttr a, double defaultValue) const
return attribute value for the given lane
MSMeanData_Net(const std::string &id, const SUMOTime dumpBegin, const SUMOTime dumpEnd, const bool useLanes, const bool withEmpty, const bool printDefaults, const bool withInternal, const bool trackVehicles, const int detectPersons, const double maxTravelTime, const double minSamples, const double haltSpeed, const std::string &vTypes, const std::string &writeAttributes, const std::vector< MSEdge * > &edges, AggregateType aggregate)
Constructor.
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 myHaltSpeed
the minimum sample seconds
Data collector for edges/lanes.
const bool myAmEdgeBased
Information whether the output shall be edge-based (not lane-based)
const std::vector< MeanDataValues * > * getEdgeValues(const MSEdge *edge) const
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].
const std::string & getID() const
Returns the id.
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.
OutputDevice & writeOptionalAttr(const SumoXMLAttr attr, const T &val, const SumoXMLAttrMask &attributeMask, const bool isNull=false)
writes a named attribute unless filtered
Representation of a vehicle, person, or container.
virtual bool isVehicle() const
Whether it is a vehicle.
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 const MSEdge * getEdge() const =0
Returns the edge the object is currently at.
A scoped lock which only triggers on condition.
#define UNUSED_PARAMETER(x)