""" This module computes/modifies data for XML creation for the simulator
"""
from lxml import etree as ET
from .constants import (
DCT_SIMULATION_INFO,
DCT_EXPORT_INFO,
DCT_TRAFIC_INFO,
DCT_NETWORK_INFO,
DCT_SCENARIO_INFO,
)
[docs]def create_DCT_SIMULATION_INFO(
title: str,
simid: str,
timestep: float,
time_start: str,
time_end: str,
date: str,
seed: int,
cfl: str,
flow: str,
decel: bool,
) -> dict:
"""Computes dictionary DCT_SIMULATION_INFO header for XML file
:param title: Simulation title
:type title: str
:param simid: Simulation ID
:type simid: str
:param timestep: time step (seconds)
:type timestep: float
:param time_start: start time H%:%M:%S
:type time_start: str
:param time_end: start time H%:%M:%S
:type time_end: str
:param date: simulation date Y%-%m-%d
:type date: str
:param seed: random seed
:type seed: int
:param cfl: car following law
:type cfl: str
:param flow: flow behaviour
:type flow: str
:param decel: deceleration procedure activation
:type decel: bool
:return: dictionary with metadata for xml creation
:rtype: dict
"""
DCT_SIMULATION_INFO.update({"id": f"{simid}"})
DCT_SIMULATION_INFO.update({"pasdetemps": f"{str(timestep)}"})
DCT_SIMULATION_INFO.update({"debut": f"{time_start}"})
DCT_SIMULATION_INFO.update({"fin": f"{time_end}"})
DCT_SIMULATION_INFO.update({"loipoursuite": f"{cfl}"})
DCT_SIMULATION_INFO.update({"comportementflux": f"{flow}"})
DCT_SIMULATION_INFO.update({"date": f"{date}"})
DCT_SIMULATION_INFO.update({"titre": f"{title}"})
DCT_SIMULATION_INFO.update({"proc_deceleration": f"{str(decel).lower()}"})
DCT_SIMULATION_INFO.update({"seed": f"{str(seed)}"})
return DCT_SIMULATION_INFO
[docs]def create_DCT_NETWORK_INFO(networkid: str) -> dict:
"""Computes dictionary DCT_NETWORK_INFO for XML file
:param networkid: network identifier
:type networkid: str
:return: dict
:rtype: [type]
"""
DCT_NETWORK_INFO.update({"id": networkid})
return DCT_NETWORK_INFO
[docs]def create_DCT_TRAFIC_INFO(
trafid: str,
bounded_acc: bool = True,
relaxation: float = 4,
ghost_lanechange: bool = False,
) -> dict:
"""Computes dictionary DCT_TRAFIC_INFO for XML file
:param trafid: traffic identifier
:type trafid: str
:param bounded_acc: bounds acceleration True/False
:type bounded_acc: bool
:param relaxation: relaxation coefficient lane change
:type relaxation: float
:param ghost_lanechange: keep lane change ghost True/False
:type ghost_lanechange: bool
:return: dictionary with metadata for xml creation
:rtype: dict
"""
DCT_TRAFIC_INFO.update({"id": str(trafid)})
DCT_TRAFIC_INFO.update({"accbornee": str(bounded_acc)})
DCT_TRAFIC_INFO.update({"coeffrelax": str(relaxation)})
DCT_TRAFIC_INFO.update({"chgtvoie_ghost": str(ghost_lanechange)})
return DCT_TRAFIC_INFO
[docs]def create_DCT_EXPORT_INFO(
trace_rout: bool = False, trajectories: bool = True, csv: bool = True
) -> dict:
"""Computes dictionary DCT_SCENARIO_INFO for XML file
:param trace_rout: trace routes True/False
:type trace_rout: bool
:param trajectories: export trajectories True/False
:type trajectories: bool
:param csv: export trajectories in csv
:type csv: bool
:return: dictionary with metadata for xml creation
:rtype: dict
"""
DCT_EXPORT_INFO.update({"trace_route": str(trace_rout).lower()})
DCT_EXPORT_INFO.update({"trajectoires": str(trajectories).lower()})
DCT_EXPORT_INFO.update({"csv": str(csv).lower()})
return DCT_EXPORT_INFO
[docs]def create_DCT_SCENARIO_INFO(
scnid: str,
dirout: str,
prefout: str,
dct_sim: dict,
dct_traffic: dict,
dct_network: dict,
) -> dict:
"""Computes dictionary DCT_SCENARIO_INFO for XML file
:param scnid: Scenario identifier
:type scnid: str
:param dirout: Output directory
:type dirout: str
:param prefout: Prefix
:type prefout: str
:param dct_sim: DCT_SIMULATION_INFO
:type dct_sim: dict
:param dct_traffic: DCT_TRAFIC_INFO
:type dct_traffic: dict
:param dct_network: DCT_NETWORK_INFO
:type dct_network: dict
:return: dictionary with metadata for xml creation
:rtype: dict
"""
DCT_SIMULATION_INFO.update({"id": f"{scnid}"})
DCT_SIMULATION_INFO.update({"simulation_id": f"{dirout}"})
DCT_SIMULATION_INFO.update({"trafic_id": f"{prefout}"})
DCT_SIMULATION_INFO.update({"reseau_id": f"{dct_sim.get('id')}"})
DCT_SIMULATION_INFO.update({"dirout": f"{dct_traffic.get('id')}"})
DCT_SIMULATION_INFO.update({"prefout": f"{dct_network.get('id')}"})
return DCT_SCENARIO_INFO
[docs]def fix_values(element: ET.ElementTree, dct_values: dict) -> ET.ElementTree:
"""Fix a set of values within a dictionary as attributes of an XML subelement
:param element: XML tree element
:type element: ET.ElementTree
:param dct_values: attributes to fix
:type dct_values: dict
:return: Tranformed XML tree element
:rtype: ET.ElementTree
"""
for k, v in dct_values.items():
element.set(k, v)
return element
[docs]class XMLGenerator(object):
"""A class to handle XML generator for SymuFlow"""
xmlns = "http://www.w3.org/2001/XMLSchema-instance"
namespace = "noNamespaceSchemaLocation"
nsmap = {"xsi": xmlns}
def __init__(self, path_xsd: str = ""):
# Create a general scheme
attr_qname = ET.QName(self.xmlns, self.namespace)
self.root = ET.Element(
"ROOT_SYMUBRUIT",
{attr_qname: "reseau.xsd"},
version="2.05",
nsmap=self.nsmap,
)