|
Dynamical System Framework
|
The FirstOrderDynamics class represents the dynamics of the network. More...
#include <FirstOrderDynamics.hpp>
Public Member Functions | |
| FirstOrderDynamics (RoadNetwork &&graph, bool useCache=false, std::optional< unsigned int > seed=std::nullopt) | |
| Construct a new FirstOrderDynamics object. | |
| void | prepareNetwork () |
| Automatically prepare the network for the simulation. This method calls the following methods in order: | |
| void | setErrorProbability (double errorProbability) |
| Set the error probability. | |
| void | setPassageProbability (double passageProbability) |
| Set the passage probability. | |
| void | killStagnantAgents (double timeToleranceFactor=3.) |
| Set the time tolerance factor for killing stagnant agents. An agent will be considered stagnant if it has not moved for timeToleranceFactor * std::ceil(street_length / street_maxSpeed) time units. | |
| void | saveData (std::time_t const savingInterval, bool const saveAverageStats=false, bool const saveStreetData=false, bool const saveTravelData=false, bool const saveAgentData=false) |
| Enable data saving (compatibility wrapper; persistence is handled by TrafficSimulator). | |
| template<typename... TArgs> | |
| void | setSpeedFunction (SpeedFunction const speedFunction, TArgs &&... args) |
| Set the speed function. Options are: | |
| void | setForcePriorities (bool const forcePriorities) noexcept |
| Set the force priorities flag. | |
| void | setUpdatePathsThrowOnEmpty (bool const throwOnEmpty) noexcept |
| Set the update paths throw on empty flag. | |
| void | setDataUpdatePeriod (Delay const dataUpdatePeriod) noexcept |
| Set the data update period. | |
| void | setMeanTravelDistance (double const meanTravelDistance) |
| Set the mean distance travelled by a random agent. The distance will be sampled from an exponential distribution with this mean. | |
| void | setMeanTravelTime (std::time_t const meanTravelTime) noexcept |
| Set the mean travel time for random agents. The travel time will be sampled from an exponential distribution with this mean. | |
| void | setUTurnPenaltyFactor (double uturnPenaltyFactor) |
| Set the penalty factor applied to U-turns when choosing the next street. | |
| void | setReinsertAgents (bool const reinsertAgents) noexcept |
| void | setOriginNodes (std::unordered_map< Id, double > const &originNodes={}) |
| Set the origin nodes. If the provided map is empty, the origin nodes are set using the streets' stationary weights. NOTE: the default stationary weights are 1.0 so, if not set, this is equivalent to setting uniform weights. | |
| void | setDestinationNodes (std::unordered_map< Id, double > const &destinationNodes) |
| Set the destination nodes. | |
| void | setDestinationNodes (std::initializer_list< Id > destinationNodes) |
| Set the destination nodes. | |
| void | setODs (std::vector< std::tuple< Id, Id, double > > const &ODs) |
| Set the origin-destination pairs with their associated weights. | |
| template<typename TContainer> requires (std::is_convertible_v<typename TContainer::value_type, Id>) | |
| void | setDestinationNodes (TContainer const &destinationNodes) |
| Set the destination nodes. | |
| void | importODsFromCSV (std::string_view const fileName, char const separator=';') |
| Import origin-destination pairs from a CSV file. Possibilities are: | |
| void | initTurnCounts () |
| Initialize the turn counts map. | |
| void | resetTurnCounts () |
| Reset the turn counts map values to zero. | |
| void | updatePaths () |
| Update the paths of the itineraries based on the given weight function. | |
| void | addAgentsUniformly (std::size_t nAgents, std::optional< Id > itineraryId=std::nullopt) |
| Add agents uniformly on the road network. | |
| void | addAgent (std::unique_ptr< Agent > agent) |
| Add an agent to the simulation. | |
|
template<typename... TArgs> requires (std::is_constructible_v<Agent, Id, std::time_t, TArgs...>) | |
| void | addAgent (TArgs &&... args) |
|
template<typename... TArgs> requires (std::is_constructible_v<Agent, Id, std::time_t, TArgs...>) | |
| void | addAgents (std::size_t const nAgents, TArgs &&... args) |
| void | addAgents (std::size_t const nAgents, AgentInsertionMethod const mode) |
| Add agents to the simulation. | |
| template<typename... TArgs> requires (std::is_constructible_v<Itinerary, TArgs...>) | |
| void | addItinerary (TArgs &&... args) |
| Add an itinerary. | |
| void | addItinerary (std::shared_ptr< Itinerary > itinerary) |
| Add an itinerary. | |
| StepDataResult | evolve (StepDataRequest const &dataRequest={}) |
| Evolve the simulation. | |
| void | optimizeTrafficLights (TrafficLightOptimization optimizationType=TrafficLightOptimization::DOUBLE_TAIL, const std::string &logFile=std::string(), double const percentage=0.3, double const threshold=1.3) |
| Optimize the traffic lights by changing the green and red times. | |
| auto const & | itineraries () const noexcept |
| Get the itineraries. | |
| std::vector< std::tuple< Id, double > > const & | originNodes () const noexcept |
| Get the origin nodes of the graph. | |
| std::vector< std::tuple< Id, double > > & | originNodes () noexcept |
| Get the origin nodes of the graph. | |
| std::vector< std::tuple< Id, double > > const & | destinationNodes () const noexcept |
| Get the destination nodes of the graph. | |
| std::vector< std::tuple< Id, double > > & | destinationNodes () noexcept |
| Get the destination nodes of the graph. | |
| const std::vector< std::unique_ptr< Agent > > & | agents () const noexcept |
| Get the agents. | |
| auto | nAgents () const |
| Get the number of agents currently in the simulation. | |
| auto | ghostAgents () const |
| Get the number of ghost agents waiting to be inserted. | |
| Measurement< double > | meanTravelTime (bool clearData=false) |
| Get the mean travel time of the agents in \(s\). | |
| Measurement< double > | meanTravelDistance (bool clearData=false) |
| Get the mean travel distance of the agents in \(m\). | |
| Measurement< double > | meanTravelSpeed (bool clearData=false) |
| Get the mean travel speed of the agents in \(m/s\). | |
| std::unordered_map< Id, std::unordered_map< Id, size_t > > const & | turnCounts () const noexcept |
| Get the turn counts of the agents. | |
| std::unordered_map< Id, std::unordered_map< Id, double > > const | normalizedTurnCounts () const noexcept |
| Get the normalized turn counts of the agents. | |
| std::unordered_map< Id, std::array< long, 4 > > | turnMapping () const |
| tbb::concurrent_unordered_map< Id, std::size_t > | originCounts (bool const bReset=true) noexcept |
| Get the origin counts of the agents. | |
| tbb::concurrent_unordered_map< Id, std::size_t > | destinationCounts (bool const bReset=true) noexcept |
| Get the destination counts of the agents. | |
| Measurement< double > | streetMeanDensity (bool normalized=false) const |
| Get the mean density of the streets in \(m^{-1}\). | |
| Measurement< double > | streetMeanFlow () const |
| Get the mean flow of the streets in \(s^{-1}\). | |
| Measurement< double > | streetMeanFlow (double threshold, bool above) const |
| Get the mean flow of the streets in \(s^{-1}\). | |
| void | summary (std::ostream &os=std::cout) const |
| Print a summary of the dynamics to an output stream. | |
| Public Member Functions inherited from dsf::Dynamics< RoadNetwork > | |
| Dynamics (RoadNetwork &&graph, std::optional< unsigned int > seed=std::nullopt) | |
| Construct a new Dynamics object. | |
| void | setSeed (unsigned int const seed) noexcept |
| Set the seed for the random number generator. | |
| void | setConcurrency (std::size_t const concurrency) |
| Set the maximum number of threads to use for parallel execution. | |
| auto | concurrency () const |
| Get the current concurrency (number of threads configured in the task arena). | |
| auto const & | graph () const |
| Get the graph. | |
| auto | time_step () const |
| Get the current simulation time-step. | |
Protected Attributes | |
| std::unordered_map< Id, std::unordered_map< Id, size_t > > | m_turnCounts |
| std::unordered_map< Id, std::array< long, 4 > > | m_turnMapping |
| tbb::concurrent_unordered_map< Id, std::unordered_map< Direction, double > > | m_queuesAtTrafficLights |
| tbb::concurrent_vector< std::pair< double, double > > | m_travelDTs |
| std::time_t | m_previousOptimizationTime {0} |
| std::optional< double > | m_errorProbability {std::nullopt} |
| std::optional< double > | m_passageProbability {std::nullopt} |
| std::optional< double > | m_meanTravelDistance {std::nullopt} |
| std::optional< std::time_t > | m_meanTravelTime {std::nullopt} |
| std::optional< Delay > | m_dataUpdatePeriod |
| bool | m_bCacheEnabled |
| std::optional< double > | m_timeToleranceFactor {std::nullopt} |
| bool | m_forcePriorities {false} |
| Protected Attributes inherited from dsf::Dynamics< RoadNetwork > | |
| std::unique_ptr< RoadNetwork > | m_graph |
| tbb::task_arena | m_taskArena |
| std::mt19937_64 | m_generator |
Additional Inherited Members | |
| Protected Member Functions inherited from dsf::Dynamics< RoadNetwork > | |
| void | m_evolve () |
The FirstOrderDynamics class represents the dynamics of the network.
| dsf::mobility::FirstOrderDynamics::FirstOrderDynamics | ( | RoadNetwork && | graph, |
| bool | useCache = false, | ||
| std::optional< unsigned int > | seed = std::nullopt ) |
Construct a new FirstOrderDynamics object.
| graph | The graph representing the network |
| useCache | If true, the cache is used (default is false) |
| seed | The seed for the random number generator (default is std::nullopt) |
| void dsf::mobility::FirstOrderDynamics::addAgent | ( | std::unique_ptr< Agent > | agent | ) |
Add an agent to the simulation.
| agent | std::unique_ptr to the agent |
| void dsf::mobility::FirstOrderDynamics::addAgents | ( | std::size_t const | nAgents, |
| AgentInsertionMethod const | mode ) |
Add agents to the simulation.
| nAgents | The number of agents to add |
| mode | The method to use for adding the agents.Possible values are:
|
| void dsf::mobility::FirstOrderDynamics::addAgentsUniformly | ( | std::size_t | nAgents, |
| std::optional< Id > | itineraryId = std::nullopt ) |
Add agents uniformly on the road network.
| nAgents | The number of agents to add |
| itineraryId | The id of the itinerary to use (default is std::nullopt) |
| std::runtime_error | If there are no itineraries |
| void dsf::mobility::FirstOrderDynamics::addItinerary | ( | std::shared_ptr< Itinerary > | itinerary | ) |
Add an itinerary.
| itinerary | std::unique_ptr to the itinerary |
| std::invalid_argument | If the itinerary already exists |
| std::invalid_argument | If the itinerary's destination is not a node of the graph |
| void dsf::mobility::FirstOrderDynamics::addItinerary | ( | TArgs &&... | args | ) |
Add an itinerary.
| ...args | The arguments to construct the itinerary |
The arguments must be compatible with any constructor of the Itinerary class
|
inlinenoexcept |
Get the agents.
|
noexcept |
Get the destination counts of the agents.
| bReset | If true, the destination counts are cleared (default is true) |
|
inlinenoexcept |
Get the destination nodes of the graph.
|
inlinenoexcept |
Get the destination nodes of the graph.
| StepDataResult dsf::mobility::FirstOrderDynamics::evolve | ( | StepDataRequest const & | dataRequest = {} | ) |
Evolve the simulation.
Evolve the simulation by moving the agents and updating the travel times. In particular:
| dataRequest | The save/collection request for the current step |
|
inline |
Get the number of ghost agents waiting to be inserted.
| void dsf::mobility::FirstOrderDynamics::importODsFromCSV | ( | std::string_view const | fileName, |
| char const | separator = ';' ) |
Import origin-destination pairs from a CSV file. Possibilities are:
| void dsf::mobility::FirstOrderDynamics::initTurnCounts | ( | ) |
Initialize the turn counts map.
| std::runtime_error | if the turn counts map is already initialized |
|
inlinenoexcept |
Get the itineraries.
| void dsf::mobility::FirstOrderDynamics::killStagnantAgents | ( | double | timeToleranceFactor = 3. | ) |
Set the time tolerance factor for killing stagnant agents. An agent will be considered stagnant if it has not moved for timeToleranceFactor * std::ceil(street_length / street_maxSpeed) time units.
| timeToleranceFactor | The time tolerance factor |
| std::invalid_argument | If the time tolerance factor is not positive |
| Measurement< double > dsf::mobility::FirstOrderDynamics::meanTravelDistance | ( | bool | clearData = false | ) |
Get the mean travel distance of the agents in \(m\).
| clearData | If true, the travel distances are cleared after the computation |
| Measurement< double > dsf::mobility::FirstOrderDynamics::meanTravelSpeed | ( | bool | clearData = false | ) |
Get the mean travel speed of the agents in \(m/s\).
| clearData | If true, the travel times and distances are cleared after the computation |
| Measurement< double > dsf::mobility::FirstOrderDynamics::meanTravelTime | ( | bool | clearData = false | ) |
Get the mean travel time of the agents in \(s\).
| clearData | If true, the travel times are cleared after the computation |
|
inline |
Get the number of agents currently in the simulation.
|
noexcept |
Get the normalized turn counts of the agents.
| void dsf::mobility::FirstOrderDynamics::optimizeTrafficLights | ( | TrafficLightOptimization | optimizationType = TrafficLightOptimization::DOUBLE_TAIL, |
| const std::string & | logFile = std::string(), | ||
| double const | percentage = 0.3, | ||
| double const | threshold = 1.3 ) |
Optimize the traffic lights by changing the green and red times.
| optimizationType | TrafficLightOptimization, The type of optimization. Default is DOUBLE_TAIL |
| logFile | The file into which write the logs (default is empty, meaning no logging) |
| percentage | double, the maximum amount (percentage) of the green time to change (default is 0.3) |
| threshold | double, The ratio between the self-density and neighbour density to trigger the non-local optimization (default is 1.3) |
The local optimization is done by changing the green time of each traffic light, trying to make it proportional to the queue lengths at each phase. The non-local optimization is done by synchronizing the traffic lights which are congested over threshold.
|
noexcept |
Get the origin counts of the agents.
| bReset | If true, the origin counts are cleared (default is true) |
|
inlinenoexcept |
Get the origin nodes of the graph.
|
inlinenoexcept |
Get the origin nodes of the graph.
| void dsf::mobility::FirstOrderDynamics::prepareNetwork | ( | ) |
Automatically prepare the network for the simulation. This method calls the following methods in order:
| void dsf::mobility::FirstOrderDynamics::resetTurnCounts | ( | ) |
Reset the turn counts map values to zero.
| std::runtime_error | if the turn counts map is not initialized |
|
inlinenoexcept |
Set the data update period.
| dataUpdatePeriod | Delay, The period |
Some data, i.e. the street queue lengths, are stored only after a fixed amount of time which is represented by this variable.
| void dsf::mobility::FirstOrderDynamics::setDestinationNodes | ( | std::initializer_list< Id > | destinationNodes | ) |
Set the destination nodes.
| destinationNodes | The destination nodes (as an initializer list) |
| void dsf::mobility::FirstOrderDynamics::setDestinationNodes | ( | std::unordered_map< Id, double > const & | destinationNodes | ) |
Set the destination nodes.
| destinationNodes | The destination nodes |
| void dsf::mobility::FirstOrderDynamics::setDestinationNodes | ( | TContainer const & | destinationNodes | ) |
Set the destination nodes.
| destinationNodes | A container of destination nodes ids |
The container must have a value_type convertible to Id and begin() and end() methods
| void dsf::mobility::FirstOrderDynamics::setErrorProbability | ( | double | errorProbability | ) |
Set the error probability.
| errorProbability | The error probability |
| std::invalid_argument | If the error probability is not between 0 and 1 |
|
inlinenoexcept |
Set the force priorities flag.
| forcePriorities | The flag |
If true, if an agent cannot move to the next street, the whole node is skipped
|
inline |
Set the mean distance travelled by a random agent. The distance will be sampled from an exponential distribution with this mean.
| meanTravelDistance | The mean distance |
| std::invalid_argument | If the mean distance is negative |
|
inlinenoexcept |
Set the mean travel time for random agents. The travel time will be sampled from an exponential distribution with this mean.
| meanTravelTime | The mean travel time |
| void dsf::mobility::FirstOrderDynamics::setODs | ( | std::vector< std::tuple< Id, Id, double > > const & | ODs | ) |
Set the origin-destination pairs with their associated weights.
| ODs | A vector of tuples (origin node id, destination node id, weight) |
| void dsf::mobility::FirstOrderDynamics::setOriginNodes | ( | std::unordered_map< Id, double > const & | originNodes = {} | ) |
Set the origin nodes. If the provided map is empty, the origin nodes are set using the streets' stationary weights. NOTE: the default stationary weights are 1.0 so, if not set, this is equivalent to setting uniform weights.
| originNodes | The origin nodes |
| void dsf::mobility::FirstOrderDynamics::setPassageProbability | ( | double | passageProbability | ) |
Set the passage probability.
| passageProbability | The passage probability |
The passage probability is the probability of passing through a node It is useful in the case of random agents
| void dsf::mobility::FirstOrderDynamics::setSpeedFunction | ( | SpeedFunction const | speedFunction, |
| TArgs &&... | args ) |
Set the speed function. Options are:
|
inlinenoexcept |
Set the update paths throw on empty flag.
| throwOnEmpty | The flag |
If true, if an itinerary has an empty path when updating paths, an exception is thrown. If false, the itinerary is left unchanged.
|
inline |
Set the penalty factor applied to U-turns when choosing the next street.
| uturnPenaltyFactor | The penalty factor, which must be positive. |
| std::invalid_argument | If the penalty factor is not positive. |
| Measurement< double > dsf::mobility::FirstOrderDynamics::streetMeanDensity | ( | bool | normalized = false | ) | const |
Get the mean density of the streets in \(m^{-1}\).
| Measurement< double > dsf::mobility::FirstOrderDynamics::streetMeanFlow | ( | ) | const |
Get the mean flow of the streets in \(s^{-1}\).
| Measurement< double > dsf::mobility::FirstOrderDynamics::streetMeanFlow | ( | double | threshold, |
| bool | above ) const |
Get the mean flow of the streets in \(s^{-1}\).
| threshold | The density threshold to consider |
| above | If true, the function returns the mean flow of the streets with a density above the threshold, otherwise below |
| void dsf::mobility::FirstOrderDynamics::summary | ( | std::ostream & | os = std::cout | ) | const |
Print a summary of the dynamics to an output stream.
| os | The output stream to write to (default is std::cout) |
The summary includes:
|
inlinenoexcept |
Get the turn counts of the agents.
| void dsf::mobility::FirstOrderDynamics::updatePaths | ( | ) |
Update the paths of the itineraries based on the given weight function.
| std::runtime_error | if m_updatepathsThrowOnEmpty is true and an itinerary has an empty path |