LCOV - code coverage report
Current view: top level - src/microsim - MSEdge.h (source / functions) Coverage Total Hit
Test: lcov.info Lines: 85.1 % 67 57
Test Date: 2024-11-22 15:46:21 Functions: 66.7 % 9 6

            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    MSEdge.h
      15              : /// @author  Christian Roessel
      16              : /// @author  Daniel Krajzewicz
      17              : /// @author  Jakob Erdmann
      18              : /// @author  Sascha Krieg
      19              : /// @author  Michael Behrisch
      20              : /// @date    Mon, 12 Mar 2001
      21              : ///
      22              : // A road/street connecting two junctions
      23              : /****************************************************************************/
      24              : #pragma once
      25              : #include <config.h>
      26              : 
      27              : #include <vector>
      28              : #include <map>
      29              : #include <string>
      30              : #include <iostream>
      31              : #ifdef HAVE_FOX
      32              : #include <utils/foxtools/fxheader.h>
      33              : #endif
      34              : #include <utils/common/Named.h>
      35              : #include <utils/common/Parameterised.h>
      36              : #include <utils/common/SUMOTime.h>
      37              : #include <utils/common/SUMOVehicleClass.h>
      38              : #include <utils/geom/Boundary.h>
      39              : #include <utils/router/ReversedEdge.h>
      40              : #include <utils/router/RailEdge.h>
      41              : #include <utils/vehicle/SUMOVehicle.h>
      42              : #include <utils/vehicle/SUMOTrafficObject.h>
      43              : #include "MSNet.h"
      44              : 
      45              : 
      46              : // ===========================================================================
      47              : // class declarations
      48              : // ===========================================================================
      49              : class Boundary;
      50              : class OutputDevice;
      51              : class SUMOVehicle;
      52              : class SUMOVehicleParameter;
      53              : class MSVehicle;
      54              : class MSLane;
      55              : class MSLaneChanger;
      56              : class MSPerson;
      57              : class MSJunction;
      58              : class MSEdge;
      59              : class MSTransportable;
      60              : 
      61              : 
      62              : // ===========================================================================
      63              : // class definitions
      64              : // ===========================================================================
      65              : /**
      66              :  * @class MSEdge
      67              :  * @brief A road/street connecting two junctions
      68              :  *
      69              :  * A single connection between two junctions.
      70              :  * Holds lanes which are reponsible for vehicle movements.
      71              :  */
      72              : 
      73              : typedef std::vector<MSEdge*> MSEdgeVector;
      74              : typedef std::vector<const MSEdge*> ConstMSEdgeVector;
      75              : typedef std::vector<std::pair<const MSEdge*, const MSEdge*> > MSConstEdgePairVector;
      76              : 
      77              : class MSEdge : public Named, public Parameterised {
      78              : private:
      79              :     /** @brief "Map" from vehicle class to allowed lanes */
      80              :     typedef std::vector<std::pair<SVCPermissions, std::shared_ptr<const std::vector<MSLane*> > > > AllowedLanesCont;
      81              : 
      82              :     /** @brief Succeeding edges (keys) and allowed lanes to reach these edges (values). */
      83              :     typedef std::map<const MSEdge*, AllowedLanesCont> AllowedLanesByTarget;
      84              : 
      85              : 
      86              : public:
      87              :     friend class MSLaneChangerSublane; // needs access to myLaneChanger
      88              : 
      89              :     /** @brief Constructor.
      90              :      *
      91              :      * After calling this constructor, the edge is not yet initialised
      92              :      *  completely. A call to "initialize" with proper values is needed
      93              :      *  for this.
      94              :      *
      95              :      * @param[in] id The id of the edge
      96              :      * @param[in] numericalID The numerical id (index) of the edge
      97              :      * @param[in] function A basic type of the edge
      98              :      * @param[in] streetName The street name for that edge
      99              :      */
     100              :     MSEdge(const std::string& id, int numericalID, const SumoXMLEdgeFunc function,
     101              :            const std::string& streetName, const std::string& edgeType, int priority,
     102              :            double distance);
     103              : 
     104              : 
     105              :     /// @brief Destructor.
     106              :     virtual ~MSEdge();
     107              : 
     108              : 
     109              :     /** @brief Initialize the edge.
     110              :      *
     111              :      * @param[in] allowed Information which edges may be reached from which lanes
     112              :      * @param[in] lanes List of this edge's lanes
     113              :      */
     114              :     void initialize(const std::vector<MSLane*>* lanes);
     115              : 
     116              : 
     117              :     /** @brief Recalculates the cached values
     118              :      */
     119              :     void recalcCache();
     120              : 
     121              : 
     122              :     /// @todo Has to be called after all edges were built and all connections were set...; Still, is not very nice
     123              :     virtual void closeBuilding();
     124              : 
     125              :     /// Has to be called after all sucessors and predecessors have been set (after closeBuilding())
     126              :     void buildLaneChanger();
     127              : 
     128              :     /* @brief returns whether initizliaing a lane change is permitted on this edge
     129              :      * @note Has to be called after all sucessors and predecessors have been set (after closeBuilding())
     130              :      */
     131              :     bool allowsLaneChanging() const;
     132              : 
     133              :     /// @name Access to the edge's lanes
     134              :     /// @{
     135              : 
     136              :     /** @brief Returns the lane left to the one given, 0 if the given lane is leftmost
     137              :      *
     138              :      * @param[in] lane The lane right to the one to be returned
     139              :      * @return The lane left to the given, 0 if no such lane exists
     140              :      * @todo This method searches for the given in the container; probably, this could be done faster
     141              :      */
     142              :     MSLane* leftLane(const MSLane* const lane) const;
     143              : 
     144              : 
     145              :     /** @brief Returns the lane right to the one given, 0 if the given lane is rightmost
     146              :      *
     147              :      * @param[in] lane The lane left to the one to be returned
     148              :      * @return The lane right to the given, 0 if no such lane exists
     149              :      * @todo This method searches for the given in the container; probably, this could be done faster
     150              :      */
     151              :     MSLane* rightLane(const MSLane* const lane) const;
     152              : 
     153              : 
     154              :     /** @brief Returns the lane with the given offset parallel to the given lane one or 0 if it does not exist
     155              :      *
     156              :      * @param[in] lane The base lane
     157              :      * @param[in] offset The offset of the result lane
     158              :      * @param[in] includeOpposte Whether an opposite direction lane may be returned
     159              :      * @todo This method searches for the given in the container; probably, this could be done faster
     160              :      */
     161              :     MSLane* parallelLane(const MSLane* const lane, int offset, bool includeOpposite = true) const;
     162              : 
     163              : 
     164              :     /** @brief Returns this edge's lanes
     165              :      *
     166              :      * @return This edge's lanes
     167              :      */
     168              :     inline const std::vector<MSLane*>& getLanes() const {
     169              :         return *myLanes;
     170              :     }
     171              : 
     172              :     inline int getNumLanes() const {
     173    694053896 :         return (int)myLanes->size();
     174              :     }
     175              : 
     176              :     /// @brief return the number of lanes that permit non-weak modes if the edge allows non weak modes and the number of lanes otherwise
     177              :     int getNumDrivingLanes() const;
     178              : 
     179              :     /// @brief return total number of vehicles on this edges lanes or segments
     180              :     int getVehicleNumber() const;
     181              : 
     182              :     /// @brief whether this edge has no vehicles
     183              :     bool isEmpty() const;
     184              : 
     185              :     /// @brief return vehicles on this edges lanes or segments
     186              :     std::vector<const SUMOVehicle*> getVehicles() const;
     187              : 
     188              :     double getBruttoOccupancy() const;
     189              : 
     190              :     /// @brief return flow based on meanSpead @note: may produced incorrect results when jammed
     191              :     double getFlow() const;
     192              : 
     193              :     /// @brief return accumated waiting time for all vehicles on this edges lanes or segments
     194              :     double getWaitingSeconds() const;
     195              : 
     196              :     /// @brief return mean occupancy on this edges lanes or segments
     197              :     double getOccupancy() const;
     198              : 
     199              :     /** @brief Returns this edge's persons set.
     200              :      *  @brief Avoids the creation of new vector as in getSortedPersons
     201              :      *
     202              :      * @return This edge's persons.
     203              :      */
     204              :     inline const std::set<MSTransportable*, ComparatorNumericalIdLess>& getPersons() const {
     205              :         return myPersons;
     206              :     }
     207              : 
     208              :     /** @brief Returns this edge's persons sorted by pos
     209              :      *
     210              :      * @return This edge's persons sorted by pos
     211              :      */
     212              :     std::vector<MSTransportable*> getSortedPersons(SUMOTime timestep, bool includeRiding = false) const;
     213              : 
     214              : 
     215              :     /** @brief Returns this edge's containers sorted by pos
     216              :      *
     217              :      * @return This edge's containers sorted by pos
     218              :      */
     219              :     std::vector<MSTransportable*> getSortedContainers(SUMOTime timestep, bool includeRiding = false) const;
     220              : 
     221              :     /** @brief Get the allowed lanes to reach the destination-edge.
     222              :      *
     223              :      * If there is no such edge, return nullptr. Then you are on the wrong edge.
     224              :      *
     225              :      * @param[in] destination The edge to reach
     226              :      * @param[in] vclass The vehicle class for which this information shall be returned
     227              :      * @return The lanes that may be used to reach the given edge, nullptr if no such lanes exist
     228              :      */
     229              :     const std::vector<MSLane*>* allowedLanes(const MSEdge& destination,
     230              :             SUMOVehicleClass vclass = SVC_IGNORING, bool ignoreTransientPermissions = false) const;
     231              : 
     232              : 
     233              : 
     234              :     /** @brief Get the allowed lanes for the given vehicle class.
     235              :      *
     236              :      * If there is no such edge, return nullptr. Then you are on the wrong edge.
     237              :      *
     238              :      * @param[in] vclass The vehicle class for which this information shall be returned
     239              :      * @return The lanes that may be used by the given vclass
     240              :      */
     241              :     const std::vector<MSLane*>* allowedLanes(SUMOVehicleClass vclass = SVC_IGNORING) const;
     242              : 
     243              :     inline bool isConnectedTo(const MSEdge& destination, SUMOVehicleClass vclass) const {
     244       401423 :         const std::vector<MSLane*>* const lanes = allowedLanes(destination, vclass);
     245       507818 :         return lanes != nullptr && !lanes->empty();
     246              :     }
     247              :     /// @}
     248              : 
     249              : 
     250              : 
     251              :     /// @name Access to other edge attributes
     252              :     /// @{
     253              : 
     254              :     /** @brief Returns the edge type (SumoXMLEdgeFunc)
     255              :      * @return This edge's SumoXMLEdgeFunc
     256              :      * @see SumoXMLEdgeFunc
     257              :      */
     258              :     inline SumoXMLEdgeFunc getFunction() const {
     259      4066026 :         return myFunction;
     260              :     }
     261              : 
     262              :     /// @brief return whether this edge is an internal edge
     263              :     inline bool isNormal() const {
     264     83431808 :         return myFunction == SumoXMLEdgeFunc::NORMAL;
     265              :     }
     266              : 
     267              :     /// @brief return whether this edge is an internal edge
     268              :     inline bool isInternal() const {
     269   2794953143 :         return myFunction == SumoXMLEdgeFunc::INTERNAL;
     270              :     }
     271              : 
     272              :     /// @brief return whether this edge is a pedestrian crossing
     273              :     inline bool isCrossing() const {
     274    102918119 :         return myFunction == SumoXMLEdgeFunc::CROSSING;
     275              :     }
     276              : 
     277              : 
     278              :     /// @brief check and register the opposite superposable edge if any
     279              :     void checkAndRegisterBiDirEdge(const std::string& bidiID = "");
     280              : 
     281              :     /// @brief return opposite superposable/congruent edge, if it exist and 0 else
     282              :     inline const MSEdge* getBidiEdge() const {
     283    127341042 :         return myBidiEdge;
     284              :     }
     285              : 
     286              :     /// @brief return whether this edge is walking area
     287              :     inline bool isWalkingArea() const {
     288     98539485 :         return myFunction == SumoXMLEdgeFunc::WALKINGAREA;
     289              :     }
     290              : 
     291              :     inline bool isTazConnector() const {
     292   5621253287 :         return myFunction == SumoXMLEdgeFunc::CONNECTOR;
     293              :     }
     294              : 
     295              :     void setOtherTazConnector(const MSEdge* edge) {
     296       100257 :         myOtherTazConnector = edge;
     297              :     }
     298              : 
     299              :     const MSEdge* getOtherTazConnector() const {
     300        87042 :         return myOtherTazConnector;
     301              :     }
     302              : 
     303              :     /** @brief Returns the numerical id of the edge
     304              :      * @return This edge's numerical id
     305              :      */
     306              :     inline int getNumericalID() const {
     307    502517363 :         return myNumericalID;
     308              :     }
     309              : 
     310              : 
     311              :     /** @brief Returns the street name of the edge
     312              :      */
     313              :     const std::string& getStreetName() const {
     314            0 :         return myStreetName;
     315              :     }
     316              : 
     317              :     /** @brief Returns the type of the edge
     318              :      */
     319              :     const std::string& getEdgeType() const {
     320      2760693 :         return myEdgeType;
     321              :     }
     322              : 
     323              :     // @brief try to infer edge type for internal edges
     324              :     void inferEdgeType();
     325              : 
     326              :     /** @brief Returns the priority of the edge
     327              :      */
     328              :     int getPriority() const {
     329       680215 :         return myPriority;
     330              :     }
     331              : 
     332              :     /** @brief Returns the kilometrage/mileage encoding at the start of the edge
     333              :      * (negative values encode descending direction)
     334              :     */
     335              :     double getDistance() const {
     336            0 :         return myDistance;
     337              :     }
     338              : 
     339              :     /** @brief Returns the kilometrage/mileage at the given offset along the edge
     340              :      */
     341              :     double getDistanceAt(double pos) const;
     342              : 
     343              :     bool hasDistance() const {
     344            0 :         return myDistance != 0;
     345              :     }
     346              :     /// @}
     347              : 
     348              :     /**@brief Sets the crossed edge ids for a crossing edge
     349              :      *
     350              :      */
     351        15719 :     void setCrossingEdges(const std::vector<std::string>& crossingEdges)        {
     352              :         myCrossingEdges.clear();
     353        15719 :         myCrossingEdges.insert(myCrossingEdges.begin(), crossingEdges.begin(), crossingEdges.end());
     354        15719 :     }
     355              : 
     356              :     /**@brief Gets the crossed edge ids
     357              :      *@return The list of crossed edge ids in a crossing edge or an empty vector
     358              :      */
     359              :     const std::vector<std::string>& getCrossingEdges() const {
     360              :         return myCrossingEdges;
     361              :     }
     362              : 
     363              : 
     364              :     /// @name Access to succeeding/predecessing edges
     365              :     /// @{
     366              : 
     367              :     /** @brief Adds an edge to the list of edges which may be reached from this edge and to the incoming of the other edge
     368              :      *
     369              :      * This is mainly used by the taz (district) parsing
     370              :      * @param[in] edge The edge to add
     371              :      */
     372              :     void addSuccessor(MSEdge* edge, const MSEdge* via = nullptr);
     373              : 
     374              :     void resetTAZ(MSJunction* junction);
     375              : 
     376              :     /** @brief Returns the number of edges that may be reached from this edge
     377              :      * @return The number of following edges
     378              :      */
     379              :     int getNumSuccessors() const {
     380      1298212 :         return (int) mySuccessors.size();
     381              :     }
     382              : 
     383              : 
     384              :     /** @brief Returns the following edges, restricted by vClass
     385              :      * @param[in] vClass The vClass for which to restrict the successors
     386              :      * @return The eligible following edges
     387              :      */
     388              :     const MSEdgeVector& getSuccessors(SUMOVehicleClass vClass = SVC_IGNORING) const;
     389              : 
     390              :     /** @brief Returns the following edges with internal vias, restricted by vClass
     391              :      * @param[in] vClass The vClass for which to restrict the successors
     392              :      * @return The eligible following edges
     393              :      */
     394              :     const MSConstEdgePairVector& getViaSuccessors(SUMOVehicleClass vClass = SVC_IGNORING, bool ignoreTransientPermissions = false) const;
     395              : 
     396              : 
     397              :     /** @brief Returns the number of edges this edge is connected to
     398              :      *
     399              :      * @return The number of edges following this edge
     400              :      */
     401              :     int getNumPredecessors() const {
     402       813392 :         return (int) myPredecessors.size();
     403              :     }
     404              : 
     405              : 
     406              :     /** @brief
     407              :      * @return
     408              :      */
     409              :     const MSEdgeVector& getPredecessors() const {
     410      4475898 :         return myPredecessors;
     411              :     }
     412              : 
     413              : 
     414              :     const MSJunction* getFromJunction() const {
     415     19731287 :         return myFromJunction;
     416              :     }
     417              : 
     418              :     const MSJunction* getToJunction() const {
     419    559944598 :         return myToJunction;
     420              :     }
     421              : 
     422              : 
     423              :     void setJunctions(MSJunction* from, MSJunction* to);
     424              :     /// @}
     425              : 
     426              : 
     427              : 
     428              :     /// @name Access to vaporizing interface
     429              :     /// @{
     430              : 
     431              :     /** @brief Returns whether vehicles on this edge shall be vaporized
     432              :      * @return Whether no vehicle shall be on this edge
     433              :      */
     434              :     bool isVaporizing() const {
     435   5492341438 :         return myVaporizationRequests > 0;
     436              :     }
     437              : 
     438              : 
     439              :     /** @brief Enables vaporization
     440              :      *
     441              :      * The internal vaporization counter is increased enabling the
     442              :      *  vaporization.
     443              :      * Called from the event handler.
     444              :      * @param[in] t The current time (unused)
     445              :      * @return Time to next call (always 0)
     446              :      * @exception ProcessError not thrown by this method, just derived
     447              :      */
     448              :     SUMOTime incVaporization(SUMOTime t);
     449              : 
     450              : 
     451              :     /** @brief Disables vaporization
     452              :      *
     453              :      * The internal vaporization counter is decreased what disables
     454              :      *  the vaporization if it was only once enabled.
     455              :      * Called from the event handler.
     456              :      * @param[in] t The current time (unused)
     457              :      * @return Time to next call (always 0)
     458              :      * @exception ProcessError not thrown by this method, just derived
     459              :      */
     460              :     SUMOTime decVaporization(SUMOTime t);
     461              :     /// @}
     462              : 
     463              : 
     464              :     /** @brief Computes and returns the current travel time for this edge
     465              :      *
     466              :      * The mean speed of all lanes is used to compute the travel time.
     467              :      * To avoid infinite travel times, the given minimum speed is used.
     468              :      *
     469              :      * @param[in] minSpeed The minimumSpeed to assume if traffic on this edge is stopped
     470              :      * @return The current effort (travel time) to pass the edge
     471              :      */
     472              :     double getCurrentTravelTime(const double minSpeed = NUMERICAL_EPS) const;
     473              : 
     474              : 
     475              :     /// @brief returns the minimum travel time for the given vehicle
     476    104693748 :     inline double getMinimumTravelTime(const SUMOVehicle* const veh) const {
     477    104696987 :         if (myFunction == SumoXMLEdgeFunc::CONNECTOR) {
     478              :             return 0;
     479     96164861 :         } else if (veh != 0) {
     480     96032271 :             return getLength() / getVehicleMaxSpeed(veh) + myTimePenalty;
     481              :         } else {
     482       135775 :             return myEmptyTraveltime;
     483              :         }
     484              :     }
     485              : 
     486            0 :     double getTimePenalty() const {
     487      3551015 :         return myTimePenalty;
     488              :     }
     489              : 
     490              :     /** @brief Returns the travel time for the given edge
     491              :      *
     492              :      * @param[in] edge The edge for which the travel time shall be retrieved
     493              :      * @param[in] veh The vehicle for which the travel time on this edge shall be retrieved
     494              :      * @param[in] time The time for which the travel time shall be returned [s]
     495              :      * @return The traveltime needed by the given vehicle to pass the edge at the given time
     496              :      */
     497              :     static inline double getTravelTimeStatic(const MSEdge* const edge, const SUMOVehicle* const veh, double time) {
     498        55328 :         return MSNet::getInstance()->getTravelTime(edge, veh, time);
     499              :     }
     500              : 
     501              :     static double getTravelTimeAggregated(const MSEdge* const edge, const SUMOVehicle* const veh, double time);
     502              : 
     503              :     /** @brief Returns the averaged speed used by the routing device
     504              :      */
     505              :     double getRoutingSpeed() const;
     506              : 
     507              : 
     508              :     /// @name Methods releated to vehicle insertion
     509              :     /// @{
     510              : 
     511              :     /** @brief Tries to insert the given vehicle into the network
     512              :      *
     513              :      * The procedure for choosing the proper lane is determined, first.
     514              :      *  In dependence to this, the proper lane is chosen.
     515              :      *
     516              :      * Insertion itself is done by calling the chose lane's "insertVehicle"
     517              :      *  method but only if the checkOnly argument is false. The check needs
     518              :      *  to be certain only in the negative case (if false is returned, there
     519              :      *  is no way this vehicle would be inserted).
     520              :      *
     521              :      * @param[in] v The vehicle to insert
     522              :      * @param[in] time The current simulation time
     523              :      * @param[in] checkOnly Whether we perform only the check without actually inserting
     524              :      * @param[in] forceCheck Whether the full insertion check should be run for each pending vehicle
     525              :      *            or whether insertion on lanes for which an insertion has already a failed should be ignored
     526              :      *            in the current time step.
     527              :      * @return Whether the vehicle could be inserted
     528              :      * @see MSLane::insertVehicle
     529              :      */
     530              :     bool insertVehicle(SUMOVehicle& v, SUMOTime time, const bool checkOnly = false, const bool forceCheck = false) const;
     531              : 
     532              :     /// @brief check whether the given departSpeed is valid for this edge
     533              :     bool validateDepartSpeed(SUMOVehicle& v) const;
     534              : 
     535              :     /** @brief Finds the emptiest lane allowing the vehicle class
     536              :      *
     537              :      * The emptiest lane is the one which vehicle insertion is most likely to succeed.
     538              :      *
     539              :      * If there are no vehicles before departPos, then the lane with the largest
     540              :      * gap between departPos and the last vehicle is
     541              :      * Otheriwise the lane with lowes occupancy is selected
     542              :      * If there is more than one, the first according to its
     543              :      *  index in the lane container is chosen.
     544              :      *
     545              :      * If allowed==0, the lanes allowed for the given vehicle class
     546              :      *  will be used.
     547              :      *
     548              :      * @param[in] allowed The lanes to choose from
     549              :      * @param[in] vclass The vehicle class to look for
     550              :      * @param[in] departPos An upper bound on vehicle depart position
     551              :      * @return the least occupied lane
     552              :      * @see allowedLanes
     553              :      */
     554              :     MSLane* getFreeLane(const std::vector<MSLane*>* allowed, const SUMOVehicleClass vclass, double departPos) const;
     555              : 
     556              :     /** @brief Finds the most probable lane allowing the vehicle class
     557              :      *
     558              :      * The most probable lane is the one which best corresponds to the desired speed of the vehicle
     559              :      * Vehicles with lower speeds will use lanes to the right while
     560              :      * vehicles with higher speeds will use lanes to the left
     561              :      *
     562              :      * @param[in] allowed The lanes to choose from
     563              :      * @param[in] vclass The vehicle class to look for
     564              :      * @param[in] departPos An upper bound on vehicle depart position
     565              :      * @param[in] maxSpeed The vehicles maxSpeed (including speedFactor)
     566              :      * @return the least occupied lane
     567              :      * @see allowedLanes
     568              :      */
     569              :     MSLane* getProbableLane(const std::vector<MSLane*>* allowed, const SUMOVehicleClass vclass, double departPos, double maxSpeed) const;
     570              : 
     571              : 
     572              :     /** @brief Finds a depart lane for the given vehicle parameters
     573              :      *
     574              :      * Depending on the depart lane procedure a depart lane is chosen.
     575              :      *  Repeated calls with the same vehicle may return different results
     576              :      *  if the procedure is "random" or "free". In case no appropriate
     577              :      *  lane was found, 0 is returned.
     578              :      *
     579              :      * @param[in] veh The vehicle to get the depart lane for
     580              :      * @return a possible/chosen depart lane, 0 if no lane can be used
     581              :      */
     582              :     MSLane* getDepartLane(MSVehicle& veh) const;
     583              : 
     584              :     /* @brief get the rightmost lane that allows the given vClass or nullptr
     585              :      * @param[in] defaultFirst Whether the first lane should be returned if all lanes are forbidden
     586              :      */
     587              :     MSLane* getFirstAllowed(SUMOVehicleClass vClass, bool defaultFirst = false) const;
     588              : 
     589              :     /// @brief consider given departLane parameter (only for validating speeds)
     590              :     MSLane* getDepartLaneMeso(SUMOVehicle& veh) const;
     591              : 
     592              :     /** @brief Returns the last time a vehicle could not be inserted
     593              :      * @return The current value
     594              :      */
     595              :     inline SUMOTime getLastFailedInsertionTime() const {
     596              :         return myLastFailedInsertionTime;
     597              :     }
     598              : 
     599              : 
     600              :     /** @brief Sets the last time a vehicle could not be inserted
     601              :      * @param[in] time the new value
     602              :      */
     603              :     inline void setLastFailedInsertionTime(SUMOTime time) const {
     604   2058321770 :         myLastFailedInsertionTime = time;
     605              :     }
     606              :     /// @}
     607              : 
     608              : 
     609              :     /** @brief Performs lane changing on this edge */
     610              :     void changeLanes(SUMOTime t) const;
     611              : 
     612              : 
     613              :     /// @todo extension: inner junctions are not filled
     614              :     const MSEdge* getInternalFollowingEdge(const MSEdge* followerAfterInternal, SUMOVehicleClass vClass) const;
     615              : 
     616              : 
     617              :     /// @brief returns the length of all internal edges on the junction until reaching the non-internal edge followerAfterInternal.
     618              :     double getInternalFollowingLengthTo(const MSEdge* followerAfterInternal, SUMOVehicleClass vClass) const;
     619              : 
     620              :     /// @brief if this edge is an internal edge, return its first normal predecessor, otherwise the edge itself
     621              :     const MSEdge* getNormalBefore() const;
     622              : 
     623              :     /// @brief if this edge is an internal edge, return its first normal successor, otherwise the edge itself
     624              :     const MSEdge* getNormalSuccessor() const;
     625              : 
     626              :     /// @brief Returns whether the vehicle (class) is not allowed on the edge
     627    630267508 :     inline bool prohibits(const SUMOVehicle* const vehicle) const {
     628    630267508 :         if (vehicle == nullptr) {
     629              :             return false;
     630              :         }
     631    630266715 :         const SUMOVehicleClass svc = vehicle->getVClass();
     632    630266715 :         return (vehicle->ignoreTransientPermissions()
     633    630266715 :                 ? (myOriginalCombinedPermissions & svc) != svc
     634    630263519 :                 : (myCombinedPermissions & svc) != svc);
     635              :     }
     636              : 
     637              :     bool hasTransientPermissions() const;
     638              : 
     639              :     /** @brief Returns whether this edge has restriction parameters forbidding the given vehicle to pass it
     640              :      * The restriction mechanism is not implemented yet for the microsim, so it always returns false.
     641              :      * @param[in] vehicle The vehicle for which the information has to be returned
     642              :      * @return Whether the vehicle must not enter this edge
     643              :      */
     644              :     inline bool restricts(const SUMOVehicle* const /* vehicle */) const {
     645              :         return false;
     646              :     }
     647              : 
     648              :     /// @brief Returns the combined permissions of all lanes of this edge
     649              :     inline SVCPermissions getPermissions() const {
     650      1418072 :         return myCombinedPermissions;
     651              :     }
     652              : 
     653              :     /** @brief Returns the edges's width (sum over all lanes)
     654              :      * @return This edges's width
     655              :      */
     656              :     double getWidth() const {
     657    411435191 :         return myWidth;
     658              :     }
     659              : 
     660              :     /// @brief Returns the right side offsets of this edge's sublanes
     661              :     const std::vector<double> getSubLaneSides() const {
     662    252111942 :         return mySublaneSides;
     663              :     }
     664              : 
     665              :     void rebuildAllowedLanes(const bool onInit = false);
     666              : 
     667              :     void rebuildAllowedTargets(const bool updateVehicles = true);
     668              : 
     669              : 
     670              :     /** @brief optimistic air distance heuristic for use in routing
     671              :      * @param[in] other The edge to which the distance shall be returned
     672              :      * @param[in] doBoundaryEstimate whether the distance should be estimated by looking at the distance of the bounding boxes
     673              :      * @return The distance to the other edge
     674              :      */
     675              :     double getDistanceTo(const MSEdge* other, const bool doBoundaryEstimate = false) const;
     676              : 
     677              : 
     678              :     /// @brief return the coordinates of the center of the given stop
     679              :     static const Position getStopPosition(const SUMOVehicleParameter::Stop& stop);
     680              : 
     681              : 
     682              :     /** @brief return the length of the edge
     683              :      * @return The edge's length
     684              :      */
     685              :     inline double getLength() const {
     686    495701801 :         return myLength;
     687              :     }
     688              : 
     689              : 
     690              :     /** @brief Returns the speed limit of the edge
     691              :      * @caution The speed limit of the first lane is retured; should probably be the fastest edge
     692              :      * @return The maximum speed allowed on this edge
     693              :      */
     694              :     double getSpeedLimit() const;
     695              : 
     696              :     /// @brief return shape.length() / myLength
     697              :     double getLengthGeometryFactor() const;
     698              : 
     699              :     /** @brief Sets a new maximum speed for all lanes (used by TraCI and MSCalibrator)
     700              :      * @param[in] val the new speed in m/s
     701              :      */
     702              :     void setMaxSpeed(double val, double jamThreshold = -1);
     703              : 
     704              :     /** @brief Sets a new friction coefficient COF for all lanes [*later to be (used by TraCI and MSCalibrator)*]
     705              :     * @param[in] val the new coefficient in [0..1]
     706              :     */
     707              :     void setFrictionCoefficient(double val) const;
     708              : 
     709              :     /** @brief Returns the maximum speed the vehicle may use on this edge
     710              :      *
     711              :      * @caution Only the first lane is considered
     712              :      * @return The maximum velocity on this edge for the given vehicle
     713              :      */
     714              :     double getVehicleMaxSpeed(const SUMOTrafficObject* const veh) const;
     715              : 
     716              : 
     717              :     virtual void addTransportable(MSTransportable* t) const;
     718              : 
     719              :     virtual void removeTransportable(MSTransportable* t) const;
     720              : 
     721              :     inline bool isRoundabout() const {
     722   1776355176 :         return myAmRoundabout;
     723              :     }
     724              : 
     725              :     void markAsRoundabout() {
     726         6082 :         myAmRoundabout = true;
     727         6082 :     }
     728              : 
     729              :     void markDelayed() const {
     730     68682713 :         myAmDelayed = true;
     731     51379149 :     }
     732              : 
     733              :     // return whether there have been vehicles on this or the bidi edge (if there is any) at least once
     734              :     inline bool isDelayed() const {
     735    563164610 :         return myAmDelayed || (myBidiEdge != nullptr && myBidiEdge->myAmDelayed);
     736              :     }
     737              : 
     738              :     bool hasLaneChanger() const {
     739    469191058 :         return myLaneChanger != nullptr;
     740              :     }
     741              : 
     742              :     /// @brief whether this edge allows changing to the opposite direction edge
     743              :     bool canChangeToOpposite() const;
     744              : 
     745              :     /// @brief Returns the opposite direction edge if on exists else a nullptr
     746              :     const MSEdge* getOppositeEdge() const;
     747              : 
     748              :     /// @brief get the mean speed
     749              :     double getMeanSpeed() const;
     750              : 
     751              :     /// @brief get the mean friction over the lanes
     752              :     double getMeanFriction() const;
     753              : 
     754              :     /// @brief get the mean speed of all bicycles on this edge
     755              :     double getMeanSpeedBike() const;
     756              : 
     757              :     /// @brief whether any lane has a minor link
     758              :     bool hasMinorLink() const;
     759              : 
     760              :     /// @brief return whether this edge is at the fringe of the network
     761              :     bool isFringe() const {
     762    283782002 :         return myAmFringe;
     763              :     }
     764              : 
     765              :     /// @brief return whether this edge prohibits changing for the given vClass when starting on the given lane index
     766              :     bool hasChangeProhibitions(SUMOVehicleClass svc, int index) const;
     767              : 
     768              :     /// @brief whether this lane is selected in the GUI
     769            0 :     virtual bool isSelected() const {
     770            0 :         return false;
     771              :     }
     772              : 
     773              :     /// @brief grant exclusive access to the mesoscopic state
     774     33958028 :     virtual void lock() const {}
     775              : 
     776              :     /// @brief release exclusive access to the mesoscopic state
     777     33958028 :     virtual void unlock() const {};
     778              : 
     779              :     /// @brief Adds a vehicle to the list of waiting vehicles
     780              :     void addWaiting(SUMOVehicle* vehicle) const;
     781              : 
     782              :     /// @brief Removes a vehicle from the list of waiting vehicles
     783              :     void removeWaiting(const SUMOVehicle* vehicle) const;
     784              : 
     785              :     /* @brief returns a vehicle that is waiting for a for a person or a container at this edge at the given position
     786              :      * @param[in] transportable The person or container that wants to ride
     787              :      * @param[in] position The vehicle shall be positioned in the interval [position - t, position + t], where t is some tolerance
     788              :      */
     789              :     SUMOVehicle* getWaitingVehicle(MSTransportable* transportable, const double position) const;
     790              : 
     791              :     /** @brief Remove all transportables before quick-loading state */
     792              :     void clearState();
     793              : 
     794              :     /// @brief update meso segment parameters
     795              :     void updateMesoType();
     796              : 
     797              :     /** @brief Inserts edge into the static dictionary
     798              :         Returns true if the key id isn't already in the dictionary. Otherwise
     799              :         returns false. */
     800              :     static bool dictionary(const std::string& id, MSEdge* edge);
     801              : 
     802              :     /** @brief Returns the MSEdge associated to the key id if it exists, otherwise returns nullptr. */
     803              :     static MSEdge* dictionary(const std::string& id);
     804              : 
     805              :     /** @brief Returns the MSEdge associated to the key id giving a hint with a numerical id. */
     806              :     static MSEdge* dictionaryHint(const std::string& id, const int startIdx);
     807              : 
     808              :     /// @brief Returns all edges with a numerical id
     809              :     static const MSEdgeVector& getAllEdges();
     810              : 
     811              :     /** @brief Clears the dictionary */
     812              :     static void clear();
     813              : 
     814              :     /** @brief Inserts IDs of all known edges into the given vector */
     815              :     static void insertIDs(std::vector<std::string>& into);
     816              : 
     817              :     static SVCPermissions getMesoPermissions(SVCPermissions p, SVCPermissions ignoreIgnored = 0);
     818              : 
     819              :     static void setMesoIgnoredVClasses(SVCPermissions ignored) {
     820         5392 :         myMesoIgnoredVClasses = ignored;
     821              :     }
     822              : 
     823              : public:
     824              :     /// @name Static parser helper
     825              :     /// @{
     826              : 
     827              :     /** @brief Parses the given string assuming it contains a list of edge ids divided by spaces
     828              :      *
     829              :      * Splits the string at spaces, uses polymorph method to generate edge vector.
     830              :      * @param[in] desc The string containing space-separated edge ids
     831              :      * @param[out] into The vector to fill
     832              :      * @param[in] rid The id of the route these description belongs to; used for error message generation
     833              :      * @exception ProcessError If one of the strings contained is not a known edge id
     834              :      */
     835              :     static void parseEdgesList(const std::string& desc, ConstMSEdgeVector& into,
     836              :                                const std::string& rid);
     837              : 
     838              : 
     839              :     /** @brief Parses the given string vector assuming it edge ids
     840              :      * @param[in] desc The string vector containing edge ids
     841              :      * @param[out] into The vector to fill
     842              :      * @param[in] rid The id of the route these description belongs to; used for error message generation
     843              :      * @exception ProcessError If one of the strings contained is not a known edge id
     844              :      */
     845              :     static void parseEdgesList(const std::vector<std::string>& desc, ConstMSEdgeVector& into,
     846              :                                const std::string& rid);
     847              :     /// @}
     848              : 
     849              : 
     850            0 :     ReversedEdge<MSEdge, SUMOVehicle>* getReversedRoutingEdge() const {
     851            0 :         if (myReversedRoutingEdge == nullptr) {
     852            0 :             myReversedRoutingEdge = new ReversedEdge<MSEdge, SUMOVehicle>(this);
     853              :         }
     854            0 :         return myReversedRoutingEdge;
     855              :     }
     856              : 
     857       371400 :     RailEdge<MSEdge, SUMOVehicle>* getRailwayRoutingEdge() const {
     858       371400 :         if (myRailwayRoutingEdge == nullptr) {
     859        46700 :             myRailwayRoutingEdge = new RailEdge<MSEdge, SUMOVehicle>(this);
     860              :         }
     861       371400 :         return myRailwayRoutingEdge;
     862              :     }
     863              : 
     864              : protected:
     865              :     /** @class by_id_sorter
     866              :      * @brief Sorts edges by their ids
     867              :      */
     868              :     class by_id_sorter {
     869              :     public:
     870              :         /// @brief constructor
     871              :         explicit by_id_sorter() { }
     872              : 
     873              :         /// @brief comparing operator
     874              :         int operator()(const MSEdge* const e1, const MSEdge* const e2) const {
     875              :             return e1->getNumericalID() < e2->getNumericalID();
     876              :         }
     877              : 
     878              :     };
     879              : 
     880              :     /** @class transportable_by_position_sorter
     881              :      * @brief Sorts transportables by their positions
     882              :      */
     883              :     class transportable_by_position_sorter {
     884              :     public:
     885              :         /// @brief constructor
     886              :         explicit transportable_by_position_sorter(SUMOTime timestep): myTime(timestep) { }
     887              : 
     888              :         /// @brief comparing operator
     889              :         int operator()(const MSTransportable* const c1, const MSTransportable* const c2) const;
     890              :     private:
     891              :         SUMOTime myTime;
     892              :     };
     893              : 
     894              : 
     895              :     /// @brief return upper bound for the depart position on this edge
     896              :     double getDepartPosBound(const MSVehicle& veh, bool upper = true) const;
     897              : 
     898              : protected:
     899              :     /// @brief This edge's numerical id
     900              :     const int myNumericalID;
     901              : 
     902              :     /// @brief Container for the edge's lane; should be sorted: (right-hand-traffic) the more left the lane, the higher the container-index
     903              :     std::shared_ptr<const std::vector<MSLane*> > myLanes;
     904              : 
     905              :     /// @brief This member will do the lane-change
     906              :     MSLaneChanger* myLaneChanger;
     907              : 
     908              :     /// @brief the purpose of the edge
     909              :     const SumoXMLEdgeFunc myFunction;
     910              : 
     911              :     /// @brief Vaporizer counter
     912              :     int myVaporizationRequests;
     913              : 
     914              :     /// @brief The time of last insertion failure
     915              :     mutable SUMOTime myLastFailedInsertionTime;
     916              : 
     917              :     /// @brief A cache for the rejected insertion attempts. Used to assure that no
     918              :     ///        further insertion attempts are made on a lane where an attempt has
     919              :     ///        already failed in the current time step if MSInsertionControl::myEagerInsertionCheck is off.
     920              :     mutable std::set<int> myFailedInsertionMemory;
     921              : 
     922              :     /// @brief The crossed edges id for a crossing edge. On not crossing edges it is empty
     923              :     std::vector<std::string> myCrossingEdges;
     924              : 
     925              :     /// @brief The succeeding edges
     926              :     MSEdgeVector mySuccessors;
     927              : 
     928              :     MSConstEdgePairVector myViaSuccessors;
     929              : 
     930              :     /// @brief The preceeding edges
     931              :     MSEdgeVector myPredecessors;
     932              : 
     933              :     /// @brief the junctions for this edge
     934              :     MSJunction* myFromJunction;
     935              :     MSJunction* myToJunction;
     936              : 
     937              :     /// @brief Persons on the edge for drawing and pushbutton
     938              :     mutable std::set<MSTransportable*, ComparatorNumericalIdLess> myPersons;
     939              : 
     940              :     /// @brief Containers on the edge
     941              :     mutable std::set<MSTransportable*, ComparatorNumericalIdLess> myContainers;
     942              : 
     943              :     /// @name Storages for allowed lanes (depending on vehicle classes)
     944              :     /// @{
     945              : 
     946              :     /// @brief Associative container from vehicle class to allowed-lanes.
     947              :     AllowedLanesCont myAllowed;
     948              :     AllowedLanesCont myOrigAllowed;
     949              : 
     950              :     /// @brief From target edge to lanes allowed to be used to reach it
     951              :     AllowedLanesByTarget myAllowedTargets;
     952              :     AllowedLanesByTarget myOrigAllowedTargets;
     953              : 
     954              :     /// @brief The intersection of lane permissions for this edge
     955              :     SVCPermissions myMinimumPermissions = SVCAll;
     956              :     /// @brief The union of lane permissions for this edge
     957              :     SVCPermissions myCombinedPermissions = 0;
     958              : 
     959              :     /// @brief The original intersection of lane permissions for this edge (before temporary modifications)
     960              :     SVCPermissions myOriginalMinimumPermissions = SVCAll;
     961              :     /// @brief The original union of lane permissions for this edge (before temporary modifications)
     962              :     SVCPermissions myOriginalCombinedPermissions;
     963              : 
     964              :     /// @brief whether transient permission changes were applied to this edge or a predecessor
     965              :     bool myHaveTransientPermissions;
     966              :     /// @}
     967              : 
     968              :     /// @brief the other taz-connector if this edge isTazConnector, otherwise nullptr
     969              :     const MSEdge* myOtherTazConnector;
     970              : 
     971              :     /// @brief the real-world name of this edge (need not be unique)
     972              :     std::string myStreetName;
     973              : 
     974              :     /// @brief the type of the edge (optionally used during network creation)
     975              :     std::string myEdgeType;
     976              : 
     977              :     /// @brief the priority of the edge (used during network creation)
     978              :     const int myPriority;
     979              : 
     980              :     /// @brief the kilometrage/mileage at the start of the edge
     981              :     const double myDistance;
     982              : 
     983              :     /// Edge width [m]
     984              :     double myWidth;
     985              : 
     986              :     /// @brief the length of the edge (cached value for speedup)
     987              :     double myLength;
     988              : 
     989              :     /// @brief the traveltime on the empty edge (cached value for speedup)
     990              :     double myEmptyTraveltime;
     991              : 
     992              :     /// @brief flat penalty when computing traveltime
     993              :     double myTimePenalty;
     994              : 
     995              :     /// @brief whether this edge had a vehicle with less than max speed on it
     996              :     mutable bool myAmDelayed;
     997              : 
     998              :     /// @brief whether this edge belongs to a roundabout
     999              :     bool myAmRoundabout;
    1000              : 
    1001              :     /// @brief whether this edge is at the network fringe
    1002              :     bool myAmFringe;
    1003              : 
    1004              :     /// @brief the right side for each sublane on this edge
    1005              :     std::vector<double> mySublaneSides;
    1006              : 
    1007              :     /// @name Static edge container
    1008              :     /// @{
    1009              : 
    1010              :     /// @brief definition of the static dictionary type
    1011              :     typedef std::map< std::string, MSEdge* > DictType;
    1012              : 
    1013              :     /** @brief Static dictionary to associate string-ids with objects.
    1014              :      * @deprecated Move to MSEdgeControl, make non-static
    1015              :      */
    1016              :     static DictType myDict;
    1017              : 
    1018              :     /** @brief Static list of edges
    1019              :      * @deprecated Move to MSEdgeControl, make non-static
    1020              :      */
    1021              :     static MSEdgeVector myEdges;
    1022              : 
    1023              :     static SVCPermissions myMesoIgnoredVClasses;
    1024              :     /// @}
    1025              : 
    1026              : 
    1027              :     /// @brief The successors available for a given vClass
    1028              :     mutable std::map<SUMOVehicleClass, MSEdgeVector> myClassesSuccessorMap;
    1029              : 
    1030              :     /// @brief The successors available for a given vClass
    1031              :     mutable std::map<SUMOVehicleClass, MSConstEdgePairVector> myClassesViaSuccessorMap;
    1032              :     mutable std::map<SUMOVehicleClass, MSConstEdgePairVector> myOrigClassesViaSuccessorMap;
    1033              : 
    1034              :     /// @brief The bounding rectangle of end nodes incoming or outgoing edges for taz connectors or of my own start and end node for normal edges
    1035              :     Boundary myBoundary;
    1036              : 
    1037              :     /// @brief List of waiting vehicles
    1038              :     mutable std::vector<SUMOVehicle*> myWaiting;
    1039              : 
    1040              : #ifdef HAVE_FOX
    1041              :     /// @brief Mutex for accessing waiting vehicles
    1042              :     mutable FXMutex myWaitingMutex;
    1043              : 
    1044              :     /// @brief Mutex for accessing successor edges
    1045              :     mutable FXMutex mySuccessorMutex;
    1046              : #endif
    1047              : 
    1048              : private:
    1049              : 
    1050              :     /// @brief the oppositing superposable edge
    1051              :     const MSEdge* myBidiEdge;
    1052              : 
    1053              :     /// @brief a reversed version for backward routing
    1054              :     mutable ReversedEdge<MSEdge, SUMOVehicle>* myReversedRoutingEdge = nullptr;
    1055              :     mutable RailEdge<MSEdge, SUMOVehicle>* myRailwayRoutingEdge = nullptr;
    1056              : 
    1057              :     /// @brief Invalidated copy constructor.
    1058              :     MSEdge(const MSEdge&);
    1059              : 
    1060              :     /// @brief assignment operator.
    1061              :     MSEdge& operator=(const MSEdge&) = delete;
    1062              : 
    1063              :     void setBidiLanes();
    1064              : 
    1065              :     bool isSuperposable(const MSEdge* other);
    1066              : 
    1067              :     void addToAllowed(const SVCPermissions permissions, std::shared_ptr<const std::vector<MSLane*> > allowedLanes, AllowedLanesCont& laneCont) const;
    1068              : };
        

Generated by: LCOV version 2.0-1