mirror of
https://github.com/Ahp06/SUMO_Emissions.git
synced 2024-11-22 11:36:29 +00:00
Fixed bugs about logging with multiprocessing
This commit is contained in:
parent
ee6ef7a010
commit
b33e96ba60
@ -15,7 +15,6 @@ from data import Data
|
|||||||
from model import Area, Vehicle, Lane, TrafficLight, Phase, Logic, Emission
|
from model import Area, Vehicle, Lane, TrafficLight, Phase, Logic, Emission
|
||||||
from runner import RunProcess
|
from runner import RunProcess
|
||||||
|
|
||||||
|
|
||||||
def compute_vehicle_emissions(veh_id):
|
def compute_vehicle_emissions(veh_id):
|
||||||
"""
|
"""
|
||||||
Recover the emissions of different pollutants from a vehicle and create an Emission instance
|
Recover the emissions of different pollutants from a vehicle and create an Emission instance
|
||||||
|
@ -1,126 +0,0 @@
|
|||||||
'''
|
|
||||||
Created on 19 janv. 2019
|
|
||||||
|
|
||||||
@author: Axel Huynh-Phuc
|
|
||||||
'''
|
|
||||||
|
|
||||||
import sys
|
|
||||||
import os
|
|
||||||
import argparse
|
|
||||||
import traci
|
|
||||||
import time
|
|
||||||
import jsonpickle
|
|
||||||
|
|
||||||
from data import Data
|
|
||||||
from config import Config
|
|
||||||
from runner import RunProcess
|
|
||||||
|
|
||||||
|
|
||||||
"""
|
|
||||||
Init the Traci API
|
|
||||||
"""
|
|
||||||
if 'SUMO_HOME' in os.environ:
|
|
||||||
tools = os.path.join(os.environ['SUMO_HOME'], 'tools')
|
|
||||||
sys.path.append(tools)
|
|
||||||
else:
|
|
||||||
sys.exit("please declare environment variable 'SUMO_HOME'")
|
|
||||||
|
|
||||||
|
|
||||||
def add_options(parser):
|
|
||||||
"""
|
|
||||||
Add command line options
|
|
||||||
:param parser: The command line parser
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
|
|
||||||
# TODO: Faire que -areas & -simulation_dir soit requis si -new_dump
|
|
||||||
# Faire que -c soit requis si -run
|
|
||||||
|
|
||||||
parser.add_argument("-new_dump", "--new_dump", type=str,
|
|
||||||
required=False, help='Load and create a new data dump with the configuration file chosen')
|
|
||||||
parser.add_argument("-areas", "--areas", type=int, required=False,
|
|
||||||
help='Will create a grid with "areas x areas" areas')
|
|
||||||
parser.add_argument("-simulation_dir", "--simulation_dir", type=str, required=False,
|
|
||||||
help='Choose the simulation directory')
|
|
||||||
|
|
||||||
parser.add_argument("-run", "--run", type=str,
|
|
||||||
help='Run a simulation with the dump chosen')
|
|
||||||
parser.add_argument("-c", "--c", nargs='+', type=str,
|
|
||||||
help='Choose your configuration file from your working directory')
|
|
||||||
parser.add_argument("-save", "--save", action="store_true",
|
|
||||||
help='Save the logs into the logs folder')
|
|
||||||
parser.add_argument("-csv", "--csv", action="store_true",
|
|
||||||
help="Export all data emissions into a CSV file")
|
|
||||||
|
|
||||||
|
|
||||||
def create_dump(dump_name, simulation_dir, areas_number):
|
|
||||||
"""
|
|
||||||
Create a new dump with config file and dump_name chosen
|
|
||||||
:param dump_name: The name of the data dump
|
|
||||||
:param simulation_dir: The simulation directory
|
|
||||||
:param areas_number: The number of areas in grid
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
|
|
||||||
sumo_binary = os.path.join(os.environ['SUMO_HOME'], 'bin', 'sumo')
|
|
||||||
sumo_cmd = [sumo_binary, "-c", f'files/simulations/{simulation_dir}/osm.sumocfg']
|
|
||||||
|
|
||||||
traci.start(sumo_cmd)
|
|
||||||
if not os.path.isfile(f'files/dump/{dump_name}.json'):
|
|
||||||
start = time.perf_counter()
|
|
||||||
data = Data(dump_name, traci.simulation.getNetBoundary(), areas_number, simulation_dir)
|
|
||||||
data.init_grid()
|
|
||||||
data.add_data_to_areas()
|
|
||||||
data.save()
|
|
||||||
|
|
||||||
loading_time = round(time.perf_counter() - start, 2)
|
|
||||||
print(f'Data loaded ({loading_time}s)')
|
|
||||||
print(f'Dump {dump_name} created')
|
|
||||||
else:
|
|
||||||
print(f'Dump with name {dump_name} already exist')
|
|
||||||
|
|
||||||
traci.close(False)
|
|
||||||
|
|
||||||
def main(args):
|
|
||||||
"""
|
|
||||||
The entry point of the application
|
|
||||||
:param args: Command line options
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
parser = argparse.ArgumentParser()
|
|
||||||
add_options(parser)
|
|
||||||
args = parser.parse_args(args)
|
|
||||||
|
|
||||||
if args.new_dump is not None:
|
|
||||||
if (args.simulation_dir is not None) and (args.areas is not None):
|
|
||||||
create_dump(args.new_dump, args.simulation_dir, args.areas)
|
|
||||||
|
|
||||||
if args.run is not None:
|
|
||||||
dump_path = f'files/dump/{args.run}.json'
|
|
||||||
if os.path.isfile(dump_path):
|
|
||||||
with open(dump_path, 'r') as f:
|
|
||||||
data = jsonpickle.decode(f.read())
|
|
||||||
|
|
||||||
process = []
|
|
||||||
|
|
||||||
if args.c is not None:
|
|
||||||
|
|
||||||
# Init all process
|
|
||||||
for conf in args.c:
|
|
||||||
|
|
||||||
config = Config()
|
|
||||||
config.import_config_file(conf)
|
|
||||||
config.init_traci(data.dir)
|
|
||||||
config.check_config()
|
|
||||||
|
|
||||||
p = RunProcess(data, config,args.save,args.csv)
|
|
||||||
p.init_logger()
|
|
||||||
process.append(p)
|
|
||||||
|
|
||||||
p.logger.info(f'Running simulation dump "{args.run}" with the config "{conf}" ...')
|
|
||||||
p.start()
|
|
||||||
p.join()
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main(sys.argv[1:])
|
|
@ -1,15 +1,25 @@
|
|||||||
|
'''
|
||||||
|
Created on 19 janv. 2019
|
||||||
|
|
||||||
|
@author: Axel Huynh-Phuc
|
||||||
|
'''
|
||||||
|
|
||||||
|
"""
|
||||||
|
Init the Traci API
|
||||||
|
"""
|
||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
|
import csv
|
||||||
|
import datetime
|
||||||
|
import itertools
|
||||||
|
import logging
|
||||||
|
import multiprocessing
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
import traci
|
import traci
|
||||||
import logging
|
|
||||||
import itertools
|
|
||||||
import csv
|
|
||||||
|
|
||||||
import jsonpickle
|
import jsonpickle
|
||||||
import multiprocessing
|
|
||||||
import datetime
|
|
||||||
|
|
||||||
from config import Config
|
from config import Config
|
||||||
from data import Data
|
from data import Data
|
||||||
@ -17,6 +27,12 @@ import emissions
|
|||||||
from model import Emission
|
from model import Emission
|
||||||
|
|
||||||
|
|
||||||
|
if 'SUMO_HOME' in os.environ:
|
||||||
|
tools = os.path.join(os.environ['SUMO_HOME'], 'tools')
|
||||||
|
sys.path.append(tools)
|
||||||
|
else:
|
||||||
|
sys.exit("please declare environment variable 'SUMO_HOME'")
|
||||||
|
|
||||||
class RunProcess(multiprocessing.Process):
|
class RunProcess(multiprocessing.Process):
|
||||||
|
|
||||||
def __init__(self, data : Data, config : Config, save_logs, csv_export):
|
def __init__(self, data : Data, config : Config, save_logs, csv_export):
|
||||||
@ -76,6 +92,7 @@ class RunProcess(multiprocessing.Process):
|
|||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
self.init_logger()
|
self.init_logger()
|
||||||
|
self.logger.info(f'Running simulation dump "{self.data.dump_name}" with the config "{self.config.config_filename}" ...')
|
||||||
|
|
||||||
traci.start(self.config.sumo_cmd)
|
traci.start(self.config.sumo_cmd)
|
||||||
|
|
||||||
@ -128,3 +145,101 @@ class RunProcess(multiprocessing.Process):
|
|||||||
self.logger.info(f'Exported data into the csv folder')
|
self.logger.info(f'Exported data into the csv folder')
|
||||||
|
|
||||||
|
|
||||||
|
def add_options(parser):
|
||||||
|
"""
|
||||||
|
Add command line options
|
||||||
|
:param parser: The command line parser
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
|
||||||
|
# TODO: Faire que -areas & -simulation_dir soit requis si -new_dump
|
||||||
|
# Faire que -c soit requis si -run
|
||||||
|
|
||||||
|
parser.add_argument("-new_dump", "--new_dump", type=str,
|
||||||
|
required=False, help='Load and create a new data dump with the configuration file chosen')
|
||||||
|
parser.add_argument("-areas", "--areas", type=int, required=False,
|
||||||
|
help='Will create a grid with "areas x areas" areas')
|
||||||
|
parser.add_argument("-simulation_dir", "--simulation_dir", type=str, required=False,
|
||||||
|
help='Choose the simulation directory')
|
||||||
|
|
||||||
|
parser.add_argument("-run", "--run", type=str,
|
||||||
|
help='Run a simulation with the dump chosen')
|
||||||
|
parser.add_argument("-c", "--c", nargs='+', type=str,
|
||||||
|
help='Choose your configuration file from your working directory')
|
||||||
|
parser.add_argument("-save", "--save", action="store_true",
|
||||||
|
help='Save the logs into the logs folder')
|
||||||
|
parser.add_argument("-csv", "--csv", action="store_true",
|
||||||
|
help="Export all data emissions into a CSV file")
|
||||||
|
|
||||||
|
|
||||||
|
def create_dump(dump_name, simulation_dir, areas_number):
|
||||||
|
"""
|
||||||
|
Create a new dump with config file and dump_name chosen
|
||||||
|
:param dump_name: The name of the data dump
|
||||||
|
:param simulation_dir: The simulation directory
|
||||||
|
:param areas_number: The number of areas in grid
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
|
||||||
|
sumo_binary = os.path.join(os.environ['SUMO_HOME'], 'bin', 'sumo')
|
||||||
|
sumo_cmd = [sumo_binary, "-c", f'files/simulations/{simulation_dir}/osm.sumocfg']
|
||||||
|
|
||||||
|
traci.start(sumo_cmd)
|
||||||
|
if not os.path.isfile(f'files/dump/{dump_name}.json'):
|
||||||
|
start = time.perf_counter()
|
||||||
|
data = Data(dump_name, traci.simulation.getNetBoundary(), areas_number, simulation_dir)
|
||||||
|
data.init_grid()
|
||||||
|
data.add_data_to_areas()
|
||||||
|
data.save()
|
||||||
|
|
||||||
|
loading_time = round(time.perf_counter() - start, 2)
|
||||||
|
print(f'Data loaded ({loading_time}s)')
|
||||||
|
print(f'Dump {dump_name} created')
|
||||||
|
else:
|
||||||
|
print(f'Dump with name {dump_name} already exist')
|
||||||
|
|
||||||
|
traci.close(False)
|
||||||
|
|
||||||
|
def main(args):
|
||||||
|
"""
|
||||||
|
The entry point of the application
|
||||||
|
:param args: Command line options
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
add_options(parser)
|
||||||
|
args = parser.parse_args(args)
|
||||||
|
|
||||||
|
if args.new_dump is not None:
|
||||||
|
if (args.simulation_dir is not None) and (args.areas is not None):
|
||||||
|
create_dump(args.new_dump, args.simulation_dir, args.areas)
|
||||||
|
|
||||||
|
if args.run is not None:
|
||||||
|
dump_path = f'files/dump/{args.run}.json'
|
||||||
|
if os.path.isfile(dump_path):
|
||||||
|
with open(dump_path, 'r') as f:
|
||||||
|
data = jsonpickle.decode(f.read())
|
||||||
|
|
||||||
|
process = []
|
||||||
|
|
||||||
|
if args.c is not None:
|
||||||
|
|
||||||
|
# Init all process
|
||||||
|
for conf in args.c:
|
||||||
|
|
||||||
|
config = Config()
|
||||||
|
config.import_config_file(conf)
|
||||||
|
config.init_traci(data.dir)
|
||||||
|
config.check_config()
|
||||||
|
|
||||||
|
p = RunProcess(data, config,args.save,args.csv)
|
||||||
|
p.init_logger()
|
||||||
|
process.append(p)
|
||||||
|
|
||||||
|
p.start()
|
||||||
|
|
||||||
|
for p in process : p.join()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main(sys.argv[1:])
|
||||||
|
Loading…
Reference in New Issue
Block a user