From 0f2e49ef80a4ec25288c5382f07c7b53f3570a67 Mon Sep 17 00:00:00 2001 From: leo-desbureaux-tellae <73165148+leo-desbureaux-tellae@users.noreply.github.com> Date: Tue, 2 Aug 2022 15:10:52 +0200 Subject: [PATCH] refactor!: moved model elements initialisation in the parent SimulationModel class (#62) BREAKING CHANGE: model classes are not specified in the following attributes of the SimulationModel subclasses: environment_class, population_class, input_class, output_class --- starling_sim/basemodel/simulation_model.py | 37 +++++++++++++++------- starling_sim/models/FF_VS/input.py | 6 ---- starling_sim/models/FF_VS/model.py | 24 +------------- starling_sim/models/SB_VS/model.py | 24 ++------------ starling_sim/models/SB_VS_R/model.py | 24 ++------------ 5 files changed, 31 insertions(+), 84 deletions(-) delete mode 100644 starling_sim/models/FF_VS/input.py diff --git a/starling_sim/basemodel/simulation_model.py b/starling_sim/basemodel/simulation_model.py index d0b36cd..9fb7bef 100644 --- a/starling_sim/basemodel/simulation_model.py +++ b/starling_sim/basemodel/simulation_model.py @@ -3,6 +3,11 @@ import numpy import datetime +from starling_sim.basemodel.population.dict_population import DictPopulation +from starling_sim.basemodel.environment.environment import Environment +from starling_sim.basemodel.input.dynamic_input import DynamicInput +from starling_sim.basemodel.output.output_factory import OutputFactory +from starling_sim.basemodel.schedule.scheduler import Scheduler from starling_sim.basemodel.trace.trace import trace_simulation_end from starling_sim.utils.utils import import_gtfs_feed, get_git_revision_hash from starling_sim.utils.constants import BASE_LEAVING_CODES @@ -30,13 +35,22 @@ class SimulationModel: #: Agent types of the model and their modes modes = None + #: Model environment class + environment_class = Environment + + #: Model population class + population_class = DictPopulation + + #: Model dynamic input class + input_class = DynamicInput + + #: Model output factory class + output_class = OutputFactory + def __init__(self, scenario): """ Initialisation of the simulation model with instances of its different elements - This constructor must be extended to instantiate the model elements - using the correct classes - :param scenario: SimulationScenario object """ @@ -55,22 +69,23 @@ def __init__(self, scenario): # information to be completed for the specific models # elements of the model - self.agentPopulation = None - self.environment = None + self.agentPopulation = self.population_class.__new__(self.population_class) + self.agentPopulation.__init__(self.agent_type_class.keys()) + self.environment = self.environment_class.__new__(self.environment_class) + self.environment.__init__(scenario) # inputs and outputs - self.dynamicInput = None - self.outputFactory = None + self.dynamicInput = self.input_class.__new__(self.input_class) + self.dynamicInput.__init__(self.agent_type_class) + self.outputFactory = self.output_class.__new__(self.output_class) + self.outputFactory.__init__() # event manager - self.scheduler = None + self.scheduler = Scheduler() # complete, unfiltered gtfs timetable, if relevant self.gtfs = None - # TODO : data structure to store simulation information (e.g. demand) - # self.data = None - def setup(self): """ Sets the entries of the simulation model and prepares it for the simulation run. diff --git a/starling_sim/models/FF_VS/input.py b/starling_sim/models/FF_VS/input.py deleted file mode 100644 index 19a2481..0000000 --- a/starling_sim/models/FF_VS/input.py +++ /dev/null @@ -1,6 +0,0 @@ -from starling_sim.basemodel.input.dynamic_input import DynamicInput - - -class Input(DynamicInput): - def pre_process_input_dict(self, input_dict): - pass diff --git a/starling_sim/models/FF_VS/model.py b/starling_sim/models/FF_VS/model.py index 5730ad1..2393415 100644 --- a/starling_sim/models/FF_VS/model.py +++ b/starling_sim/models/FF_VS/model.py @@ -1,9 +1,5 @@ from starling_sim.basemodel.simulation_model import SimulationModel -from starling_sim.basemodel.population.dict_population import DictPopulation -from starling_sim.basemodel.environment.environment import Environment -from starling_sim.models.FF_VS.input import Input from starling_sim.models.FF_VS.output import Output -from starling_sim.basemodel.schedule.scheduler import Scheduler from starling_sim.models.FF_VS.user import User from starling_sim.basemodel.agent.vehicles.vehicle import Vehicle @@ -21,22 +17,4 @@ class Model(SimulationModel): modes = {"user": ["walk"], "vehicle": [None, "walk"]} - def __init__(self, scenario): - """ - Initialisation of the classes used by the free-floating model - - :param scenario: SimulationScenario object - """ - - super().__init__(scenario) - - # elements of the model - self.agentPopulation = DictPopulation(self.agent_type_class.keys()) - self.environment = Environment(self.scenario) - - # inputs and outputs - self.dynamicInput = Input(self.agent_type_class) - self.outputFactory = Output() - - # event manager - self.scheduler = Scheduler() + output_class = Output diff --git a/starling_sim/models/SB_VS/model.py b/starling_sim/models/SB_VS/model.py index 16dc1b0..6cd341b 100644 --- a/starling_sim/models/SB_VS/model.py +++ b/starling_sim/models/SB_VS/model.py @@ -1,9 +1,6 @@ from starling_sim.basemodel.simulation_model import SimulationModel -from starling_sim.basemodel.population.dict_population import DictPopulation -from starling_sim.basemodel.environment.environment import Environment from starling_sim.models.SB_VS.input import Input from starling_sim.models.SB_VS.output import Output -from starling_sim.basemodel.schedule.scheduler import Scheduler from starling_sim.models.SB_VS.user import User from starling_sim.basemodel.agent.vehicles.station_based_vehicle import StationBasedVehicle from starling_sim.basemodel.agent.stations.vehicle_sharing_station import VehicleSharingStation @@ -26,22 +23,5 @@ class Model(SimulationModel): modes = {"user": ["walk"], "vehicle": ["station"], "station": [None, "walk"]} - def __init__(self, scenario): - """ - Initialisation of the classes used by the station-based model - - :param scenario: SimulationScenario object - """ - - super().__init__(scenario) - - # elements of the model - self.agentPopulation = DictPopulation(self.agent_type_class.keys()) - self.environment = Environment(self.scenario) - - # inputs and outputs - self.dynamicInput = Input(self.agent_type_class) - self.outputFactory = Output() - - # event manager - self.scheduler = Scheduler() + input_class = Input + output_class = Output diff --git a/starling_sim/models/SB_VS_R/model.py b/starling_sim/models/SB_VS_R/model.py index f4ae735..b3523e3 100644 --- a/starling_sim/models/SB_VS_R/model.py +++ b/starling_sim/models/SB_VS_R/model.py @@ -1,9 +1,6 @@ from starling_sim.basemodel.simulation_model import SimulationModel -from starling_sim.basemodel.population.dict_population import DictPopulation -from starling_sim.basemodel.environment.environment import Environment from starling_sim.models.SB_VS_R.input import Input from starling_sim.models.SB_VS_R.output import Output -from starling_sim.basemodel.schedule.scheduler import Scheduler from starling_sim.models.SB_VS_R.operator import Operator from starling_sim.models.SB_VS_R.repositioning_staff import RepositioningStaff from starling_sim.models.SB_VS.user import User @@ -35,22 +32,5 @@ class Model(SimulationModel): "operator": {"staff": "staff", "fleet": "station"}, } - def __init__(self, scenario): - """ - Initialisation of the classes used by the station-based with repositioning model - - :param scenario: SimulationScenario object - """ - - super().__init__(scenario) - - # elements of the model - self.agentPopulation = DictPopulation(self.agent_type_class.keys()) - self.environment = Environment(self.scenario) - - # inputs and outputs - self.dynamicInput = Input(self.agent_type_class) - self.outputFactory = Output() - - # event manager - self.scheduler = Scheduler() + input_class = Input + output_class = Output