Source code for symupy.tsc.network

"""
Network
=======
This module contains representation for different traffic objects related to the road infrastructure.
"""

# ============================================================================
# STANDARD  IMPORTS
# ============================================================================

from dataclasses import dataclass, field
from typing import Any
import numpy as np

# ============================================================================
# CLASS AND DEFINITIONS
# ============================================================================


[docs]@dataclass class NetworkElement: id: Any = None
[docs]@dataclass class Node(NetworkElement): links: list = field(default_factory=list) type: str = "" def __getitem__(self, attr): return self.__dict__[attr] def __setitem__(self, attr, value): self.__dict__[attr] = value
[docs]@dataclass class Zone(NetworkElement): links: list = field(default_factory=list)
[docs]@dataclass class Sensor: id: Any = None links: list = field(default_factory=list) mesure: list = field(default_factory=list) def __getitem__(self, attr): return self.__dict__[attr] def __setitem__(self, attr, value): self.__dict__[attr] = value def __repr__(self): return f"Sensor(id={self.id.__repr__()}, {len(self.links)} links)"
[docs]@dataclass class TerminationZone: id: Any = None links: list = field(default_factory=list) def __getitem__(self, attr): return self.__dict__[attr] def __setitem__(self, attr, value): self.__dict__[attr] = value def __repr__(self): return f"TerminationZone(id={self.id.__repr__()}, {len(self.links)} links)"
[docs]class Network(NetworkElement): __slots__ = ["sensors", "termination_zone", "links", "nodes", "adj"] def __init__(self, id, links=list(), nodes=list(), sensors=list()): super().__init__(id) self.links = {} self.nodes = {} self.sensors = {} self.termination_zone = {} self.networks = {}
[docs] def add_node(self, id, type=None): self.nodes[id] = Node(id=id, type=type)
[docs] def add_sensor(self, id, links): for l in links: assert l in self.links.keys(), f"{l} is not in Network" self.sensors[id] = Sensor(id, links)
[docs] def add_termination_zone(self, id, links): for l in links: assert l in self.links.keys(), f"{l} is not in Network" self.termination_zone[id] = TerminationZone(id, links)
[docs] def add_network(self, id, network): self.networks[id] = network
[docs] def get_nodes_attributes(self, attr): return {k: n[attr] for k, n in self.nodes.items()}
[docs] def get_borders(self, id: Link): return [ self.nodes[self.links[id]["upstream_node"]], self.nodes[self.links[id]["downstream_node"]], ]
[docs] def get_regions(self, id: Node): return [self.links[l] for l in self.nodes[id]["links"]]
def __repr__(self): return f"Network(id={self.id.__repr__()}, {len(self.links)} links, {len(self.nodes)} nodes)"