LCOV - code coverage report
Current view: top level - src/mesosim - MESegment.h (source / functions) Hit Total Coverage
Test: lcov.info Lines: 34 47 72.3 %
Date: 2024-04-27 15:34:54 Functions: 0 6 0.0 %

          Line data    Source code
       1             : /****************************************************************************/
       2             : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
       3             : // Copyright (C) 2001-2024 German Aerospace Center (DLR) and others.
       4             : // This program and the accompanying materials are made available under the
       5             : // terms of the Eclipse Public License 2.0 which is available at
       6             : // https://www.eclipse.org/legal/epl-2.0/
       7             : // This Source Code may also be made available under the following Secondary
       8             : // Licenses when the conditions for such availability set forth in the Eclipse
       9             : // Public License 2.0 are satisfied: GNU General Public License, version 2
      10             : // or later which is available at
      11             : // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
      12             : // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
      13             : /****************************************************************************/
      14             : /// @file    MESegment.h
      15             : /// @author  Daniel Krajzewicz
      16             : /// @date    Tue, May 2005
      17             : ///
      18             : // A single mesoscopic segment (cell)
      19             : /****************************************************************************/
      20             : #pragma once
      21             : #include <config.h>
      22             : 
      23             : #include <vector>
      24             : #include <cassert>
      25             : #include <utils/common/SUMOVehicleClass.h>
      26             : #include <utils/common/Named.h>
      27             : #include <utils/common/SUMOTime.h>
      28             : #include <microsim/MSMoveReminder.h>
      29             : 
      30             : 
      31             : // ===========================================================================
      32             : // class declarations
      33             : // ===========================================================================
      34             : class MSEdge;
      35             : class MSLink;
      36             : class MSDetectorFileOutput;
      37             : class MSVehicleControl;
      38             : class MEVehicle;
      39             : class OutputDevice;
      40             : 
      41             : 
      42             : // ===========================================================================
      43             : // class definitions
      44             : // ===========================================================================
      45             : /**
      46             :  * @class MESegment
      47             :  * @brief A single mesoscopic segment (cell)
      48             :  */
      49             : class MESegment : public Named {
      50             : public:
      51             :     static const double DO_NOT_PATCH_JAM_THRESHOLD;
      52             :     static const int PARKING_QUEUE = -1;
      53             : 
      54             :     /// @brief edge type specific meso parameters
      55             :     struct MesoEdgeType {
      56             :         SUMOTime tauff;
      57             :         SUMOTime taufj;
      58             :         SUMOTime taujf;
      59             :         SUMOTime taujj;
      60             :         double jamThreshold;
      61             :         bool junctionControl;
      62             :         double tlsPenalty;
      63             :         double tlsFlowPenalty;
      64             :         SUMOTime minorPenalty;
      65             :         bool overtaking;
      66             :     };
      67             : 
      68             : 
      69             : private:
      70      645866 :     class Queue {
      71             :     public:
      72      625714 :         Queue(const SVCPermissions permissions) : myPermissions(permissions) {}
      73             :         inline int size() const {
      74   140074546 :             return (int)myVehicles.size();
      75             :         }
      76             :         inline const std::vector<MEVehicle*>& getVehicles() const {
      77      421702 :             return myVehicles;
      78             :         }
      79             :         MEVehicle* remove(MEVehicle* v);
      80             :         inline std::vector<MEVehicle*>& getModifiableVehicles() {
      81    33779100 :             return myVehicles;
      82             :         }
      83             :         inline double getOccupancy() const {
      84   174299742 :             return myOccupancy;
      85             :         }
      86             :         inline void setOccupancy(const double occ) {
      87    33777746 :             myOccupancy = occ;
      88         213 :         }
      89             :         inline bool allows(SUMOVehicleClass vclass) const {
      90    48876746 :             return (myPermissions & vclass) == vclass;
      91             :         }
      92             : 
      93             :         /// @brief return the next time at which a vehicle may enter this queue
      94             :         inline SUMOTime getEntryBlockTime() const {
      95    22450257 :             return myEntryBlockTime;
      96             :         }
      97             : 
      98             :         /// @brief set the next time at which a vehicle may enter this queue
      99             :         inline void setEntryBlockTime(SUMOTime entryBlockTime) {
     100    32979123 :             myEntryBlockTime = entryBlockTime;
     101    32979123 :         }
     102             : 
     103             :         inline SUMOTime getBlockTime() const {
     104    88876562 :             return myBlockTime;
     105             :         }
     106             :         inline void setBlockTime(SUMOTime t) {
     107         216 :             myBlockTime = t;
     108    32994868 :         }
     109             : 
     110             :         inline void setPermissions(SVCPermissions p) {
     111          48 :             myPermissions = p;
     112        1110 :         }
     113             : 
     114             :         void addDetector(MSMoveReminder* data);
     115             : 
     116             :         void addReminders(MEVehicle* veh) const;
     117             : 
     118             :     private:
     119             :         /// The vClass permissions for this queue
     120             :         SVCPermissions myPermissions;
     121             : 
     122             :         std::vector<MEVehicle*> myVehicles;
     123             : 
     124             :         /// @brief The occupied space (in m) in the queue
     125             :         double myOccupancy = 0.;
     126             : 
     127             :         /// @brief The block time for vehicles who wish to enter this queue
     128             :         SUMOTime myEntryBlockTime = SUMOTime_MIN;
     129             : 
     130             :         /// @brief The block time
     131             :         SUMOTime myBlockTime = -1;
     132             : 
     133             :         /// @brief The data collection for all kinds of detectors
     134             :         std::vector<MSMoveReminder*> myDetectorData;
     135             : 
     136             :     };
     137             : 
     138             : public:
     139             :     /** @brief constructor
     140             :      * @param[in] id The id of this segment (currently: "<EDGEID>:<SEGMENTNO>")
     141             :      * @param[in] parent The edge this segment is located within
     142             :      * @param[in] next The following segment (belonging to the same edge)
     143             :      * @param[in] length The segment's length
     144             :      * @param[in] speed The speed allowed on this segment
     145             :      * @param[in] idx The running index of this segment within the segment's edge
     146             :      * @param[in] multiQueue whether to install multiple queues on this segment
     147             :      * @param[in] edgeType edge type specific meso parameters such as the different taus
     148             :      */
     149             :     MESegment(const std::string& id,
     150             :               const MSEdge& parent, MESegment* next,
     151             :               const double length, const double speed,
     152             :               const int idx,
     153             :               const bool multiQueue,
     154             :               const MesoEdgeType& edgeType);
     155             : 
     156             :     /// @brief set model parameters (may be updated from additional file after network loading is complete)
     157             :     void initSegment(const MesoEdgeType& edgeType, const MSEdge& parent, const double capacity);
     158             : 
     159             :     /// @name Measure collection
     160             :     /// @{
     161             : 
     162             :     /** @brief Adds a data collector for a detector to this segment
     163             :      *
     164             :      * @param[in] data The data collector to add
     165             :      * @param[in] queueIndex The queue (aka lane) to use, -1 means all
     166             :      */
     167             :     void addDetector(MSMoveReminder* data, int queueIndex = -1);
     168             : 
     169             :     /** @brief Removes a data collector for a detector from this segment
     170             :      *
     171             :      * @param[in] data The data collector to remove
     172             :      * @note: currently not used
     173             :      */
     174             :     // void removeDetector(MSMoveReminder* data);
     175             : 
     176             :     /** @brief Updates data of a detector for one or all vehicle queues
     177             :      *
     178             :      * @param[in] data The detector data to update
     179             :      * @param[in] queueIndex The queue (aka lane) to use, -1 means all
     180             :      */
     181             :     void prepareDetectorForWriting(MSMoveReminder& data, int queueIndex = -1);
     182             :     /// @}
     183             : 
     184             :     /** @brief Returns whether the given vehicle would still fit into the segment
     185             :      *
     186             :      * @param[in] veh The vehicle to check space for
     187             :      * @param[in] entryTime The time at which the vehicle wants to enter
     188             :      * @param[out] qIdx The index of the queue the vehicle should choose
     189             :      * @param[in] init whether the check is done at insertion time
     190             :      * @return the earliest time a vehicle may be added to this segment
     191             :      */
     192             :     SUMOTime hasSpaceFor(const MEVehicle* const veh, const SUMOTime entryTime, int& qIdx, const bool init = false) const;
     193             : 
     194             :     /** @brief Inserts (emits) vehicle into the segment
     195             :      *
     196             :      * @param[in] veh The vehicle to emit
     197             :      * @param[in] time The emission time
     198             :      * @return Whether the emission was successful
     199             :      */
     200             :     bool initialise(MEVehicle* veh, SUMOTime time);
     201             : 
     202             :     /** @brief Returns the total number of cars on the segment
     203             :      *
     204             :      * @return the total number of cars on the segment
     205             :      */
     206           0 :     inline int getCarNumber() const {
     207   226510591 :         return myNumVehicles;
     208             :     }
     209             : 
     210             :     /// @brief return the number of queues
     211             :     inline int numQueues() const {
     212      560961 :         return (int)myQueues.size();
     213             :     }
     214             :     /** @brief Returns the cars in the queue with the given index for visualization
     215             :      * @return the Queue (XXX not thread-safe!)
     216             :      */
     217             :     inline const std::vector<MEVehicle*>& getQueue(int index) const {
     218             :         assert(index < (int)myQueues.size());
     219      421385 :         return myQueues[index].getVehicles();
     220             :     }
     221             : 
     222             :     /** @brief Returns the running index of the segment in the edge (0 is the most upstream).
     223             :      *
     224             :      * @return the running index of the segment in the edge
     225             :      */
     226             :     inline int getIndex() const {
     227     9833201 :         return myIndex;
     228             :     }
     229             : 
     230             :     /** @brief Returns the following segment on the same edge (0 if it is the last).
     231             :      *
     232             :      * @return the following segment on the same edge (0 if it is the last)
     233             :      */
     234             :     inline MESegment* getNextSegment() const {
     235   310991334 :         return myNextSegment;
     236             :     }
     237             : 
     238             :     /** @brief Returns the length of the segment in meters.
     239             :      *
     240             :      * @return the length of the segment
     241             :      */
     242             :     inline double getLength() const {
     243   138723273 :         return myLength;
     244             :     }
     245             : 
     246             :     /** @brief Returns the sum of the lengths of all usable lanes of the segment in meters.
     247             :      *
     248             :      * @return the capacity of the segment
     249             :      */
     250             :     inline double getCapacity() const {
     251         240 :         return myCapacity;
     252             :     }
     253             : 
     254             :     /** @brief Returns the occupany of the segment (the sum of the vehicle lengths + minGaps)
     255             :      *
     256             :      * @return the occupany of the segment in meters
     257             :      */
     258             :     inline double getBruttoOccupancy() const {
     259             :         double occ = 0.;
     260      359078 :         for (const Queue& q : myQueues) {
     261      180432 :             occ += q.getOccupancy();
     262             :         }
     263             :         return occ;
     264             :     }
     265             : 
     266             :     /** @brief Returns the relative occupany of the segment (percentage of road used))
     267             :      * @return the occupany of the segment in percent
     268             :      */
     269           0 :     inline double getRelativeOccupancy() const {
     270           0 :         return getBruttoOccupancy() / myCapacity;
     271             :     }
     272             : 
     273             :     /** @brief Returns the relative occupany of the segment (percentage of road used))
     274             :      * at which the segment is considered jammed
     275             :      * @return the jam threshold of the segment in percent
     276             :      */
     277             :     inline double getRelativeJamThreshold() const {
     278           0 :         return myJamThreshold / myCapacity;
     279             :     }
     280             : 
     281             :     /** @brief Returns the average speed of vehicles on the segment in meters per second.
     282             :      * If there is no vehicle on the segment it returns the maximum allowed speed
     283             :      * @param[in] useCache whether to use a cached value if available
     284             :      * @note this value is cached in myMeanSpeed. Since caching only takes place
     285             :      * once every simstep there is a potential for side-influences (i.e. GUI calls to
     286             :      * this method, ...) For that reason the simulation logic doesn't use the cache.
     287             :      * This shouldn't matter much for speed since it is only used during
     288             :      * initializsation of vehicles onto the segment.
     289             :      * @return the average speed on the segment
     290             :      */
     291             :     double getMeanSpeed(bool useCache) const;
     292             : 
     293             :     /// @brief wrapper to satisfy the FunctionBinding signature
     294           0 :     inline double getMeanSpeed() const {
     295    45111072 :         return getMeanSpeed(true);
     296             :     }
     297             : 
     298             : 
     299             :     void writeVehicles(OutputDevice& of) const;
     300             : 
     301             :     /** @brief Removes the given car from the edge's que
     302             :      *
     303             :      * @param[in] v The vehicle to remove
     304             :      * @param[in] leaveTime The time at which the vehicle is leaving the que
     305             :      * @param[in] reason The reason for removing to send to reminders
     306             :      * @return The next first vehicle to add to the net's que
     307             :      */
     308             :     MEVehicle* removeCar(MEVehicle* v, SUMOTime leaveTime, const MSMoveReminder::Notification reason);
     309             : 
     310             :     /** @brief Returns the link the given car will use when passing the next junction
     311             :      *
     312             :      * This returns non-zero values only for the last segment and only
     313             :      *  if junction control is enabled.
     314             :      *
     315             :      * @param[in] veh The vehicle in question
     316             :      * @param[in] tlsPenalty Whether the link should be returned for computing tlsPenalty
     317             :      * @return The link to use or 0 without junction control
     318             :      */
     319             :     MSLink* getLink(const MEVehicle* veh, bool tlsPenalty = false) const;
     320             : 
     321             :     /** @brief Returns whether the vehicle may use the next link
     322             :      *
     323             :      * In case of disabled junction control it returns always true.
     324             :      *
     325             :      * @param[in] veh The vehicle in question
     326             :      * @return Whether it may pass to the next segment
     327             :      */
     328             :     bool isOpen(const MEVehicle* veh) const;
     329             : 
     330             :     /** @brief Removes the vehicle from the segment, adapting its parameters
     331             :      *
     332             :      * @param[in] veh The vehicle in question
     333             :      * @param[in] next The subsequent segment for delay calculation
     334             :      * @param[in] time the leave time
     335             :      * @todo Isn't always time == veh->getEventTime?
     336             :      */
     337             :     void send(MEVehicle* veh, MESegment* const next, const int nextQIdx, SUMOTime time, const MSMoveReminder::Notification reason);
     338             : 
     339             :     /** @brief Adds the vehicle to the segment, adapting its parameters
     340             :      *
     341             :      * @param[in] veh The vehicle in question
     342             :      * @param[in] time the leave time
     343             :      * @param[in] isDepart whether the vehicle just departed
     344             :      * @todo Isn't always time == veh->getEventTime?
     345             :      */
     346             :     void receive(MEVehicle* veh, const int qIdx, SUMOTime time, const bool isDepart = false, const bool isTeleport = false, const bool newEdge = false);
     347             : 
     348             : 
     349             :     /** @brief tries to remove any car from this segment
     350             :      *
     351             :      * @param[in] currentTime the current time
     352             :      * @return Whether vaporization was successful
     353             :      * @note: cars removed via this method do NOT count as arrivals */
     354             :     bool vaporizeAnyCar(SUMOTime currentTime, const MSDetectorFileOutput* filter);
     355             : 
     356             :     /** @brief Returns the edge this segment belongs to
     357             :      * @return the edge this segment belongs to
     358             :      */
     359             :     inline const MSEdge& getEdge() const {
     360    98150192 :         return myEdge;
     361             :     }
     362             : 
     363             : 
     364             :     /** @brief reset mySpeed and patch the speed of
     365             :      * all vehicles in it. Also set/recompute myJamThreshold
     366             :      * @param[in] jamThresh follows the semantic of option meso-jam-threshold
     367             :      */
     368             :     void setSpeed(double newSpeed, SUMOTime currentTime, double jamThresh = DO_NOT_PATCH_JAM_THRESHOLD, int qIdx = -1);
     369             : 
     370             :     /** @brief Returns the (planned) time at which the next vehicle leaves this segment
     371             :      * @return The time the vehicle thinks it leaves
     372             :      */
     373             :     SUMOTime getEventTime() const;
     374             : 
     375             :     /// @brief Like getEventTime but returns seconds (for visualization)
     376           0 :     inline double getEventTimeSeconds() const {
     377           0 :         return STEPS2TIME(getEventTime());
     378             :     }
     379             : 
     380             :     /// @brief get the last headway time in seconds
     381           0 :     inline double getLastHeadwaySeconds() const {
     382           0 :         return STEPS2TIME(myLastHeadway);
     383             :     }
     384             : 
     385             :     /// @brief get the earliest entry time in seconds
     386           0 :     inline double getEntryBlockTimeSeconds() const {
     387             :         SUMOTime t = SUMOTime_MAX;
     388           0 :         for (const Queue& q : myQueues) {
     389             :             t = MIN2(t, q.getEntryBlockTime());
     390             :         }
     391           0 :         return STEPS2TIME(t);
     392             :     }
     393             : 
     394             :     /// @brief Get the waiting time for vehicles in all queues
     395             :     double getWaitingSeconds() const;
     396             : 
     397             :     /// @name State saving/loading
     398             :     /// @{
     399             : 
     400             :     /** @brief Saves the state of this segment into the given stream
     401             :      *
     402             :      * Some internal values which must be restored are saved as well as ids of
     403             :      *  the vehicles stored in internal queues and the last departures of connected
     404             :      *  edges.
     405             :      *
     406             :      * @param[in, filled] out The (possibly binary) device to write the state into
     407             :      * @todo What about throwing an IOError?
     408             :      */
     409             :     void saveState(OutputDevice& out) const;
     410             : 
     411             :     /** @brief Remove all vehicles before quick-loading state */
     412             :     void clearState();
     413             : 
     414             :     /** @brief Loads the state of this segment with the given parameters
     415             :      *
     416             :      * This method is called for every internal que the segment has.
     417             :      *  Every vehicle is retrieved from the given MSVehicleControl and added to this
     418             :      *  segment. Then, the internal queues that store vehicles dependant to their next
     419             :      *  edge are filled the same way. Then, the departure of last vehicles onto the next
     420             :      *  edge are restored.
     421             :      *
     422             :      * @param[in] vehIDs The vehicle ids for the current que
     423             :      * @param[in] vc The vehicle control to retrieve references vehicles from
     424             :      * @param[in] blockTime The time the last vehicle left the que
     425             :      * @param[in] queIdx The index of the current que
     426             :      * @todo What about throwing an IOError?
     427             :      * @todo What about throwing an error if something else fails (a vehicle can not be referenced)?
     428             :      */
     429             :     void loadState(const std::vector<std::string>& vehIDs, MSVehicleControl& vc, const SUMOTime blockTime, const int queIdx);
     430             :     /// @}
     431             : 
     432             : 
     433             :     /** @brief returns all vehicles (for debugging)
     434             :      */
     435             :     std::vector<const MEVehicle*> getVehicles() const;
     436             : 
     437             :     /** @brief returns flow based on headway
     438             :      * @note: returns magic number 10000 when headway cannot be computed
     439             :      */
     440             :     double getFlow() const;
     441             : 
     442             :     /// @brief whether the given segment is 0 or encodes vaporization
     443             :     static inline bool isInvalid(const MESegment* segment) {
     444    76500263 :         return segment == nullptr || segment == &myVaporizationTarget;
     445             :     }
     446             : 
     447             :     /// @brief return a time after earliestEntry at which a vehicle may be inserted at full speed
     448             :     SUMOTime getNextInsertionTime(SUMOTime earliestEntry) const;
     449             : 
     450             :     /// @brief return the remaining physical space on this segment
     451             :     inline int remainingVehicleCapacity(const double vehLength) const {
     452             :         int cap = 0;
     453      153003 :         for (const Queue& q : myQueues) {
     454       76962 :             if (q.getOccupancy() == 0. && myQueueCapacity < vehLength) {
     455             :                 // even small segments can hold at least one vehicle
     456           0 :                 cap += 1;
     457             :             } else {
     458       76962 :                 cap += (int)((myQueueCapacity - q.getOccupancy()) / vehLength);
     459             :             }
     460             :         }
     461             :         return cap;
     462             :     }
     463             : 
     464             :     /// @brief return the minimum headway-time with which vehicles may enter or leave this segment
     465             :     inline SUMOTime getMinimumHeadwayTime() const {
     466       76041 :         return myTau_ff;
     467             :     }
     468             : 
     469             :     /// @brief add this lanes MoveReminders to the given vehicle
     470             :     void addReminders(MEVehicle* veh) const;
     471             : 
     472             :     /** @brief Returns the penalty time for passing a link (if using gMesoTLSPenalty > 0 or gMesoMinorPenalty > 0)
     473             :      * @param[in] veh The vehicle in question
     474             :      * @return The time penalty
     475             :      */
     476             :     SUMOTime getLinkPenalty(const MEVehicle* veh) const;
     477             : 
     478             :     /// @brief called when permissions change due to Rerouter or TraCI
     479             :     void updatePermissions();
     480             : 
     481             : private:
     482             :     bool overtake();
     483             : 
     484             :     void setSpeedForQueue(double newSpeed, SUMOTime currentTime,
     485             :                           SUMOTime blockTime, const std::vector<MEVehicle*>& vehs);
     486             : 
     487             :     /** @brief compute the new arrival time when switching speed
     488             :      */
     489             :     SUMOTime newArrival(const MEVehicle* const v, double newSpeed, SUMOTime currentTime);
     490             : 
     491             :     /// @brief whether a leader in any queue is blocked
     492             :     bool hasBlockedLeader() const;
     493             : 
     494             :     /** @brief compute a value for myJamThreshold
     495             :      * if jamThresh is negative, compute a value which allows free flow at mySpeed
     496             :      * interpret jamThresh as the relative occupation at which jam starts
     497             :      */
     498             :     void recomputeJamThreshold(double jamThresh);
     499             : 
     500             :     /// @brief compute jam threshold for the given speed and jam-threshold option
     501             :     double jamThresholdForSpeed(double speed, double jamThresh) const;
     502             : 
     503             :     /// @brief whether the given link may be passed because the option meso-junction-control.limited is set
     504             :     bool limitedControlOverride(const MSLink* link) const;
     505             : 
     506             :     /// @brief convert net time gap (leader back to follower front) to gross time gap (leader front to follower front)
     507             :     inline SUMOTime tauWithVehLength(SUMOTime tau, double lengthWithGap, double vehicleTau) const {
     508   245174987 :         return (SUMOTime)((double)tau * vehicleTau + lengthWithGap * myTau_length);
     509             :     }
     510             : 
     511             :     SUMOTime getTauJJ(double nextQueueSize, double nextQueueCapacity, double nextJamThreshold) const;
     512             : 
     513             : private:
     514             :     /// @brief The microsim edge this segment belongs to
     515             :     const MSEdge& myEdge;
     516             : 
     517             :     /// @brief The next segment of this edge, 0 if this is the last segment of this edge
     518             :     MESegment* myNextSegment;
     519             : 
     520             :     /// @brief The segment's length
     521             :     const double myLength;
     522             : 
     523             :     /// @brief Running number of the segment in the edge
     524             :     const int myIndex;
     525             : 
     526             :     /// @name Model constants that may be reset once via additional file
     527             :     /// @{
     528             : 
     529             :     /// @brief The time headway parameters, see the Eissfeldt thesis
     530             :     SUMOTime myTau_ff, myTau_fj, myTau_jf, myTau_jj;
     531             : 
     532             :     /// @brief Whether tls penalty is enabled
     533             :     bool myTLSPenalty;
     534             : 
     535             :     /// @brief penalty for minor links
     536             :     bool myCheckMinorPenalty; // for legacy compatibility (#7802, 7804)
     537             :     SUMOTime myMinorPenalty;
     538             : 
     539             :     /// @brief Whether junction control is enabled
     540             :     bool myJunctionControl;
     541             : 
     542             :     /// @brief Whether overtaking is permitted on this segment
     543             :     bool myOvertaking;
     544             :     /// @}
     545             : 
     546             :     /// @brief Headway parameter for computing gross time headyway from net time headway, length and edge speed
     547             :     double myTau_length;
     548             : 
     549             :     /// @brief The number of lanes represented by the queue * the length of the lane
     550             :     double myCapacity = 0.;
     551             : 
     552             :     /// @brief The number of lanes represented by the queue * the length of the lane
     553             :     double myQueueCapacity = 0.;
     554             : 
     555             :     /// @brief The space (in m) which needs to be occupied before the segment is considered jammed
     556             :     double myJamThreshold;
     557             : 
     558             :     /// @brief The car queues. Vehicles are inserted in the front and removed in the back
     559             :     std::vector<Queue> myQueues;
     560             : 
     561             :     /// @brief The cached value for the number of vehicles
     562             :     int myNumVehicles;
     563             : 
     564             :     /// @brief The follower edge to allowed que index mapping for multi queue segments
     565             :     std::map<const MSEdge*, int> myFollowerMap;
     566             : 
     567             :     /// @brief the last headway
     568             :     SUMOTime myLastHeadway;
     569             : 
     570             :     /* @brief segment for signifying vaporization. This segment has invalid
     571             :      * data and should only be used as a unique pointer */
     572             :     static MSEdge myDummyParent;
     573             :     static MESegment myVaporizationTarget;
     574             : 
     575             :     /// @brief the mean speed on this segment. Updated at event time or on demand
     576             :     mutable double myMeanSpeed;
     577             : 
     578             :     /// @brief the time at which myMeanSpeed was last updated
     579             :     mutable SUMOTime myLastMeanSpeedUpdate;
     580             : 
     581             : private:
     582             :     /// @brief Invalidated copy constructor.
     583             :     MESegment(const MESegment&);
     584             : 
     585             :     /// @brief Invalidated assignment operator.
     586             :     MESegment& operator=(const MESegment&);
     587             : 
     588             :     /// @brief constructor for dummy segment
     589             :     MESegment(const std::string& id);
     590             : };

Generated by: LCOV version 1.14