Dynamical system model
Loading...
Searching...
No Matches
dsf::mobility::RoadNetwork Class Reference

The RoadNetwork class represents a graph in the network. More...

#include <RoadNetwork.hpp>

Inheritance diagram for dsf::mobility::RoadNetwork:
dsf::Network< RoadJunction, Street >

Public Member Functions

 RoadNetwork (AdjacencyMatrix const &adj)
 Construct a new RoadNetwork object.
 
 RoadNetwork (const RoadNetwork &)=delete
 
RoadNetworkoperator= (const RoadNetwork &)=delete
 
 RoadNetwork (RoadNetwork &&)=default
 
RoadNetworkoperator= (RoadNetwork &&)=default
 
Size nCoils () const
 Get the graph's number of coil streets.
 
Size nIntersections () const
 Get the graph's number of intersections.
 
Size nRoundabouts () const
 Get the graph's number of roundabouts.
 
Size nTrafficLights () const
 Get the graph's number of traffic lights.
 
void adjustNodeCapacities ()
 Adjust the nodes' transport capacity.
 
void initTrafficLights (Delay const minGreenTime=30)
 Initialize the traffic lights with random parameters.
 
void autoMapStreetLanes ()
 Automatically re-maps street lanes basing on network's topology.
 
template<typename... TArgs>
void importEdges (const std::string &fileName, TArgs &&... args)
 Import the graph's streets from a file.
 
template<typename... TArgs>
void importNodeProperties (const std::string &fileName, TArgs &&... args)
 Import the graph's nodes properties from a file.
 
void importTrafficLights (const std::string &fileName)
 Import the graph's traffic lights from a file.
 
template<typename T1, typename... Tn>
requires is_node_v<std::remove_reference_t<T1>> && (is_node_v<std::remove_reference_t<Tn>> && ...)
void addNodes (T1 &&node, Tn &&... nodes)
 
TrafficLightmakeTrafficLight (Id const nodeId, Delay const cycleTime, Delay const counter=0)
 Convert an existing node to a traffic light.
 
RoundaboutmakeRoundabout (Id nodeId)
 Convert an existing node into a roundabout.
 
void makeStochasticStreet (Id streetId, double const flowRate)
 
void addCoil (Id streetId, std::string const &name=std::string())
 Add a coil (dsf::Counter sensor) on the street with streetId.
 
StationmakeStation (Id nodeId, const unsigned int managementTime)
 Convert an existing node into a station.
 
void addStreet (Street &&street)
 Add a street to the graph.
 
template<typename T1>
requires is_street_v<std::remove_reference_t<T1>>
void addStreets (T1 &&street)
 
template<typename T1, typename... Tn>
requires is_street_v<std::remove_reference_t<T1>> && (is_street_v<std::remove_reference_t<Tn>> && ...)
void addStreets (T1 &&street, Tn &&... streets)
 
void setStreetStationaryWeights (std::unordered_map< Id, double > const &streetWeights)
 Set the streets' stationary weights.
 
const std::unique_ptr< Street > * street (Id source, Id destination) const
 Get a street from the graph.
 
auto capacity () const noexcept
 Get the maximum agent capacity.
 
template<typename DynamicsFunc>
requires (std::is_invocable_r_v<double, DynamicsFunc, std::unique_ptr<Street> const&>)
PathCollection allPathsTo (Id const targetId, DynamicsFunc getEdgeWeight, double const threshold=1e-9) const
 Perform a global Dijkstra search to a target node from all other nodes in the graph.
 
template<typename DynamicsFunc>
requires (std::is_invocable_r_v<double, DynamicsFunc, std::unique_ptr<Street> const&>)
PathCollection shortestPath (Id const sourceId, Id const targetId, DynamicsFunc getEdgeWeight, double const threshold=1e-9) const
 Find the shortest path between two nodes using Dijkstra's algorithm.
 
- Public Member Functions inherited from dsf::Network< RoadJunction, Street >
 Network ()=default
 Construct a new empty Network object.
 
 Network (AdjacencyMatrix const &adj)
 Construct a new Network object.
 
std::unordered_map< Id, std::unique_ptr< RoadJunction > > const & nodes () const
 Get the nodes as an unordered map.
 
std::unordered_map< Id, std::unique_ptr< Street > > const & edges () const
 Get the edges as an unordered map.
 
size_t nNodes () const
 Get the number of nodes.
 
size_t nEdges () const
 Get the number of edges.
 
void addNode (TArgs &&... args)
 Add a node to the network.
 
void addNDefaultNodes (size_t n)
 
void addEdge (TArgs &&... args)
 Add an edge to the network.
 
std::unique_ptr< RoadJunction > const & node (Id nodeId) const
 Get a node by id.
 
std::unique_ptr< RoadJunction > & node (Id nodeId)
 Get a node by id.
 
TNode & node (Id nodeId)
 Get a node by id.
 
std::unique_ptr< Street > const & edge (Id edgeId) const
 Get an edge by id.
 
std::unique_ptr< Street > & edge (Id edgeId)
 Get an edge by id.
 
std::unique_ptr< Street > const & edge (Id source, Id target) const
 
TEdge & edge (Id edgeId)
 Get an edge by id.
 

Additional Inherited Members

- Protected Member Functions inherited from dsf::Network< RoadJunction, Street >
Id m_cantorHash (Id u, Id v) const
 
Id m_cantorHash (std::pair< Id, Id > const &idPair) const
 
- Protected Attributes inherited from dsf::Network< RoadJunction, Street >
std::unordered_map< Id, std::unique_ptr< RoadJunction > > m_nodes
 
std::unordered_map< Id, std::unique_ptr< Street > > m_edges
 

Detailed Description

The RoadNetwork class represents a graph in the network.

Template Parameters
Id,Thetype of the graph's id. It must be an unsigned integral type.
Size,Thetype of the graph's capacity. It must be an unsigned integral type.

Constructor & Destructor Documentation

◆ RoadNetwork()

dsf::mobility::RoadNetwork::RoadNetwork ( AdjacencyMatrix const & adj)

Construct a new RoadNetwork object.

Parameters
adjAn adjacency matrix made by a SparseMatrix representing the graph's adjacency matrix

Member Function Documentation

◆ addCoil()

void dsf::mobility::RoadNetwork::addCoil ( Id streetId,
std::string const & name = std::string() )

Add a coil (dsf::Counter sensor) on the street with streetId.

Parameters
streetIdThe id of the street to add the coil to
nameThe coil name
Exceptions
std::invalid_argumentif the street does not exist

◆ addStreet()

void dsf::mobility::RoadNetwork::addStreet ( Street && street)

Add a street to the graph.

Parameters
streetA reference to the street to add

◆ adjustNodeCapacities()

void dsf::mobility::RoadNetwork::adjustNodeCapacities ( )

Adjust the nodes' transport capacity.

The nodes' capacity is adjusted using the graph's streets transport capacity, which may vary basing on the number of lanes. The node capacity will be set to the sum of the incoming streets' transport capacity.

◆ allPathsTo()

template<typename DynamicsFunc>
requires (std::is_invocable_r_v<double, DynamicsFunc, std::unique_ptr<Street> const&>)
PathCollection dsf::mobility::RoadNetwork::allPathsTo ( Id const targetId,
DynamicsFunc getEdgeWeight,
double const threshold = 1e-9 ) const

Perform a global Dijkstra search to a target node from all other nodes in the graph.

Template Parameters
DynamicsFuncA callable type that takes a const reference to a Street and returns a double representing the edge weight
Parameters
targetIdThe id of the target node
getEdgeWeightA callable that takes a const reference to a Street and returns a double representing the edge weight
thresholdA threshold value to consider alternative paths
Returns
A map where each key is a node id and the value is a vector of next hop node ids toward the target
Exceptions
std::out_of_rangeif the target node does not exist

◆ autoMapStreetLanes()

void dsf::mobility::RoadNetwork::autoMapStreetLanes ( )

Automatically re-maps street lanes basing on network's topology.

For example, if one street has the right turn forbidden, then the right lane becomes a straight one

◆ capacity()

auto dsf::mobility::RoadNetwork::capacity ( ) const
inlinenoexcept

Get the maximum agent capacity.

Returns
unsigned long long The maximum agent capacity of the graph

◆ importEdges()

template<typename... TArgs>
void dsf::mobility::RoadNetwork::importEdges ( const std::string & fileName,
TArgs &&... args )

Import the graph's streets from a file.

Parameters
fileNameThe name of the file to import the streets from.

Supports csv, json and geojson file formats. The file format is deduced from the file extension. Supported fields:

  • id: The id of the street
  • source: The id of the source node
  • target: The id of the target node
  • length: The length of the street, in meters
  • nlanes: The number of lanes of the street
  • maxspeed: The street's speed limit, in km/h
  • name: The name of the street
  • geometry: The geometry of the street, as a LINESTRING

    Next columns are optional (meaning that their absence will not -hopefully- cause any pain):

  • type: The type of the street (e.g. residential, primary, secondary, etc.)
  • forbiddenTurns: The forbidden turns of the street, encoding information about street into which the street cannot output agents. The format is a string "sourceId1-targetid1, sourceId2-targetid2,..."
  • coilcode: An integer code to identify the coil located on the street
  • customWeight: will be stored in the weight parameter of the Edge class. You can use it for the shortest path via dsf::weight_functions::customWeight.

◆ importNodeProperties()

template<typename... TArgs>
void dsf::mobility::RoadNetwork::importNodeProperties ( const std::string & fileName,
TArgs &&... args )

Import the graph's nodes properties from a file.

Parameters
fileNameThe name of the file to import the nodes properties from.

Supports csv file format. Please specify the separator as second parameter. Supported fields:

  • id: The id of the node
  • type: The type of the node, e.g. roundabout, traffic_signals, etc.
  • geometry: The geometry of the node, as a POINT

◆ importTrafficLights()

void dsf::mobility::RoadNetwork::importTrafficLights ( const std::string & fileName)

Import the graph's traffic lights from a file.

Parameters
fileNameThe name of the file to import the traffic lights from.

The file format is csv-like with the ';' separator. Supported columns (in order):

  • id: The id of the TrafficLight node
  • sourceId: The id of the source node of the incoming street
  • cycleTime: The traffic light's cycle time, in seconds
  • greenTime: The green time of the considered phase, in time-steps
    Exceptions
    std::invalid_argumentif the file is not found, invalid or the format is not supported
    The traffic lights are imported from the specified file. If the file does not provide sufficient parameters, the behavior of the traffic light initialization is undefined. Ensure the file contains valid and complete data for accurate traffic light configuration. Street priorities may be assigned based on additional parameters such as the number of lanes and the speed limit, if such data is available in the file.

◆ initTrafficLights()

void dsf::mobility::RoadNetwork::initTrafficLights ( Delay const minGreenTime = 30)

Initialize the traffic lights with random parameters.

Parameters
minGreenTimeThe minimum green time for the traffic lights cycles (default is 30)

Traffic Lights with no parameters set are initialized with random parameters. Street priorities are assigned considering the number of lanes and the speed limit. Traffic Lights with an input degree lower than 3 are converted to standard intersections.

◆ makeRoundabout()

Roundabout & dsf::mobility::RoadNetwork::makeRoundabout ( Id nodeId)

Convert an existing node into a roundabout.

Parameters
nodeIdThe id of the node to convert to a roundabout
Returns
A reference to the roundabout
Exceptions
std::invalid_argumentif the node does not exist

◆ makeStation()

Station & dsf::mobility::RoadNetwork::makeStation ( Id nodeId,
const unsigned int managementTime )

Convert an existing node into a station.

Parameters
nodeIdThe id of the node to convert to a station
managementTimeThe station's management time
Returns
A reference to the station
Exceptions
std::invalid_argumentif the node does not exist

◆ makeTrafficLight()

TrafficLight & dsf::mobility::RoadNetwork::makeTrafficLight ( Id const nodeId,
Delay const cycleTime,
Delay const counter = 0 )

Convert an existing node to a traffic light.

Parameters
nodeIdThe id of the node to convert to a traffic light
cycleTimeThe traffic light's cycle time
counterThe traffic light's counter initial value. Default is 0
Returns
A reference to the traffic light
Exceptions
std::invalid_argumentif the node does not exist

◆ nCoils()

Size dsf::mobility::RoadNetwork::nCoils ( ) const

Get the graph's number of coil streets.

Returns
The number of coil streets

◆ nIntersections()

Size dsf::mobility::RoadNetwork::nIntersections ( ) const

Get the graph's number of intersections.

Returns
The number of intersections

◆ nRoundabouts()

Size dsf::mobility::RoadNetwork::nRoundabouts ( ) const

Get the graph's number of roundabouts.

Returns
The number of roundabouts

◆ nTrafficLights()

Size dsf::mobility::RoadNetwork::nTrafficLights ( ) const

Get the graph's number of traffic lights.

Returns
The number of traffic lights

◆ setStreetStationaryWeights()

void dsf::mobility::RoadNetwork::setStreetStationaryWeights ( std::unordered_map< Id, double > const & streetWeights)

Set the streets' stationary weights.

Parameters
streetWeightsA map where the key is the street id and the value is the street stationary weight. If a street id is not present in the map, its stationary weight is set to 1.0.

◆ shortestPath()

template<typename DynamicsFunc>
requires (std::is_invocable_r_v<double, DynamicsFunc, std::unique_ptr<Street> const&>)
PathCollection dsf::mobility::RoadNetwork::shortestPath ( Id const sourceId,
Id const targetId,
DynamicsFunc getEdgeWeight,
double const threshold = 1e-9 ) const

Find the shortest path between two nodes using Dijkstra's algorithm.

Template Parameters
DynamicsFuncA callable type that takes a const reference to a Street and returns a double representing the edge weight
Parameters
sourceIdThe id of the source node
targetIdThe id of the target node
getEdgeWeightA callable that takes a const reference to a Street and returns a double representing the edge weight
thresholdA threshold value to consider alternative paths
Returns
A map where each key is a node id and the value is a vector of next hop node ids toward the target. Returns an empty map if no path exists
Exceptions
std::out_of_rangeif the source or target node does not exist

Uses Dijkstra's algorithm to find shortest paths from source to target. Like allPathsTo, this method tracks all equivalent paths within the threshold, allowing for multiple next hops per node.

◆ street()

const std::unique_ptr< Street > * dsf::mobility::RoadNetwork::street ( Id source,
Id destination ) const

Get a street from the graph.

Parameters
sourceThe source node
destinationThe destination node
Returns
A std::unique_ptr to the street if it exists, nullptr otherwise

The documentation for this class was generated from the following files: