LCOV - code coverage report
Current view: top level - src/microsim - MSNet.h (source / functions) Coverage Total Hit
Test: lcov.info Lines: 94.4 % 36 34
Test Date: 2024-10-24 15:46:30 Functions: 80.0 % 5 4

            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    MSNet.h
      15              : /// @author  Christian Roessel
      16              : /// @author  Jakob Erdmann
      17              : /// @author  Daniel Krajzewicz
      18              : /// @author  Thimor Bohn
      19              : /// @author  Eric Nicolay
      20              : /// @author  Clemens Honomichl
      21              : /// @author  Michael Behrisch
      22              : /// @author  Leonhard Luecken
      23              : /// @date    Mon, 12 Mar 2001
      24              : ///
      25              : // The simulated network and simulation performer
      26              : /****************************************************************************/
      27              : #pragma once
      28              : #include <config.h>
      29              : 
      30              : #include <typeinfo>
      31              : #include <vector>
      32              : #include <map>
      33              : #include <string>
      34              : #include <fstream>
      35              : #include <iostream>
      36              : #include <cmath>
      37              : #include <iomanip>
      38              : #include <memory>
      39              : #include <utils/common/SUMOTime.h>
      40              : #include <utils/common/UtilExceptions.h>
      41              : #include <utils/common/NamedObjectCont.h>
      42              : #include <utils/common/NamedRTree.h>
      43              : #include <utils/router/SUMOAbstractRouter.h>
      44              : #include <mesosim/MESegment.h>
      45              : #include "MSRouterDefs.h"
      46              : #include "MSJunction.h"
      47              : 
      48              : 
      49              : // ===========================================================================
      50              : // class declarations
      51              : // ===========================================================================
      52              : class MSEdge;
      53              : class MSEdgeControl;
      54              : class MSEventControl;
      55              : class MSVehicleControl;
      56              : class MSJunctionControl;
      57              : class MSInsertionControl;
      58              : class SUMORouteLoaderControl;
      59              : class MSTransportableControl;
      60              : class MSTransportable;
      61              : class MSVehicle;
      62              : class MSRoute;
      63              : class MSLane;
      64              : class MSTLLogicControl;
      65              : class MSTrafficLightLogic;
      66              : class MSDetectorControl;
      67              : class ShapeContainer;
      68              : class MSDynamicShapeUpdater;
      69              : class PolygonDynamics;
      70              : class MSEdgeWeightsStorage;
      71              : class SUMOVehicle;
      72              : class SUMOTrafficObject;
      73              : class MSTractionSubstation;
      74              : class MSStoppingPlace;
      75              : template<class E, class L, class N, class V>
      76              : class IntermodalRouter;
      77              : template<class E, class L, class N, class V>
      78              : class PedestrianRouter;
      79              : class OptionsCont;
      80              : 
      81              : 
      82              : // ===========================================================================
      83              : // class definitions
      84              : // ===========================================================================
      85              : /**
      86              :  * @class MSNet
      87              :  * @brief The simulated network and simulation perfomer
      88              :  */
      89              : class MSNet : public Parameterised {
      90              : public:
      91              :     /** @enum SimulationState
      92              :      * @brief Possible states of a simulation - running or stopped with different reasons
      93              :      */
      94              :     enum SimulationState {
      95              :         /// @brief The simulation is loading
      96              :         SIMSTATE_LOADING,
      97              :         /// @brief The simulation is running
      98              :         SIMSTATE_RUNNING,
      99              :         /// @brief The final simulation step has been performed
     100              :         SIMSTATE_END_STEP_REACHED,
     101              :         /// @brief The simulation does not contain further vehicles
     102              :         SIMSTATE_NO_FURTHER_VEHICLES,
     103              :         /// @brief The connection to a client was closed by the client
     104              :         SIMSTATE_CONNECTION_CLOSED,
     105              :         /// @brief An error occurred during the simulation step
     106              :         SIMSTATE_ERROR_IN_SIM,
     107              :         /// @brief An external interrupt occured
     108              :         SIMSTATE_INTERRUPTED,
     109              :         /// @brief The simulation had too many teleports
     110              :         SIMSTATE_TOO_MANY_TELEPORTS
     111              :     };
     112              : 
     113              :     /// @brief collision tracking
     114              :     struct Collision {
     115              :         std::string victim;
     116              :         std::string colliderType;
     117              :         std::string victimType;
     118              :         double colliderSpeed;
     119              :         double victimSpeed;
     120              :         std::string type;
     121              :         const MSLane* lane;
     122              :         double pos;
     123              :         SUMOTime time;
     124              :     };
     125              : 
     126              :     typedef std::map<std::string, std::vector<Collision> > CollisionMap;
     127              : 
     128              : public:
     129              :     /** @brief Returns the pointer to the unique instance of MSNet (singleton).
     130              :      * @return Pointer to the unique MSNet-instance
     131              :      * @exception ProcessError If a network was not yet constructed
     132              :      */
     133              :     static MSNet* getInstance();
     134              : 
     135              :     /**
     136              :      * @brief Returns whether this is a GUI Net
     137              :      */
     138           40 :     virtual bool isGUINet() const {
     139           40 :         return false;
     140              :     }
     141              : 
     142              :     /// @brief Place for static initializations of simulation components (called after successful net build)
     143              :     static void initStatic();
     144              : 
     145              :     /// @brief Place for static initializations of simulation components (called after successful net build)
     146              :     static void cleanupStatic();
     147              : 
     148              : 
     149              :     /** @brief Returns whether the network was already constructed
     150              :     * @return whether the network was already constructed
     151              :     */
     152              :     static bool hasInstance() {
     153      6597518 :         return myInstance != nullptr;
     154              :     }
     155              : 
     156              : 
     157              :     /** @brief Constructor
     158              :      *
     159              :      * This constructor builds a net of which only some basic structures are initialised.
     160              :      * It prepares the network for being filled while loading.
     161              :      * As soon as all edge/junction/traffic lights and other containers are build, they
     162              :      *  must be initialised using "closeBuilding".
     163              :      * @param[in] vc The vehicle control to use
     164              :      * @param[in] beginOfTimestepEvents The event control to use for simulation step begin events
     165              :      * @param[in] endOfTimestepEvents The event control to use for simulation step end events
     166              :      * @param[in] insertionEvents The event control to use for insertion events
     167              :      * @param[in] shapeCont The shape container to use
     168              :      * @exception ProcessError If a network was already constructed
     169              :      * @see closeBuilding
     170              :      */
     171              :     MSNet(MSVehicleControl* vc, MSEventControl* beginOfTimestepEvents,
     172              :           MSEventControl* endOfTimestepEvents,
     173              :           MSEventControl* insertionEvents,
     174              :           ShapeContainer* shapeCont = 0);
     175              : 
     176              : 
     177              :     /// @brief Destructor
     178              :     virtual ~MSNet();
     179              : 
     180              : 
     181              :     /** @brief Closes the network's building process
     182              :      *
     183              :      * Assigns the structures built while loading to this network.
     184              :      * @param[in] oc The options to use
     185              :      * @param[in] edges The control of edges which belong to this network
     186              :      * @param[in] junctions The control of junctions which belong to this network
     187              :      * @param[in] routeLoaders The route loaders used
     188              :      * @param[in] tlc The control of traffic lights which belong to this network
     189              :      * @param[in] stateDumpTimes List of time steps at which state shall be written
     190              :      * @param[in] stateDumpFiles Filenames for states
     191              :      * @param[in] hasInternalLinks Whether the network actually contains internal links
     192              :      * @param[in] junctionHigherSpeeds Whether the network was built with higher junction speeds
     193              :      * @param[in] version The network version
     194              :      * @todo Try to move all this to the constructor?
     195              :      */
     196              :     void closeBuilding(const OptionsCont& oc, MSEdgeControl* edges, MSJunctionControl* junctions,
     197              :                        SUMORouteLoaderControl* routeLoaders, MSTLLogicControl* tlc,
     198              :                        std::vector<SUMOTime> stateDumpTimes, std::vector<std::string> stateDumpFiles,
     199              :                        bool hasInternalLinks,
     200              :                        bool junctionHigherSpeeds,
     201              :                        const MMVersion& version);
     202              : 
     203              : 
     204              :     /** @brief Returns whether the network has specific vehicle class permissions
     205              :      * @return whether permissions are present
     206              :      */
     207              :     bool hasPermissions() const {
     208     37556539 :         return myHavePermissions;
     209              :     }
     210              : 
     211              : 
     212              :     /// @brief Labels the network to contain vehicle class permissions
     213              :     void setPermissionsFound() {
     214       747254 :         myHavePermissions = true;
     215       747254 :     }
     216              : 
     217              : 
     218              :     /** @brief Adds a restriction for an edge type
     219              :      * @param[in] id The id of the type
     220              :      * @param[in] svc The vehicle class the restriction refers to
     221              :      * @param[in] speed The restricted speed
     222              :      */
     223              :     void addRestriction(const std::string& id, const SUMOVehicleClass svc, const double speed);
     224              : 
     225              : 
     226              :     /** @brief Returns the restrictions for an edge type
     227              :      * If no restrictions are present, 0 is returned.
     228              :      * @param[in] id The id of the type
     229              :      * @return The mapping of vehicle classes to maximum speeds
     230              :      */
     231              :     const std::map<SUMOVehicleClass, double>* getRestrictions(const std::string& id) const;
     232              : 
     233              :     /** @brief Adds edge type specific meso parameters
     234              :      * @param[in] id The id of the type
     235              :      * @param[in] edgeType The parameter object
     236              :      */
     237              :     void addMesoType(const std::string& typeID, const MESegment::MesoEdgeType& edgeType);
     238              : 
     239              :     /** @brief Returns edge type specific meso parameters
     240              :      * if no type specific parameters have been loaded, default values are returned
     241              :      */
     242              :     const MESegment::MesoEdgeType& getMesoType(const std::string& typeID);
     243              : 
     244              :     /** @brief Clears all dictionaries
     245              :      * @todo Try to move all this to the destructor
     246              :      */
     247              :     static void clearAll();
     248              : 
     249              :     /// @brief return whether the given flow is known
     250              :     bool hasFlow(const std::string& id) const;
     251              : 
     252              :     /** @brief Simulates from timestep start to stop
     253              :      * @param[in] start The begin time step of the simulation
     254              :      * @param[in] stop The end time step of the simulation
     255              :      * @return Returns always 0
     256              :      * @todo Recheck return value
     257              :      * @todo What exceptions may occure?
     258              :      */
     259              :     SimulationState simulate(SUMOTime start, SUMOTime stop);
     260              : 
     261              : 
     262              :     /** @brief Performs a single simulation step
     263              :      * @todo Which exceptions may occur?
     264              :      */
     265              :     void simulationStep(const bool onlyMove = false);
     266              : 
     267              :     /** @brief loads routes for the next few steps */
     268              :     void loadRoutes();
     269              : 
     270              : 
     271              :     /** @brief Writes performance output and running vehicle stats
     272              :      *
     273              :      * @param[in] start The step the simulation was started with
     274              :      */
     275              :     const std::string generateStatistics(const SUMOTime start, const long now);
     276              : 
     277              :     /// @brief write collision output to (xml) file
     278              :     void writeCollisions() const;
     279              : 
     280              :     /// @brief write statistic output to (xml) file
     281              :     void writeStatistics(const SUMOTime start, const long now) const;
     282              : 
     283              :     /// @brief write summary-output to (xml) file
     284              :     void writeSummaryOutput();
     285              : 
     286              :     /** @brief Closes the simulation (all files, connections, etc.)
     287              :      *
     288              :      * Writes also performance output
     289              :      *
     290              :      * @param[in] start The step the simulation was started with
     291              :      */
     292              :     void closeSimulation(SUMOTime start, const std::string& reason = "");
     293              : 
     294              : 
     295              :     /** @brief This method returns the current simulation state. It should not modify status.
     296              :      * @param[in] stopTime The time the simulation shall stop at
     297              :      * @return The current simulation state
     298              :      * @see SimulationState
     299              :      */
     300              :     SimulationState simulationState(SUMOTime stopTime) const;
     301              : 
     302              : 
     303              :     /** @brief Called after a simulation step, this method adapts the current simulation state if necessary
     304              :      * @param[in] state The current simulation state
     305              :      * @return The new simulation state
     306              :      * @see SimulationState
     307              :      */
     308              :     SimulationState adaptToState(const SimulationState state, const bool isLibsumo = false) const;
     309              : 
     310              : 
     311              :     /** @brief Returns the message to show if a certain state occurs
     312              :      * @return Readable description of the state
     313              :      */
     314              :     static std::string getStateMessage(SimulationState state);
     315              : 
     316              : 
     317              :     /** @brief Returns the current simulation step
     318              :      * @return the current simulation step
     319              :      */
     320              :     inline SUMOTime getCurrentTimeStep() const {
     321   2038537919 :         return myStep;
     322              :     }
     323              : 
     324              : 
     325              :     /** @brief Sets the current simulation step (used by state loading)
     326              :      * @param step the current simulation step
     327              :      */
     328              :     inline void setCurrentTimeStep(const SUMOTime step) {
     329         7985 :         myStep = step;
     330              :     }
     331              : 
     332              : 
     333              :     /** @brief Resets events when quick-loading state
     334              :      * @param step The new simulation step
     335              :      */
     336              :     void clearState(const SUMOTime step, bool quickReload = false);
     337              : 
     338              :     /** @brief Write netstate, summary and detector output
     339              :      * @todo Which exceptions may occur?
     340              :      */
     341              :     void writeOutput();
     342              : 
     343              : 
     344              :     /** @brief Returns whether duration shall be logged
     345              :      * @return Whether duration shall be logged
     346              :      */
     347              :     bool logSimulationDuration() const;
     348              : 
     349              : 
     350              : 
     351              :     /// @name Output during the simulation
     352              :     //@{
     353              : 
     354              :     /** @brief Prints the current step number
     355              :      *
     356              :      * Called on the begin of a simulation step
     357              :      */
     358              :     void preSimStepOutput() const;
     359              : 
     360              : 
     361              :     /** @brief Prints the statistics of the step at its end
     362              :      *
     363              :      * Called on the end of a simulation step
     364              :      */
     365              :     void postSimStepOutput() const;
     366              :     //}
     367              : 
     368              : 
     369              : 
     370              :     /// @name Retrieval of references to substructures
     371              :     /// @{
     372              : 
     373              :     /** @brief Returns the vehicle control
     374              :      * @return The vehicle control
     375              :      * @see MSVehicleControl
     376              :      * @see myVehicleControl
     377              :      */
     378              :     MSVehicleControl& getVehicleControl() {
     379    498552753 :         return *myVehicleControl;
     380              :     }
     381              : 
     382              : 
     383              :     /** @brief Returns the person control
     384              :      *
     385              :      * If the person control does not exist, yet, it is created.
     386              :      *
     387              :      * @return The person control
     388              :      * @see MSPersonControl
     389              :      * @see myPersonControl
     390              :      */
     391              :     virtual MSTransportableControl& getPersonControl();
     392              : 
     393              :     /** @brief Returns whether persons are simulated
     394              :      */
     395              :     bool hasPersons() const {
     396    336287975 :         return myPersonControl != nullptr;
     397              :     }
     398              : 
     399              :     /** @brief Returns the container control
     400              :      *
     401              :      * If the container control does not exist, yet, it is created.
     402              :      *
     403              :      * @return The container control
     404              :      * @see MSContainerControl
     405              :      * @see myContainerControl
     406              :      */
     407              :     virtual MSTransportableControl& getContainerControl();
     408              : 
     409              :     /** @brief Returns whether containers are simulated
     410              :     */
     411              :     bool hasContainers() const {
     412     27711207 :         return myContainerControl != nullptr;
     413              :     }
     414              : 
     415              : 
     416              :     /** @brief Returns the edge control
     417              :      * @return The edge control
     418              :      * @see MSEdgeControl
     419              :      * @see myEdges
     420              :      */
     421              :     MSEdgeControl& getEdgeControl() {
     422    208264995 :         return *myEdges;
     423              :     }
     424              : 
     425              : 
     426              :     /** @brief Returns the insertion control
     427              :      * @return The insertion control
     428              :      * @see MSInsertionControl
     429              :      * @see myInserter
     430              :      */
     431              :     MSInsertionControl& getInsertionControl() {
     432      7161079 :         return *myInserter;
     433              :     }
     434              : 
     435              : 
     436              :     /** @brief Returns the detector control
     437              :      * @return The detector control
     438              :      * @see MSDetectorControl
     439              :      * @see myDetectorControl
     440              :      */
     441              :     MSDetectorControl& getDetectorControl() {
     442       153038 :         return *myDetectorControl;
     443              :     }
     444              : 
     445              : 
     446              :     /** @brief Returns the tls logics control
     447              :      * @return The tls logics control
     448              :      * @see MSTLLogicControl
     449              :      * @see myLogics
     450              :      */
     451              :     MSTLLogicControl& getTLSControl() {
     452       320814 :         return *myLogics;
     453              :     }
     454              : 
     455              : 
     456              :     /** @brief Returns the junctions control
     457              :      * @return The junctions control
     458              :      * @see MSJunctionControl
     459              :      * @see myJunctions
     460              :      */
     461              :     MSJunctionControl& getJunctionControl() {
     462        32482 :         return *myJunctions;
     463              :     }
     464              : 
     465              : 
     466              :     /** @brief Returns the event control for events executed at the begin of a time step
     467              :      * @return The control responsible for events that are executed at the begin of a time step
     468              :      * @see MSEventControl
     469              :      * @see myBeginOfTimestepEvents
     470              :      */
     471              :     MSEventControl* getBeginOfTimestepEvents() {
     472       323951 :         return myBeginOfTimestepEvents;
     473              :     }
     474              : 
     475              : 
     476              :     /** @brief Returns the event control for events executed at the end of a time step
     477              :      * @return The control responsible for events that are executed at the end of a time step
     478              :      * @see MSEventControl
     479              :      * @see myEndOfTimestepEvents
     480              :      */
     481              :     MSEventControl* getEndOfTimestepEvents() {
     482        23552 :         return myEndOfTimestepEvents;
     483              :     }
     484              : 
     485              : 
     486              :     /** @brief Returns the event control for insertion events
     487              :      * @return The control responsible for insertion events
     488              :      * @see MSEventControl
     489              :      * @see myInsertionEvents
     490              :      */
     491              :     MSEventControl* getInsertionEvents() {
     492      1513472 :         return myInsertionEvents;
     493              :     }
     494              : 
     495              : 
     496              :     /** @brief Returns the shapes container
     497              :      * @return The shapes container
     498              :      * @see ShapeContainer
     499              :      * @see myShapeContainer
     500              :      */
     501              :     ShapeContainer& getShapeContainer() {
     502        99704 :         return *myShapeContainer;
     503              :     }
     504              : 
     505              :     /** @brief Returns the dynamic shapes updater
     506              :      * @see PolygonDynamics
     507              :      */
     508              :     MSDynamicShapeUpdater* getDynamicShapeUpdater() {
     509              :         return myDynamicShapeUpdater.get();
     510              :     }
     511              : 
     512              :     /** @brief Creates and returns a dynamic shapes updater
     513              :      * @see PolygonDynamics
     514              :      */
     515              :     MSDynamicShapeUpdater* makeDynamicShapeUpdater();
     516              : 
     517              :     /** @brief Returns the net's internal edge travel times/efforts container
     518              :      *
     519              :      * If the net does not have such a container, it is built.
     520              :      * @return The net's knowledge about edge weights
     521              :      */
     522              :     MSEdgeWeightsStorage& getWeightsStorage();
     523              :     /// @}
     524              : 
     525              :     /// @name Insertion and retrieval of stopping places
     526              :     /// @{
     527              : 
     528              :     /** @brief Adds a stopping place
     529              :      *
     530              :      * If another stop with the same id and category exists, false is returned.
     531              :      *  Otherwise, the stop is added to the internal stopping place container.
     532              :      *
     533              :      * This control gets responsible for deletion of the added stop.
     534              :      *
     535              :      * @param[in] stop The stop to add
     536              :      * @return Whether the stop could be added
     537              :      */
     538              :     bool addStoppingPlace(const SumoXMLTag category, MSStoppingPlace* stop);
     539              : 
     540              : 
     541              :     /** @brief Adds a traction substation
     542              :      *
     543              :      * If another traction substation with the same id and category exists, false is returned.
     544              :      *  Otherwise, the traction substation is added to the internal substations container.
     545              :      *
     546              :      * @param[in] substation The traction substation to add
     547              :      * @return Whether the stop could be added
     548              :      */
     549              :     bool addTractionSubstation(MSTractionSubstation* substation);
     550              : 
     551              : 
     552              :     /** @brief Returns the named stopping place of the given category
     553              :      * @param[in] id The id of the stop to return.
     554              :      * @param[in] category The type of stop
     555              :      * @return The named stop, or 0 if no such stop exists
     556              :      */
     557              :     MSStoppingPlace* getStoppingPlace(const std::string& id, const SumoXMLTag category) const;
     558              : 
     559              :     /** @brief Returns the named stopping place by looking through all categories
     560              :      * @param[in] id The id of the stop to return.
     561              :      * @return The named stop, or 0 if no such stop exists
     562              :      */
     563              :     MSStoppingPlace* getStoppingPlace(const std::string& id) const;
     564              : 
     565              :     /** @brief Returns the stop of the given category close to the given position
     566              :      * @param[in] lane the lane of the stop to return.
     567              :      * @param[in] pos the position of the stop to return.
     568              :      * @param[in] category The type of stop
     569              :      * @return The stop id on the location, or "" if no such stop exists
     570              :      */
     571              :     std::string getStoppingPlaceID(const MSLane* lane, const double pos, const SumoXMLTag category) const;
     572              :     /// @}
     573              : 
     574              :     const NamedObjectCont<MSStoppingPlace*>& getStoppingPlaces(SumoXMLTag category) const;
     575              : 
     576              :     /// @brief write charging station output
     577              :     void writeChargingStationOutput() const;
     578              : 
     579              :     /// @brief write rail signal block output
     580              :     void writeRailSignalBlocks() const;
     581              : 
     582              :     /// @brief creates a wrapper for the given logic (see GUINet)
     583           57 :     virtual void createTLWrapper(MSTrafficLightLogic*) {};
     584              : 
     585              :     /// @brief write the output generated by an overhead wire segment
     586              :     void writeOverheadWireSegmentOutput() const;
     587              : 
     588              :     /// @brief write electrical substation output
     589              :     void writeSubstationOutput() const;
     590              : 
     591              :     /// @brief return wheter the given logic (or rather its wrapper) is selected in the GUI
     592            0 :     virtual bool isSelected(const MSTrafficLightLogic*) const {
     593            0 :         return false;
     594              :     }
     595              :     /// @brief update view after simulation.loadState
     596          143 :     virtual void updateGUI() const { }
     597              : 
     598              :     /// @brief load state from file and return new time
     599              :     SUMOTime loadState(const std::string& fileName, const bool catchExceptions);
     600              : 
     601              :     /// @brief reset state to the beginning without reloading the network
     602              :     void quickReload();
     603              : 
     604              :     /// @name Notification about vehicle state changes
     605              :     /// @{
     606              : 
     607              :     /// @brief Definition of a vehicle state
     608              :     enum class VehicleState {
     609              :         /// @brief The vehicle was built, but has not yet departed
     610              :         BUILT,
     611              :         /// @brief The vehicle has departed (was inserted into the network)
     612              :         DEPARTED,
     613              :         /// @brief The vehicle started to teleport
     614              :         STARTING_TELEPORT,
     615              :         /// @brief The vehicle ended being teleported
     616              :         ENDING_TELEPORT,
     617              :         /// @brief The vehicle arrived at his destination (is deleted)
     618              :         ARRIVED,
     619              :         /// @brief The vehicle got a new route
     620              :         NEWROUTE,
     621              :         /// @brief The vehicles starts to park
     622              :         STARTING_PARKING,
     623              :         /// @brief The vehicle ends to park
     624              :         ENDING_PARKING,
     625              :         /// @brief The vehicles starts to stop
     626              :         STARTING_STOP,
     627              :         /// @brief The vehicle ends to stop
     628              :         ENDING_STOP,
     629              :         /// @brief The vehicle is involved in a collision
     630              :         COLLISION,
     631              :         /// @brief The vehicle had to brake harder than permitted
     632              :         EMERGENCYSTOP,
     633              :         /// @brief Vehicle maneuvering either entering or exiting a parking space
     634              :         MANEUVERING
     635              :     };
     636              : 
     637              : 
     638              :     /** @class VehicleStateListener
     639              :      * @brief Interface for objects listening to vehicle state changes
     640              :      */
     641              :     class VehicleStateListener {
     642              :     public:
     643              :         /// @brief Constructor
     644         3456 :         VehicleStateListener() { }
     645              : 
     646              :         /// @brief Destructor
     647              :         virtual ~VehicleStateListener() { }
     648              : 
     649              :         /** @brief Called if a vehicle changes its state
     650              :          * @param[in] vehicle The vehicle which changed its state
     651              :          * @param[in] to The state the vehicle has changed to
     652              :          * @param[in] info Additional information on the state change
     653              :          */
     654              :         virtual void vehicleStateChanged(const SUMOVehicle* const vehicle, VehicleState to, const std::string& info = "") = 0;
     655              : 
     656              :     };
     657              : 
     658              : 
     659              :     /** @brief Adds a vehicle states listener
     660              :      * @param[in] listener The listener to add
     661              :      */
     662              :     void addVehicleStateListener(VehicleStateListener* listener);
     663              : 
     664              : 
     665              :     /** @brief Removes a vehicle states listener
     666              :      * @param[in] listener The listener to remove
     667              :      */
     668              :     void removeVehicleStateListener(VehicleStateListener* listener);
     669              : 
     670              : 
     671              :     /** @brief Informs all added listeners about a vehicle's state change
     672              :      * @param[in] vehicle The vehicle which changed its state
     673              :      * @param[in] to The state the vehicle has changed to
     674              :      * @param[in] info Information regarding the replacement
     675              :      * @see VehicleStateListener:vehicleStateChanged
     676              :      */
     677              :     void informVehicleStateListener(const SUMOVehicle* const vehicle, VehicleState to, const std::string& info = "");
     678              :     /// @}
     679              : 
     680              : 
     681              :     /// @name Notification about transportable state changes
     682              :     /// @{
     683              : 
     684              :     /// @brief Definition of a transportable state
     685              :     enum class TransportableState {
     686              :         /// @brief The transportable person has departed (was inserted into the network)
     687              :         PERSON_DEPARTED,
     688              :         /// @brief The transportable person arrived at his destination (is deleted)
     689              :         PERSON_ARRIVED,
     690              :         /// @brief The transportable container has departed (was inserted into the network)
     691              :         CONTAINER_DEPARTED,
     692              :         /// @brief The transportable container arrived at his destination (is deleted)
     693              :         CONTAINER_ARRIVED
     694              :     };
     695              : 
     696              : 
     697              :     /** @class TransportableStateListener
     698              :      * @brief Interface for objects listening to transportable state changes
     699              :      */
     700              :     class TransportableStateListener {
     701              :     public:
     702              :         /// @brief Constructor
     703         2477 :         TransportableStateListener() { }
     704              : 
     705              :         /// @brief Destructor
     706              :         virtual ~TransportableStateListener() { }
     707              : 
     708              :         /** @brief Called if a transportable changes its state
     709              :          * @param[in] transportable The transportable which changed its state
     710              :          * @param[in] to The state the transportable has changed to
     711              :          * @param[in] info Additional information on the state change
     712              :          */
     713              :         virtual void transportableStateChanged(const MSTransportable* const transportable, TransportableState to, const std::string& info = "") = 0;
     714              : 
     715              :     };
     716              : 
     717              : 
     718              :     /** @brief Adds a transportable states listener
     719              :      * @param[in] listener The listener to add
     720              :      */
     721              :     void addTransportableStateListener(TransportableStateListener* listener);
     722              : 
     723              : 
     724              :     /** @brief Removes a transportable states listener
     725              :      * @param[in] listener The listener to remove
     726              :      */
     727              :     void removeTransportableStateListener(TransportableStateListener* listener);
     728              : 
     729              : 
     730              :     /** @brief Informs all added listeners about a transportable's state change
     731              :      * @param[in] transportable The transportable which changed its state
     732              :      * @param[in] to The state the transportable has changed to
     733              :      * @param[in] info Information regarding the replacement
     734              :      * @see TransportableStateListener:TransportableStateChanged
     735              :      */
     736              :     void informTransportableStateListener(const MSTransportable* const transportable, TransportableState to, const std::string& info = "");
     737              :     /// @}
     738              : 
     739              : 
     740              :     /// @brief register collision and return whether it was the first one involving these vehicles
     741              :     bool registerCollision(const SUMOTrafficObject* collider, const SUMOTrafficObject* victim, const std::string& collisionType, const MSLane* lane, double pos);
     742              : 
     743              :     const CollisionMap& getCollisions() const {
     744              :         return myCollisions;
     745              :     }
     746              : 
     747              : 
     748              :     /** @brief Returns the travel time to pass an edge
     749              :      * @param[in] e The edge for which the travel time to be passed shall be returned
     750              :      * @param[in] v The vehicle that is rerouted
     751              :      * @param[in] t The time for which the travel time shall be returned [s]
     752              :      * @return The travel time for an edge
     753              :      * @see DijkstraRouter_ByProxi
     754              :      */
     755              :     static double getTravelTime(const MSEdge* const e, const SUMOVehicle* const v, double t);
     756              : 
     757              : 
     758              :     /** @brief Returns the effort to pass an edge
     759              :      * @param[in] e The edge for which the effort to be passed shall be returned
     760              :      * @param[in] v The vehicle that is rerouted
     761              :      * @param[in] t The time for which the effort shall be returned [s]
     762              :      * @return The effort (abstract) for an edge
     763              :      * @see DijkstraRouter_ByProxi
     764              :      */
     765              :     static double getEffort(const MSEdge* const e, const SUMOVehicle* const v, double t);
     766              : 
     767              : 
     768              :     /* @brief get the router, initialize on first use
     769              :      * @param[in] prohibited The vector of forbidden edges (optional)
     770              :      */
     771              :     MSVehicleRouter& getRouterTT(const int rngIndex, const MSEdgeVector& prohibited = MSEdgeVector()) const;
     772              :     MSVehicleRouter& getRouterEffort(const int rngIndex, const MSEdgeVector& prohibited = MSEdgeVector()) const;
     773              :     MSPedestrianRouter& getPedestrianRouter(const int rngIndex, const MSEdgeVector& prohibited = MSEdgeVector()) const;
     774              :     MSTransportableRouter& getIntermodalRouter(const int rngIndex, const int routingMode = 0, const MSEdgeVector& prohibited = MSEdgeVector()) const;
     775              : 
     776              :     static void adaptIntermodalRouter(MSTransportableRouter& router);
     777              : 
     778              : 
     779              :     /// @brief return whether the network contains internal links
     780              :     bool hasInternalLinks() const {
     781       280028 :         return myHasInternalLinks;
     782              :     }
     783              : 
     784              :     /// @brief return whether the network was built with higher junction speeds
     785              :     bool hasJunctionHigherSpeeds() const {
     786           20 :         return myJunctionHigherSpeeds;
     787              :     }
     788              : 
     789              :     /// @brief return whether the network contains elevation data
     790              :     bool hasElevation() const {
     791   1248492662 :         return myHasElevation;
     792              :     }
     793              : 
     794              :     /// @brief return whether the network contains walkingareas and crossings
     795              :     bool hasPedestrianNetwork() const {
     796       122338 :         return myHasPedestrianNetwork;
     797              : 
     798              :     }
     799              :     /// @brief return whether the network contains bidirectional rail edges
     800              :     bool hasBidiEdges() const {
     801       102467 :         return myHasBidiEdges;
     802              :     }
     803              : 
     804              :     /// @brief return the network version
     805              :     MMVersion getNetworkVersion() const {
     806              :         return myVersion;
     807              :     }
     808              : 
     809              :     /// @brief return whether a warning regarding the given object shall be issued
     810              :     bool warnOnce(const std::string& typeAndID);
     811              : 
     812              :     void interrupt() {
     813           10 :         myAmInterrupted = true;
     814           10 :     }
     815              : 
     816              :     bool isInterrupted() const {
     817           10 :         return myAmInterrupted;
     818              :     }
     819              : 
     820              :     /// @brief gui may prevent final meanData reset to keep live data visible
     821     16301491 :     virtual bool skipFinalReset() const {
     822     16301491 :         return false;
     823              :     }
     824              : 
     825              :     /// @brief find electrical substation by its id
     826              :     MSTractionSubstation* findTractionSubstation(const std::string& substationId);
     827              : 
     828              :     /// @brief return whether given electrical substation exists in the network
     829              :     bool existTractionSubstation(const std::string& substationId);
     830              : 
     831              :     /// @brief string constants for simstep stages
     832              :     static const std::string STAGE_EVENTS;
     833              :     static const std::string STAGE_MOVEMENTS;
     834              :     static const std::string STAGE_LANECHANGE;
     835              :     static const std::string STAGE_INSERTIONS;
     836              :     static const std::string STAGE_REMOTECONTROL;
     837              : 
     838              : protected:
     839              :     /// @brief check all lanes for elevation data
     840              :     bool checkElevation();
     841              : 
     842              :     /// @brief check all lanes for type walkingArea
     843              :     bool checkWalkingarea();
     844              : 
     845              :     /// @brief check wether bidirectional edges occur in the network
     846              :     bool checkBidiEdges();
     847              : 
     848              :     /// @brief remove collisions from the previous simulation step
     849              :     void removeOutdatedCollisions();
     850              : 
     851              :     /** @brief Performs the parts of the simulation step which happen after the move
     852              :      */
     853              :     void postMoveStep();
     854              : 
     855              : protected:
     856              :     /// @brief Unique instance of MSNet
     857              :     static MSNet* myInstance;
     858              : 
     859              :     /// @brief Route loader for dynamic loading of routes
     860              :     SUMORouteLoaderControl* myRouteLoaders;
     861              : 
     862              :     /// @brief Current time step
     863              :     SUMOTime myStep;
     864              : 
     865              :     /// @brief whether libsumo triggered a partial step (executeMove)
     866              :     bool myStepCompletionMissing = false;
     867              : 
     868              :     /// @brief Maximum number of teleports.
     869              :     int myMaxTeleports;
     870              : 
     871              :     /// @brief whether an interrupt occured
     872              :     bool myAmInterrupted;
     873              : 
     874              : 
     875              : 
     876              :     /// @name Substructures
     877              :     /// @{
     878              : 
     879              :     /// @brief Controls vehicle building and deletion; @see MSVehicleControl
     880              :     MSVehicleControl* myVehicleControl;
     881              :     /// @brief Controls person building and deletion; @see MSTransportableControl
     882              :     MSTransportableControl* myPersonControl;
     883              :     /// @brief Controls container building and deletion; @see MSTransportableControl
     884              :     MSTransportableControl* myContainerControl;
     885              :     /// @brief Controls edges, performs vehicle movement; @see MSEdgeControl
     886              :     MSEdgeControl* myEdges;
     887              :     /// @brief Controls junctions, realizes right-of-way rules; @see MSJunctionControl
     888              :     MSJunctionControl* myJunctions;
     889              :     /// @brief Controls tls logics, realizes waiting on tls rules; @see MSJunctionControl
     890              :     MSTLLogicControl* myLogics;
     891              :     /// @brief Controls vehicle insertion; @see MSInsertionControl
     892              :     MSInsertionControl* myInserter;
     893              :     /// @brief Controls detectors; @see MSDetectorControl
     894              :     MSDetectorControl* myDetectorControl;
     895              :     /// @brief Controls events executed at the begin of a time step; @see MSEventControl
     896              :     MSEventControl* myBeginOfTimestepEvents;
     897              :     /// @brief Controls events executed at the end of a time step; @see MSEventControl
     898              :     MSEventControl* myEndOfTimestepEvents;
     899              :     /// @brief Controls insertion events; @see MSEventControl
     900              :     MSEventControl* myInsertionEvents;
     901              :     /// @brief A container for geometrical shapes; @see ShapeContainer
     902              :     ShapeContainer* myShapeContainer;
     903              :     /// @brief The net's knowledge about edge efforts/travel times; @see MSEdgeWeightsStorage
     904              :     MSEdgeWeightsStorage* myEdgeWeights;
     905              :     /// @}
     906              : 
     907              : 
     908              : 
     909              :     /// @name data needed for computing performance values
     910              :     /// @{
     911              : 
     912              :     /// @brief Information whether the simulation duration shall be logged
     913              :     bool myLogExecutionTime;
     914              : 
     915              :     /// @brief Information whether the number of the simulation step shall be logged
     916              :     bool myLogStepNumber;
     917              :     /// @brief Period between successive step-log outputs
     918              :     int myLogStepPeriod;
     919              : 
     920              :     /// @brief The last simulation step duration
     921              :     long myTraCIStepDuration = 0, mySimStepDuration = 0;
     922              : 
     923              :     /// @brief The overall simulation duration
     924              :     long mySimBeginMillis;
     925              : 
     926              :     /// @brief The overall time spent waiting for traci operations including
     927              :     long myTraCIMillis;
     928              : 
     929              :     /// @brief The overall number of vehicle movements
     930              :     long long int myVehiclesMoved;
     931              :     long long int myPersonsMoved;
     932              :     //}
     933              : 
     934              : 
     935              : 
     936              :     /// @name State output variables
     937              :     /// @{
     938              : 
     939              :     /// @brief Times at which a state shall be written
     940              :     std::vector<SUMOTime> myStateDumpTimes;
     941              :     /// @brief The names for the state files
     942              :     std::vector<std::string> myStateDumpFiles;
     943              :     /// @brief The names of the last K periodic state files (only only K shall be kept)
     944              :     std::vector<std::string> myPeriodicStateFiles;
     945              :     /// @brief The period for writing state
     946              :     SUMOTime myStateDumpPeriod;
     947              :     /// @brief name components for periodic state
     948              :     std::string myStateDumpPrefix;
     949              :     std::string myStateDumpSuffix;
     950              :     /// @}
     951              : 
     952              : 
     953              : 
     954              :     /// @brief Whether the network contains edges which not all vehicles may pass
     955              :     bool myHavePermissions;
     956              : 
     957              :     /// @brief The vehicle class specific speed restrictions
     958              :     std::map<std::string, std::map<SUMOVehicleClass, double> > myRestrictions;
     959              : 
     960              :     /// @brief The edge type specific meso parameters
     961              :     std::map<std::string, MESegment::MesoEdgeType> myMesoEdgeTypes;
     962              : 
     963              :     /// @brief Whether the network contains internal links/lanes/edges
     964              :     bool myHasInternalLinks;
     965              : 
     966              :     /// @brief Whether the network was built with higher speed on junctions
     967              :     bool myJunctionHigherSpeeds;
     968              : 
     969              :     /// @brief Whether the network contains elevation data
     970              :     bool myHasElevation;
     971              : 
     972              :     /// @brief Whether the network contains pedestrian network elements
     973              :     bool myHasPedestrianNetwork;
     974              : 
     975              :     /// @brief Whether the network contains bidirectional rail edges
     976              :     bool myHasBidiEdges;
     977              : 
     978              :     /// @brief Whether the network was built for left-hand traffic
     979              :     bool myLefthand;
     980              : 
     981              :     /// @brief the network version
     982              :     MMVersion myVersion;
     983              : 
     984              :     /// @brief end of loaded edgeData
     985              :     SUMOTime myEdgeDataEndTime;
     986              : 
     987              :     /// @brief Dictionary of bus / container stops
     988              :     std::map<SumoXMLTag, NamedObjectCont<MSStoppingPlace*> > myStoppingPlaces;
     989              : 
     990              :     /// @brief Dictionary of traction substations
     991              :     std::vector<MSTractionSubstation*> myTractionSubstations;
     992              : 
     993              :     /// @brief Container for vehicle state listener
     994              :     std::vector<VehicleStateListener*> myVehicleStateListeners;
     995              : 
     996              :     /// @brief Container for transportable state listener
     997              :     std::vector<TransportableStateListener*> myTransportableStateListeners;
     998              : 
     999              :     /// @brief collisions in the current time step
    1000              :     CollisionMap myCollisions;
    1001              : 
    1002              : #ifdef HAVE_FOX
    1003              :     /// @brief to avoid concurrent access to the state update function
    1004              :     FXMutex myVehicleStateListenerMutex;
    1005              : 
    1006              :     /// @brief to avoid concurrent access to the state update function
    1007              :     FXMutex myTransportableStateListenerMutex;
    1008              : #endif
    1009              :     static const NamedObjectCont<MSStoppingPlace*> myEmptyStoppingPlaceCont;
    1010              : 
    1011              :     /// @brief container to record warnings that shall only be issued once
    1012              :     std::map<std::string, bool> myWarnedOnce;
    1013              : 
    1014              :     /* @brief The router instance for routing by trigger and by traci
    1015              :      * @note MSDevice_Routing has its own instance since it uses a different weight function
    1016              :      * @note we provide one member for every switchable router type
    1017              :      * because the class structure makes it inconvenient to use a superclass
    1018              :      */
    1019              :     mutable std::map<int, MSVehicleRouter*> myRouterTT;
    1020              :     mutable std::map<int, MSVehicleRouter*> myRouterEffort;
    1021              :     mutable std::map<int, MSPedestrianRouter*> myPedestrianRouter;
    1022              :     mutable std::map<int, MSTransportableRouter*> myIntermodalRouter;
    1023              : 
    1024              :     /// @brief An RTree structure holding lane IDs
    1025              :     mutable std::pair<bool, NamedRTree> myLanesRTree;
    1026              : 
    1027              :     /// @brief Updater for dynamic shapes that are tracking traffic objects
    1028              :     ///        (ensures removal of shape dynamics when the objects are removed)
    1029              :     /// @see utils/shapes/PolygonDynamics
    1030              :     std::unique_ptr<MSDynamicShapeUpdater> myDynamicShapeUpdater;
    1031              : 
    1032              : private:
    1033              :     /// @brief Invalidated copy constructor.
    1034              :     MSNet(const MSNet&);
    1035              : 
    1036              :     /// @brief Invalidated assignment operator.
    1037              :     MSNet& operator=(const MSNet&);
    1038              : 
    1039              : 
    1040              : };
        

Generated by: LCOV version 2.0-1