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